Skip to content

Commit 5181db8

Browse files
[TECH] Les types de colonnes ne sont pas corrects sur le datamart Parcoursup de dev (PIX-16800).
#11550
2 parents b6f546e + 8ace9d3 commit 5181db8

9 files changed

+94
-34
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
const FIRST_DATAMART_TABLE_NAME = 'data_export_parcoursup_certif_result';
2+
const SECOND_DATAMART_TABLE_NAME = 'data_export_parcoursup_certif_result_code_validation';
3+
4+
/**
5+
* @param { import("knex").Knex } knex
6+
* @returns { Promise<void> }
7+
*/
8+
const up = async function (knex) {
9+
await knex.schema.alterTable(FIRST_DATAMART_TABLE_NAME, function (table) {
10+
table.text('area_name').alter();
11+
table.integer('certification_courses_id').alter();
12+
table.text('competence_code').alter();
13+
table.text('competence_name').alter();
14+
});
15+
16+
await knex.schema.alterTable(SECOND_DATAMART_TABLE_NAME, function (table) {
17+
table.integer('certification_courses_id').alter();
18+
table.string('national_student_id', 50).alter();
19+
table.string('organization_uai', 50).alter();
20+
});
21+
};
22+
23+
/**
24+
* @returns { Promise<void> }
25+
*/
26+
const down = async function () {
27+
// there are no reasons to go back to previous state as the columns types were utterly wrong
28+
};
29+
30+
export { down, up };

api/datamart/seeds/cases/ine-ok.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import { faker } from '@faker-js/faker';
22

33
import {
4+
certificationCourseIdGenerator,
45
COMPETENCES,
5-
generateCertifCourseId,
66
generateCompetenceLevel,
77
generateFirstName,
88
generatePixScore,
@@ -12,6 +12,7 @@ import {
1212
nationalStudentIdGenerator,
1313
} from './tools.js';
1414

15+
const generateCertifCourseId = certificationCourseIdGenerator({ startingFrom: 1100000 });
1516
const generateINE = nationalStudentIdGenerator({ ineSuffix: 'AA' });
1617

1718
/**

api/datamart/seeds/cases/same-ine-different-person.js

+5-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import { faker } from '@faker-js/faker';
22

33
import {
4+
certificationCourseIdGenerator,
45
COMPETENCES,
5-
generateCertifCourseId,
66
generateCompetenceLevel,
77
generateFirstName,
88
generatePixScore,
@@ -13,6 +13,8 @@ import {
1313
orgaUAIGenerator,
1414
} from './tools.js';
1515

16+
const generateCertifCourseIdStudentOne = certificationCourseIdGenerator({ startingFrom: 3100000 });
17+
const generateCertifCourseIdStudentTwo = certificationCourseIdGenerator({ startingFrom: 4100000 });
1618
const generateINE = nationalStudentIdGenerator({ ineSuffix: 'CC' });
1719
const generateOrgaUai = orgaUAIGenerator();
1820

@@ -23,7 +25,7 @@ export default function () {
2325
const sameINE = generateINE();
2426

2527
const studentOneBase = {
26-
certification_courses_id: generateCertifCourseId(),
28+
certification_courses_id: generateCertifCourseIdStudentOne(),
2729
organization_uai: generateOrgaUai(),
2830
national_student_id: sameINE,
2931
last_name: faker.person.lastName(),
@@ -35,7 +37,7 @@ export default function () {
3537
};
3638

3739
const studentTwoBase = {
38-
certification_courses_id: generateCertifCourseId(),
40+
certification_courses_id: generateCertifCourseIdStudentTwo(),
3941
organization_uai: generateOrgaUai(),
4042
national_student_id: sameINE,
4143
last_name: faker.person.lastName(),

api/datamart/seeds/cases/same-person-different-birthdate.js

+5-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import { faker } from '@faker-js/faker';
22

33
import {
4+
certificationCourseIdGenerator,
45
COMPETENCES,
5-
generateCertifCourseId,
66
generateCompetenceLevel,
77
generateFirstName,
88
generatePixScore,
@@ -13,6 +13,8 @@ import {
1313
orgaUAIGenerator,
1414
} from './tools.js';
1515

16+
const generateCertifCourseIdStudentOne = certificationCourseIdGenerator({ startingFrom: 5100000 });
17+
const generateCertifCourseIdStudentTwo = certificationCourseIdGenerator({ startingFrom: 6100000 });
1618
const generateINE = nationalStudentIdGenerator({ ineSuffix: 'BB' });
1719
const generateOrgaUai = orgaUAIGenerator();
1820

@@ -28,7 +30,7 @@ export default function () {
2830
const sameLastName = faker.person.lastName();
2931

3032
const studentOneBase = {
31-
certification_courses_id: generateCertifCourseId(),
33+
certification_courses_id: generateCertifCourseIdStudentOne(),
3234
organization_uai: sameUAI,
3335
national_student_id: sameINE,
3436
last_name: sameLastName,
@@ -40,7 +42,7 @@ export default function () {
4042
};
4143

4244
const studentTwoBase = {
43-
certification_courses_id: generateCertifCourseId(),
45+
certification_courses_id: generateCertifCourseIdStudentTwo(),
4446
organization_uai: sameUAI,
4547
national_student_id: sameINE,
4648
last_name: sameLastName,

api/datamart/seeds/cases/special-names.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
import {
2+
certificationCourseIdGenerator,
23
COMPETENCES,
3-
generateCertifCourseId,
44
generateCompetenceLevel,
55
generatePixScore,
66
generateStatus,
77
getCertificationDate,
88
} from './tools.js';
99

10+
const generateCertifCourseId = certificationCourseIdGenerator({ startingFrom: 8100000 });
11+
1012
/**
1113
* A student that has multiple accents in its first name and last name
1214
*/

api/datamart/seeds/cases/tools.js

+4-3
Original file line numberDiff line numberDiff line change
@@ -107,8 +107,9 @@ const generateStatus = () => {
107107
]);
108108
};
109109

