From 91e3dfb153f725a74e2b49a92db9bfea2b890fbf Mon Sep 17 00:00:00 2001 From: lubien Date: Thu, 13 Jun 2019 00:56:06 -0300 Subject: [PATCH] =?UTF-8?q?Endpoint=20de=20listar=20altera=C3=A7=C3=B5es?= =?UTF-8?q?=20em=20listas=20de=20email?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- seeds/students.js | 21 ++++- server/controllers/students/EmailChanges.js | 49 ++++++++++++ server/controllers/students/index.js | 4 +- server/router.js | 1 + test/server/controllers/students.spec.js | 88 +++++++++++++++++++++ 5 files changed, 158 insertions(+), 5 deletions(-) create mode 100644 server/controllers/students/EmailChanges.js diff --git a/seeds/students.js b/seeds/students.js index cc7a3ad1..13f26adc 100644 --- a/seeds/students.js +++ b/seeds/students.js @@ -20,6 +20,8 @@ exports.seed = async function(knex, Promise) { cancelled: false, prescribed: false, mailingList: 'none', + mailingListToRemove: 'none', + mailingListToAdd: 'active', entryDate: '05-28-2019', advisor: 'Orientador VĂ¡lido', defenseDate: null, @@ -44,6 +46,8 @@ exports.seed = async function(knex, Promise) { cancelled: false, prescribed: false, mailingList: 'none', + mailingListToRemove: 'none', + mailingListToAdd: 'active', entryDate: '05-27-2019', advisor: null, defenseDate: null, @@ -67,7 +71,9 @@ exports.seed = async function(knex, Promise) { academicHighlight: false, cancelled: false, prescribed: false, - mailingList: 'none', + mailingList: 'active', + mailingListToRemove: 'active', + mailingListToAdd: 'concluding', entryDate: '01-28-2019', advisor: 'Mais um orientador', defenseDate: null, @@ -92,8 +98,9 @@ exports.seed = async function(knex, Promise) { cancelled: false, prescribed: false, mailingList: 'none', + mailingListToRemove: 'none', + mailingListToAdd: 'active', entryDate: '04-20-2019', - advisor: null, defenseDate: null, term: null, @@ -116,7 +123,9 @@ exports.seed = async function(knex, Promise) { academicHighlight: false, cancelled: true, prescribed: false, - mailingList: 'none', + mailingList: 'active', + mailingListToRemove: 'active', + mailingListToAdd: 'none', entryDate: '05-18-2018', advisor: null, defenseDate: null, @@ -141,6 +150,8 @@ exports.seed = async function(knex, Promise) { cancelled: false, prescribed: false, mailingList: 'none', + mailingListToRemove: 'none', + mailingListToAdd: 'active', entryDate: null, advisor: null, defenseDate: null, @@ -164,7 +175,9 @@ exports.seed = async function(knex, Promise) { academicHighlight: false, cancelled: false, prescribed: false, - mailingList: 'none', + mailingList: 'active', + mailingListToRemove: 'active', + mailingListToAdd: 'concluding', entryDate: '02-01-2019', advisor: null, defenseDate: null, diff --git a/server/controllers/students/EmailChanges.js b/server/controllers/students/EmailChanges.js new file mode 100644 index 00000000..eccb70e0 --- /dev/null +++ b/server/controllers/students/EmailChanges.js @@ -0,0 +1,49 @@ +const Student = require('../../models/Student') +const Solicitation = require('../../models/Solicitation') +const errors = require('../../../shared/errors') + +module.exports = async function emailChanges(ctx) { + const { mailingList } = ctx.request.query + if ( + mailingList === undefined || + !['active', 'concluding', 'freshman'].includes(mailingList) + ) { + ctx.status = 400 + ctx.body = { code: errors.INVALID_FILTER, filter: 'mailingList' } + return + } + + const promises = [ + Student.where('mailingListToAdd', mailingList).fetchAll(), + Student.where('mailingListToRemove', mailingList).fetchAll() + ] + + if (['concluding', 'freshman'].includes(mailingList)) { + promises.push(Solicitation.where('type', mailingList).fetchAll()) + } + + const [ + additionsViaApp, + deletionsViaApp, + additionsViaSolicitations = [] + ] = await Promise.all(promises) + + const prepare = models => + models.toJSON + ? models.toJSON().map(({ name, email }) => ({ + name, + email + })) + : [] + + const additions = prepare(additionsViaApp).concat( + prepare(additionsViaSolicitations) + ) + const deletions = prepare(deletionsViaApp) + + ctx.status = 200 + ctx.body = { + additions, + deletions + } +} diff --git a/server/controllers/students/index.js b/server/controllers/students/index.js index a03106bd..931bd92b 100644 --- a/server/controllers/students/index.js +++ b/server/controllers/students/index.js @@ -4,6 +4,7 @@ const FromCsv = require('./FromCsv') const Update = require('./Update') const ActiveMailList = require('./ActiveMailList') const UpdateAcademicHighlight = require('./UpdateAcademicHighlight') +const EmailChanges = require('./EmailChanges') module.exports = { List, @@ -11,5 +12,6 @@ module.exports = { FromCsv, Update, ActiveMailList, - UpdateAcademicHighlight + UpdateAcademicHighlight, + EmailChanges } diff --git a/server/router.js b/server/router.js index a3ce3f37..780d34a4 100644 --- a/server/router.js +++ b/server/router.js @@ -30,6 +30,7 @@ api.get('/users/:id', users.Show) api.post('/users/', bodyJson, users.Create) // Student Routes +api.get('/students/email-changes', students.EmailChanges) api.get('/students/actives-mailing-list', students.ActiveMailList) api.get('/students/', students.List) api.get('/students/:id', students.Show) diff --git a/test/server/controllers/students.spec.js b/test/server/controllers/students.spec.js index bdf2113f..b273bb8d 100644 --- a/test/server/controllers/students.spec.js +++ b/test/server/controllers/students.spec.js @@ -1152,4 +1152,92 @@ describe('/api/students', () => { expect(res1.body[1].academicHighlight).toEqual(1) done() }) + test('GET /email-changes?mailingList=active', async done => { + const { token } = await testUtils.user('admin') + const res = await chai + .request(server.listen()) + .get('/api/students/email-changes') + .query({ mailingList: 'active' }) + .set('Authorization', `Bearer ${token}`) + expect(res.status).toEqual(200) + expect(res.type).toEqual('application/json') + expect(res.body).toBeDefined() + expect(res.body.additions.length).toBeDefined() + expect(res.body.deletions.length).toBeDefined() + + expect( + [ + 'FELIPE SOUZA FERREIRA', + 'LAURA CARDOSO CASTRO', + 'ENZO FERREIRA ALVES', + 'EDUARDO ALVES LIMA' + ].filter( + name => !res.body.additions.find(student => student.name === name) + ) + ).toEqual([]) + + expect( + [ + 'JOSE FERREIRA SILVA', + 'KAUAN CARVALHO SANTOS', + 'JULIAN BARBOSA SANTOS' + ].filter( + name => !res.body.deletions.find(student => student.name === name) + ) + ).toEqual([]) + + done() + }) +}) + +test('GET /email-changes?mailingList=concluding', async done => { + const { token } = await testUtils.user('admin') + + const res = await chai + .request(server.listen()) + .get('/api/students/email-changes') + .query({ mailingList: 'concluding' }) + .set('Authorization', `Bearer ${token}`) + expect(res.status).toEqual(200) + expect(res.type).toEqual('application/json') + expect(res.body).toBeDefined() + expect(res.body.additions.length).toBeDefined() + expect(res.body.deletions.length).toBeDefined() + expect(res.body.deletions.length).toEqual(0) + + expect( + [ + 'JOSE FERREIRA SILVA', + 'JULIAN BARBOSA SANTOS', + 'Ana Goncalves Gomes', + 'Gabriela Dias Cunha', + 'Rodrigo Rodrigues Santos' + ].filter(name => !res.body.additions.find(student => student.name === name)) + ).toEqual([]) + + done() +}) + +test('GET /email-changes?mailingList=freshman', async done => { + const { token } = await testUtils.user('admin') + + const res = await chai + .request(server.listen()) + .get('/api/students/email-changes') + .query({ mailingList: 'freshman' }) + .set('Authorization', `Bearer ${token}`) + expect(res.status).toEqual(200) + expect(res.type).toEqual('application/json') + expect(res.body).toBeDefined() + expect(res.body.additions.length).toBeDefined() + expect(res.body.deletions.length).toBeDefined() + expect(res.body.deletions.length).toEqual(0) + + expect( + ['Victor Silva Carvalho', 'Marisa Correia Castro'].filter( + name => !res.body.additions.find(student => student.name === name) + ) + ).toEqual([]) + + done() })