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";
|
2024-12-26 12:34:31 +01:00
|
|
|
import { SynchronizeNewsletterRecipientsCommand } from "./newsletterRecipientsCommand";
|
2025-01-05 14:14:00 +01:00
|
|
|
import { newsletterRecipients } from "../../../entity/club/newsletter/newsletterRecipients";
|
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> {
|
2024-12-26 12:34:31 +01:00
|
|
|
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(
|
2024-12-26 12:34:31 +01:00
|
|
|
(r) => !currentRecipients.map((np) => np).includes(r)
|
2024-12-25 12:22:28 +01:00
|
|
|
);
|
|
|
|
let removeRecipients = currentRecipients.filter(
|
2024-12-26 12:34:31 +01:00
|
|
|
(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) => {
|
|
|
|
throw new InternalException("Failed syncing newsletter recipients", err);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
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(
|
2024-12-26 12:34:31 +01:00
|
|
|
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)
|
2024-12-26 12:34:31 +01:00
|
|
|
.where("memberId IN (:...ids)", { ids: recipients })
|
2024-12-25 12:22:28 +01:00
|
|
|
.andWhere("newsletterId = :newsletterId", { newsletterId })
|
|
|
|
.execute();
|
|
|
|
}
|
|
|
|
}
|