diff --git a/src/controller/admin/club/newsletterController.ts b/src/controller/admin/club/newsletterController.ts index 294b6e3..9338732 100644 --- a/src/controller/admin/club/newsletterController.ts +++ b/src/controller/admin/club/newsletterController.ts @@ -164,6 +164,34 @@ export async function createNewsletterPrintoutPreviewById(req: Request, res: Res res.send(pdfbuffer); } +/** + * @description get all members receiving a newsletter printout by id + * @param req {Request} Express req object + * @param res {Response} Express res object + * @returns {Promise<*>} + */ +export async function getNewsletterPrintReceiversById(req: Request, res: Response): Promise { + let newsletterId = parseInt(req.params.newsletterId); + + let recipients = await NewsletterHelper.getPrintRecipients(newsletterId); + + res.json(recipients); +} + +/** + * @description get all members receiving a newsletter mail by id + * @param req {Request} Express req object + * @param res {Response} Express res object + * @returns {Promise<*>} + */ +export async function getNewsletterMailReceiversById(req: Request, res: Response): Promise { + let newsletterId = parseInt(req.params.newsletterId); + + let recipients = await NewsletterHelper.getMailRecipients(newsletterId); + + res.json(recipients); +} + /** * @description create newsletter * @param req {Request} Express req object diff --git a/src/helpers/newsletterHelper.ts b/src/helpers/newsletterHelper.ts index 8ab1b05..8c819b2 100644 --- a/src/helpers/newsletterHelper.ts +++ b/src/helpers/newsletterHelper.ts @@ -1,4 +1,3 @@ -import Mail from "nodemailer/lib/mailer"; import { member } from "../entity/club/member/member"; import { newsletter } from "../entity/club/newsletter/newsletter"; import { newsletterDates } from "../entity/club/newsletter/newsletterDates"; @@ -148,6 +147,47 @@ export abstract class NewsletterHelper { } } + public static async getMailRecipients(newsletterId: number) { + let newsletter = await NewsletterService.getById(newsletterId); + let recipients = await NewsletterRecipientsService.getAll(newsletterId); + let config = await NewsletterConfigService.getAll(); + + let allowedForMail = config.filter((c) => c.config == NewsletterConfigType.mail).map((c) => c.comTypeId); + + const members = await this.transformRecipientsToMembers(newsletter, recipients); + const mailRecipients = members.filter( + (m) => + m.sendNewsletter != null && + m.sendNewsletter?.email != null && + allowedForMail.includes(m.sendNewsletter?.type?.id) + ); + + return mailRecipients; + } + + public static async getPrintRecipients(newsletterId: number) { + let newsletter = await NewsletterService.getById(newsletterId); + let recipients = await NewsletterRecipientsService.getAll(newsletterId); + let config = await NewsletterConfigService.getAll(); + + let notAllowedForPdf = config.filter((c) => c.config == NewsletterConfigType.mail).map((c) => c.comTypeId); + + const members = await this.transformRecipientsToMembers(newsletter, recipients); + const pdfRecipients = members.filter( + (m) => !notAllowedForPdf.includes(m.sendNewsletter?.type?.id) || m.sendNewsletter == null + ); + + pdfRecipients.unshift({ + id: "0", + firstname: "Alle Mitglieder", + lastname: CLUB_NAME, + nameaffix: "", + salutation: { salutation: "" }, + } as member); + + return pdfRecipients; + } + public static getICSFilePath(newsletter: newsletter) { return FileSystemHelper.formatPath( "newsletter", @@ -163,22 +203,12 @@ export abstract class NewsletterHelper { public static async sendMails(newsletterId: number) { let newsletter = await NewsletterService.getById(newsletterId); let dates = await NewsletterDatesService.getAll(newsletterId); - let recipients = await NewsletterRecipientsService.getAll(newsletterId); - let config = await NewsletterConfigService.getAll(); const { value, error } = CalendarHelper.buildICS(dates.map((r) => r.calendar)); if (error) throw new InternalException("Failed Building ICS form Mail", error); this.saveIcsToFile(newsletter, value); - let allowedForMail = config.filter((c) => c.config == NewsletterConfigType.mail).map((c) => c.comTypeId); - - const members = await this.transformRecipientsToMembers(newsletter, recipients); - const mailRecipients = members.filter( - (m) => - m.sendNewsletter != null && - m.sendNewsletter?.email != null && - allowedForMail.includes(m.sendNewsletter?.type?.id) - ); + const mailRecipients = await this.getMailRecipients(newsletterId); this.formatJobEmit("progress", "mail", "info", newsletterId, mailRecipients.length, 0, "starting sending"); @@ -231,7 +261,6 @@ export abstract class NewsletterHelper { public static async printPdfs(newsletterId: number) { let newsletter = await NewsletterService.getById(newsletterId); let dates = await NewsletterDatesService.getAll(newsletterId); - let recipients = await NewsletterRecipientsService.getAll(newsletterId); let config = await NewsletterConfigService.getAll(); FileSystemHelper.clearDirectoryByFiletype( @@ -243,26 +272,13 @@ export abstract class NewsletterHelper { if (error) throw new InternalException("Failed Building ICS form Pdf", error); this.saveIcsToFile(newsletter, value); - let notAllowedForPdf = config.filter((c) => c.config == NewsletterConfigType.mail).map((c) => c.comTypeId); let printWithAdress = config.filter((c) => c.config == NewsletterConfigType.pdf).map((c) => c.comTypeId); - const members = await this.transformRecipientsToMembers(newsletter, recipients); - const pdfRecipients = members.filter( - (m) => !notAllowedForPdf.includes(m.sendNewsletter?.type?.id) || m.sendNewsletter == null - ); + const pdfRecipients = await this.getPrintRecipients(newsletterId); - this.formatJobEmit("progress", "pdf", "info", newsletterId, pdfRecipients.length + 1, 0, "starting sending"); + this.formatJobEmit("progress", "pdf", "info", newsletterId, pdfRecipients.length, 0, "starting sending"); - for (const [index, rec] of [ - ...pdfRecipients, - { - id: "0", - firstname: "Alle Mitglieder", - lastname: CLUB_NAME, - nameaffix: "", - salutation: { salutation: "" }, - } as member, - ].entries()) { + for (const [index, rec] of pdfRecipients.entries()) { let data = this.buildData(newsletter, dates, rec, printWithAdress.includes(rec.sendNewsletter?.type?.id)); await PdfExport.renderFile({ @@ -278,8 +294,8 @@ export abstract class NewsletterHelper { "pdf", "success", newsletterId, - pdfRecipients.length + 1, - index + 1, + pdfRecipients.length, + index, `successfully printed for ${rec.lastname}, ${rec.firstname}` ); }) @@ -289,8 +305,8 @@ export abstract class NewsletterHelper { "pdf", "failed", newsletterId, - pdfRecipients.length + 1, - index + 1, + pdfRecipients.length, + index, `failed print for ${rec.lastname}, ${rec.firstname}` ); }); @@ -307,8 +323,8 @@ export abstract class NewsletterHelper { "pdf", "success", newsletterId, - pdfRecipients.length + 1, - pdfRecipients.length + 1, + pdfRecipients.length, + pdfRecipients.length, "sucessfully combined pdf" ); }) @@ -318,8 +334,8 @@ export abstract class NewsletterHelper { "pdf", "failed", newsletterId, - pdfRecipients.length + 1, - pdfRecipients.length + 1, + pdfRecipients.length, + pdfRecipients.length, "failed combining pdf" ); }); @@ -329,8 +345,8 @@ export abstract class NewsletterHelper { "pdf", "info", newsletterId, - pdfRecipients.length + 1, - pdfRecipients.length + 1, + pdfRecipients.length, + pdfRecipients.length, `completed printing process` ); } diff --git a/src/routes/admin/club/newsletter.ts b/src/routes/admin/club/newsletter.ts index 9a71bbf..5ec1aba 100644 --- a/src/routes/admin/club/newsletter.ts +++ b/src/routes/admin/club/newsletter.ts @@ -16,6 +16,8 @@ import { createNewsletterPrintoutPreviewById, getNewsletterPrintoutProgressById, getNewsletterSendingProgressById, + getNewsletterMailReceiversById, + getNewsletterPrintReceiversById, } from "../../../controller/admin/club/newsletterController"; import PermissionHelper from "../../../helpers/permissionHelper"; @@ -57,6 +59,14 @@ router.get("/:newsletterId/sendprogress", async (req: Request, res: Response) => await getNewsletterSendingProgressById(req, res); }); +router.get("/:newsletterId/printrecipients", async (req: Request, res: Response) => { + await getNewsletterPrintReceiversById(req, res); +}); + +router.get("/:newsletterId/mailrecipients", async (req: Request, res: Response) => { + await getNewsletterMailReceiversById(req, res); +}); + router.post( "/", PermissionHelper.passCheckMiddleware("create", "club", "protocol"),