diff --git a/tasker-server/serverless.yml b/tasker-server/serverless.yml index da8cbf6..48e420d 100644 --- a/tasker-server/serverless.yml +++ b/tasker-server/serverless.yml @@ -10,8 +10,9 @@ provider: runtime: nodejs20.x environment: SLS_REGION: ${self:provider.region} - TASKER_TASK_TABLE_NAME: ${ssm:/tasker/dynamodb/project-table-name} - TASKER_PROJECT_TABLE_NAME: ${ssm:/tasker/dynamodb/task-table-name} + API_BASE_URL: ${ssm:/tasker/api/base-url} + TASKER_TASK_TABLE_NAME: ${ssm:/tasker/dynamodb/task-table-name} + TASKER_PROJECT_TABLE_NAME: ${ssm:/tasker/dynamodb/project-table-name} TASKER_USER_TABLE_NAME: ${ssm:/tasker/dynamodb/user-table-name} TASKER_TASK_EXTRA_TABLE_NAME: ${ssm:/tasker/dynamodb/task-extra-table-name} TASKER_TEAM_TABLE_NAME: ${ssm:/tasker/dynamodb/team-table-name} @@ -32,6 +33,11 @@ provider: "arn:aws:dynamodb:${self:provider.region}:*:table/tasker-*", "arn:aws:dynamodb:${self:provider.region}:*:table/tasker-*/*", ] + - Effect: Allow + Action: + - execute-api:Invoke + Resource: + - "arn:aws:execute-api:${self:provider.region}:*:*/*/POST/users" functions: postSignUp: @@ -52,6 +58,7 @@ functions: path: users method: post cors: true + authorizer: aws_iam # POST /projects createProject: handler: src/handlers/createProject.handler diff --git a/tasker-server/src/handlers/createProject.ts b/tasker-server/src/handlers/createProject.ts index cfdd20c..0770c47 100644 --- a/tasker-server/src/handlers/createProject.ts +++ b/tasker-server/src/handlers/createProject.ts @@ -9,7 +9,8 @@ const client = new DynamoDBClient({ region: SLS_REGION }); const docClient = DynamoDBDocument.from(client); export const handler = async (event: any): Promise => { - const { name, description, startDate, endDate } = event.body; + const { name, description, startDate, endDate } = JSON.parse(event.body); + try { const newProject = { category: "projects", @@ -28,12 +29,14 @@ export const handler = async (event: any): Promise => { await docClient.put(params); return { - status: 201, + statusCode: 201, + headers: { "Content-Type": "application/json" }, body: JSON.stringify(newProject), }; } catch (error: any) { return { - status: 500, + statusCode: 500, + headers: { "Content-Type": "application/json" }, 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 bec3b1f..2ee1dcc 100644 --- a/tasker-server/src/handlers/createTask.ts +++ b/tasker-server/src/handlers/createTask.ts @@ -21,7 +21,7 @@ export const handler = async (event: any): Promise => { projectId, authorUserId, assignedUserId, - } = event.body; + } = JSON.parse(event.body); try { const newTask = { category: "tasks", @@ -47,12 +47,14 @@ export const handler = async (event: any): Promise => { await docClient.put(params); return { - status: 201, + statusCode: 201, + headers: { "Content-Type": "application/json" }, body: JSON.stringify(newTask), }; } catch (error: any) { return { - status: 500, + statusCode: 500, + headers: { "Content-Type": "application/json" }, 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 762586d..e991ac4 100644 --- a/tasker-server/src/handlers/createUser.ts +++ b/tasker-server/src/handlers/createUser.ts @@ -10,7 +10,7 @@ const client = new DynamoDBClient({ region: SLS_REGION }); const docClient = DynamoDBDocument.from(client); export const handler = async (event: any): Promise => { - const { username, cognitoId } = event.body; + const { username, cognitoId } = JSON.parse(event.body); const teamId = fetchRandomTeamId(); try { @@ -31,12 +31,14 @@ export const handler = async (event: any): Promise => { await docClient.put(params); return { - status: 201, + statusCode: 201, + headers: { "Content-Type": "application/json" }, body: JSON.stringify(newUser), }; } catch (error: any) { return { - status: 500, + statusCode: 500, + headers: { "Content-Type": "application/json" }, body: JSON.stringify({ message: `Error creating user: ${error.message}`, }), diff --git a/tasker-server/src/handlers/getProjects.ts b/tasker-server/src/handlers/getProjects.ts index 9375246..1dcbdeb 100644 --- a/tasker-server/src/handlers/getProjects.ts +++ b/tasker-server/src/handlers/getProjects.ts @@ -20,12 +20,14 @@ export const handler = async (event: any): Promise => { const projects = await docClient.query(params); return { - status: 200, + statusCode: 200, + headers: { "Content-Type": "application/json" }, body: JSON.stringify(projects.Items), }; } catch (error: any) { return { - status: 500, + statusCode: 500, + headers: { "Content-Type": "application/json" }, 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 5a722d0..ee56eb1 100644 --- a/tasker-server/src/handlers/getTasks.ts +++ b/tasker-server/src/handlers/getTasks.ts @@ -53,12 +53,14 @@ export const handler = async (event: any): Promise => { ); return { - status: 200, + statusCode: 200, + headers: { "Content-Type": "application/json" }, body: JSON.stringify(tasksWithDetails), }; } catch (error: any) { return { - status: 500, + statusCode: 500, + headers: { "Content-Type": "application/json" }, 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 59d55d5..c1054a6 100644 --- a/tasker-server/src/handlers/getTeams.ts +++ b/tasker-server/src/handlers/getTeams.ts @@ -40,12 +40,14 @@ export const handler = async (event: any): Promise => { ); return { - status: 200, + statusCode: 200, + headers: { "Content-Type": "application/json" }, body: JSON.stringify(teamsWithUsernames), }; } catch (error: any) { return { - status: 500, + statusCode: 500, + headers: { "Content-Type": "application/json" }, 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 872c08c..4f67b98 100644 --- a/tasker-server/src/handlers/getUser.ts +++ b/tasker-server/src/handlers/getUser.ts @@ -22,12 +22,14 @@ export const handler = async (event: any): Promise => { const user = await docClient.query(params); return { - status: 200, + statusCode: 200, + headers: { "Content-Type": "application/json" }, body: JSON.stringify(user.Items?.[0] || {}), }; } catch (error: any) { return { - status: 500, + statusCode: 500, + headers: { "Content-Type": "application/json" }, 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 d6c2d07..e578766 100644 --- a/tasker-server/src/handlers/getUserTasks.ts +++ b/tasker-server/src/handlers/getUserTasks.ts @@ -18,12 +18,14 @@ export const handler = async (event: any): Promise => { const userTasks = [...authorTasks, ...assigneeTasks]; return { - status: 200, + statusCode: 200, + headers: { "Content-Type": "application/json" }, body: JSON.stringify(userTasks), }; } catch (error: any) { return { - status: 500, + statusCode: 500, + headers: { "Content-Type": "application/json" }, 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 7d280eb..d111aaf 100644 --- a/tasker-server/src/handlers/getUsers.ts +++ b/tasker-server/src/handlers/getUsers.ts @@ -20,12 +20,14 @@ export const handler = async (event: any): Promise => { const users = await docClient.query(params); return { - status: 200, + statusCode: 200, + headers: { "Content-Type": "application/json" }, body: JSON.stringify(users.Items), }; } catch (error: any) { return { - status: 500, + statusCode: 500, + headers: { "Content-Type": "application/json" }, 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 26f9322..1ac6d39 100644 --- a/tasker-server/src/handlers/postSignUp.ts +++ b/tasker-server/src/handlers/postSignUp.ts @@ -1,4 +1,7 @@ import https from "https"; +import path from "path"; + +const API_BASE_URL = process.env.API_BASE_URL || ""; export const handler = async (event: any): Promise => { const postData = JSON.stringify({ @@ -8,9 +11,11 @@ export const handler = async (event: any): Promise => { }); const options = { - hostname: process.env.API_URL, + hostname: API_BASE_URL ? new URL(API_BASE_URL).hostname : "", port: 443, - path: "/users", + path: API_BASE_URL + ? path.join(new URL(API_BASE_URL).pathname, "/users") + : "", method: "POST", headers: { "Content-category": "application/json", @@ -18,7 +23,7 @@ export const handler = async (event: any): Promise => { }, }; - const responseBody = new Promise((resolve, reject) => { + const responseBody = await new Promise((resolve, reject) => { const req = https.request(options, (res) => { res.setEncoding("utf8"); let responseBody = ""; diff --git a/tasker-server/src/handlers/updateTaskStatus.ts b/tasker-server/src/handlers/updateTaskStatus.ts index f9ad61e..77842d4 100644 --- a/tasker-server/src/handlers/updateTaskStatus.ts +++ b/tasker-server/src/handlers/updateTaskStatus.ts @@ -9,7 +9,7 @@ const docClient = DynamoDBDocument.from(client); export const handler = async (event: any): Promise => { const { taskId } = event.pathParameters; - const { status } = event.body; + const { status } = JSON.parse(event.body); try { const params: UpdateCommandInput = { TableName: TASKER_TASK_TABLE_NAME, @@ -30,12 +30,14 @@ export const handler = async (event: any): Promise => { const updatedTask = await docClient.update(params); return { - status: 200, + statusCode: 200, + headers: { "Content-Type": "application/json" }, body: JSON.stringify(updatedTask.Attributes), }; } catch (error: any) { return { - status: 500, + statusCode: 500, + headers: { "Content-Type": "application/json" }, body: JSON.stringify({ message: `Error updating task: ${error.message}`, }),