Skip to content

Commit

Permalink
Merge pull request hopetambala#513 from hopetambala/PLATFORM-OFFLINE
Browse files Browse the repository at this point in the history
fix: offline post survey hook
  • Loading branch information
hopetambala committed Dec 10, 2022
2 parents 79724f8 + 7cd293d commit 80cd351
Show file tree
Hide file tree
Showing 5 changed files with 55 additions and 166 deletions.
1 change: 1 addition & 0 deletions .env.dev
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
PARSE_SERVER_ALLOW_ORIGIN="*"
PARSE_ENV=dev
PARSE_APP_ID="myAppId"
PARSE_JAVASCRIPT_KEY=_PLACEHOLDER_
Expand Down
144 changes: 0 additions & 144 deletions cloud/src/definer/offline.definer.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,147 +9,3 @@ Parse.Cloud.define('uploadOfflineForms', (request) => new Promise((resolve, reje
return reject(new Error(`Cloud code error: ${err}`));
}
}));

Parse.Cloud.afterSave('FormResults', async (request) => {
const customForm = request.object;
const hasClient = customForm.get('client');
if (hasClient) {
return {};
}

const formResultsPointer = await customForm.get('parseParentClassObjectIdOffline');

const residentQuery = new Parse.Query('SurveyData');
residentQuery.equalTo('objectIdOffline', formResultsPointer);
return residentQuery.first({ useMasterKey: true }).then(async (resident) => {
const supplementaryQuery = new Parse.Query('FormResults');
try {
const form = await supplementaryQuery.get(request.object.id);
form.set('client', resident);
return form.save();
} catch (error) {
console.error(`Got an error ${error.code} : ${error.message}`); //eslint-disable-line
return { };
}
});
});

Parse.Cloud.afterSave('FormAssetResults', async (request) => {
const supplementaryAssetForm = request.object;
const hasClient = supplementaryAssetForm.get('client');
if (hasClient) {
return {};
}

const formAssetResultsPointer = await supplementaryAssetForm.get('parseParentClassObjectIdOffline');

const assetQuery = new Parse.Query('Assets');
assetQuery.equalTo('objectIdOffline', formAssetResultsPointer);
return assetQuery.first({ useMasterKey: true }).then(async (asset) => {
const supplementaryAssetQuery = new Parse.Query('FormAssetResults');
try {
const supplementaryAsset = await supplementaryAssetQuery.get(request.object.id);
supplementaryAsset.set('client', asset);
return supplementaryAsset.save();
} catch (error) {
console.error(`Got an error ${error.code} : ${error.message}`); //eslint-disable-line
return { };
}
});
});

Parse.Cloud.afterSave('HistoryEnvironmentalHealth', async (request) => {
const environmentalForm = request.object;
const hasClient = environmentalForm.get('client');
if (hasClient) {
return {};
}

const formResultsPointer = await environmentalForm.get('parseParentClassObjectIdOffline');

const residentQuery = new Parse.Query('SurveyData');
residentQuery.equalTo('objectIdOffline', formResultsPointer);
return residentQuery.first({ useMasterKey: true }).then(async (resident) => {
const supplementaryQuery = new Parse.Query('HistoryEnvironmentalHealth');
try {
const form = await supplementaryQuery.get(request.object.id);
form.set('client', resident);
return form.save();
} catch (error) {
console.error(`Got an error ${error.code} : ${error.message}`); //eslint-disable-line
return {};
}
});
});

Parse.Cloud.afterSave('Vitals', async (request) => {
const vitalForm = request.object;
const hasClient = vitalForm.get('client');
if (hasClient) {
return {};
}

const formResultsPointer = await vitalForm.get('parseParentClassObjectIdOffline');

const residentQuery = new Parse.Query('SurveyData');
residentQuery.equalTo('objectIdOffline', formResultsPointer);
return residentQuery.first({ useMasterKey: true }).then(async (resident) => {
const supplementaryQuery = new Parse.Query('Vitals');
try {
const form = await supplementaryQuery.get(request.object.id);
form.set('client', resident);
return form.save();
} catch (error) {
console.error(`Got an error ${error.code} : ${error.message}`); //eslint-disable-line
return {};
}
});
});

