From 4e9dd85e3ab72e3f97f6851919c4dfc28dfb7829 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Fri, 2 Oct 2026 15:21:02 +0000 Subject: [PATCH 1/2] Documenta 201 en POST y 204 en DELETE de /api/notes. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit springdoc infería 200 para ResponseEntity; @ResponseStatus alinea la spec OpenAPI y el cliente Hey API con los códigos reales. Co-authored-by: Ariel Alvarado --- .../cl/overrid3/boilerplate/notes/NoteController.java | 4 ++++ frontend/openapi/openapi.json | 8 ++++---- frontend/src/client/@tanstack/react-query.gen.ts | 6 +++--- frontend/src/client/index.ts | 2 +- frontend/src/client/types.gen.ts | 10 ++++++---- 5 files changed, 18 insertions(+), 12 deletions(-) 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]; From 16f6a90e44eabed63118395d5ba975bfbee62646 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Fri, 2 Oct 2026 15:28:04 +0000 Subject: [PATCH 2/2] Instala pnpm 12.8.1 sin corepack en Node 26. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit node:26 ya no incluye corepack, así que la imagen y el CI usan npm install -g. El workflow de frontend y del cliente OpenAPI pasa a Node 26, igual que el Dockerfile. Co-authored-by: Ariel Alvarado --- .github/workflows/ci.yml | 8 ++++---- Dockerfile | 2 +- README.md | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) 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