From 659067a280663e22eac5e746b3819879e5090cc4 Mon Sep 17 00:00:00 2001 From: Vins Date: Tue, 3 Oct 2023 09:48:15 +0200 Subject: [PATCH 1/4] fixed --- src/common/emails/EmailBuilder.ts | 10 +++---- .../MailchimpService/MailchimpService.ts | 28 +++++++++---------- 2 files changed, 18 insertions(+), 20 deletions(-) diff --git a/src/common/emails/EmailBuilder.ts b/src/common/emails/EmailBuilder.ts index ee3926b6..bb41d029 100644 --- a/src/common/emails/EmailBuilder.ts +++ b/src/common/emails/EmailBuilder.ts @@ -1,7 +1,7 @@ import DocumentsService from "@Services/super-admin/DocumentsService/DocumentsService"; import { Documents } from "@prisma/client"; -import { Document } from "le-coffre-resources/dist/SuperAdmin"; +import User, { Document } from "le-coffre-resources/dist/SuperAdmin"; import { Service } from "typedi"; import { ETemplates } from "./Templates/EmailTemplates"; import MailchimpService from "@Services/common/MailchimpService/MailchimpService"; @@ -48,14 +48,14 @@ export default class EmailBuilder { }); } - public async sendRecapEmails(usersToEmail: [{email: string, civility: string, last_name: string}]){ + public async sendRecapEmails(usersToEmail: User[]){ usersToEmail.forEach(user => { - const to = user.email; - const civility = this.getCivility(user.civility); + const to = user.contact!.email; + const civility = this.getCivility(user.contact!.civility); const templateVariables = { civility: civility, - last_name: user.last_name, + last_name: user.contact!.last_name, link: this.variables.APP_HOST }; diff --git a/src/services/common/MailchimpService/MailchimpService.ts b/src/services/common/MailchimpService/MailchimpService.ts index 1b9833be..8f9f5f5e 100644 --- a/src/services/common/MailchimpService/MailchimpService.ts +++ b/src/services/common/MailchimpService/MailchimpService.ts @@ -1,17 +1,22 @@ import EmailRepository from "@Repositories/EmailRepository"; import BaseService from "@Services/BaseService"; -import { Emails, PrismaClient } from "@prisma/client"; +import { Emails } from "@prisma/client"; import { Service } from "typedi"; import MailchimpClient from "@mailchimp/mailchimp_transactional"; import { BackendVariables } from "@Common/config/variables/Variables"; +import UsersService from "@Services/super-admin/UsersService/UsersService"; import EmailBuilder from "@Common/emails/EmailBuilder"; -// import DocumentsService from "@Services/super-admin/DocumentsService/DocumentsService"; @Service() export default class MailchimpService extends BaseService { private static readonly from = "vincent.alamelle@smart-chain.fr"; - constructor(private emailRepository: EmailRepository, protected variables: BackendVariables, private emailBuilder: EmailBuilder) { + constructor( + private emailRepository: EmailRepository, + protected variables: BackendVariables, + private usersService: UsersService, + private emailBuilder: EmailBuilder, + ) { super(); } @@ -52,7 +57,7 @@ export default class MailchimpService extends BaseService { * @description : Function called by cron to send emails * @throws {Error} If email cannot be sent */ - public async sendEmails() { + public async sendEmails() { const emailsToSend = await this.get({ where: { sentAt: null } }); const currentDate = new Date(); let nextTrySendDate = null; @@ -85,8 +90,8 @@ export default class MailchimpService extends BaseService { } } - private async sendEmail(email: Emails) { - const apiKey = this.variables.MAILCHIMP_API_KEY; + private async sendEmail(email: Emails) { + const apiKey = this.variables.MAILCHIMP_API_KEY; const mailchimpApiClient = MailchimpClient(apiKey!); await mailchimpApiClient.messages.sendTemplate({ @@ -117,15 +122,8 @@ export default class MailchimpService extends BaseService { } public async sendRecapEmails() { - const prisma = new PrismaClient(); - const usersToEmail: [{email: string, civility: string, last_name: string}] = await prisma.$queryRaw - `SELECT DISTINCT c.email, c.civility, c.last_name - FROM Contacts c - JOIN Users u ON c.uid = u.contact_uid - JOIN office_folders of ON u.office_uid = of.office_uid - JOIN Documents d ON of.uid = d.folder_uid - WHERE d.document_status = 'DEPOSITED';` - + const usersToEmail = await this.usersService.get({ where: { office_folders: { some:{ documents: { some: { document_status: "DEPOSITED" } } }} }, distinct: ["uid"], include: { contact: true } }); + await this.emailBuilder.sendRecapEmails(usersToEmail); } } From 55797019ec3d4d2a9260b047fb2796e8c7c6f6e6 Mon Sep 17 00:00:00 2001 From: Vins Date: Tue, 3 Oct 2023 09:50:02 +0200 Subject: [PATCH 2/4] Changed expiring document cron timer --- src/services/common/CronService/CronService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/common/CronService/CronService.ts b/src/services/common/CronService/CronService.ts index f184d6e0..c37c6860 100644 --- a/src/services/common/CronService/CronService.ts +++ b/src/services/common/CronService/CronService.ts @@ -80,7 +80,7 @@ export default class CronService { } public async checkDocumentsExpiration() { - const cronJob = new CronJob("*/10 * * * * *", async () => { + const cronJob = new CronJob("0 20 * * *", async () => { // Once a day at midnight try { const prisma = new PrismaClient(); From ef4cb3f5fa072fe36a6ec1e8061a58021657ffcb Mon Sep 17 00:00:00 2001 From: Maxime Lalo Date: Tue, 3 Oct 2023 11:21:25 +0200 Subject: [PATCH 3/4] :sparkles: Creating get of anchors --- .../notary/OfficeFolderAnchorsController.ts | 39 ++++++++++++++++++- .../OfficeFolderAnchorsRepository.ts | 20 ++++++++++ .../OfficeFolderAnchorsService.ts | 27 +++++++++++++ 3 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 src/services/notary/OfficeFolderAnchorsService/OfficeFolderAnchorsService.ts diff --git a/src/app/api/notary/OfficeFolderAnchorsController.ts b/src/app/api/notary/OfficeFolderAnchorsController.ts index 052dffc8..62c9d3d7 100644 --- a/src/app/api/notary/OfficeFolderAnchorsController.ts +++ b/src/app/api/notary/OfficeFolderAnchorsController.ts @@ -12,6 +12,8 @@ import ruleHandler from "@App/middlewares/RulesHandler"; import folderHandler from "@App/middlewares/OfficeMembershipHandlers/FolderHandler"; import OfficeFolderAnchor from "le-coffre-resources/dist/Notary/OfficeFolderAnchor"; import NotificationBuilder from "@Common/notifications/NotificationBuilder"; +import { Prisma } from "@prisma/client"; +import OfficeFolderAnchorsService from "@Services/notary/OfficeFolderAnchorsService/OfficeFolderAnchorsService"; const hydrateOfficeFolderAnchor = (data: any): OfficeFolderAnchor => OfficeFolderAnchor.hydrate( @@ -37,6 +39,7 @@ export default class OfficeFoldersController extends ApiController { constructor( private secureService: SecureService, private officeFolderAnchorsRepository: OfficeFolderAnchorsRepository, + private officeFolderAnchorsService: OfficeFolderAnchorsService, private officeFoldersService: OfficeFoldersService, private notificationBuilder: NotificationBuilder, ) { @@ -163,7 +166,7 @@ export default class OfficeFoldersController extends ApiController { * @description Verify a folder anchor status */ @Get("/api/v1/notary/anchors/:uid", [authHandler, ruleHandler, folderHandler]) - protected async get(req: Request, response: Response) { + protected async getOneByUid(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -230,4 +233,38 @@ export default class OfficeFoldersController extends ApiController { return; } } + + /** + * @description Get all folders + */ + @Get("/api/v1/notary/anchors", [authHandler, ruleHandler]) + protected async get(req: Request, response: Response) { + try { + //get query + let query: Prisma.OfficeFolderAnchorsFindManyArgs = {}; + if (req.query["q"]) { + query = JSON.parse(req.query["q"] as string); + } + + query.where = { + ...query.where, + folder: { + office_uid: req.body.user.office_Id as string, + }, + }; + + //call service to get prisma entity + const officeFolderAnchorsEntities: OfficeFolderAnchor[] = await this.officeFolderAnchorsService.get(query); + + //Hydrate ressource with prisma entity + const officeFolderAnchors = OfficeFolderAnchor.hydrateArray(officeFolderAnchorsEntities, { + strategy: "excludeAll", + }); + //success + this.httpSuccess(response, officeFolderAnchors); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } } diff --git a/src/common/repositories/OfficeFolderAnchorsRepository.ts b/src/common/repositories/OfficeFolderAnchorsRepository.ts index c0687017..53cd98ca 100644 --- a/src/common/repositories/OfficeFolderAnchorsRepository.ts +++ b/src/common/repositories/OfficeFolderAnchorsRepository.ts @@ -65,4 +65,24 @@ export default class OfficeFolderAnchorsRepository extends BaseRepository { ...updateArgs, }); } + + /** + * @description : Find one office folder + */ + public async findOneByUid(uid: string, query?: Prisma.OfficeFolderAnchorsInclude) { + return this.model.findUnique({ + where: { + uid: uid, + }, + include: query, + }); + } + + /** + * @description : Find many office folders + */ + public async findMany(query: Prisma.OfficeFolderAnchorsFindManyArgs) { + query.take = Math.min(query.take || this.defaultFetchRows, this.maxFetchRows); + return this.model.findMany(query); + } } diff --git a/src/services/notary/OfficeFolderAnchorsService/OfficeFolderAnchorsService.ts b/src/services/notary/OfficeFolderAnchorsService/OfficeFolderAnchorsService.ts new file mode 100644 index 00000000..ee4c9ebf --- /dev/null +++ b/src/services/notary/OfficeFolderAnchorsService/OfficeFolderAnchorsService.ts @@ -0,0 +1,27 @@ +import BaseService from "@Services/BaseService"; +import { Service } from "typedi"; +import { Prisma } from "@prisma/client"; +import OfficeFolderAnchorsRepository from "@Repositories/OfficeFolderAnchorsRepository"; + +@Service() +export default class OfficeFolderAnchorsService extends BaseService { + constructor(private officeFolderAnchorsRepository: OfficeFolderAnchorsRepository) { + super(); + } + + /** + * @description : Get all folders + * @throws {Error} If folders cannot be get + */ + public async get(query: Prisma.OfficeFolderAnchorsFindManyArgs) { + return this.officeFolderAnchorsRepository.findMany(query); + } + + /** + * @description : Get a folder by uid + * @throws {Error} If folder cannot be get by uid + */ + public async getByUid(uid: string, query?: Prisma.OfficeFolderAnchorsInclude) { + return this.officeFolderAnchorsRepository.findOneByUid(uid, query); + } +} From 80ef324a6a6181e24dd75619a7b7abc5cec934e4 Mon Sep 17 00:00:00 2001 From: Maxime Lalo Date: Tue, 3 Oct 2023 11:39:26 +0200 Subject: [PATCH 4/4] :sparkles: Updating resources --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8157f96d..d64f06cf 100644 --- a/package.json +++ b/package.json @@ -53,7 +53,7 @@ "express": "^4.18.2", "fp-ts": "^2.16.1", "jsonwebtoken": "^9.0.0", - "le-coffre-resources": "git@github.com:smart-chain-fr/leCoffre-resources.git#v2.88", + "le-coffre-resources": "git@github.com:smart-chain-fr/leCoffre-resources.git#v2.89", "module-alias": "^2.2.2", "monocle-ts": "^2.3.13", "multer": "^1.4.5-lts.1",