gilad code review
unknown
javascript
2 years ago
6.0 kB
6
Indexable
###### details.js ###### server.route({ method: 'PUT', path: '/orgs/{idOrg}/appFormField/reorder', config: { tags: ['api'], description: 'Reorder app form fields', auth: { strategy: 'session', scope: ['torii-admin', `${SCOPES.APPLICATIONS_WRITE}-{params.idOrg}`] }, validate: { params: { idOrg: Joi.number().integer() }, payload: { changes: Joi.array().required().items(Joi.object({ idField: Joi.number().integer().required(), position: Joi.number().integer().required(), idGroup: Joi.number().integer() }).required()) } }, app: { audit: { type: 'reorder_app_form_fields', properties: ({ params, payload }) => ({ idOrg: params.idOrg, changes: payload.changes }) } } }, handler: async (request, h) => { const { idOrg } = request.params const { changes: positions } = request.payload const idFields = _.map(positions, "idField") const existingFields = await AppDetails.getFieldsByIds({ idFields, idOrg, fields: ["idOrg"] }) const intersectionLength = _.intersection(_.map(existingFields, "id"),idFields).length; if (!(intersectionLength === idFields.length && idFields.length === existingFields.length )) { return Boom.notFound('Some or all fields from ${idFields} not found') } let containsOnlyCustomFieldsForGroupReordering = true; _.filter(positions,"idGroup").forEach((position) => { if (_.find(existingFields, (existingField) => existingField.id === position.idField && existingField.idOrg !== idOrg)) { containsOnlyCustomFieldsForGroupReordering = false; return; } }) if (!containsOnlyCustomFieldsForGroupReordering) { return Boom.notAcceptable('User can only move custom fields between groups') } await AppDetails.setFieldsPositions({ idOrg, positions }) const fields = await AppDetails.getFieldsByIds({ idFields, idOrg }) return { fields } } }) ##### appDetails.js ###### static async setFieldsPositions ({ idOrg, positions }) { const form_fields_info_data = []; const form_fields_data = []; positions.forEach((position) => { position.idGroup && form_fields_data.push({ id: position.idField, idGroup: position.idGroup }) form_fields_info_data.push({ idOrg, idField: position.idField, position: position.position }); }); await upsert('form_fields_info', form_fields_info_data, ['idOrg', 'idField', 'position']) if (form_fields_data.length > 0) { await upsert('form_fields', form_fields_data, ['id', 'idGroup']) } return true } ##### details.test.js describe('PUT /orgs/{idOrg}/appFormField/reorder', () => { const demoUser = { id: 2, idOrg: 5 } const baseRequest = { method: 'PUT', url: '/orgs/100/appFormField/reorder', auth: { credentials: { user: demoUser, scope: ['torii-admin'] }, strategy: 'default' } } AppDetails.getFieldsByIds = jest.fn(async () => [ { id: 1, idOrg: null, }, { id: 15, idOrg: null, } ]) AppDetails.setFieldsPositions = jest.fn(async () => {}) it.only('should return 404 due to mismatch of fields', async () => { const requestWithMismatchingFields = { ...baseRequest, payload: { changes: [ { idField: 1, position: 1, }, { idField: 15, position: 4, }, { idField: 18, position: 4, } ] } }; const response2 = await server.inject(requestWithMismatchingFields) expect(response2.statusCode).toBe(404) // expect(response.result.message).toBe('Domains "example1.com, example3.com" are assigned to another organization') }) it.only('should return 200', async () => { const requestWithValidFields = { ...baseRequest, payload: { changes: [ { idField: 1, position: 1, }, { idField: 15, position: 4, } ] } }; const response1 = await server.inject(requestWithValidFields) expect(response1.statusCode).toBe(200) }) it.only('should return 406 due to a request to move between groups a field with idOrg=null ', async () => { const requestWithValidFields = { ...baseRequest, payload: { changes: [ { idField: 1, position: 1, idGroup: 6 }, { idField: 15, position: 4, } ] } }; const response1 = await server.inject(requestWithValidFields) expect(response1.statusCode).toBe(406) }) }) #### appDetails.test.js #### const formFieldsInfo = [ { id: 1, idOrg: 100, idField: 99, isShown: 1, isDeleted: 0, position: 10, }, { id: 2, idOrg: 100, idField: 11, isShown: 1, isDeleted: 0, position: 20, }, { id: 3, idOrg: 100, idField: 4, isShown: 1, isDeleted: 0, position: 30, } ] describe('setFieldsPositions', () => { describe('validate setFieldPosition response', () => { it('should return true on success', async () => { let changes = _.map(formFieldsInfo, f => _.pick(f, ["idField", "position"])) _.first(changes).idGroup = _.first(formFields).idGroup; const reorderResponse = await AppDetails.setFieldsPositions({ idOrg: 100, positions: changes }) expect(reorderResponse).toEqual(true) }) }) })
Editor is loading...