Skip to content

Commit ed7ed10

Browse files
Merge pull request #2 from Mipmipp/feature/crud
Feature: Add CRUD.
2 parents 5377752 + ae914b2 commit ed7ed10

17 files changed

+1590
-0
lines changed

.env.dist

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# DYNAMOOSE
2+
DYNAMOOSE_ENDPOINT = "http://host.docker.internal:4566"
3+
DYNAMOOSE_REGION = "us-east-1"

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,5 @@
11
# DEPENDENCIES
22
/node_modules/*
3+
4+
# ENVIRONMENT VARIABLES
5+
.env

package-lock.json

Lines changed: 1368 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,14 @@
3131
"localstack"
3232
],
3333
"devDependencies": {
34+
"@types/aws-lambda": "^8.10.145",
35+
"@types/node": "^22.7.4",
36+
"@types/uuid": "^10.0.0",
3437
"typescript": "^5.6.2"
38+
},
39+
"dependencies": {
40+
"dynamoose": "^4.0.1",
41+
"http-status-codes": "^2.3.0",
42+
"uuid": "^10.0.0"
3543
}
3644
}

src/controller/index.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import * as ItemController from "./item.controller";
2+
3+
export const { createItem, getItem, getAllItems, updateItem, deleteItem } =
4+
ItemController;

src/controller/item.controller.ts

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
import { APIGatewayEvent } from "aws-lambda";
2+
import { StatusCodes } from "http-status-codes";
3+
import { createResponse, ErrorMessages } from "../utils";
4+
import { ItemService } from "../services";
5+
6+
const itemService = new ItemService();
7+
8+
const createItem = async (event: APIGatewayEvent) => {
9+
const itemData = JSON.parse(event.body ?? "{}");
10+
const newItem = await itemService.create(itemData);
11+
12+
return createResponse(StatusCodes.CREATED, newItem);
13+
};
14+
15+
const getItem = async (event: APIGatewayEvent) => {
16+
const itemId = event.pathParameters?.id;
17+
18+
if (!itemId) {
19+
return createResponse(StatusCodes.BAD_REQUEST, {
20+
message: ErrorMessages.ITEM_ID_REQUIRED,
21+
});
22+
}
23+
24+
const item = await itemService.get(itemId);
25+
26+
return createResponse(StatusCodes.OK, item);
27+
};
28+
29+
const getAllItems = async () => {
30+
const items = await itemService.getAll();
31+
32+
return createResponse(StatusCodes.OK, items);
33+
};
34+
35+
const updateItem = async (event: APIGatewayEvent) => {
36+
const itemId = event.pathParameters?.id;
37+
38+
if (!itemId) {
39+
return createResponse(StatusCodes.BAD_REQUEST, {
40+
message: ErrorMessages.ITEM_ID_REQUIRED,
41+
});
42+
}
43+
44+
const itemData = JSON.parse(event.body ?? "{}");
45+
const updatedItem = await itemService.update(itemId, itemData);
46+
47+
return createResponse(StatusCodes.OK, updatedItem);
48+
};
49+
50+
const deleteItem = async (event: APIGatewayEvent) => {
51+
const itemId = event.pathParameters?.id;
52+
53+
if (!itemId) {
54+
return createResponse(StatusCodes.BAD_REQUEST, {
55+
message: ErrorMessages.ITEM_ID_REQUIRED,
56+
});
57+
}
58+
59+
const itemDeleted = await itemService.get(itemId);
60+
await itemService.delete(itemId);
61+
62+
return createResponse(StatusCodes.NO_CONTENT, itemDeleted);
63+
};
64+
65+
export { createItem, getItem, getAllItems, updateItem, deleteItem };

src/index.ts

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import { APIGatewayEvent, APIGatewayProxyResult } from "aws-lambda";
2+
import { StatusCodes } from "http-status-codes";
3+
import {
4+
createItem,
5+
deleteItem,
6+
getAllItems,
7+
getItem,
8+
updateItem,
9+
} from "./controller";
10+
import { ErrorMessages } from "./utils";
11+
12+
export const handler = async (
13+
event: APIGatewayEvent
14+
): Promise<APIGatewayProxyResult> => {
15+
switch (event.httpMethod) {
16+
case "POST":
17+
return createItem(event);
18+
case "GET":
19+
if (event.pathParameters) {
20+
return getItem(event);
21+
}
22+
return getAllItems();
23+
case "PUT":
24+
return updateItem(event);
25+
case "DELETE":
26+
return deleteItem(event);
27+
default:
28+
return {
29+
statusCode: StatusCodes.METHOD_NOT_ALLOWED,
30+
body: JSON.stringify({ message: ErrorMessages.METHOD_NOT_ALLOWED }),
31+
};
32+
}
33+
};

src/models/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export { default as ItemModel } from "./item.model";
2+
export type { ItemDTO } from "./item.interface";

src/models/item.interface.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
export interface ItemDTO {
2+
name: string;
3+
description?: string;
4+
}
5+
6+
export default ItemDTO;

src/models/item.model.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import dynamoose from "dynamoose";
2+
import { itemSchema } from "../schemas";
3+
4+
const ddb = new dynamoose.aws.ddb.DynamoDB({
5+
endpoint: process.env.DYNAMO_ENDPOINT,
6+
region: process.env.DYNAMO_REGION,
7+
});
8+
9+
dynamoose.aws.ddb.set(ddb);
10+
11+
const ItemModel = dynamoose.model("ItemsTable", itemSchema);
12+
13+
export default ItemModel;

0 commit comments

Comments
 (0)