• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

akvo / nmis-mobile / 5619678529

21 Jul 2023 07:15AM UTC coverage: 73.699% (+0.9%) from 72.839%
5619678529

Pull #66

github

web-flow
Merge 8c0d9fc68 into 7afe79e32
Pull Request #66: Feature/64 sync submitted submission

392 of 567 branches covered (69.14%)

Branch coverage included in aggregate %.

44 of 44 new or added lines in 4 files covered. (100.0%)

897 of 1182 relevant lines covered (75.89%)

7.6 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

86.42
/app/src/lib/background-task.js
1
import { crudForms, crudSessions, crudDataPoints, crudUsers } from '../database/crud';
2
import api from './api';
3
import * as BackgroundFetch from 'expo-background-fetch';
4
import * as TaskManager from 'expo-task-manager';
5

6
const syncFormVersion = async ({
7✔
7
  showNotificationOnly = true,
×
8
  sendPushNotification = () => {},
×
9
}) => {
10
  try {
2✔
11
    // find last session
12
    const session = await crudSessions.selectLastSession();
2✔
13
    if (!session) {
2!
14
      return;
×
15
    }
16
    const authenticationCode = session.passcode;
2✔
17
    const data = new FormData();
2✔
18
    data.append('code', authenticationCode);
2✔
19
    api
2✔
20
      .post('/auth', data, { headers: { 'Content-Type': 'multipart/form-data' } })
21
      .then(async (res) => {
22
        console.log('[bgTask]Fetch Auth Success');
2✔
23
        const { data } = res;
2✔
24
        const promises = data.formsUrl.map(async (form) => {
2✔
25
          const formExist = await crudForms.selectFormByIdAndVersion({ ...form });
2✔
26
          if (formExist) {
2!
27
            return false;
×
28
          }
29
          if (showNotificationOnly) {
2✔
30
            console.info('[bgTask]New form:', form.id, form.version);
1✔
31
            return { id: form.id, version: form.version };
1✔
32
          }
33
          const formRes = await api.get(form.url);
1✔
34
          // update previous form latest value to 0
35
          await crudForms.updateForm({ ...form });
1✔
36
          console.info('[syncForm]Updated Forms...', form.id);
1✔
37
          const savedForm = await crudForms.addForm({ ...form, formJSON: formRes?.data });
1✔
38
          console.info('[syncForm]Saved Forms...', form.id);
1✔
39
          return savedForm;
1✔
40
        });
41
        Promise.all(promises).then(async (res) => {
2✔
42
          const exist = res.filter((x) => x);
2✔
43
          if (!exist.length || !showNotificationOnly) {
2✔
44
            return;
1✔
45
          }
46
          sendPushNotification();
1✔
47
        });
48
      });
49
  } catch (err) {
50
    console.error('[bgTask]sycnFormVersion failed:', err);
×
51
  }
52
};
53

54
const registerBackgroundTask = async (TASK_NAME, minimumInterval = 86400) => {
7✔
55
  try {
2✔
56
    await BackgroundFetch.registerTaskAsync(TASK_NAME, {
2✔
57
      minimumInterval: minimumInterval,
58
      stopOnTerminate: true, // android only,
59
      startOnBoot: true, // android only
60
    });
61
  } catch (err) {
62
    console.error('Task Register failed:', err);
×
63
  }
64
};
65

66
const unregisterBackgroundTask = async (TASK_NAME) => {
7✔
67
  try {
1✔
68
    await BackgroundFetch.unregisterTaskAsync(TASK_NAME);
1✔
69
  } catch (err) {
70
    console.error('Task Unregister failed:', err);
×
71
  }
72
};
73

74
const backgroundTaskStatus = async (TASK_NAME, minimumInterval = 86400) => {
7✔
75
  const status = await BackgroundFetch.getStatusAsync();
1✔
76
  const isRegistered = await TaskManager.isTaskRegisteredAsync(TASK_NAME);
1✔
77
  if (BackgroundFetch.BackgroundFetchStatus?.[status] === 'Available' && !isRegistered) {
1!
78
    await registerBackgroundTask(TASK_NAME, minimumInterval);
1✔
79
  }
80
  console.log(`[${TASK_NAME}] Status`, status, isRegistered, minimumInterval);
1✔
81
};
82

83
const syncFormSubmission = async () => {
7✔
84
  try {
2✔
85
    // check connection
86
    await api.get();
2✔
87
    // get token
88
    const session = await crudSessions.selectLastSession();
1✔
89
    // set token
90
    api.setToken(session.token);
1✔
91
    // get all datapoints to sync
92
    const data = await crudDataPoints.selectSubmissionToSync();
1✔
93
    data.forEach(async (d) => {
1✔
94
      // get user
95
      const user = await crudUsers.selectUserById({ id: d.user });
1✔
96
      const syncData = {
1✔
97
        name: d.name,
98
        submitter: user.name,
99
        duration: d.duration,
100
        submittedAt: d.submittedAt,
101
        answers: JSON.parse(d.json.replace(/''/g, "'")),
102
      };
103
      // sync data point
104
      const res = await api.post('/sync', syncData);
1✔
105
      if (res.id) {
1!
106
        // update data point
107
        const updatedDataPoint = await crudDataPoints.updateDataPoint({
1✔
108
          ...d,
109
          syncedAt: new Date().toISOString(),
110
        });
111
        console.info('[syncFormSubmisiion] sync data point :', d.id);
1✔
112
      }
113
    });
114
  } catch (err) {
115
    console.error('[syncFormSubmission] Error: ', err);
1✔
116
  }
117
};
118

119
const backgroundTaskHandler = () => {
7✔
120
  return {
7✔
121
    syncFormVersion,
122
    registerBackgroundTask,
123
    unregisterBackgroundTask,
124
    backgroundTaskStatus,
125
    syncFormSubmission,
126
  };
127
};
128

129
const backgroundTask = backgroundTaskHandler();
7✔
130
export default backgroundTask;
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc