diff --git a/pkg/routes/resolve_project.go b/pkg/routes/resolve_project.go index 26ec83341..7847b2d53 100644 --- a/pkg/routes/resolve_project.go +++ b/pkg/routes/resolve_project.go @@ -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 diff --git a/pkg/webtests/task_by_index_test.go b/pkg/webtests/task_by_index_test.go index dac04fbe4..8b2816297 100644 --- a/pkg/webtests/task_by_index_test.go +++ b/pkg/webtests/task_by_index_test.go @@ -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)