diff --git a/api/src/middlewares/find-and-authorize-current-user-middleware.ts b/api/src/middlewares/authorization-middleware.ts similarity index 92% rename from api/src/middlewares/find-and-authorize-current-user-middleware.ts rename to api/src/middlewares/authorization-middleware.ts index 226bd2a..eb6ccdd 100644 --- a/api/src/middlewares/find-and-authorize-current-user-middleware.ts +++ b/api/src/middlewares/authorization-middleware.ts @@ -20,7 +20,7 @@ export type AuthorizationRequest = JwtRequest & { * * NOTE: must be kept in sync with api/tests/support/mock-current-user.ts */ -export async function findAndAuthorizeCurrentUserMiddleware( +export async function authorizationMiddleware( req: AuthorizationRequest, res: Response, next: NextFunction @@ -38,7 +38,7 @@ export async function findAndAuthorizeCurrentUserMiddleware( try { const token = req.headers.authorization || "" - const user = await Users.FindFromAuth0TokenService.perform(token) + const user = await Users.EnsureFromAuth0TokenService.perform(token) req.currentUser = user return next() } catch (error) { diff --git a/api/src/middlewares/index.ts b/api/src/middlewares/index.ts index 8bb4d17..336dc5c 100644 --- a/api/src/middlewares/index.ts +++ b/api/src/middlewares/index.ts @@ -1,3 +1,3 @@ -export { findAndAuthorizeCurrentUserMiddleware } from "./find-and-authorize-current-user-middleware" +export { authorizationMiddleware } from "./authorization-middleware" export { jwtMiddleware } from "./jwt-middleware" export { requestLoggerMiddleware } from "./request-logger-middleware" diff --git a/api/src/router.ts b/api/src/router.ts index 8faac5d..f00ec6d 100644 --- a/api/src/router.ts +++ b/api/src/router.ts @@ -14,7 +14,7 @@ import { template } from "lodash" import { APPLICATION_NAME, GIT_COMMIT_HASH, NODE_ENV, RELEASE_TAG } from "@/config" import { logger } from "@/utils/logger" -import { jwtMiddleware, findAndAuthorizeCurrentUserMiddleware } from "@/middlewares" +import { jwtMiddleware, authorizationMiddleware } from "@/middlewares" import { CurrentUserController, UsersController } from "@/controllers" @@ -31,7 +31,7 @@ router.route("/_status").get((_req: Request, res: Response) => { // external (public) routes - no authentication required // api routes -router.use("/api", jwtMiddleware, findAndAuthorizeCurrentUserMiddleware) +router.use("/api", jwtMiddleware, authorizationMiddleware) router.route("/api/current-user").get(CurrentUserController.show) diff --git a/api/src/services/users/find-from-auth0-token-service.ts b/api/src/services/users/ensure-from-auth0-token-service.ts similarity index 57% rename from api/src/services/users/find-from-auth0-token-service.ts rename to api/src/services/users/ensure-from-auth0-token-service.ts index b37f6b2..773c05b 100644 --- a/api/src/services/users/find-from-auth0-token-service.ts +++ b/api/src/services/users/ensure-from-auth0-token-service.ts @@ -2,14 +2,17 @@ import { auth0Integration } from "@/integrations" import { User } from "@/models" import { Op } from "@sequelize/core" import BaseService from "@/services/base-service" +import { Users } from "@/services" -export class FindFromAuth0TokenService extends BaseService { +export class EnsureFromAuth0TokenService extends BaseService { constructor(private token: string) { super() } async perform(): Promise { - const { auth0Subject, email } = await auth0Integration.getUserInfo(this.token) + const { auth0Subject, email, firstName, lastName } = await auth0Integration.getUserInfo( + this.token + ) const existingUser = await User.withScope(["asCurrentUser"]).findOne({ where: { auth0Subject }, @@ -28,8 +31,20 @@ export class FindFromAuth0TokenService extends BaseService { return firstTimeUser } - throw new Error("No user found for this token.") + await Users.CreateService.perform({ + auth0Subject, + email, + firstName, + lastName, + }) + + const newUser = await User.withScope(["asCurrentUser"]).findOne({ + where: { auth0Subject }, + rejectOnEmpty: true, + }) + + return newUser } } -export default FindFromAuth0TokenService +export default EnsureFromAuth0TokenService diff --git a/api/src/services/users/index.ts b/api/src/services/users/index.ts index ea10908..edeffe5 100644 --- a/api/src/services/users/index.ts +++ b/api/src/services/users/index.ts @@ -3,4 +3,4 @@ export { UpdateService } from "./update-service" export { DestroyService } from "./destroy-service" // Special Services -export { FindFromAuth0TokenService } from "./find-from-auth0-token-service" +export { EnsureFromAuth0TokenService } from "./ensure-from-auth0-token-service" diff --git a/api/tests/support/mock-current-user.ts b/api/tests/support/mock-current-user.ts index 352f2b2..4c502d6 100644 --- a/api/tests/support/mock-current-user.ts +++ b/api/tests/support/mock-current-user.ts @@ -1,9 +1,9 @@ import { Request, Response, NextFunction } from "express" import { - findAndAuthorizeCurrentUserMiddleware, + authorizationMiddleware, type AuthorizationRequest, -} from "@/middlewares/find-and-authorize-current-user-middleware" +} from "@/middlewares/authorization-middleware" import { User } from "@/models" @@ -23,9 +23,9 @@ export function mockCurrentUser(newCurrentUser: User) { jwtMiddleware: async (_req: Request, _res: Response, next: NextFunction) => next(), })) - vi.mock("@/middlewares/find-and-authorize-current-user-middleware") - const findAndAuthorizeCurrentUserMiddlewareMock = vi.mocked(findAndAuthorizeCurrentUserMiddleware) - findAndAuthorizeCurrentUserMiddlewareMock.mockImplementation( + vi.mock("@/middlewares/authorization-middleware") + const authorizationMiddlewareMock = vi.mocked(authorizationMiddleware) + authorizationMiddlewareMock.mockImplementation( async (req: AuthorizationRequest, _res: Response, next: NextFunction) => { const currentUser = await User.withScope(["asCurrentUser"]).findByPk(newCurrentUser.id, { rejectOnEmpty: true,