Skip to content

Commit 62e3547

Browse files
committed
feat(mon-domifa): create all accounts in one shot
1 parent c44971f commit 62e3547

File tree

39 files changed

+1005
-166
lines changed

39 files changed

+1005
-166
lines changed
44 Bytes
Binary file not shown.

_scripts/db/dumps/domifa_test.postgres.restore-data-only.sql

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -336,9 +336,9 @@ f1d8975b-e429-41db-9246-bb2b388aece6 2025-04-15 20:14:04.704668+02 2025-04-15 20
336336
-- Data for Name: user_usager; Type: TABLE DATA; Schema: public; Owner: -
337337
--
338338
339-
COPY public.user_usager (uuid, "createdAt", "updatedAt", version, id, "usagerUUID", "structureId", login, password, salt, "isTemporaryPassword", "lastLogin", "passwordLastUpdate", "lastPasswordResetDate", "lastPasswordResetStructureUser", enabled, "acceptTerms") FROM stdin;
340-
a03a9a49-ae31-4160-9879-bab02dc46361 2021-11-30 14:50:26.278073+01 2023-11-20 16:40:58.362384+01 17 2 97b7e840-0e93-4bf4-ba7d-0a406aa898f2 1 LNQIFFBK $2a$10$/MxpSdJoHG59JaksJx5eSe4U1tHGcVoHEvlDRoi.AsVW2LlybKNnG $2a$10$zmuPXxUOuQJ7nE6ag4.x6e f 2023-11-20 16:40:58.36+01 2021-11-30 15:01:39.675+01 2021-11-30 14:50:26.275+01 {"userId": 1, "userName": "Patrick Roméro"} t \N
341-
a657f4bd-e4d1-4c38-bdd0-ffd268b356df 2021-10-05 11:34:41.369505+02 2023-12-18 17:54:10.81286+01 19 1 b2c26e55-ab37-457d-b307-6fe161050a9b 1 WKYJBDXS $2a$10$1rKKqmxsaIKyNkyZpm5QHufHZ8JfCSgEtaLOv07oy2QE.O8msCVPO $2a$10$1rKKqmxsaIKyNkyZpm5QHu t 2021-11-30 15:02:07.69+01 \N 2021-10-05 11:34:41.365+02 {"userId": 1, "userName": "Patrick Roméro"} t \N
339+
COPY public.user_usager (uuid, "createdAt", "updatedAt", version, id, "usagerUUID", "structureId", login, password, salt, "isTemporaryPassword", "lastLogin", "passwordLastUpdate", "lastPasswordResetDate", "lastPasswordResetStructureUser", "acceptTerms", "isBirthDate") FROM stdin;
340+
a03a9a49-ae31-4160-9879-bab02dc46361 2021-11-30 14:50:26.278073+01 2023-11-20 16:40:58.362384+01 17 2 97b7e840-0e93-4bf4-ba7d-0a406aa898f2 1 LNQIFFBK $2a$10$/MxpSdJoHG59JaksJx5eSe4U1tHGcVoHEvlDRoi.AsVW2LlybKNnG $2a$10$zmuPXxUOuQJ7nE6ag4.x6e f 2023-11-20 16:40:58.36+01 2021-11-30 15:01:39.675+01 2021-11-30 14:50:26.275+01 {"userId": 1, "userName": "Patrick Roméro"} \N f
341+
a657f4bd-e4d1-4c38-bdd0-ffd268b356df 2021-10-05 11:34:41.369505+02 2023-12-18 17:54:10.81286+01 19 1 b2c26e55-ab37-457d-b307-6fe161050a9b 1 WKYJBDXS $2a$10$1rKKqmxsaIKyNkyZpm5QHufHZ8JfCSgEtaLOv07oy2QE.O8msCVPO $2a$10$1rKKqmxsaIKyNkyZpm5QHu t 2021-11-30 15:02:07.69+01 \N 2021-10-05 11:34:41.365+02 {"userId": 1, "userName": "Patrick Roméro"} \N f
342342
\.
343343
344344

