ff-admin-server/src/command/club/newsletter/newsletterRecipientsCommandHandler.ts

75 lines
2.6 KiB
TypeScript
Raw Normal View History

2024-12-25 12:22:28 +01:00
import { DeleteResult, EntityManager, InsertResult, UpdateResult } from "typeorm";
2025-01-05 14:14:00 +01:00
import { dataSource } from "../../../data-source";
import InternalException from "../../../exceptions/internalException";
import NewsletterRecipientsService from "../../../service/club/newsletter/newsletterRecipientsService";
import { SynchronizeNewsletterRecipientsCommand } from "./newsletterRecipientsCommand";
2025-01-05 14:14:00 +01:00
import { newsletterRecipients } from "../../../entity/club/newsletter/newsletterRecipients";
2025-01-29 09:42:22 +01:00
import DatabaseActionException from "../../../exceptions/databaseActionException";
2024-12-25 12:22:28 +01:00
export default abstract class NewsletterRecipientsCommandHandler {
/**
* @description sync newsletterRecipients
* @param {SynchronizeNewsletterRecipientsCommand} syncNewsletterRecipients
* @returns {Promise<void>}
*/
static async sync(syncNewsletterRecipients: SynchronizeNewsletterRecipientsCommand): Promise<void> {
let currentRecipients = (await NewsletterRecipientsService.getAll(syncNewsletterRecipients.newsletterId)).map(
(r) => r.memberId
);
2024-12-25 12:22:28 +01:00
return await dataSource.manager
.transaction(async (manager) => {
let newRecipients = syncNewsletterRecipients.recipients.filter(
(r) => !currentRecipients.map((np) => np).includes(r)
2024-12-25 12:22:28 +01:00
);
let removeRecipients = currentRecipients.filter(
(r) => !syncNewsletterRecipients.recipients.map((np) => np).includes(r)
2024-12-25 12:22:28 +01:00
);
if (newRecipients.length != 0) {
await this.syncPresenceAdd(manager, syncNewsletterRecipients.newsletterId, newRecipients);
}
if (removeRecipients.length != 0) {
await this.syncPresenceRemove(manager, syncNewsletterRecipients.newsletterId, removeRecipients);
}
})
.then(() => {})
.catch((err) => {
2025-01-29 09:42:22 +01:00
throw new DatabaseActionException("SYNC", "newsletterRecipients", err);
2024-12-25 12:22:28 +01:00
});
}
private static async syncPresenceAdd(
manager: EntityManager,
newsletterId: number,
2025-01-29 08:53:49 +01:00
recipients: Array<string>
2024-12-25 12:22:28 +01:00
): Promise<InsertResult> {
return await manager
.createQueryBuilder()
.insert()
.into(newsletterRecipients)
.values(
recipients.map((r) => ({
memberId: r,
2024-12-25 12:22:28 +01:00
newsletterId: newsletterId,
}))
)
.execute();
}
private static async syncPresenceRemove(
manager: EntityManager,
newsletterId: number,
2025-01-29 08:53:49 +01:00
recipients: Array<string>
2024-12-25 12:22:28 +01:00
): Promise<DeleteResult> {
return await manager
.createQueryBuilder()
.delete()
.from(newsletterRecipients)
.where("memberId IN (:...ids)", { ids: recipients })
2024-12-25 12:22:28 +01:00
.andWhere("newsletterId = :newsletterId", { newsletterId })
.execute();
}
}