From f43f25328691e8a8aa43fa6f78dbce05387da427 Mon Sep 17 00:00:00 2001 From: Tom Moor Date: Tue, 15 Nov 2022 22:22:35 -0500 Subject: [PATCH] Refactoring endpoints to transaction middleware --- server/routes/api/auth.ts | 24 ++++++----- server/routes/api/subscriptions.ts | 65 +++++++++++++++++------------- server/routes/api/users.ts | 23 ++++++----- 3 files changed, 64 insertions(+), 48 deletions(-) diff --git a/server/routes/api/auth.ts b/server/routes/api/auth.ts index 86fb0470f..80d67e323 100644 --- a/server/routes/api/auth.ts +++ b/server/routes/api/auth.ts @@ -1,9 +1,12 @@ import Router from "koa-router"; import { find, uniqBy } from "lodash"; import { parseDomain } from "@shared/utils/domains"; -import { sequelize } from "@server/database/sequelize"; import env from "@server/env"; import auth from "@server/middlewares/authentication"; +import { + transaction, + TransactionContext, +} from "@server/middlewares/transaction"; import { Event, Team } from "@server/models"; import { presentUser, @@ -153,10 +156,13 @@ router.post("auth.info", auth(), async (ctx) => { }; }); -router.post("auth.delete", auth(), async (ctx) => { - const { user } = ctx.state; +router.post( + "auth.delete", + auth(), + transaction(), + async (ctx: TransactionContext) => { + const { user, transaction } = ctx.state; - await sequelize.transaction(async (transaction) => { await user.rotateJwtSecret({ transaction }); await Event.create( { @@ -173,11 +179,11 @@ router.post("auth.delete", auth(), async (ctx) => { transaction, } ); - }); - ctx.body = { - success: true, - }; -}); + ctx.body = { + success: true, + }; + } +); export default router; diff --git a/server/routes/api/subscriptions.ts b/server/routes/api/subscriptions.ts index 9706def00..80a4ef871 100644 --- a/server/routes/api/subscriptions.ts +++ b/server/routes/api/subscriptions.ts @@ -1,8 +1,11 @@ import Router from "koa-router"; import subscriptionCreator from "@server/commands/subscriptionCreator"; import subscriptionDestroyer from "@server/commands/subscriptionDestroyer"; -import { sequelize } from "@server/database/sequelize"; import auth from "@server/middlewares/authentication"; +import { + transaction, + TransactionContext, +} from "@server/middlewares/transaction"; import { Subscription, Document } from "@server/models"; import { authorize } from "@server/policies"; import { presentSubscription } from "@server/presenters"; @@ -75,19 +78,22 @@ router.post("subscriptions.info", auth(), async (ctx) => { }; }); -router.post("subscriptions.create", auth(), async (ctx) => { - const { user } = ctx.state; - const { documentId, event } = ctx.request.body; +router.post( + "subscriptions.create", + auth(), + transaction(), + async (ctx: TransactionContext) => { + const { user, transaction } = ctx.state; + const { documentId, event } = ctx.request.body; - assertUuid(documentId, "documentId is required"); + assertUuid(documentId, "documentId is required"); - assertIn( - event, - ["documents.update"], - "Not a valid subscription event for documents" - ); + assertIn( + event, + ["documents.update"], + "Not a valid subscription event for documents" + ); - const subscription = await sequelize.transaction(async (transaction) => { const document = await Document.findByPk(documentId, { userId: user.id, transaction, @@ -95,27 +101,30 @@ router.post("subscriptions.create", auth(), async (ctx) => { authorize(user, "subscribe", document); - return subscriptionCreator({ + const subscription = await subscriptionCreator({ user, documentId: document.id, event, ip: ctx.request.ip, transaction, }); - }); - ctx.body = { - data: presentSubscription(subscription), - }; -}); + ctx.body = { + data: presentSubscription(subscription), + }; + } +); -router.post("subscriptions.delete", auth(), async (ctx) => { - const { user } = ctx.state; - const { id } = ctx.request.body; +router.post( + "subscriptions.delete", + auth(), + transaction(), + async (ctx: TransactionContext) => { + const { user, transaction } = ctx.state; + const { id } = ctx.request.body; - assertUuid(id, "id is required"); + assertUuid(id, "id is required"); - await sequelize.transaction(async (transaction) => { const subscription = await Subscription.findByPk(id, { rejectOnEmpty: true, transaction, @@ -130,12 +139,10 @@ router.post("subscriptions.delete", auth(), async (ctx) => { transaction, }); - return subscription; - }); - - ctx.body = { - success: true, - }; -}); + ctx.body = { + success: true, + }; + } +); export default router; diff --git a/server/routes/api/users.ts b/server/routes/api/users.ts index 85c79ee5c..ec001af8d 100644 --- a/server/routes/api/users.ts +++ b/server/routes/api/users.ts @@ -10,7 +10,6 @@ import userDestroyer from "@server/commands/userDestroyer"; import userInviter from "@server/commands/userInviter"; import userSuspender from "@server/commands/userSuspender"; import userUnsuspender from "@server/commands/userUnsuspender"; -import { sequelize } from "@server/database/sequelize"; import ConfirmUserDeleteEmail from "@server/emails/templates/ConfirmUserDeleteEmail"; import InviteEmail from "@server/emails/templates/InviteEmail"; import env from "@server/env"; @@ -359,11 +358,15 @@ router.post( } ); -router.post("users.resendInvite", auth(), async (ctx) => { - const { id } = ctx.request.body; - const actor = ctx.state.user; +router.post( + "users.resendInvite", + auth(), + transaction(), + async (ctx: TransactionContext) => { + const { id } = ctx.request.body; + const actor = ctx.state.user; + const { transaction } = ctx.state; - await sequelize.transaction(async (transaction) => { const user = await User.findByPk(id, { lock: transaction.LOCK.UPDATE, transaction, @@ -394,12 +397,12 @@ router.post("users.resendInvite", auth(), async (ctx) => { }/auth/email.callback?token=${user.getEmailSigninToken()}` ); } - }); - ctx.body = { - success: true, - }; -}); + ctx.body = { + success: true, + }; + } +); router.post( "users.requestDelete",