Jack
23aae19898
feat: implement POST /api/v1/agents/<agent_id>/upload API ( #15633 )
...
## Summary
Implement the `POST /api/v1/agents/<agent_id>/upload` endpoint in Go,
allowing file uploads associated with agent canvases.
### Changes
- **Modified**: `internal/service/agent.go` — Added `CheckCanvasAccess`
method (owner + team-level permission semantics)
- **Modified**: `internal/handler/agent.go` — Added `UploadAgentFile`
handler with auth check, multipart file parsing, and delegation to
`FileService`. Added `fileUploader` interface for testability.
- **Modified**: `internal/router/router.go` — Registered `POST
/:agent_id/upload` route
- **Modified**: `cmd/server_main.go` — Wired `fileService` into
`AgentHandler`
- **New**: `internal/service/agent_test.go` — 4 service-level tests for
`CheckCanvasAccess` (owner, team member, private denial, not found)
- **New**: `internal/handler/agent_upload_test.go` — 3 handler-level
tests (success with fake file service, cross-user denial, empty file
rejection)
### Testing
All 7 tests pass with zero mocking of the DB layer (in-memory SQLite):
```
=== RUN TestCheckCanvasAccess_Owner --- PASS
=== RUN TestCheckCanvasAccess_NotOwner --- PASS
=== RUN TestCheckCanvasAccess_PrivateCanvas_Denied --- PASS
=== RUN TestCheckCanvasAccess_NotFound --- PASS
=== RUN TestUploadAgentFileHandler_Success --- PASS
=== RUN TestUploadAgentFileHandler_NoPermission --- PASS
=== RUN TestUploadAgentFileHandler_NoFiles --- PASS
```
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
---------
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-04 17:21:47 +08:00
Jack
02d163a177
feat: implement GET /api/v1/agents/<agent_id>/versions API ( #15629 )
...
## Summary
Implement the `GET /api/v1/agents/<agent_id>/versions` endpoint in Go,
listing all version snapshots for an agent canvas in descending update
time order.
### Changes
- **New**: `internal/dao/user_canvas_version.go` —
`UserCanvasVersionDAO` with `ListByCanvasID` (ordered by update_time
DESC) and `GetByID`
- **Modified**: `internal/service/agent.go` — Added `CheckCanvasAccess`,
`ListVersions`, `GetVersion` methods
- **Modified**: `internal/handler/agent.go` — Added `ListAgentVersions`
handler with auth check
- **Modified**: `internal/router/router.go` — Registered `GET
/:agent_id/versions` route
- **New**: `internal/service/agent_test.go` — 5 service-level tests
(SQLite in-memory DB, zero mock)
- **Modified**: `internal/handler/agent_test.go` — 3 handler-level tests
(real DB, pre-authenticated context)
### Testing
All 8 tests pass with zero mocking (in-memory SQLite replaces MySQL):
```
=== RUN TestListVersions_Success --- PASS
=== RUN TestListVersions_Empty --- PASS
=== RUN TestCheckCanvasAccess_Owner --- PASS
=== RUN TestCheckCanvasAccess_NotOwner --- PASS
=== RUN TestCheckCanvasAccess_NotFound --- PASS
=== RUN TestListAgentVersionsHandler_Success --- PASS
=== RUN TestListAgentVersionsHandler_NoPermission --- PASS
=== RUN TestListAgentVersionsHandler_CanvasNotFound --- PASS
```
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
---------
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-04 15:36:26 +08:00
web-dev0521
0a7662cf3e
feat(go-api): implement GET /api/v1/agents list endpoint (issue #15328 ) ( #15329 )
...
## Summary
Closes : #15328
- Implements `GET /api/v1/agents` — the agent/canvas listing endpoint
needed to complete the Home dashboard tile in `web/src/pages/home/`.
- Mirrors Python `api/apps/restful_apis/agent_api.py::list_agents`
exactly: tenant-join auth, optional `owner_ids` guard, keyword filter,
pagination, ordering, and `canvas_category` filter (default:
`agent_canvas`).
- **Scope:** read-only list only. Full agent CRUD and canvas runtime are
explicitly out of scope (separate slice of #15240 ).
2026-05-28 19:40:54 +08:00