110-
const generateCertifCourseId = () => {
111-
return Date.now() + faker.number.int(10);
110+
const certificationCourseIdGenerator = ({ startingFrom = 1000 }) => {
111+
const certifCourseIdGenerator = incrementalGenerator(startingFrom);
112+
return () => certifCourseIdGenerator.next().value;
112113
};
113114

114115
const generateCompetenceLevel = () => {
@@ -120,8 +121,8 @@ const generatePixScore = () => {
120121
};
121122

122123
export {
124+
certificationCourseIdGenerator,
123125
COMPETENCES,
124-
generateCertifCourseId,
125126
generateCompetenceLevel,
126127
generateFirstName,
127128
generatePixScore,

api/datamart/seeds/cases/uai-ok.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
import {
2+
certificationCourseIdGenerator,
23
COMPETENCES,
3-
generateCertifCourseId,
44
generateCompetenceLevel,
55
generatePixScore,
66
generateStatus,
77
getCertificationDate,
88
orgaUAIGenerator,
99
} from './tools.js';
1010

11+
const generateCertifCourseId = certificationCourseIdGenerator({ startingFrom: 2100000 });
1112
const generateOrgaUai = orgaUAIGenerator();
1213

1314
/**

api/datamart/seeds/cases/verification-code-only.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import { faker } from '@faker-js/faker';
22

33
import {
4+
certificationCourseIdGenerator,
45
COMPETENCES,
5-
generateCertifCourseId,
66
generateCompetenceLevel,
77
generateFirstName,
88
generatePixScore,
@@ -12,6 +12,7 @@ import {
1212
verificationCodeGenerator,
1313
} from './tools.js';
1414

15+
const generateCertifCourseId = certificationCourseIdGenerator({ startingFrom: 1000000 });
1516
const generateVerificationCode = verificationCodeGenerator();
1617

1718
/**
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { faker } from '@faker-js/faker';
22

3+
import { logger } from '../../src/shared/infrastructure/utils/logger.js';
34
import caseINEok from './cases/ine-ok.js';
45
import caseSameINEDifferentPerson from './cases/same-ine-different-person.js';
56
import caseSamePersonDifferentBirthdate from './cases/same-person-different-birthdate.js';
@@ -12,34 +13,53 @@ const NUMBER_OF_SEEDS = Number(process.env.DATAMART_NUMBER_OF_SEEDS) || 100;
1213
const insertScoDatamart = async (knex) => {
1314
const scoDatamart = 'data_export_parcoursup_certif_result';
1415

15-
// Case 1 : INE ok
16-
await knex.batchInsert(scoDatamart, faker.helpers.multiple(caseINEok, { count: NUMBER_OF_SEEDS }).flat());
17-
// Case 2 : UAI ok
18-
await knex.batchInsert(scoDatamart, faker.helpers.multiple(caseUAIok, { count: NUMBER_OF_SEEDS }).flat());
19-
// Case 3 : Same INE different persons
20-
await knex.batchInsert(
21-
scoDatamart,
22-
faker.helpers.multiple(caseSameINEDifferentPerson, { count: NUMBER_OF_SEEDS }).flat(),
23-
);
24-
// Case 4 : Same person but different birthdate
25-
await knex.batchInsert(
26-
scoDatamart,
27-
faker.helpers.multiple(caseSamePersonDifferentBirthdate, { count: NUMBER_OF_SEEDS }).flat(),
28-
);
29-
// Case 5 : Complicated names (accents, dashes)
30-
await knex.batchInsert(scoDatamart, faker.helpers.multiple(caseSpecialNames, { count: 1 }).flat());
16+
logger.info('Start Case 1 : INE ok');
17+
await _chunkify({ numberOfSeeds: NUMBER_OF_SEEDS, knex, datamart: scoDatamart, generateFn: caseINEok });
18+
19+
logger.info('Start Case 2 : UAI ok');
20+
await _chunkify({ numberOfSeeds: NUMBER_OF_SEEDS, knex, datamart: scoDatamart, generateFn: caseUAIok });
21+
22+
logger.info('Start Case 3 : Same INE different persons');
23+
await _chunkify({
24+
numberOfSeeds: NUMBER_OF_SEEDS,
25+
knex,
26+
datamart: scoDatamart,
27+
generateFn: caseSameINEDifferentPerson,
28+
});
29+
30+
logger.info('Start Case 4 : Same person but different birthdate');
31+
await _chunkify({
32+
numberOfSeeds: NUMBER_OF_SEEDS,
33+
knex,
34+
datamart: scoDatamart,
35+
generateFn: caseSamePersonDifferentBirthdate,
36+
});
37+
38+
logger.info('Start Case 5 : Complicated names (accents, dashes');
39+
await _chunkify({ numberOfSeeds: NUMBER_OF_SEEDS, knex, datamart: scoDatamart, generateFn: caseSpecialNames });
3140
};
3241

3342
const insertGeneralPublicDatamart = async (knex) => {
43+
logger.info('Start Case 6 : Verification code OK');
3444
const generalPublicDatamart = 'data_export_parcoursup_certif_result_code_validation';
35-
await knex(generalPublicDatamart).truncate();
36-
await knex.batchInsert(
37-
generalPublicDatamart,
38-
faker.helpers.multiple(caseVerificationCodeOK, { count: NUMBER_OF_SEEDS }).flat(),
39-
);
45+
await _chunkify({
46+
numberOfSeeds: NUMBER_OF_SEEDS,
47+
knex,
48+
datamart: generalPublicDatamart,
49+
generateFn: caseVerificationCodeOK,
50+
});
4051
};
4152

4253
export async function seed(knex) {
4354
await insertScoDatamart(knex);
4455
await insertGeneralPublicDatamart(knex);
4556
}
57+
58+
const _chunkify = async ({ numberOfSeeds, knex, datamart, generateFn }) => {
59+
const chunkSize = 100;
60+
let remaining = numberOfSeeds;
61+
do {
62+
await knex.batchInsert(datamart, faker.helpers.multiple(generateFn, { count: chunkSize }).flat());
63+
remaining = remaining - chunkSize;
64+
} while (remaining / chunkSize >= 1);
65+
};

0 commit comments

Comments
 (0)