diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3a0d01a..afd8a20 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -31,9 +31,9 @@ jobs: - uses: actions/checkout@v7.0.1 - uses: actions/setup-node@v7.0.0 with: - node-version: "24" + node-version: "26" - name: pnpm - run: corepack enable && corepack prepare pnpm@12.8.1 --activate + run: npm install -g pnpm@12.8.1 - name: Dependencias working-directory: frontend run: pnpm install --frozen-lockfile @@ -60,9 +60,9 @@ jobs: - uses: actions/checkout@v7.0.1 - uses: actions/setup-node@v7.0.0 with: - node-version: "24" + node-version: "26" - name: pnpm - run: corepack enable && corepack prepare pnpm@12.8.1 --activate + run: npm install -g pnpm@12.8.1 - name: Dependencias working-directory: frontend run: pnpm install --frozen-lockfile diff --git a/Dockerfile b/Dockerfile index 82ed56f..b871a4c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,7 +2,7 @@ FROM node:26-bookworm-slim AS frontend WORKDIR /src -RUN corepack enable && corepack prepare pnpm@12.8.1 --activate +RUN npm install -g pnpm@12.8.1 COPY frontend/package.json frontend/pnpm-lock.yaml frontend/pnpm-workspace.yaml ./ COPY frontend/ ./ RUN pnpm install --frozen-lockfile diff --git a/README.md b/README.md index ecc46e8..0359800 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ La SPA y la API comparten origen. No hay CORS. En desarrollo, Vite proxea `/api` ## Arranque local -Requisitos: JDK 25 (Gradle puede descargarlo con el resolver de Foojay), Node.js 24, pnpm 12, Docker. +Requisitos: JDK 25 (Gradle puede descargarlo con el resolver de Foojay), Node.js 26, pnpm 12, Docker. ```bash cp .env.example .env diff --git a/backend/src/main/java/cl/overrid3/boilerplate/notes/NoteController.java b/backend/src/main/java/cl/overrid3/boilerplate/notes/NoteController.java index 9f5305f..b9dc879 100644 --- a/backend/src/main/java/cl/overrid3/boilerplate/notes/NoteController.java +++ b/backend/src/main/java/cl/overrid3/boilerplate/notes/NoteController.java @@ -6,6 +6,7 @@ import jakarta.validation.Valid; +import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; @@ -14,6 +15,7 @@ import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestController; import cl.overrid3.boilerplate.notes.internal.NoteService; @@ -46,6 +48,7 @@ public NoteResponse get(@PathVariable UUID id) { } @PostMapping + @ResponseStatus(HttpStatus.CREATED) @Operation(operationId = "createNote") public ResponseEntity create(@Valid @RequestBody CreateNoteRequest request) { NoteResponse created = notes.create(request); @@ -59,6 +62,7 @@ public NoteResponse update(@PathVariable UUID id, @Valid @RequestBody UpdateNote } @DeleteMapping("/{id}") + @ResponseStatus(HttpStatus.NO_CONTENT) @Operation(operationId = "deleteNote") public ResponseEntity delete(@PathVariable UUID id) { notes.delete(id); diff --git a/frontend/openapi/openapi.json b/frontend/openapi/openapi.json index c3081d3..8d7720f 100644 --- a/frontend/openapi/openapi.json +++ b/frontend/openapi/openapi.json @@ -86,8 +86,8 @@ } } ], "responses" : { - "200" : { - "description" : "OK" + "204" : { + "description" : "No Content" } }, "security" : [ { @@ -132,8 +132,8 @@ "required" : true }, "responses" : { - "200" : { - "description" : "OK", + "201" : { + "description" : "Created", "content" : { "*/*" : { "schema" : { diff --git a/frontend/src/client/@tanstack/react-query.gen.ts b/frontend/src/client/@tanstack/react-query.gen.ts index cb94575..2d3fc21 100644 --- a/frontend/src/client/@tanstack/react-query.gen.ts +++ b/frontend/src/client/@tanstack/react-query.gen.ts @@ -4,10 +4,10 @@ import { type DefaultError, queryOptions, type UseMutationOptions } from '@tanst import { client } from '../client.gen'; import { createNote, deleteNote, getCurrentPrincipal, getNote, getPublicConfig, listNotes, type Options, updateNote } from '../sdk.gen'; -import type { CreateNoteData, CreateNoteResponse, DeleteNoteData, GetCurrentPrincipalData, GetCurrentPrincipalResponse, GetNoteData, GetNoteResponse, GetPublicConfigData, GetPublicConfigResponse, ListNotesData, ListNotesResponse, UpdateNoteData, UpdateNoteResponse } from '../types.gen'; +import type { CreateNoteData, CreateNoteResponse, DeleteNoteData, DeleteNoteResponse, GetCurrentPrincipalData, GetCurrentPrincipalResponse, GetNoteData, GetNoteResponse, GetPublicConfigData, GetPublicConfigResponse, ListNotesData, ListNotesResponse, UpdateNoteData, UpdateNoteResponse } from '../types.gen'; -export const deleteNoteMutation = (options?: Partial>): UseMutationOptions> => { - const mutationOptions: UseMutationOptions> = { +export const deleteNoteMutation = (options?: Partial>): UseMutationOptions> => { + const mutationOptions: UseMutationOptions> = { mutationFn: async (fnOptions) => { const { data } = await deleteNote({ ...options, diff --git a/frontend/src/client/index.ts b/frontend/src/client/index.ts index e3f6471..32b3e36 100644 --- a/frontend/src/client/index.ts +++ b/frontend/src/client/index.ts @@ -1,4 +1,4 @@ // This file is auto-generated by @hey-api/openapi-ts export { createNote, deleteNote, getCurrentPrincipal, getNote, getPublicConfig, listNotes, type Options, updateNote } from './sdk.gen'; -export type { ClientOptions, CreateNoteData, CreateNoteRequest, CreateNoteResponse, CreateNoteResponses, DeleteNoteData, DeleteNoteResponses, GetCurrentPrincipalData, GetCurrentPrincipalResponse, GetCurrentPrincipalResponses, GetNoteData, GetNoteResponse, GetNoteResponses, GetPublicConfigData, GetPublicConfigResponse, GetPublicConfigResponses, ListNotesData, ListNotesResponse, ListNotesResponses, MeResponse, NoteResponse, PublicConfigResponse, UpdateNoteData, UpdateNoteRequest, UpdateNoteResponse, UpdateNoteResponses } from './types.gen'; +export type { ClientOptions, CreateNoteData, CreateNoteRequest, CreateNoteResponse, CreateNoteResponses, DeleteNoteData, DeleteNoteResponse, DeleteNoteResponses, GetCurrentPrincipalData, GetCurrentPrincipalResponse, GetCurrentPrincipalResponses, GetNoteData, GetNoteResponse, GetNoteResponses, GetPublicConfigData, GetPublicConfigResponse, GetPublicConfigResponses, ListNotesData, ListNotesResponse, ListNotesResponses, MeResponse, NoteResponse, PublicConfigResponse, UpdateNoteData, UpdateNoteRequest, UpdateNoteResponse, UpdateNoteResponses } from './types.gen'; diff --git a/frontend/src/client/types.gen.ts b/frontend/src/client/types.gen.ts index e1b066c..cffc58e 100644 --- a/frontend/src/client/types.gen.ts +++ b/frontend/src/client/types.gen.ts @@ -47,11 +47,13 @@ export type DeleteNoteData = { export type DeleteNoteResponses = { /** - * OK + * No Content */ - 200: unknown; + 204: void; }; +export type DeleteNoteResponse = DeleteNoteResponses[keyof DeleteNoteResponses]; + export type GetNoteData = { body?: never; path: { @@ -113,9 +115,9 @@ export type CreateNoteData = { export type CreateNoteResponses = { /** - * OK + * Created */ - 200: NoteResponse; + 201: NoteResponse; }; export type CreateNoteResponse = CreateNoteResponses[keyof CreateNoteResponses];