// @flow import Router from 'koa-router'; import auth from '../middlewares/authentication'; import { NotificationSetting } from '../models'; import { presentNotificationSetting } from '../presenters'; import policy from '../policies'; const { authorize } = policy; const router = new Router(); router.post('notificationSettings.create', auth(), async ctx => { const { event } = ctx.body; ctx.assertPresent(event, 'event is required'); const user = ctx.state.user; authorize(user, 'create', NotificationSetting); const [setting] = await NotificationSetting.findOrCreate({ where: { userId: user.id, teamId: user.teamId, event, }, }); ctx.body = { data: presentNotificationSetting(ctx, setting), }; }); router.post('notificationSettings.list', auth(), async ctx => { const user = ctx.state.user; const settings = await NotificationSetting.findAll({ where: { userId: user.id, }, }); ctx.body = { data: settings.map(setting => presentNotificationSetting(ctx, setting)), }; }); router.post('notificationSettings.delete', auth(), async ctx => { const { id } = ctx.body; ctx.assertPresent(id, 'id is required'); const user = ctx.state.user; const setting = await NotificationSetting.findById(id); authorize(user, 'delete', setting); await setting.destroy(); ctx.body = { success: true, }; }); router.post('notificationSettings.unsubscribe', async ctx => { const { id, token } = ctx.body; ctx.assertPresent(id, 'id is required'); ctx.assertPresent(token, 'token is required'); const setting = await NotificationSetting.findById(id); if (setting) { if (token !== setting.unsubscribeToken) { ctx.redirect(`${process.env.URL}?notice=invalid-auth`); } await setting.destroy(); } ctx.redirect(`${process.env.URL}/settings/notifications?success`); }); export default router;