_scripts/db/dumps/domifa_test.postgres.truncate-restore-data-only.sql

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -372,9 +372,9 @@ f1d8975b-e429-41db-9246-bb2b388aece6 2025-04-15 20:14:04.704668+02 2025-04-15 20
372372
-- Data for Name: user_usager; Type: TABLE DATA; Schema: public; Owner: -
373373
--
374374
375-
COPY public.user_usager (uuid, "createdAt", "updatedAt", version, id, "usagerUUID", "structureId", login, password, salt, "isTemporaryPassword", "lastLogin", "passwordLastUpdate", "lastPasswordResetDate", "lastPasswordResetStructureUser", enabled, "acceptTerms") FROM stdin;
376-
a03a9a49-ae31-4160-9879-bab02dc46361 2021-11-30 14:50:26.278073+01 2023-11-20 16:40:58.362384+01 17 2 97b7e840-0e93-4bf4-ba7d-0a406aa898f2 1 LNQIFFBK $2a$10$/MxpSdJoHG59JaksJx5eSe4U1tHGcVoHEvlDRoi.AsVW2LlybKNnG $2a$10$zmuPXxUOuQJ7nE6ag4.x6e f 2023-11-20 16:40:58.36+01 2021-11-30 15:01:39.675+01 2021-11-30 14:50:26.275+01 {"userId": 1, "userName": "Patrick Roméro"} t \N
377-
a657f4bd-e4d1-4c38-bdd0-ffd268b356df 2021-10-05 11:34:41.369505+02 2023-12-18 17:54:10.81286+01 19 1 b2c26e55-ab37-457d-b307-6fe161050a9b 1 WKYJBDXS $2a$10$1rKKqmxsaIKyNkyZpm5QHufHZ8JfCSgEtaLOv07oy2QE.O8msCVPO $2a$10$1rKKqmxsaIKyNkyZpm5QHu t 2021-11-30 15:02:07.69+01 \N 2021-10-05 11:34:41.365+02 {"userId": 1, "userName": "Patrick Roméro"} t \N
375+
COPY public.user_usager (uuid, "createdAt", "updatedAt", version, id, "usagerUUID", "structureId", login, password, salt, "isTemporaryPassword", "lastLogin", "passwordLastUpdate", "lastPasswordResetDate", "lastPasswordResetStructureUser", "acceptTerms", "isBirthDate") FROM stdin;
376+
a03a9a49-ae31-4160-9879-bab02dc46361 2021-11-30 14:50:26.278073+01 2023-11-20 16:40:58.362384+01 17 2 97b7e840-0e93-4bf4-ba7d-0a406aa898f2 1 LNQIFFBK $2a$10$/MxpSdJoHG59JaksJx5eSe4U1tHGcVoHEvlDRoi.AsVW2LlybKNnG $2a$10$zmuPXxUOuQJ7nE6ag4.x6e f 2023-11-20 16:40:58.36+01 2021-11-30 15:01:39.675+01 2021-11-30 14:50:26.275+01 {"userId": 1, "userName": "Patrick Roméro"} \N f
377+
a657f4bd-e4d1-4c38-bdd0-ffd268b356df 2021-10-05 11:34:41.369505+02 2023-12-18 17:54:10.81286+01 19 1 b2c26e55-ab37-457d-b307-6fe161050a9b 1 WKYJBDXS $2a$10$1rKKqmxsaIKyNkyZpm5QHufHZ8JfCSgEtaLOv07oy2QE.O8msCVPO $2a$10$1rKKqmxsaIKyNkyZpm5QHu t 2021-11-30 15:02:07.69+01 \N 2021-10-05 11:34:41.365+02 {"userId": 1, "userName": "Patrick Roméro"} \N f
378378
\.
379379
380380

