From 5f9ee29c8dd9d1d8eb4a283897d914f46720eeb3 Mon Sep 17 00:00:00 2001 From: Andrew Trieu Date: Sat, 23 Nov 2024 11:12:46 +0200 Subject: [PATCH] feat: Add Cognito user pool name parameter and update API handlers to include CORS headers --- tasker-client/src/state/api.ts | 8 +++---- tasker-server/serverless.yml | 18 ++++++--------- tasker-server/src/handlers/createProject.ts | 10 +++++++-- tasker-server/src/handlers/createTask.ts | 10 +++++++-- tasker-server/src/handlers/createUser.ts | 22 +++++++------------ tasker-server/src/handlers/getProjects.ts | 10 +++++++-- tasker-server/src/handlers/getTasks.ts | 10 +++++++-- tasker-server/src/handlers/getTeams.ts | 10 +++++++-- tasker-server/src/handlers/getUser.ts | 10 +++++++-- tasker-server/src/handlers/getUserTasks.ts | 10 +++++++-- tasker-server/src/handlers/getUsers.ts | 10 +++++++-- tasker-server/src/handlers/postSignUp.ts | 5 +++++ .../src/handlers/updateTaskStatus.ts | 10 +++++++-- tasker-server/terraform/cognito.tf | 7 ++++++ 14 files changed, 103 insertions(+), 47 deletions(-) diff --git a/tasker-client/src/state/api.ts b/tasker-client/src/state/api.ts index 00a6264..5ceb25b 100644 --- a/tasker-client/src/state/api.ts +++ b/tasker-client/src/state/api.ts @@ -80,9 +80,9 @@ export const api = createApi({ baseUrl: process.env.NEXT_PUBLIC_API_BASE_URL, prepareHeaders: async (headers) => { const session = await fetchAuthSession(); - const { accessToken } = session.tokens ?? {}; - if (accessToken) { - headers.set("Authorization", `Bearer ${accessToken}`); + const { idToken } = session.tokens ?? {}; + if (idToken) { + headers.set("Authorization", `Bearer ${idToken}`); } return headers; }, @@ -120,7 +120,7 @@ export const api = createApi({ }), invalidatesTags: ["Projects"], }), - getTasks: build.query({ + getTasks: build.query({ query: ({ projectId }) => `tasks?projectId=${projectId}`, providesTags: (result) => result diff --git a/tasker-server/serverless.yml b/tasker-server/serverless.yml index 48e420d..bc2349f 100644 --- a/tasker-server/serverless.yml +++ b/tasker-server/serverless.yml @@ -40,15 +40,7 @@ provider: - "arn:aws:execute-api:${self:provider.region}:*:*/*/POST/users" functions: - postSignUp: - handler: src/handlers/postSignUp.handler - memorySize: 1024 - timeout: 60 - events: - - cognitoUserPool: - pool: ${ssm:/tasker/cognito/user-pool-id} - trigger: PostConfirmation - # POST /users + # POST /users or triggered by Cognito createUser: handler: src/handlers/createUser.handler memorySize: 1024 @@ -59,6 +51,10 @@ functions: method: post cors: true authorizer: aws_iam + - cognitoUserPool: + existing: true + pool: ${ssm:/tasker/cognito/user-pool-name} + trigger: PostConfirmation # POST /projects createProject: handler: src/handlers/createProject.handler @@ -151,8 +147,8 @@ functions: type: COGNITO_USER_POOLS arn: ${ssm:/tasker/cognito/user-pool-arn} # GET /tasks/user/${userId} - getTasksByUser: - handler: src/handlers/getTasksByUser.handler + getUserTasks: + handler: src/handlers/getUserTasks.handler memorySize: 1024 timeout: 60 events: diff --git a/tasker-server/src/handlers/createProject.ts b/tasker-server/src/handlers/createProject.ts index 0770c47..75e6354 100644 --- a/tasker-server/src/handlers/createProject.ts +++ b/tasker-server/src/handlers/createProject.ts @@ -30,13 +30,19 @@ export const handler = async (event: any): Promise => { return { statusCode: 201, - headers: { "Content-Type": "application/json" }, + headers: { + "Content-Type": "application/json", + "Access-Control-Allow-Origin": "*", + }, body: JSON.stringify(newProject), }; } catch (error: any) { return { statusCode: 500, - headers: { "Content-Type": "application/json" }, + headers: { + "Content-Type": "application/json", + "Access-Control-Allow-Origin": "*", + }, body: JSON.stringify({ message: `Error creating project: ${error.message}`, }), diff --git a/tasker-server/src/handlers/createTask.ts b/tasker-server/src/handlers/createTask.ts index 2ee1dcc..caef865 100644 --- a/tasker-server/src/handlers/createTask.ts +++ b/tasker-server/src/handlers/createTask.ts @@ -48,13 +48,19 @@ export const handler = async (event: any): Promise => { return { statusCode: 201, - headers: { "Content-Type": "application/json" }, + headers: { + "Content-Type": "application/json", + "Access-Control-Allow-Origin": "*", + }, body: JSON.stringify(newTask), }; } catch (error: any) { return { statusCode: 500, - headers: { "Content-Type": "application/json" }, + headers: { + "Content-Type": "application/json", + "Access-Control-Allow-Origin": "*", + }, body: JSON.stringify({ message: `Error creating task: ${error.message}`, }), diff --git a/tasker-server/src/handlers/createUser.ts b/tasker-server/src/handlers/createUser.ts index e991ac4..0cd9032 100644 --- a/tasker-server/src/handlers/createUser.ts +++ b/tasker-server/src/handlers/createUser.ts @@ -10,8 +10,10 @@ const client = new DynamoDBClient({ region: SLS_REGION }); const docClient = DynamoDBDocument.from(client); export const handler = async (event: any): Promise => { - const { username, cognitoId } = JSON.parse(event.body); - const teamId = fetchRandomTeamId(); + const username = + event.request.userAttributes["preferred_username"] || event.userName; + const cognitoId = event.userName; + const teamId = await fetchRandomTeamId(); try { const newUser = { @@ -30,18 +32,10 @@ export const handler = async (event: any): Promise => { await docClient.put(params); - return { - statusCode: 201, - headers: { "Content-Type": "application/json" }, - body: JSON.stringify(newUser), - }; + console.info(`User ${username} created with teamId ${teamId}`); } catch (error: any) { - return { - statusCode: 500, - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ - message: `Error creating user: ${error.message}`, - }), - }; + throw new Error(`Error creating user: ${error.message}`); } + + return event; }; diff --git a/tasker-server/src/handlers/getProjects.ts b/tasker-server/src/handlers/getProjects.ts index 1dcbdeb..b2e6f8b 100644 --- a/tasker-server/src/handlers/getProjects.ts +++ b/tasker-server/src/handlers/getProjects.ts @@ -21,13 +21,19 @@ export const handler = async (event: any): Promise => { return { statusCode: 200, - headers: { "Content-Type": "application/json" }, + headers: { + "Content-Type": "application/json", + "Access-Control-Allow-Origin": "*", + }, body: JSON.stringify(projects.Items), }; } catch (error: any) { return { statusCode: 500, - headers: { "Content-Type": "application/json" }, + headers: { + "Content-Type": "application/json", + "Access-Control-Allow-Origin": "*", + }, body: JSON.stringify({ message: `Error retrieving projects: ${error.message}`, }), diff --git a/tasker-server/src/handlers/getTasks.ts b/tasker-server/src/handlers/getTasks.ts index ee56eb1..592f3b9 100644 --- a/tasker-server/src/handlers/getTasks.ts +++ b/tasker-server/src/handlers/getTasks.ts @@ -54,13 +54,19 @@ export const handler = async (event: any): Promise => { return { statusCode: 200, - headers: { "Content-Type": "application/json" }, + headers: { + "Content-Type": "application/json", + "Access-Control-Allow-Origin": "*", + }, body: JSON.stringify(tasksWithDetails), }; } catch (error: any) { return { statusCode: 500, - headers: { "Content-Type": "application/json" }, + headers: { + "Content-Type": "application/json", + "Access-Control-Allow-Origin": "*", + }, body: JSON.stringify({ message: `Error retrieving tasks: ${error.message}`, }), diff --git a/tasker-server/src/handlers/getTeams.ts b/tasker-server/src/handlers/getTeams.ts index c1054a6..e09e5f6 100644 --- a/tasker-server/src/handlers/getTeams.ts +++ b/tasker-server/src/handlers/getTeams.ts @@ -41,13 +41,19 @@ export const handler = async (event: any): Promise => { return { statusCode: 200, - headers: { "Content-Type": "application/json" }, + headers: { + "Content-Type": "application/json", + "Access-Control-Allow-Origin": "*", + }, body: JSON.stringify(teamsWithUsernames), }; } catch (error: any) { return { statusCode: 500, - headers: { "Content-Type": "application/json" }, + headers: { + "Content-Type": "application/json", + "Access-Control-Allow-Origin": "*", + }, body: JSON.stringify({ message: `Error retrieving teams: ${error.message}`, }), diff --git a/tasker-server/src/handlers/getUser.ts b/tasker-server/src/handlers/getUser.ts index 4f67b98..b8ae931 100644 --- a/tasker-server/src/handlers/getUser.ts +++ b/tasker-server/src/handlers/getUser.ts @@ -23,13 +23,19 @@ export const handler = async (event: any): Promise => { return { statusCode: 200, - headers: { "Content-Type": "application/json" }, + headers: { + "Content-Type": "application/json", + "Access-Control-Allow-Origin": "*", + }, body: JSON.stringify(user.Items?.[0] || {}), }; } catch (error: any) { return { statusCode: 500, - headers: { "Content-Type": "application/json" }, + headers: { + "Content-Type": "application/json", + "Access-Control-Allow-Origin": "*", + }, body: JSON.stringify({ message: `Error retrieving user: ${error.message}`, }), diff --git a/tasker-server/src/handlers/getUserTasks.ts b/tasker-server/src/handlers/getUserTasks.ts index e578766..b9dc8d9 100644 --- a/tasker-server/src/handlers/getUserTasks.ts +++ b/tasker-server/src/handlers/getUserTasks.ts @@ -19,13 +19,19 @@ export const handler = async (event: any): Promise => { return { statusCode: 200, - headers: { "Content-Type": "application/json" }, + headers: { + "Content-Type": "application/json", + "Access-Control-Allow-Origin": "*", + }, body: JSON.stringify(userTasks), }; } catch (error: any) { return { statusCode: 500, - headers: { "Content-Type": "application/json" }, + headers: { + "Content-Type": "application/json", + "Access-Control-Allow-Origin": "*", + }, body: JSON.stringify({ message: `Error retrieving tasks for user: ${error.message}`, }), diff --git a/tasker-server/src/handlers/getUsers.ts b/tasker-server/src/handlers/getUsers.ts index d111aaf..9a9e86d 100644 --- a/tasker-server/src/handlers/getUsers.ts +++ b/tasker-server/src/handlers/getUsers.ts @@ -21,13 +21,19 @@ export const handler = async (event: any): Promise => { return { statusCode: 200, - headers: { "Content-Type": "application/json" }, + headers: { + "Content-Type": "application/json", + "Access-Control-Allow-Origin": "*", + }, body: JSON.stringify(users.Items), }; } catch (error: any) { return { statusCode: 500, - headers: { "Content-Type": "application/json" }, + headers: { + "Content-Type": "application/json", + "Access-Control-Allow-Origin": "*", + }, body: JSON.stringify({ message: `Error retrieving users: ${error.message}`, }), diff --git a/tasker-server/src/handlers/postSignUp.ts b/tasker-server/src/handlers/postSignUp.ts index 1ac6d39..cf63274 100644 --- a/tasker-server/src/handlers/postSignUp.ts +++ b/tasker-server/src/handlers/postSignUp.ts @@ -10,6 +10,8 @@ export const handler = async (event: any): Promise => { cognitoId: event.userName, }); + console.log(postData); + const options = { hostname: API_BASE_URL ? new URL(API_BASE_URL).hostname : "", port: 443, @@ -20,6 +22,7 @@ export const handler = async (event: any): Promise => { headers: { "Content-category": "application/json", "Content-Length": Buffer.byteLength(postData), + "Allow-Control-Allow-Origin": "*", }, }; @@ -35,5 +38,7 @@ export const handler = async (event: any): Promise => { req.end(); }); + console.log(responseBody); + return event; }; diff --git a/tasker-server/src/handlers/updateTaskStatus.ts b/tasker-server/src/handlers/updateTaskStatus.ts index 77842d4..5910f8e 100644 --- a/tasker-server/src/handlers/updateTaskStatus.ts +++ b/tasker-server/src/handlers/updateTaskStatus.ts @@ -31,13 +31,19 @@ export const handler = async (event: any): Promise => { return { statusCode: 200, - headers: { "Content-Type": "application/json" }, + headers: { + "Content-Type": "application/json", + "Access-Control-Allow-Origin": "*", + }, body: JSON.stringify(updatedTask.Attributes), }; } catch (error: any) { return { statusCode: 500, - headers: { "Content-Type": "application/json" }, + headers: { + "Content-Type": "application/json", + "Access-Control-Allow-Origin": "*", + }, body: JSON.stringify({ message: `Error updating task: ${error.message}`, }), diff --git a/tasker-server/terraform/cognito.tf b/tasker-server/terraform/cognito.tf index dee2443..474651d 100644 --- a/tasker-server/terraform/cognito.tf +++ b/tasker-server/terraform/cognito.tf @@ -83,6 +83,13 @@ resource "aws_ssm_parameter" "user_pool_arn" { value = aws_cognito_user_pool.tasker_cognito_user_pool.arn } +resource "aws_ssm_parameter" "user_pool_name" { + name = "/tasker/cognito/user-pool-name" + description = "Tasker Cognito User Pool Name" + type = "String" + value = aws_cognito_user_pool.tasker_cognito_user_pool.name +} + resource "aws_ssm_parameter" "client_id" { name = "/tasker/cognito/client-id" description = "Tasker Cognito Client ID"