Skip to content

Commit d6ae875

Browse files
authored
Merge pull request #54 from vbetsch/develop
Sprint 3 - Create API routes for create, list and delete vaults
2 parents d969eb6 + a186414 commit d6ae875

File tree

31 files changed

+398
-74
lines changed

31 files changed

+398
-74
lines changed

.idea/sqldialects.xml

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

Makefile

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,6 @@ clean:
4545

4646
# Aliases
4747
run: up dev
48-
checks: lint
49-
checks_build: checks build
50-
.PHONY: run checks checks_build
48+
checks: lint tests
49+
ci: checks build
50+
.PHONY: run checks ci

prisma/migrations/20250720185500_init/migration.sql

Lines changed: 0 additions & 25 deletions
This file was deleted.

prisma/migrations/20250720202439_init/migration.sql

Lines changed: 0 additions & 14 deletions
This file was deleted.
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
-- CreateTable
2+
CREATE TABLE "Vault" (
3+
"id" TEXT NOT NULL,
4+
"label" VARCHAR(255) NOT NULL,
5+
"secret" VARCHAR(255) NOT NULL,
6+
7+
CONSTRAINT "Vault_pkey" PRIMARY KEY ("id")
8+
);

prisma/schema.prisma

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,9 @@ datasource db {
77
provider = "postgresql"
88
url = env("DATABASE_URL")
99
}
10+
11+
model Vault {
12+
id String @id @default(uuid())
13+
label String @db.VarChar(255)
14+
secret String @db.VarChar(255)
15+
}

src/app/api/swagger/route.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { createSwaggerSpec } from 'next-swagger-doc';
2+
import { NextResponse } from 'next/server';
23

3-
export function GET(): Response {
4+
export function GET(): NextResponse {
45
const spec: object = createSwaggerSpec({
56
apiFolder: 'src/app/api',
67
schemaFolders: ['src/modules/shared/dto'],
@@ -13,5 +14,5 @@ export function GET(): Response {
1314
},
1415
});
1516

16-
return Response.json(spec);
17+
return NextResponse.json(spec);
1718
}

src/app/api/vaults/[id]/route.ts

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import 'reflect-metadata';
2+
import type { NextRequest, NextResponse } from 'next/server';
3+
import type { IdParam } from '@shared/dto/params/id.param';
4+
import { container } from 'tsyringe';
5+
import { handleApiRequest } from '@api/utils/handle-api-request';
6+
import { StatusCodes } from 'http-status-codes';
7+
import { DeleteVaultUseCase } from '@api/usecases/vaults/delete-vault.usecase';
8+
9+
/**
10+
* @swagger
11+
* /api/vaults/{id}:
12+
* delete:
13+
* tags:
14+
* - Vaults
15+
* description: Delete a vault by ID
16+
* parameters:
17+
* - in: path
18+
* name: id
19+
* required: true
20+
* description: ID of vault to delete
21+
* schema:
22+
* type: string
23+
* responses:
24+
* 204:
25+
* description: The vault has been successfully deleted
26+
* 404:
27+
* description: Vault not found
28+
* 500:
29+
* description: Internal Server Error
30+
* content:
31+
* application/json:
32+
* schema:
33+
* $ref: '#/components/schemas/HttpResponseDto'
34+
*/
35+
export async function DELETE(
36+
request: NextRequest,
37+
params: IdParam
38+
): Promise<NextResponse> {
39+
const deleteVaultUseCase: DeleteVaultUseCase =
40+
container.resolve(DeleteVaultUseCase);
41+
return await handleApiRequest(
42+
() => deleteVaultUseCase.handle(params),
43+
StatusCodes.NO_CONTENT
44+
);
45+
}

src/app/api/vaults/route.ts

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
import 'reflect-metadata';
2+
import type { NextRequest, NextResponse } from 'next/server';
3+
import { container } from 'tsyringe';
4+
import { handleApiRequest } from '@api/utils/handle-api-request';
5+
import type { VaultModelDto } from '@shared/dto/models/vault.model.dto';
6+
import type { CreateVaultResponseDto } from '@shared/dto/responses/create-vault.response.dto';
7+
import { CreateVaultUseCase } from '@api/usecases/vaults/create-vault.usecase';
8+
import type { GetMyVaultsResponseDto } from '@shared/dto/responses/get-my-vaults.response.dto';
9+
import { GetMyVaultsUseCase } from '@api/usecases/vaults/get-my-vaults.usecase';
10+
import type { CreateVaultRequestDto } from '@shared/dto/requests/create-vault.request.dto';
11+
import { StatusCodes } from 'http-status-codes';
12+
13+
/**
14+
* @swagger
15+
* /api/vaults:
16+
* get:
17+
* tags:
18+
* - Vaults
19+
* description: Get my vaults
20+
* responses:
21+
* 200:
22+
* description: Returns my vaults
23+
* content:
24+
* application/json:
25+
* schema:
26+
* $ref: '#/components/schemas/GetMyVaultsResponseDto'
27+
* 500:
28+
* description: Internal Server Error
29+
* content:
30+
* application/json:
31+
* schema:
32+
* $ref: '#/components/schemas/HttpResponseDto'
33+
*/
34+
export async function GET(): Promise<NextResponse> {
35+
const getMyVaultsUseCase: GetMyVaultsUseCase =
36+
container.resolve(GetMyVaultsUseCase);
37+
return await handleApiRequest(async () => {
38+
const myVaults: VaultModelDto[] = await getMyVaultsUseCase.handle();
39+
const response: GetMyVaultsResponseDto = { myVaults };
40+
return response;
41+
});
42+
}
43+
44+
/**
45+
* @swagger
46+
* /api/vaults:
47+
* post:
48+
* tags:
49+
* - Vaults
50+
* description: Create a vault
51+
* requestBody:
52+
* required: true
53+
* content:
54+
* application/json:
55+
* schema:
56+
* $ref: '#/components/schemas/CreateVaultRequestDto'
57+
* responses:
58+
* 201:
59+
* description: Returns the vault created
60+
* content:
61+
* application/json:
62+
* schema:
63+
* $ref: '#/components/schemas/CreateVaultResponseDto'
64+
* 500:
65+
* description: Internal Server Error
66+
* content:
67+
* application/json:
68+
* schema:
69+
* $ref: '#/components/schemas/HttpResponseDto'
70+
*/
71+
export async function POST(request: NextRequest): Promise<NextResponse> {
72+
const params: CreateVaultRequestDto = await request.json();
73+
const createVaultUseCase: CreateVaultUseCase =
74+
container.resolve(CreateVaultUseCase);
75+
return await handleApiRequest(async () => {
76+
const vaultCreated: VaultModelDto = await createVaultUseCase.handle(params);
77+
const response: CreateVaultResponseDto = { vaultCreated };
78+
return response;
79+
}, StatusCodes.CREATED);
80+
}

src/modules/api/adapters/.gitkeep

Whitespace-only changes.

0 commit comments

Comments
 (0)