import { InteractionManager } from 'react-native'; import { sanitizedRaw } from '@nozbe/watermelondb/RawRecord'; import database from '../database'; import log from '../../utils/log'; import protectedFunction from './helpers/protectedFunction'; export default function() { const db = database.active; return new Promise(async(resolve) => { try { // RC 0.70.0 const result = await this.sdk.get('roles.list'); if (!result.success) { return resolve(); } const { roles } = result; if (roles && roles.length) { InteractionManager.runAfterInteractions(async() => { await db.action(async() => { const rolesCollections = db.collections.get('roles'); const allRolesRecords = await rolesCollections.query().fetch(); // filter roles let rolesToCreate = roles.filter(i1 => !allRolesRecords.find(i2 => i1._id === i2.id)); let rolesToUpdate = allRolesRecords.filter(i1 => roles.find(i2 => i1.id === i2._id)); // Create rolesToCreate = rolesToCreate.map(role => rolesCollections.prepareCreate(protectedFunction((r) => { r._raw = sanitizedRaw({ id: role._id }, rolesCollections.schema); Object.assign(r, role); }))); // Update rolesToUpdate = rolesToUpdate.map((role) => { const newRole = roles.find(r => r._id === role.id); return role.prepareUpdate(protectedFunction((r) => { Object.assign(r, newRole); })); }); const allRecords = [ ...rolesToCreate, ...rolesToUpdate ]; try { await db.batch(...allRecords); } catch (e) { log(e); } return allRecords.length; }); return resolve(); }); } } catch (e) { log(e); return resolve(); } }); }