diff --git a/.sdlc/features/add-hello-endpoint/feature.json b/.sdlc/features/add-hello-endpoint/feature.json index 0e4c4d7..0f67d0b 100644 --- a/.sdlc/features/add-hello-endpoint/feature.json +++ b/.sdlc/features/add-hello-endpoint/feature.json @@ -12,6 +12,17 @@ "status": "approved", "createdAt": "2026-02-03T03:02:00Z", "approvedAt": "2026-02-03T03:04:00Z" + }, + "tasks": { + "status": "draft", + "createdAt": "2026-02-03T03:05:00Z" } - } + }, + "tasks": [ + {"id": "T1", "title": "Create Hello handler with Say method", "status": "pending"}, + {"id": "T2", "title": "Add unit tests for Hello handler", "status": "pending"}, + {"id": "T3", "title": "Register /hello route in routes.go", "status": "pending"}, + {"id": "T4", "title": "Add OpenAPI documentation for /hello endpoint", "status": "pending"}, + {"id": "T5", "title": "Verify integration and run quality checks", "status": "pending"} + ] } diff --git a/.sdlc/features/add-hello-endpoint/tasks.md b/.sdlc/features/add-hello-endpoint/tasks.md new file mode 100644 index 0000000..9929694 --- /dev/null +++ b/.sdlc/features/add-hello-endpoint/tasks.md @@ -0,0 +1,76 @@ +# Tasks: Add /hello Endpoint to API Service + +## Task Order (dependency sequence) + +### T1: Create Hello handler with Say method +- **Scope:** Create `services/api/internal/api/handlers/hello.go` with: + - `HelloResponse` struct with `Message string` field + - `Hello` struct (handler) + - `NewHello(logger *logging.Logger) *Hello` constructor + - `Say(w http.ResponseWriter, r *http.Request) error` method that returns greeting +- **Files:** + - Create: `services/api/internal/api/handlers/hello.go` +- **Depends on:** None +- **Acceptance criteria:** + - [ ] `HelloResponse` struct defined with `json:"message"` tag + - [ ] `Hello` handler struct created with logger field + - [ ] `NewHello` constructor follows existing pattern from `example.go` + - [ ] `Say` method uses `httpresponse.OK()` to return `HelloResponse{Message: "Hello, World!"}` + - [ ] `Say` method returns `nil` (no error case) + - [ ] File compiles without errors + +### T2: Add unit tests for Hello handler +- **Scope:** Create `services/api/internal/api/handlers/hello_test.go` with test for `Say` method +- **Files:** + - Create: `services/api/internal/api/handlers/hello_test.go` +- **Depends on:** T1 +- **Acceptance criteria:** + - [ ] Test file follows pattern from `example_test.go` + - [ ] `TestHello_Say` test verifies HTTP 200 status + - [ ] Test verifies response contains `data` field + - [ ] Test verifies `data.message` equals `"Hello, World!"` + - [ ] All tests pass + +### T3: Register /hello route in routes.go +- **Scope:** Update `services/api/internal/api/routes.go` to: + - Initialize `helloHandler` using `handlers.NewHello(logger)` + - Register `GET /api/v1/hello` route with `app.Wrap(helloHandler.Say)` +- **Files:** + - Modify: `services/api/internal/api/routes.go` +- **Depends on:** T1 +- **Acceptance criteria:** + - [ ] `helloHandler` initialized alongside other handlers + - [ ] Route registered in public routes section (before auth group) + - [ ] Route uses `app.Wrap()` pattern + - [ ] Route path is `/hello` (under `/api/v1` group) + +### T4: Add OpenAPI documentation for /hello endpoint +- **Scope:** Update `services/api/internal/api/spec.go` to: + - Add "Hello" tag with description "Simple greeting endpoint" + - Define `HelloResponse` schema + - Add `/api/v1/hello` GET path with response documentation +- **Files:** + - Modify: `services/api/internal/api/spec.go` +- **Depends on:** T3 +- **Acceptance criteria:** + - [ ] "Hello" tag added with appropriate description + - [ ] `HelloResponse` schema defined with `message` field + - [ ] GET `/api/v1/hello` path documented + - [ ] Response shows 200 with `{data, meta}` envelope containing `HelloResponse` + - [ ] No security requirement (public endpoint) + - [ ] OpenAPI spec renders correctly at `/docs` + +### T5: Verify integration and run quality checks +- **Scope:** Run the service and verify end-to-end functionality: + - Build passes + - Tests pass + - Endpoint responds correctly + - OpenAPI docs show the new endpoint +- **Files:** None (verification only) +- **Depends on:** T1, T2, T3, T4 +- **Acceptance criteria:** + - [ ] `go build ./...` succeeds for services/api + - [ ] `go test ./...` passes for services/api + - [ ] `GET /api/v1/hello` returns 200 with `{"data": {"message": "Hello, World!"}, "meta": {...}}` + - [ ] `/docs` shows Hello endpoint under "Hello" tag + - [ ] Response includes `request_id` in meta (via middleware)