Skip to content

Commit

Permalink
Adiciona base de comparação de lista de email
Browse files Browse the repository at this point in the history
  • Loading branch information
lubien authored and urielfcampos committed Jun 21, 2019
1 parent 77fdbad commit f39759d
Show file tree
Hide file tree
Showing 3 changed files with 200 additions and 45 deletions.
14 changes: 5 additions & 9 deletions migrations/20190506212942_students.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
const mailingList = ['none', 'active', 'concluding']

exports.up = function(knex, Promise) {
return knex.schema.createTable('students', table => {
table.increments('id').primary()
Expand Down Expand Up @@ -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()
Expand Down
75 changes: 39 additions & 36 deletions server/utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -83,7 +84,8 @@ exports.digestSigaaData = function digestSigaaData(data) {
isGraduating: false,
academicHighlight: false,
cancelled: false,
prescribed: false
prescribed: false,
mailingListToAdd: 'none'
}

const translateStatus = {
Expand All @@ -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
}

Expand Down Expand Up @@ -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))
})
}
/**
Expand Down
156 changes: 156 additions & 0 deletions test/server/utils.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -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 => {
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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)

Expand Down

0 comments on commit f39759d

Please sign in to comment.