diff --git a/apps/backend/lambdas/projects/db.ts b/apps/backend/lambdas/projects/db.ts index 6a2fa8a..73ffb54 100644 --- a/apps/backend/lambdas/projects/db.ts +++ b/apps/backend/lambdas/projects/db.ts @@ -1,6 +1,6 @@ -import { Kysely, PostgresDialect } from 'kysely'; -import { Pool } from 'pg'; -import type { DB } from './db-types'; +import { Kysely, PostgresDialect } from 'kysely' +import { Pool } from 'pg' +import type { DB } from './db-types' const db = new Kysely({ dialect: new PostgresDialect({ @@ -10,9 +10,8 @@ const db = new Kysely({ user: process.env.DB_USER ?? 'branch_dev', password: process.env.DB_PASSWORD ?? 'password', database: process.env.DB_NAME ?? 'branch_db', - ssl: false, + ssl: false, }), }), -}); - -export default db; +}) +export default db \ No newline at end of file diff --git a/apps/backend/lambdas/projects/handler.ts b/apps/backend/lambdas/projects/handler.ts index 0c24d41..f6fb13a 100644 --- a/apps/backend/lambdas/projects/handler.ts +++ b/apps/backend/lambdas/projects/handler.ts @@ -2,7 +2,6 @@ import { APIGatewayProxyEvent, APIGatewayProxyResult } from 'aws-lambda'; import db from './db'; import { ProjectValidationUtils } from './validation-utils'; - export const handler = async (event: any): Promise => { try { // Support both API Gateway and Lambda Function URL events @@ -19,7 +18,25 @@ export const handler = async (event: any): Promise => { // >>> ROUTES-START (do not remove this marker) // CLI-generated routes will be inserted here - + // GET /projects/{id}/members + if (normalizedPath.startsWith('/projects/') && normalizedPath.split('/').length === 4 && method === 'GET') { + const id = normalizedPath.split('/')[2]; + if (!id) return json(400, { message: 'id is required' }); + const users = await db + .selectFrom('branch.project_memberships as pm') + .innerJoin('branch.users as u', 'u.user_id', 'pm.user_id') + .select([ + 'u.user_id', + 'u.name', + 'u.email', + 'pm.role' + ]) + .where('pm.project_id', '=', id) + .execute(); + return json(200, { ok: true, route: 'GET /projects/{id}/members', pathParams: { id }, body: { + users + }}); + } // GET /projects if (rawPath === '/' && method === 'GET') { const projects = await db.selectFrom("branch.projects").selectAll().execute(); @@ -72,7 +89,6 @@ export const handler = async (event: any): Promise => { } } // <<< ROUTES-END - return json(404, { message: 'Not Found', path: normalizedPath, method }); } catch (err) { console.error('Lambda error:', err); diff --git a/apps/backend/lambdas/projects/openapi.yaml b/apps/backend/lambdas/projects/openapi.yaml index 7b45fbb..449e467 100644 --- a/apps/backend/lambdas/projects/openapi.yaml +++ b/apps/backend/lambdas/projects/openapi.yaml @@ -19,6 +19,15 @@ paths: ok: type: boolean + /projects/{id}/members: + get: + summary: GET /projects/{id}/members + parameters: + - in: path + name: id + required: true + schema: + type: string /projects: post: summary: POST /projects