feat(api): lowercase project identifier before by-index lookup

Normalises the input side so GitHub-style references like "TEST1-42" and
"test1-42" resolve to the same project. The SQL comparison itself remains
case-sensitive for now; case-insensitive matching on the column will be
addressed separately.
This commit is contained in:
Tink bot 2026-05-19 07:51:54 +00:00 committed by kolaente
parent 466d39e6de
commit 04148e14db
2 changed files with 8 additions and 1 deletions

View File

@ -19,6 +19,7 @@ package routes
import (
"net/http"
"strconv"
"strings"
"code.vikunja.io/api/pkg/db"
"code.vikunja.io/api/pkg/models"
@ -44,7 +45,7 @@ func ResolveProjectIdentifier() echo.MiddlewareFunc {
s := db.NewSession()
project := &models.Project{}
has, err := s.Where("identifier = ?", raw).Get(project)
has, err := s.Where("identifier = ?", strings.ToLower(raw)).Get(project)
_ = s.Close()
if err != nil {
return err

View File

@ -57,6 +57,12 @@ func TestTaskByProjectIndex(t *testing.T) {
assert.Contains(t, rec.Body.String(), `"id":1`)
})
t.Run("identifier match is case-insensitive on the input", func(t *testing.T) {
rec := do("/api/v1/projects/TEST1/tasks/by-index/1")
assert.Equal(t, http.StatusOK, rec.Code)
assert.Contains(t, rec.Body.String(), `"id":1`)
})
t.Run("unknown project identifier returns 404", func(t *testing.T) {
rec := do("/api/v1/projects/does-not-exist/tasks/by-index/1")
assert.Equal(t, http.StatusNotFound, rec.Code)