From f39759de0fc17e3b3630ce5e9e0cba1b6ecbf204 Mon Sep 17 00:00:00 2001 From: lubien Date: Thu, 13 Jun 2019 00:54:25 -0300 Subject: [PATCH] =?UTF-8?q?Adiciona=20base=20de=20compara=C3=A7=C3=A3o=20d?= =?UTF-8?q?e=20lista=20de=20email?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- migrations/20190506212942_students.js | 14 +-- server/utils.js | 75 +++++++------ test/server/utils.spec.js | 156 ++++++++++++++++++++++++++ 3 files changed, 200 insertions(+), 45 deletions(-) diff --git a/migrations/20190506212942_students.js b/migrations/20190506212942_students.js index 3fc51c6a..325742ea 100644 --- a/migrations/20190506212942_students.js +++ b/migrations/20190506212942_students.js @@ -1,3 +1,5 @@ +const mailingList = ['none', 'active', 'concluding'] + exports.up = function(knex, Promise) { return knex.schema.createTable('students', table => { table.increments('id').primary() @@ -41,15 +43,9 @@ exports.up = function(knex, Promise) { .boolean('prescribed') .notNullable() .defaultTo(false) - table - .enum('mailingList', [ - 'none', - 'active', - 'graduating', - 'concluding', - 'forming' - ]) - .defaultTo('none') + table.enum('mailingList', mailingList).defaultTo('none') + table.enum('mailingListToAdd', mailingList).defaultTo('none') + table.enum('mailingListToRemove', mailingList).defaultTo('none') table.date('entryDate').nullable() table.string('advisor').nullable() table.date('defenseDate').nullable() diff --git a/server/utils.js b/server/utils.js index c15bc7e5..0a043af0 100644 --- a/server/utils.js +++ b/server/utils.js @@ -58,7 +58,8 @@ exports.parseCsv = function parseCsv(str) { * // isGraduating: false, * // academicHighlight: false, * // cancelled: false, - * // prescribed: false + * // prescribed: false, + * // mailingListToAdd: 'active' * // }] */ exports.digestSigaaData = function digestSigaaData(data) { @@ -83,7 +84,8 @@ exports.digestSigaaData = function digestSigaaData(data) { isGraduating: false, academicHighlight: false, cancelled: false, - prescribed: false + prescribed: false, + mailingListToAdd: 'none' } const translateStatus = { @@ -104,6 +106,14 @@ exports.digestSigaaData = function digestSigaaData(data) { base.isActive = false } + if (base.isConcluding) { + base.mailingListToAdd = 'concluding' + } + + if (base.isActive) { + base.mailingListToAdd = 'active' + } + return base } @@ -144,45 +154,38 @@ exports.batchUpdateStudents = function batchUpdateStudents(data) { const existingStudents = existingStudentsCollection.toJSON() - const existingRegistrationNumbers = existingStudents.map( - ({ registrationNumber }) => registrationNumber - ) - - const { newStudents, oldStudents } = data.reduce( - (acc, student) => { - const key = existingRegistrationNumbers.includes( - student.registrationNumber - ) - ? 'oldStudents' - : 'newStudents' - - acc[key].push(student) - - return acc - }, - { newStudents: [], oldStudents: [] } + const existingRegistrationNumbers = new Set( + existingStudents.map(({ registrationNumber }) => registrationNumber) ) - const newPromises = newStudents.map(student => - new Student(student).save(null, { transacting: trx }) - ) + return Promise.all( + data.map(student => { + // New student + if (!existingRegistrationNumbers.has(student.registrationNumber)) { + return new Student(student).save(null, { transacting: trx }) + } - function getId(student) { - const { id } = existingStudents.find( - ({ registrationNumber }) => - student.registrationNumber === registrationNumber - ) - return id - } - - const oldPromises = oldStudents.map(student => - new Student({ id: getId(student) }).save(student, { - patch: true, - transacting: trx + // Old student + const model = existingStudents.find( + ({ registrationNumber }) => + registrationNumber === student.registrationNumber + ) + const { id } = model + const changedMailingList = + student.mailingListToAdd !== model.mailingList + const mailingListToAdd = changedMailingList + ? student.mailingListToAdd + : 'none' + const mailingListToRemove = changedMailingList + ? model.mailingList + : model.mailingListToRemove + const payload = { ...student, mailingListToAdd, mailingListToRemove } + return Student.forge({ id }).save(payload, { + patch: true, + transacting: trx + }) }) ) - - return Promise.all(newPromises.concat(oldPromises)) }) } /** diff --git a/test/server/utils.spec.js b/test/server/utils.spec.js index 639d5e0d..b1e33f83 100644 --- a/test/server/utils.spec.js +++ b/test/server/utils.spec.js @@ -98,6 +98,12 @@ describe('utils', () => { expect(kauan.isGraduating).toBeTruthy() expect(kauan.isConcluding).toBeFalsy() expect(kauan.cancelled).toBeFalsy() + + expect(felipe.mailingListToAdd).toEqual('active') + expect(laura.mailingListToAdd).toEqual('active') + expect(jose.mailingListToAdd).toEqual('concluding') + expect(enzo.mailingListToAdd).toEqual('none') + expect(kauan.mailingListToAdd).toEqual('active') }) test('batchUpdateStudents', async done => { @@ -164,6 +170,24 @@ describe('utils', () => { expect(kauan.isConcluding).toBeFalsy() expect(kauan.cancelled).toBeFalsy() + expect(felipe.mailingList).toEqual('none') + expect(laura.mailingList).toEqual('none') + expect(jose.mailingList).toEqual('none') + expect(enzo.mailingList).toEqual('none') + expect(kauan.mailingList).toEqual('none') + + expect(felipe.mailingListToAdd).toEqual('active') + expect(laura.mailingListToAdd).toEqual('active') + expect(jose.mailingListToAdd).toEqual('concluding') + expect(enzo.mailingListToAdd).toEqual('none') + expect(kauan.mailingListToAdd).toEqual('active') + + expect(felipe.mailingListToRemove).toEqual('none') + expect(laura.mailingListToRemove).toEqual('none') + expect(jose.mailingListToRemove).toEqual('none') + expect(enzo.mailingListToRemove).toEqual('none') + expect(kauan.mailingListToRemove).toEqual('none') + const dataUpdated = utils.parseCsv(exampleSigaaCsvNext) const digestedUpdated = utils.digestSigaaData(dataUpdated) await utils.batchUpdateStudents(digestedUpdated) @@ -233,6 +257,138 @@ describe('utils', () => { expect(julian.isConcluding).toBeTruthy() expect(julian.cancelled).toBeFalsy() + expect(felipeUpdated.mailingList).toEqual('none') + expect(lauraUpdated.mailingList).toEqual('none') + expect(joseUpdated.mailingList).toEqual('none') + expect(enzoUpdated.mailingList).toEqual('none') + expect(kauanUpdated.mailingList).toEqual('none') + expect(eduardo.mailingList).toEqual('none') + expect(julian.mailingList).toEqual('none') + + expect(felipeUpdated.mailingListToAdd).toEqual('active') + expect(lauraUpdated.mailingListToAdd).toEqual('concluding') + expect(joseUpdated.mailingListToAdd).toEqual('concluding') + expect(enzoUpdated.mailingListToAdd).toEqual('active') + expect(kauanUpdated.mailingListToAdd).toEqual('none') + expect(eduardo.mailingListToAdd).toEqual('active') + expect(julian.mailingListToAdd).toEqual('concluding') + + expect(felipeUpdated.mailingListToRemove).toEqual('none') + expect(lauraUpdated.mailingListToRemove).toEqual('none') + expect(joseUpdated.mailingListToRemove).toEqual('none') + expect(enzoUpdated.mailingListToRemove).toEqual('none') + expect(kauanUpdated.mailingListToRemove).toEqual('none') + expect(eduardo.mailingListToRemove).toEqual('none') + expect(julian.mailingListToRemove).toEqual('none') + + done() + }, 100000) + + test('batchUpdateStudents with consolidated emails', async done => { + /** + * Find a student by it's registrationNumber + * + * @param {object[]} students - Object of student from the database + * @param {string} registrationNumber - The wanted student's registrationNumber + * @return {object} The student + * + * @example + * + * const students = [{ registrationNumber: '123', name: 'test user' }] + * findByRegistrationNumber(students, '123') + */ + function findByRegistrationNumber(students, registrationNumber) { + return students.find(u => u.registrationNumber === registrationNumber) + } + + const data = utils.parseCsv(exampleSigaaCsv) + const digested = utils.digestSigaaData(data) + await utils.batchUpdateStudents(digested) + const models = await Student.fetchAll() + await Promise.all( + models.map(model => { + model.set('mailingList', model.get('mailingListToAdd')) + model.set('mailingListToAdd', 'none') + return model.save() + }) + ) + const students = (await Student.fetchAll()).toJSON() + + const [felipe, laura, jose, enzo, kauan] = [ + '201704940001', + '201304940002', + '200504940003', + '201104940004', + '200604940005' + ].map(registrationNumber => + findByRegistrationNumber(students, registrationNumber) + ) + + expect(students.length).toEqual(5) + + expect(felipe.mailingList).toEqual('active') + expect(laura.mailingList).toEqual('active') + expect(jose.mailingList).toEqual('concluding') + expect(enzo.mailingList).toEqual('none') + expect(kauan.mailingList).toEqual('active') + + expect(felipe.mailingListToAdd).toEqual('none') + expect(laura.mailingListToAdd).toEqual('none') + expect(jose.mailingListToAdd).toEqual('none') + expect(enzo.mailingListToAdd).toEqual('none') + expect(kauan.mailingListToAdd).toEqual('none') + + const dataUpdated = utils.parseCsv(exampleSigaaCsvNext) + const digestedUpdated = utils.digestSigaaData(dataUpdated) + await utils.batchUpdateStudents(digestedUpdated) + const studentsUpdated = (await Student.fetchAll()).toJSON() + + const [ + felipeUpdated, + lauraUpdated, + joseUpdated, + enzoUpdated, + kauanUpdated, + eduardo, + julian + ] = [ + '201704940001', + '201304940002', + '200504940003', + '201104940004', + '200604940005', + '201804940006', + '199604940007' + ].map(registrationNumber => + findByRegistrationNumber(studentsUpdated, registrationNumber) + ) + + expect(studentsUpdated.length).toEqual(7) + + expect(felipeUpdated.mailingList).toEqual('active') + expect(lauraUpdated.mailingList).toEqual('active') + expect(joseUpdated.mailingList).toEqual('concluding') + expect(enzoUpdated.mailingList).toEqual('none') + expect(kauanUpdated.mailingList).toEqual('active') + expect(eduardo.mailingList).toEqual('none') + expect(julian.mailingList).toEqual('none') + + expect(felipeUpdated.mailingListToAdd).toEqual('none') + expect(lauraUpdated.mailingListToAdd).toEqual('concluding') + expect(joseUpdated.mailingListToAdd).toEqual('none') + expect(enzoUpdated.mailingListToAdd).toEqual('active') + expect(kauanUpdated.mailingListToAdd).toEqual('none') + expect(eduardo.mailingListToAdd).toEqual('active') + expect(julian.mailingListToAdd).toEqual('concluding') + + expect(felipeUpdated.mailingListToRemove).toEqual('none') + expect(lauraUpdated.mailingListToRemove).toEqual('active') + expect(joseUpdated.mailingListToRemove).toEqual('none') + expect(enzoUpdated.mailingListToRemove).toEqual('none') + expect(kauanUpdated.mailingListToRemove).toEqual('active') + expect(eduardo.mailingListToRemove).toEqual('none') + expect(julian.mailingListToRemove).toEqual('none') + done() }, 100000)