mirror of
https://github.com/go-vikunja/vikunja.git
synced 2026-05-07 03:58:09 -05:00
Closed
opened 2026-04-20 18:13:02 -05:00 by GiteaMirror
·
0 comments
No Branch/Tag Specified
main
feat-v2-foundation
spike-huma-openapi3
claude/investigate-swagger3-support-nyyUa
feat-list-view-buckets
ci-mysql-8-test
codex/analyze-codebase-for-email-task-feature
feat-project-templates
csv-import-feature
claude/email-reply-comments-wpdcQ
fix-oidc-pkce-support
fix/overview-subtasks-expand
feat/bucket-select-task-detail
feat-soft-delete-projects
claude/review-bot-design-plan-cf5C3
claude/project-scoped-api-tokens-KTqR3
claude/explore-openclaw-integration-KQEzg
claude/project-scoped-api-tokens-yv5KS
fix-duplicate-close-button
feat-list-view-sorting
feat/official-vite-sentry-plugin
feat/highlight-overdue-tasks
feat/add-enter-key-form-submission-handling
feat/TipTap-nits
feat/update-caldavtimetotimestamp-parsing
feat-phosphor-icons
wip-plans
claude/investigate-issue-2173-llKme
fix-description-text-drag
feat-custom-keyboard-shortcuts
pr-1845-ci
codex/fix-drag-and-drop-behavior-inconsistency
copilot/add-clickable-labels-for-filtering
copilot/fix-issue-1786
playwright-migration
fix-kanban-repeating-wip
copilot/fix-1498
feature/replace-axios
codex/upgrade-to-tailwind-4.1.8-using-pnpm
codex/add-cypress-test-for-avatar-types
feature/biome
feature/oxc
codex/update-flexsearch-to-0.8.205
4r6ni9-codex/fix-deprecated-sass-@import-usage
codex/fix-deprecated-sass-@import-usage
codex/add-cypress-test-for-task-list-refresh-fix
codex/fix-quick-add-magic-not-adding-tasks
codex/fix-all-type-errors
codex/fix-mimetype-for-docs.json
feature/caldav-from-scratch
feature/gh-actions-hetzner
fix-ci
feat/new-logger
jyte-better-dev-config
feat/add-team-member-with-enter
fix/button-and-icon-types
fix/notifications-component-name-collision
feature/null-time
renovate/tailwindcss-4.x
feature/unplugin-vue-router
fix/deprecated-import
feature/zod-schema
renovate/golangci-golangci-lint-1.x
fix/tiptap-editor-reactive-destructuring
release/0.24
feat/improve-add-task
fix/saved-filter-search
feat/webp-and-avif-attachment-previews
feature/migrate-back-to-bulma
fix/sass-add-missing-list-import
feature/sticky-demo-bar
fix/gantt-view-switch
feature/typesense-position-join
feature/focus-visible
dependencies/golangci-lint
feature/better-filter-syntax
fix/tiptap-task-list
renovate/github.com-golang-jwt-jwt-v4-5.x
feature/hide-forbidden-related-tasks
renovate/golang-1.x
release/0.20
release/0.17
release/0.16
release/0.15
release/0.14
v2.3.0
v2.2.2
v2.2.1
v2.2.0
v2.1.0
v2.0.0
v1.1.0
v1.0.0
v1.0.0-rc4
v1.0.0-rc3
v1.0.0-rc2
v1.0.0-rc1
v1.0.0-rc0
v0.24.6
v0.24.5
v0.24.4
v0.24.3
v0.24.2
v0.24.1
v0.24.0
v0.23.0
v0.22.1
v0.22.0
0.21.0
v0.21.0
v0.20.4
v0.20.5
v0.20.3
v0.20.2
v0.20.1
v0.20.0
v0.19.2
v0.19.1
v0.19.0
vue3
v0.18.1
v0.18.0
v0.17.1
v0.17.0
v0.16.1
v0.16.0
v0.15.1
v0.15.0
v0.14.1
v0.14.0
v0.13.1
v0.13
v0.12
v0.11
v0.10
v0.9
v0.8
v0.7
v0.6
v0.5
v0.4
v0.3
v0.2
v0.1
Labels
Clear labels
area/api
area/attachments
area/auth
area/avatars
area/backup-restore
area/caldav
area/calendar-view
area/comments
area/config
area/database
area/desktop
area/docker
area/email
area/favorites
area/filters
area/frontend
area/gantt
area/i18n
area/import-export
area/internal-code
area/kanban
area/labels
area/list-view
area/mobile
area/notifications
area/permissions
area/projects
area/pwa
area/recurring-tasks
area/reminders
area/search
area/shortcuts
area/subtasks
area/sync
area/table-view
area/task-editor
area/task-metadata
area/task-relations
area/teams
area/theming
area/time-tracking
area/typesense
area/views
area/webhooks
bug
changes requested
concern/accessibility
concern/performance
concern/regression
concern/ux
confirmed
db/mysql
dependencies
enhancement
good first issue
help wanted
integration/inbound
integration/outbound
kind/bug
kind/feature
needs reproduction
pull-request
question
security
support
upstream issue
waiting for reply
wontfix
Mirrored from GitHub Pull Request
No Label
pull-request
Milestone
No items
No Milestone
Projects
Clear projects
No project
No Assignees
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: github-starred/vikunja#8436
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
📋 Pull Request Information
Original PR: https://github.com/go-vikunja/vikunja/pull/2659
Author: @tink-bot
Created: 4/20/2026
Status: ❌ Closed
Base:
main← Head:spike-huma-openapi3📝 Commits (10+)
37adc38chore: add github.com/danielgtaylor/huma/v2 dependency35f9c4bfeat: vendor humaecho adapter for echo/v51d6c1cftest: humaecho5 adapter roundtrip and spec servingabc0cdffeat(auth): add GetAuthFromContext for Huma handlers00d394efeat(huma): error formatter matching legacy Vikunja JSON shape19fa92frefactor(handler): extract DoCreate from CreateWeb12feb63refactor(handler): extract DoReadOne from ReadOneWebbe988d4refactor(handler): extract DoReadAll from ReadAllWebd677e40refactor(handler): extract DoUpdate from UpdateWeb5ba404arefactor(handler): extract DoDelete from DeleteWeb📊 Changes
20 files changed (+1356 additions, -182 deletions)
View changed files
📝
go.mod(+8 -7)📝
go.sum(+17 -0)📝
pkg/modules/auth/auth.go(+15 -0)➕
pkg/modules/auth/auth_test.go(+34 -0)➕
pkg/modules/humaecho5/humaecho5.go(+170 -0)➕
pkg/modules/humaecho5/humaecho5_test.go(+86 -0)➕
pkg/routes/api/v1/humaapi/crud.go(+239 -0)➕
pkg/routes/api/v1/humaapi/crud_test.go(+105 -0)➕
pkg/routes/api/v1/humaapi/errors.go(+45 -0)➕
pkg/routes/api/v1/humaapi/errors_test.go(+46 -0)➕
pkg/routes/api/v1/humaapi/labels.go(+38 -0)➕
pkg/routes/api/v1/humaapi/spec_verification_test.go(+121 -0)📝
pkg/routes/routes.go(+54 -2)➕
pkg/web/handler/core.go(+214 -0)📝
pkg/web/handler/create.go(+1 -38)📝
pkg/web/handler/delete.go(+1 -36)📝
pkg/web/handler/read_all.go(+1 -22)📝
pkg/web/handler/read_one.go(+3 -40)📝
pkg/web/handler/update.go(+1 -37)➕
pkg/webtests/huma_label_test.go(+157 -0)📄 Description
Proves end-to-end that Vikunja can serve an OpenAPI 3.1 spec via Huma alongside the existing Swagger 2.0 swaggo-driven spec, by porting Label through a generic CRUD registrar reusing the existing
models.CObject+ permissions interface.Spike is additive: legacy
/api/v1/docs.jsonand/api/v1/labelskeep working. The Huma-served spec is at/api/v1/oas3/openapi.json; Huma Label routes at/api/v1/oas3/labels{,/{id}}.What landed
pkg/modules/humaecho5/— vendored Huma adapter for echo/v5 (upstream PR #959 not yet merged)pkg/modules/auth.GetAuthFromContext— bridges Huma's plaincontext.Contextto Vikunja's echo-based JWT flowpkg/routes/api/v1/humaapi/errors.go— error formatter matching legacy{code, message}shape (no RFC 9457 leakage)pkg/web/handler/core.go—DoCreate/DoReadOne/DoReadAll/DoUpdate/DoDeleteextracted from the*Webwrappers so both Echo and Huma can drive the same lifecyclepkg/routes/api/v1/humaapi/crud.go— genericRegister[T]registrar producing five Huma operations from oneConfigpkg/routes/api/v1/humaapi/labels.go— Label ported through the registrarpkg/webtests/huma_label_test.goproving round-trip, spec contents, and error shapeFindings
What worked on first try
pkg/modules/humaecho5) — upstream PR #959's 6-line diff applied cleanly; round-trip + spec-serving smoke tests passed on the first run.huma.NewErrorglobal override — installinghumaapi.Install()once at boot replaces error formatting everywhere with no per-handler ceremony.auth.GetAuthFromContextbridge — stashing*echo.Contextunder a context key in the adapter'sContext()lets all existing JWT auth flow through unchanged.DoCreate/DoReadOne/DoUpdate/DoDeletefrom*Webhandlers — the lifecycle (session, perm check, model op, commit, event dispatch) factored out cleanly with zero test regressions acrossmage test:web.Register[T]registrar — produced correct paths, methods, security refs, tags, and path/query params for Label from a singleConfig.What needed deviation from the plan
/api/v1/oas3/...instead of/api/v1/.... Echo v5 panics on duplicate(method, path)registrations and the legacy Label routes already own/api/v1/labels. To keep both alive simultaneously the Huma routes got a parallel prefix. Full migration will need to swap the legacy handlers out atomically to reclaim/api/v1/labels.*HTTPError→vikunjaErrortranslation (translateErrorincrud.go). Errors bubbling fromDo*(e.g.echo.NewHTTPError(403, "Forbidden")) need an expliciterrors.Astranslation layer so the wire shape matches legacy{"message":"Forbidden"}. Plan originally assumedhuma.NewErroroverride alone would suffice.humaConfig.FieldsOptionalByDefault = true. Without this Huma marks every non-pointer struct field as required and rejects legitimate partial Label PUTs at schema-validation time. Legacy handlers are permissive; govalidator enforces real rules later.Register[T, P]simplified toRegister[T]overSingleIDonly. Go does not permit embedding a type parameter in a struct, and Huma's parameter discovery only walks anonymous (embedded) fields. The generalised multi-path-shape registrar needs per-shape concrete wrappers. Spike only exercisesSingleID; nested-route resources (/tasks/{task}/labels/{label}) will need hand-written wrapper types for the full migration.go.modis v5.0.3 —echo.Contextis still a concrete struct; adapter usesParam(name)notPathParam(name)that the upstream PR assumes. Single-line deviation from upstream v5 diff.Semantic spec differences (legacy Swagger 2.0 vs Huma OAS 3.1)
Real contract divergences, not cosmetic — flagging for anyone consuming the spec:
200instead of201. Huma's default success status is 200. Either setDefaultStatus: http.StatusCreatedon the create op or accept the wire change. Frontend code asserting=== 201will break.JWTKeyAuthreferenced by every op but never declared incomponents.securitySchemes. Huma won't generate the scheme definition unless registered viaapi.OpenAPI().Components.SecuritySchemes[...]. As-is the spec fails OAS validators (Spectral, Redoc, Swagger UI auth flows). Trivial one-time fix.defaultresponse. Legacy lists explicit 400/403/404/500 per op with distinct schemas; Huma emits onedefaultreferencingVikunjaError. OAS-3-idiomatic but client code generators branching on status codes lose granularity. Runtime error shape is identical — only spec descriptors differ.parameters[in:body](Swagger 2) torequestBody(OAS 3.1). Expected, correct — flagging because anything regex-scraping the legacy spec for"in":"body"will need updating.DoReadAll'sresult.([]T)cast — does NOT hold for Labelmodels.Label.ReadAllreturns[]*LabelWithTaskID(viaGetLabelsByTaskIDs), not[]*models.Label. The generic registrar's type assertionresult.([]T)fails silently and returns an empty list. Integration tests exercise PUT + GET /{id} + DELETE but not GET list, so this was not caught until Phase F verification.For the full migration, pick one of:
Config[T]accept aListItemtype parameter distinct fromThuma.Registerdirectly (the comment incrud.goalready documents this escape hatch)ReadAllreturns to[]T(semantic change — touches every consumer)This is the single biggest scope risk for porting more resources. Most Vikunja list endpoints return wrapper types (
*WithTaskID,*WithCounts, etc.).Effort estimate for porting the next 5 resources
Tier: Medium — 1-2 dev-days per resource, pending the list-cast fix.
Main cost drivers:
/tasks/{task}/labels/{label}) — need a second concreteConfigshape; ~50 LoC per shape, one-time cost./labels/bulk) — outside the registrar; hand-writtenhuma.Registerper endpoint.valid:→ JSON Schema migration — out of spike scope but eventually needed for Huma to enforce validation natively.Test plan
mage test:web— all existing webtests plus the three new Huma Label tests passmage build— clean buildmage lint— clean/api/v1/docs.jsonstill serves legacy Swagger 2.0 unchanged/api/v1/oas3/openapi.jsonserves OAS 3.1 with Label paths🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.
[PR #2659] spike: serve OpenAPI 3.1 via Huma alongside legacy Swagger 2.0to [PR #2659] [CLOSED] spike: serve OpenAPI 3.1 via Huma alongside legacy Swagger 2.0