Parse.Cloud.afterSave('HistoryMedical', async (request) => {
const historyMedicalform = request.object;
const hasClient = historyMedicalform.get('client');
if (hasClient) {
return {};
}

const historyMedicalformResultsPointer = await historyMedicalform.get('parseParentClassObjectIdOffline');

const residentQuery = new Parse.Query('SurveyData');
residentQuery.equalTo('objectIdOffline', historyMedicalformResultsPointer);
return residentQuery.first({ useMasterKey: true }).then(async (resident) => {
const supplementaryQuery = new Parse.Query('HistoryMedical');
try {
const supForm = await supplementaryQuery.get(request.object.id);
supForm.set('client', resident);
return supForm.save();
} catch (error) {
console.error(`Got an error ${error.code} : ${error.message}`); //eslint-disable-line
return {};
}
});
});

Parse.Cloud.afterSave('Allergies', async (request) => {
const allergiesForm = request.object;
const hasClient = allergiesForm.get('client');
if (hasClient) {
return {};
}

const formResultsPointer = await allergiesForm.get('parseParentClassObjectIdOffline');

const residentQuery = new Parse.Query('SurveyData');
residentQuery.equalTo('objectIdOffline', formResultsPointer);
return residentQuery.first({ useMasterKey: true }).then(async (resident) => {
const supplementaryQuery = new Parse.Query('Allergies');
try {
const form = await supplementaryQuery.get(request.object.id);
form.set('client', resident);
return form.save();
} catch (error) {
console.error(`Got an error ${error.code} : ${error.message}`); //eslint-disable-line
return {};
}
});
});
25 changes: 14 additions & 11 deletions cloud/src/services/offline/offline.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
const { afterSurveyHouseholdHook } = require('../post/hooks/afterSave');
const { afterSurveyHouseholdHook, afterSupplementaryFormHook } = require('../post/hooks/afterSave');
const post = require('../post/post');