packages/backend/src/_common/model/app-log/LogAction.type.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ export type LogAction =
1515
// Mon DomiFa
1616
| "MON_DOMIFA_DOWNLOAD_DOC"
1717
| "MON_DOMIFA_DOWNLOAD_DOC_TRY"
18+
| "MON_DOMIFA_CREATE_PORTAIL_ACCOUNT_BULK"
1819
///
1920
| "EXPORT_USAGERS"
2021
| "GET_STATS"
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import { MigrationInterface, QueryRunner } from "typeorm";
2+
import { domifaConfig } from "../config";
3+
4+
export class AddIsBirthDateToUserUsager1754929500000
5+
implements MigrationInterface
6+
{
7+
name = "AddIsBirthDateToUserUsager1754929500000";
8+
9+
public async up(queryRunner: QueryRunner): Promise<void> {
10+
if (
11+
domifaConfig().envId === "prod" ||
12+
domifaConfig().envId === "preprod" ||
13+
domifaConfig().envId === "dev" ||
14+
domifaConfig().envId === "local"
15+
) {
16+
await queryRunner.query(
17+
` ALTER TABLE "user_usager" ADD COLUMN "isBirthDate" boolean NOT NULL DEFAULT false`
18+
);
19+
20+
await queryRunner.query(
21+
` ALTER TABLE "user_usager" DROP COLUMN "enabled" `
22+
);
23+
}
24+
}
25+
26+
public async down(queryRunner: QueryRunner): Promise<void> {
27+
await queryRunner.query(`
28+
ALTER TABLE "user_usager"
29+
DROP COLUMN "isBirthDate"
30+
`);
31+
}
32+
}

packages/backend/src/_migrations/_init-db/domifa_test_schema.sql

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -510,8 +510,8 @@ CREATE TABLE public.user_usager (
510510
"passwordLastUpdate" timestamp with time zone,
511511
"lastPasswordResetDate" timestamp with time zone,
512512
"lastPasswordResetStructureUser" jsonb,
513-
enabled boolean DEFAULT false NOT NULL,
514-
"acceptTerms" timestamp with time zone
513+
"acceptTerms" timestamp with time zone,
514+
"isBirthDate" boolean DEFAULT false NOT NULL
515515
);
516516
CREATE SEQUENCE public.user_usager_id_seq
517517
AS integer

packages/backend/src/database/entities/user-usager/UserUsagerTable.typeorm.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,12 +63,12 @@ export class UserUsagerTable
6363
@Column({ type: "jsonb", nullable: true })
6464
lastPasswordResetStructureUser: UserStructureResume;
6565

66-
@Column({ type: "boolean", default: false })
67-
enabled: boolean;
68-
6966
@Column({ type: "timestamptz", nullable: true })
7067
acceptTerms: Date;
7168

69+
@Column({ type: "boolean", default: true })
70+
isBirthDate: boolean;
71+
7272
public constructor(entity?: Partial<UserUsagerTable>) {
7373
super(entity);
7474
Object.assign(this, entity);

packages/backend/src/database/services/usager/usagerRepository.service.ts

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1-
import { PortailUsagerPublic, Usager } from "@domifa/common";
1+
import {
2+
PortailUsagerPublic,
3+
Usager,
4+
UsagersCountByStatus,
5+
} from "@domifa/common";
26

37
import { myDataSource } from "..";
48
import { UsagerTable } from "../../entities";
@@ -25,8 +29,42 @@ export const usagerRepository = myDataSource
2529
findLastFiveCustomRef,
2630
getUserUsagerData,
2731
countTotalActifs,
32+
countUsagersByStatus,
2833
});
2934

