// @flow import Router from "koa-router"; import auth from "../../middlewares/authentication"; import { Team, NotificationSetting } from "../../models"; import policy from "../../policies"; import { presentNotificationSetting } from "../../presenters"; 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, "createNotificationSetting", user.team); const [setting] = await NotificationSetting.findOrCreate({ where: { userId: user.id, teamId: user.teamId, event, }, }); ctx.body = { data: presentNotificationSetting(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(presentNotificationSetting), }; }); router.post("notificationSettings.delete", auth(), async (ctx) => { const { id } = ctx.body; ctx.assertUuid(id, "id is required"); const user = ctx.state.user; const setting = await NotificationSetting.findByPk(id); authorize(user, "delete", setting); await setting.destroy(); ctx.body = { success: true, }; }); router.post("notificationSettings.unsubscribe", async (ctx) => { const { id, token } = ctx.body; ctx.assertUuid(id, "id is required"); ctx.assertPresent(token, "token is required"); const setting = await NotificationSetting.findByPk(id, { include: [ { model: Team, required: true, as: "team", }, ], }); if (setting && setting.unsubscribeToken === token) { await setting.destroy(); ctx.redirect(`${setting.team.url}/settings/notifications?success`); return; } ctx.redirect(`${process.env.URL}?notice=invalid-auth`); }); export default router;