const postObjectsArray = (data, metadata) => {
if (!data) return [];
if (!data) return Promise.all([]);
const promises = data.map(async (obj) => {
const record = obj;
record.localObject = {
Expand Down Expand Up @@ -31,12 +31,13 @@ const postObjectsArray = (data, metadata) => {
try {
return Promise.all(promises);
} catch (error) {
console.error('Error: postObjectsArray' ,error); //eslint-disable-line
return error;
}
};

const postObjectsWithRelationshipsArray = async (data, metadata) => {
if (!data) return [];
if (!data) return Promise.all([]);
const promises = data.map(async (obj) => {
const record = obj;
record.localObject = {
Expand All @@ -58,6 +59,7 @@ const postObjectsWithRelationshipsArray = async (data, metadata) => {
const posts = await Promise.all(promises);
return posts;
} catch (error) {
console.error('Error: postObjectsWithRelationshipsArray',error); //eslint-disable-line
return error;
}
};
Expand All @@ -82,6 +84,7 @@ const postHouseholdArray = (data, metadata) => {
try {
return Promise.all(promises);
} catch (error) {
console.error('Error: postHouseholdArray',error); //eslint-disable-line
return error;
}
};
Expand All @@ -99,19 +102,19 @@ const OfflineFactory = (records, type) => {
if (type === 'households') return postHouseholdArray(households, metadata);
if (type === 'assetForms') return postObjectsArray(assetForms, metadata);
if (type === 'residentForms') return postObjectsArray(residentForms, metadata).then((results) => afterSurveyHouseholdHook(results));
if (type === 'residentSupplementaryForms') return postObjectsWithRelationshipsArray(residentSupplementaryForms, metadata);
if (type === 'assetSupplementaryForms') return postObjectsWithRelationshipsArray(assetSupplementaryForms, metadata);
if (type === 'residentSupplementaryForms') return postObjectsWithRelationshipsArray(residentSupplementaryForms, metadata).then((results) => afterSupplementaryFormHook(results, 'SurveyData'));
if (type === 'assetSupplementaryForms') return postObjectsWithRelationshipsArray(assetSupplementaryForms, metadata).then((results) => afterSupplementaryFormHook(results, 'Assets'));
return [];
};

const Offline = {
upload: async function upload(records) {
try {
const households = await Promise.resolve(OfflineFactory(records, 'households'));
const residentForms = await Promise.resolve(OfflineFactory(records, 'residentForms'));
const assetForms = await Promise.resolve(OfflineFactory(records, 'assetForms'));
const residentSupplementaryForms = await Promise.resolve(OfflineFactory(records, 'residentSupplementaryForms'));
const assetSupplementaryForms = await Promise.resolve(OfflineFactory(records, 'assetSupplementaryForms'));
const households = await OfflineFactory(records, 'households');
const residentForms = await OfflineFactory(records, 'residentForms');
const assetForms = await OfflineFactory(records, 'assetForms');
const residentSupplementaryForms = await OfflineFactory(records, 'residentSupplementaryForms');
const assetSupplementaryForms = await OfflineFactory(records, 'assetSupplementaryForms');
return {
residentForms,
assetForms,
Expand All @@ -120,7 +123,7 @@ const Offline = {
assetSupplementaryForms,
};
} catch (err) {
console.log(err); //eslint-disable-line
console.error('Error: Offline',err); //eslint-disable-line
return err;
}
},
Expand Down
24 changes: 24 additions & 0 deletions cloud/src/services/post/hooks/afterSave.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,30 @@ const afterSurveyHouseholdHook = async (records) => {
}
};

const afterSupplementaryFormHook = async (records, parentClass = 'SurveyData') => {
const data = records.map(async (record) => {
const supplementaryForm = record;
const parentPointer = await supplementaryForm.get('parseParentClassObjectIdOffline');
if (!parentPointer) return supplementaryForm;

const parentQuery = new Parse.Query(parentClass);
parentQuery.equalTo('objectIdOffline', parentPointer);
const parent = await parentQuery.first({ useMasterKey: true });

if (!parent) return supplementaryForm;
supplementaryForm.set('client', parent);
return supplementaryForm.save().catch((error) => console.error('Error: afterSupplementaryFormHook', error)); //eslint-disable-line
});

try {
return Promise.all(data);
} catch (error) {
console.error(`Got an error ${error.code} : ${error.message}`); //eslint-disable-line
return [];
}
};

module.exports = {
afterSurveyHouseholdHook,
afterSupplementaryFormHook,
};
27 changes: 16 additions & 11 deletions cloud/src/services/post/post.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,26 +23,27 @@ const postObject = async (survey) => {
.catch((err) => console.log(err)); //eslint-disable-line
}

Object.keys(localObject).forEach((key) => surveyPoint.set(key, localObject[key]));

const { latitude, longitude } = localObject;
if (latitude && longitude) {
const point = new Parse.GeoPoint(latitude, longitude);
surveyPoint.set('location', point);
if (Array.isArray(localObject.location)) {
const { location } = localObject;
const point = new Parse.GeoPoint(parseFloat(location[0]), parseFloat(location[1]));
localObject.location = point;
}

if (parseUser) {
Object.keys(localObject).forEach((key) => surveyPoint.set(key, localObject[key]));

if (typeof parseUser !== 'undefined' && parseUser) {
const userObject = new Parse.Object('_User');
userObject.id = String(survey.parseUser);
surveyPoint.set('parseUser', userObject);
}

return surveyPoint.save().then((result) => result).catch((error) => error);
return surveyPoint.save().then((result) => result).catch((error) => {
console.error('Error: postObject',error); //eslint-disable-line
});
};

const postObjectWithRelationships = async (survey) => {
const supplementaryForm = new Parse.Object(survey.parseClass);
const userObject = new Parse.Object('_User');
const loopParentForm = new Parse.Object(survey.parseClass);

const { localObject, loop } = survey;
Expand Down Expand Up @@ -76,12 +77,16 @@ const postObjectWithRelationships = async (survey) => {
supplementaryForm.set('loopClient', loopParentForm);
}

if (survey.parseUser) {
if (typeof survey.parseUser !== 'undefined' && survey.parseUser) {
const userObject = new Parse.Object('_User');
userObject.id = String(survey.parseUser);
supplementaryForm.set('parseUser', userObject);
}

const results = await supplementaryForm.save();
const results = await supplementaryForm.save().catch((error) => {
console.error('Error: postObjectWithRelationships',error); //eslint-disable-line
});

const mainObject = results;
if (loop && Object.keys(loopedJson).length > 0) {
await utils.Loop.postLoopedForm(loopedJson, newFieldsArray, survey, mainObject);
Expand Down

0 comments on commit 80cd351

Please sign in to comment.