35+
async function countUsagersByStatus(
36+
structureId: number,
37+
includePortailUsagerEnabled: boolean = false
38+
): Promise<UsagersCountByStatus> {
39+
const portailCondition = includePortailUsagerEnabled
40+
? `AND options ->> 'portailUsagerEnabled' = 'true'`
41+
: "";
42+
43+
const query = `
44+
SELECT
45+
COUNT(*) FILTER (WHERE statut = 'INSTRUCTION') AS instruction_count,
46+
COUNT(*) FILTER (WHERE statut = 'VALIDE') AS valide_count,
47+
COUNT(*) FILTER (WHERE statut = 'ATTENTE_DECISION') AS attente_count,
48+
COUNT(*) FILTER (WHERE statut = 'REFUS') AS refus_count,
49+
COUNT(*) FILTER (WHERE statut = 'RADIE') AS radie_count,
50+
COUNT(*) AS tous_count
51+
FROM usager
52+
WHERE "structureId" = $1
53+
${portailCondition}
54+
`;
55+
56+
const [result] = await myDataSource.query(query, [structureId]);
57+
58+
return {
59+
INSTRUCTION: parseInt(result.instruction_count || "0", 10),
60+
VALIDE: parseInt(result.valide_count || "0", 10),
61+
ATTENTE_DECISION: parseInt(result.attente_count || "0", 10),
62+
REFUS: parseInt(result.refus_count || "0", 10),
63+
RADIE: parseInt(result.radie_count || "0", 10),
64+
TOUS: parseInt(result.tous_count || "0", 10),
65+
};
66+
}
67+
3068
export async function getUserUsagerData({
3169
usagerUUID,
3270
}: {
Lines changed: 59 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,62 @@
1+
import { UserUsagerWithUsagerInfo } from "@domifa/common";
2+
import { PageOptionsDto } from "../../../usagers/dto";
13
import { UserUsagerTable } from "../../entities";
24
import { myDataSource } from "../_postgres";
5+
import { UserStructureAuthenticated } from "../../../_common/model";
36

4-
export const userUsagerRepository = myDataSource.getRepository(UserUsagerTable);
7+
export const userUsagerRepository = myDataSource
8+
.getRepository(UserUsagerTable)
9+
.extend({
10+
async getAccountsWithUsagerInfo(
11+
currentUser: UserStructureAuthenticated,
12+
options?: PageOptionsDto,
13+
isExport = false
14+
): Promise<{
15+
entities: UserUsagerWithUsagerInfo[];
16+
itemCount: number;
17+
}> {
18+
const queryBuilder = this.createQueryBuilder("user_usager")
19+
.leftJoinAndSelect(
20+
"usager",
21+
"usager",
22+
"user_usager.usagerUUID = usager.uuid"
23+
)
24+
.where("user_usager.structureId = :structureId", {
25+
structureId: currentUser.structureId,
26+
})
27+
.select([
28+
`user_usager.createdAt as "createdAt"`,
29+
`user_usager.updatedAt as "updatedAt"`,
30+
`user_usager.login as "login"`,
31+
`user_usager.isTemporaryPassword as "isTemporaryPassword"`,
32+
`user_usager.lastLogin as "lastLogin"`,
33+
`user_usager.passwordLastUpdate as "passwordLastUpdate"`,
34+
`user_usager.enabled as "enabled"`,
35+
`user_usager.isBirthDate as "isBirthDate"`,
36+
`usager.nom as "nom"`,
37+
`usager.prenom as "prenom"`,
38+
`usager.telephone as "telephone"`,
39+
`usager.dateNaissance as "dateNaissance"`,
40+
]);
41+
const itemCount = await queryBuilder.getCount();
42+
43+
if (isExport) {
44+
// Pour l'export, on prend tout avec une limite haute et on ordonne par dateInteraction
45+
queryBuilder.orderBy(`user_usager."createdAt"`, "DESC").limit(100000);
46+
}
47+
console.log({ options, isExport });
48+
if (options) {
49+
queryBuilder
50+
.orderBy("user_usager.createdAt", options.order)
51+
.offset((options.page - 1) * options.take)
52+
.limit(options.take);
53+
}
54+
55+
const entities = await queryBuilder.getRawMany();
56+
57+
return {
58+
entities,
59+
itemCount,
60+
};
61+
},
62+
});

packages/backend/src/modules/open-data/services/update-open-data-places/update-open-data-places.service.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import { Cron } from "@nestjs/schedule";
33
import { domifaConfig } from "../../../../config";
44
import { isCronEnabled } from "../../../../config/services/isCronEnabled.service";
55
import { loadDomifaData } from "../import-data/load-domifa";
6-
import { loadMssData } from "../import-data/load-mss";
76
import { loadSoliguideData } from "../import-data/load-soliguide";
87

98
@Injectable()
@@ -15,6 +14,5 @@ export class UpdateOpenDataPlacesService {
1514
protected async loadOpenDataPlaces() {
1615
await loadDomifaData();
1716
await loadSoliguideData();
18-
await loadMssData();
1917
}
2018
}

0 commit comments

Comments
 (0)