Skip to content

Commit

Permalink
added usage of mailing lists
Browse files Browse the repository at this point in the history
  • Loading branch information
Mipronimo committed Jul 11, 2023
1 parent 9f941b7 commit d17e6ff
Show file tree
Hide file tree
Showing 6 changed files with 66 additions and 5 deletions.
2 changes: 2 additions & 0 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ import eventRouter from './src/routes/event.route.js'
import settingRouter from './src/routes/setting.route.js'
import responsibilityRouter from './src/routes/responsibility.route.js'
import mailRouter from './src/routes/mail.route.js'
import mailinglistRouter from './src/routes/mailinglist.route.js'
import miscRouter from './src/routes/misc.route.js'
import supporterYearRouter from './src/routes/supporterYear.route.js'
import userRouter from './src/routes/user.route.js'
Expand All @@ -74,6 +75,7 @@ app.use('/event', eventRouter);
app.use('/setting', settingRouter);
app.use('/responsibility', responsibilityRouter);
app.use('/mail', mailRouter);
app.use('/mailinglist', mailinglistRouter);
app.use('/misc', miscRouter);
app.use('/user', userRouter);
app.use('/supporterYear', supporterYearRouter);
Expand Down
52 changes: 51 additions & 1 deletion src/controllers/mail.controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import userModel from '../models/user.model.js';
import formData from 'form-data';
import Mailgun from 'mailgun.js';
import nodemailer from 'nodemailer';
import settingModel from "../models/setting.model.js";
import { convert } from 'html-to-text';

const mailgun = new Mailgun(formData);
Expand Down Expand Up @@ -58,6 +59,55 @@ export function listDomains() {
.catch(err => console.error(err));
}

export async function findAllMailinglists(req, res) {
const lists = (await mg.lists.list()).items
const year = (await settingModel.findByPk('currentYear')).value
const isLT = req.kauth.grant.access_token.content.groups.includes(year + '_LT')
if (isLT) {
res.status(200).send(lists)
return;
}
res.status(200).send(lists.filter(list => list.address.toLowerCase().startsWith('team' + year + '@')))
}

export async function sendMail(req, res) {
if (!req.body || !req.body.addresses.length || !req.body.subject || req.body.content === '<br>') {
let missingKeys = []
if (!req.body.addresses.length) missingKeys.push('addresses')
if (!req.body.subject) missingKeys.push('subject')
if (req.body.content == '<br>') missingKeys.push('content')
res.status(400).send(missingKeys)
return;
}
const year = (await settingModel.findByPk('currentYear')).value
const isLT = req.kauth.grant.access_token.content.groups.includes(year + '_LT')
const addresses = req.body.addresses
if (!isLT) {
if (addresses.length > 1 || !addresses[0].toLowerCase().startsWith('team' + year + '@')) {
res.status(403).send('forbidden to send to this address')
return;
}
}
const user = await userModel.findByPk(req.kauth.grant.access_token.content.sub)
const messageData = {
from: user.firstName + ' ' + user.lastName + ' <' + user.mail + '>',
to: addresses.toString(),
bcc: user.mail,
subject: req.body.subject,
html: req.body.content,
text: convert(req.body.content),
'h:Reply-To': user.mail
};

mg.messages.create('verteiler.lippesola.de', messageData)
.then((mgRes) => {
res.status(200).send('mail sent');
return;
})
.catch((err) => {
console.error(err);
});}

export async function addToMailinglist(mailingList, uuids) {
if (!Array.isArray(uuids)) {
uuids = [uuids];
Expand All @@ -82,7 +132,7 @@ export async function addToTeamMailinglist(uuids, year) {
addToMailinglist('team' + year + '@' + (process.env.MAIL_LIST_DOMAIN || 'verteiler.lippesola.de'), uuids);
}

export async function sendMail(uuid, type) {
export async function sendMailToUser(uuid, type) {
const user = await userModel.findByPk(uuid);
const mailConfiguration = await mailModel.findByPk(type);
let transporter = nodemailer.createTransport({
Expand Down
1 change: 0 additions & 1 deletion src/controllers/supporterYear.controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import keycloak from '../config/keycloak.js';
import settingModel from "../models/setting.model.js";
import supporterDayModel from "../models/supporterDay.model.js";
import { ValidationError } from 'sequelize';
import { addToTeamMailinglist, sendMail } from "./mail.controller.js";

export async function findAll(req, res) {
const year = req.query.year || (await settingModel.findByPk('currentYear')).value
Expand Down
4 changes: 2 additions & 2 deletions src/controllers/userYear.controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import keycloak from '../config/keycloak.js';
import settingModel from "../models/setting.model.js";
import userModel from "../models/user.model.js";
import userDocumentModel from "../models/userDocument.model.js";
import { addToTeamMailinglist, sendMail } from "./mail.controller.js";
import { addToTeamMailinglist, sendMailToUser } from "./mail.controller.js";

export async function findAll(req, res) {
const year = req.query.year || await settingModel.findByPk('currentYear')
Expand Down Expand Up @@ -96,7 +96,7 @@ export async function createOrUpdate(req, res) {
.catch((e) => {console.log(e);})

addToTeamMailinglist(req.params.uuid, year);
sendMail(req.params.uuid, 'confirmation');
sendMailToUser(req.params.uuid, 'confirmation');
}
userYearModel.update(data, {where: {uuid: req.params.uuid, year: req.params.year}});
res.status(200).send(userYear)
Expand Down
3 changes: 2 additions & 1 deletion src/routes/mail.route.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
import { Router } from 'express';
import keycloak from '../config/keycloak.js';
import { findAll, findOne, createOrUpdate } from '../controllers/mail.controller.js'
import { findAll, findOne, createOrUpdate, sendMail } from '../controllers/mail.controller.js'

var router = new Router();

router.get('/', keycloak.protect(['admin']), findAll);
router.get('/:key', keycloak.protect(['admin']), findOne);
router.post('/sendMail', keycloak.protect(), sendMail);
router.post('/:key', keycloak.protect(['admin']), createOrUpdate);

export default router
9 changes: 9 additions & 0 deletions src/routes/mailinglist.route.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import { Router } from 'express';
import keycloak from '../config/keycloak.js';
import { findAllMailinglists } from '../controllers/mail.controller.js'

var router = new Router();

router.get('/', keycloak.protect(), findAllMailinglists);

export default router

0 comments on commit d17e6ff

Please sign in to comment.