Skip to content

Commit

Permalink
feat: check if datamodel version is in registry
Browse files Browse the repository at this point in the history
  • Loading branch information
frantzarty committed May 24, 2022
1 parent d73fab3 commit a6844ed
Show file tree
Hide file tree
Showing 5 changed files with 104 additions and 12 deletions.
22 changes: 21 additions & 1 deletion src/controllers/organization.controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,6 @@ export const resetHomeOrg = async (req, res) => {
}
};

// eslint-disable-next-line
export const importOrg = async (req, res) => {
try {
await assertIfReadOnlyMode();
Expand All @@ -137,6 +136,27 @@ export const importOrg = async (req, res) => {
}
};

export const importHomeOrg = async (req, res) => {
try {
await assertIfReadOnlyMode();
await assertWalletIsSynced();

const { orgUid } = req.body;

await Organization.importHomeOrg(orgUid);

res.json({
message: 'Importing home organization.',
});
} catch (error) {
console.trace(error);
res.status(400).json({
message: 'Error importing organization',
error: error.message,
});
}
};

export const subscribeToOrganization = async (req, res) => {
try {
await assertIfReadOnlyMode();
Expand Down
11 changes: 11 additions & 0 deletions src/datalayer/syncService.js
Original file line number Diff line number Diff line change
Expand Up @@ -314,6 +314,16 @@ const getStoreIfUpdated = async (
}
};

export const getLocalStoreData = async (storeId) => {
const encodedData = await dataLayer.getStoreData(storeId);

if (!encodedData) {
return false;
}

return decodeDataLayerResponse(encodedData);
};

export default {
startDataLayerUpdatePolling,
syncDataLayerStoreToClimateWarehouse,
Expand All @@ -323,6 +333,7 @@ export default {
getRootHistory,
getRootDiff,
getStoreData,
getLocalStoreData,
getStoreIfUpdated,
POLLING_INTERVAL,
getCurrentStoreData,
Expand Down
68 changes: 60 additions & 8 deletions src/models/organizations/organizations.model.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ import {
serverAvailable,
} from '../../utils/data-loaders';

import { getDataModelVersion } from '../../utils/helpers';

import { getConfig } from '../../utils/config-loader';
const { USE_SIMULATOR } = getConfig().APP;

Expand Down Expand Up @@ -129,9 +131,55 @@ class Organization extends Model {
}

// eslint-disable-next-line
static appendNewRegistry = (dataVersion) => {
throw new Error('Not implemented yet');
};
static async appendNewRegistry(registryId, dataVersion) {
const registryVersionId = await datalayer.createDataLayerStore();
await datalayer.syncDataLayer(registryId, {
[dataVersion]: registryVersionId,
});

return registryVersionId;
}

static async importHomeOrg(orgUid) {
const orgData = await datalayer.getLocalStoreData(orgUid);

if (!orgData) {
throw new Error('Your node does not have write access to this orgUid');
}

const orgDataObj = orgData.reduce((obj, curr) => {
console.log(curr);
obj[curr.key] = curr.value;
return obj;
}, {});

const registryData = await datalayer.getLocalStoreData(
orgDataObj.registryId,
);

const registryDataObj = registryData.reduce((obj, curr) => {
obj[curr.key] = curr.value;
return obj;
}, {});

const dataModelVersion = getDataModelVersion();

if (!registryDataObj[dataModelVersion]) {
registryDataObj[dataModelVersion] = await Organization.appendNewRegistry(
orgDataObj.registryId,
dataModelVersion,
);
}

await Organization.upsert({
orgUid,
name: orgDataObj.name,
icon: orgDataObj.icon,
registryId: registryDataObj[dataModelVersion],
subscribed: true,
isHome: true,
});
}

// eslint-disable-next-line
static importOrganization = async (orgUid, ip, port) => {
Expand All @@ -155,19 +203,23 @@ class Organization extends Model {
port,
);

if (!registryData.v1) {
throw new Error('Organization has no registry, can not import');
const dataModelVersion = getDataModelVersion();

if (!registryData[dataModelVersion]) {
throw new Error(
`Organization has no registry for the ${dataModelVersion} datamodel, can not import`,
);
}

logger.info('IMPORTING REGISTRY V1: ', registryData.v1);
logger.info(`IMPORTING REGISTRY ${dataModelVersion}: `, registryData.v1);

await datalayer.subscribeToStoreOnDataLayer(registryData.v1, ip, port);

logger.info({
orgUid,
name: orgData.name,
icon: orgData.icon,
registryId: registryData.v1,
registryId: registryData[dataModelVersion],
subscribed: true,
isHome: false,
});
Expand All @@ -176,7 +228,7 @@ class Organization extends Model {
orgUid,
name: orgData.name,
icon: orgData.icon,
registryId: registryData.v1,
registryId: registryData[dataModelVersion],
subscribed: true,
isHome: false,
});
Expand Down
11 changes: 8 additions & 3 deletions src/routes/v1/resources/organization.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import {
resyncOrganizationSchema,
subscribeOrganizationSchema,
unsubscribeOrganizationSchema,
importHomeOrganizationSchema,
} from '../../../validations';

const validator = joiExpress.createValidator({ passError: true });
Expand All @@ -35,9 +36,13 @@ OrganizationRouter.post('/create', (req, res) => {
return OrganizationController.createV2(req, res);
});

OrganizationRouter.put('/', (req, res) => {
return OrganizationController.importOrg(req, res);
});
OrganizationRouter.put(
'/',
validator.body(importHomeOrganizationSchema),
(req, res) => {
return OrganizationController.importHomeOrg(req, res);
},
);

OrganizationRouter.put(
'/import',
Expand Down
4 changes: 4 additions & 0 deletions src/validations/organizations.validations.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,10 @@ export const importOrganizationSchema = Joi.object({
port: Joi.string().required(),
});

export const importHomeOrganizationSchema = Joi.object({
orgUid: Joi.string().required(),
});

export const unsubscribeOrganizationSchema = Joi.object({
orgUid: Joi.string().required(),
});
Expand Down

0 comments on commit a6844ed

Please sign in to comment.