From 97fad8633fe1fd714264dd7c47dcbf696f2d9183 Mon Sep 17 00:00:00 2001 From: Ramnique Singh <30795890+ramnique@users.noreply.github.com> Date: Wed, 6 Aug 2025 12:13:14 +0530 Subject: [PATCH] dry refactor --- apps/rowboat/app/actions/project_actions.ts | 12 ++++---- apps/rowboat/app/api/v1/utils.ts | 28 ------------------- .../mongodb.project-members.repository.ts | 4 +-- 3 files changed, 9 insertions(+), 35 deletions(-) delete mode 100644 apps/rowboat/app/api/v1/utils.ts diff --git a/apps/rowboat/app/actions/project_actions.ts b/apps/rowboat/app/actions/project_actions.ts index 32a126cc..2cb425e4 100644 --- a/apps/rowboat/app/actions/project_actions.ts +++ b/apps/rowboat/app/actions/project_actions.ts @@ -13,21 +13,23 @@ import { Project } from "../lib/types/project_types"; import { USE_AUTH } from "../lib/feature_flags"; import { authorizeUserAction } from "./billing_actions"; import { Workflow } from "../lib/types/workflow_types"; +import { container } from "@/di/container"; +import { IProjectActionAuthorizationPolicy } from "@/src/application/policies/project-action-authorization.policy"; const KLAVIS_API_KEY = process.env.KLAVIS_API_KEY || ''; +const projectActionAuthorizationPolicy = container.resolve('projectActionAuthorizationPolicy'); + export async function projectAuthCheck(projectId: string) { if (!USE_AUTH) { return; } const user = await authCheck(); - const membership = await projectMembersCollection.findOne({ - projectId, + await projectActionAuthorizationPolicy.authorize({ + caller: 'user', userId: user._id, + projectId, }); - if (!membership) { - throw new Error('User not a member of project'); - } } async function createBaseProject( diff --git a/apps/rowboat/app/api/v1/utils.ts b/apps/rowboat/app/api/v1/utils.ts deleted file mode 100644 index 771f3961..00000000 --- a/apps/rowboat/app/api/v1/utils.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { NextRequest } from "next/server"; -import { apiKeysCollection, projectsCollection } from "../../lib/mongodb"; - -export async function authCheck(projectId: string, req: NextRequest, handler: () => Promise): Promise { - const authHeader = req.headers.get('Authorization'); - if (!authHeader?.startsWith('Bearer ')) { - return Response.json({ error: "Authorization header must be a Bearer token" }, { status: 400 }); - } - const key = authHeader.split(' ')[1]; - if (!key) { - return Response.json({ error: "Missing API key in request" }, { status: 400 }); - } - - // check if api key is valid - // while also updating last used timestamp - const result = await apiKeysCollection.findOneAndUpdate( - { - projectId, - key, - }, - { $set: { lastUsedAt: new Date().toISOString() } } - ); - if (!result) { - return Response.json({ error: "Invalid API key" }, { status: 403 }); - } - - return await handler(); -} diff --git a/apps/rowboat/src/infrastructure/repositories/mongodb.project-members.repository.ts b/apps/rowboat/src/infrastructure/repositories/mongodb.project-members.repository.ts index 6b0416d9..4e1272ac 100644 --- a/apps/rowboat/src/infrastructure/repositories/mongodb.project-members.repository.ts +++ b/apps/rowboat/src/infrastructure/repositories/mongodb.project-members.repository.ts @@ -1,9 +1,9 @@ import { IProjectMembersRepository } from "@/src/application/repositories/project-members.repository.interface"; -import { db } from "@/app/lib/mongodb"; +import { projectMembersCollection } from "@/app/lib/mongodb"; export class MongoDBProjectMembersRepository implements IProjectMembersRepository { async checkMembership(projectId: string, userId: string): Promise { - const membership = await db.collection('project_members').findOne({ + const membership = await projectMembersCollection.findOne({ projectId, userId, });