From d081cf80fc09976bac6828a789d8302fb2d22688 Mon Sep 17 00:00:00 2001 From: kolaente Date: Wed, 30 Oct 2024 08:37:21 +0100 Subject: [PATCH] chore(caldav): refactor fetching projects --- pkg/caldav/caldav.go | 1 - pkg/models/project.go | 21 ++++++++++----------- pkg/routes/caldav/handler.go | 35 +++++++++++++++++++++-------------- 3 files changed, 31 insertions(+), 26 deletions(-) diff --git a/pkg/caldav/caldav.go b/pkg/caldav/caldav.go index c7f10440b..3bc788e99 100644 --- a/pkg/caldav/caldav.go +++ b/pkg/caldav/caldav.go @@ -23,7 +23,6 @@ import ( "time" "code.vikunja.io/api/pkg/models" - "code.vikunja.io/api/pkg/user" "code.vikunja.io/api/pkg/utils" ) diff --git a/pkg/models/project.go b/pkg/models/project.go index 831746f48..ab1940d21 100644 --- a/pkg/models/project.go +++ b/pkg/models/project.go @@ -330,21 +330,11 @@ func (p *Project) ReadOne(s *xorm.Session, a web.Auth) (err error) { // GetProjectSimpleByID gets a project with only the basic items, aka no tasks or user objects. Returns an error if the project does not exist. func GetProjectSimpleByID(s *xorm.Session, projectID int64) (project *Project, err error) { - - project = &Project{} - if projectID < 1 { return nil, ErrProjectDoesNotExist{ID: projectID} } - exists, err := s. - Where("id = ?", projectID). - OrderBy("position"). - Get(project) - if err != nil { - return - } - + project, exists, err := getProjectSimple(s, builder.Eq{"id": projectID}) if !exists { return nil, ErrProjectDoesNotExist{ID: projectID} } @@ -352,6 +342,15 @@ func GetProjectSimpleByID(s *xorm.Session, projectID int64) (project *Project, e return } +func getProjectSimple(s *xorm.Session, cond builder.Cond) (project *Project, exists bool, err error) { + project = &Project{} + exists, err = s. + Where(cond). + OrderBy("position"). + Get(project) + return +} + // GetProjectSimplByTaskID gets a project by a task id func GetProjectSimplByTaskID(s *xorm.Session, taskID int64) (l *Project, err error) { // We need to re-init our project object, because otherwise xorm creates a "where for every item in that project object, diff --git a/pkg/routes/caldav/handler.go b/pkg/routes/caldav/handler.go index c7fb57be7..65d4dbfbc 100644 --- a/pkg/routes/caldav/handler.go +++ b/pkg/routes/caldav/handler.go @@ -18,18 +18,18 @@ package caldav import ( "bytes" - "errors" "fmt" "io" "reflect" "strconv" "strings" + "code.vikunja.io/api/pkg/db" + caldav2 "code.vikunja.io/api/pkg/caldav" "code.vikunja.io/api/pkg/log" "code.vikunja.io/api/pkg/models" "code.vikunja.io/api/pkg/user" - "code.vikunja.io/api/pkg/web/handler" "github.com/labstack/echo/v4" "github.com/samedi/caldav-go" "github.com/samedi/caldav-go/lib" @@ -45,11 +45,8 @@ func getBasicAuthUserFromContext(c echo.Context) (*user.User, error) { // ProjectHandler returns all tasks from a project func ProjectHandler(c echo.Context) error { - projectID, err := getIntParam(c, "project") + project, err := getProjectFromParam(c) if err != nil { - if errors.Is(err, &strconv.NumError{}) { - return echo.ErrBadRequest - } return err } @@ -59,7 +56,7 @@ func ProjectHandler(c echo.Context) error { } storage := &VikunjaCaldavProjectStorage{ - project: &models.ProjectWithTasksAndBuckets{Project: models.Project{ID: projectID}}, + project: project, user: u, } @@ -89,7 +86,7 @@ func ProjectHandler(c echo.Context) error { // TaskHandler is the handler which manages updating/deleting a single task func TaskHandler(c echo.Context) error { - projectID, err := getIntParam(c, "project") + project, err := getProjectFromParam(c) if err != nil { return err } @@ -103,7 +100,7 @@ func TaskHandler(c echo.Context) error { taskUID := strings.TrimSuffix(c.Param("task"), ".ics") storage := &VikunjaCaldavProjectStorage{ - project: &models.ProjectWithTasksAndBuckets{Project: models.Project{ID: projectID}}, + project: project, task: &models.Task{UID: taskUID}, user: u, } @@ -172,15 +169,25 @@ func EntryHandler(c echo.Context) error { return nil } -func getIntParam(c echo.Context, paramName string) (intParam int64, err error) { - param := c.Param(paramName) +func getProjectFromParam(c echo.Context) (project *models.ProjectWithTasksAndBuckets, err error) { + param := c.Param("project") if param == "" { - return 0, nil + return nil, echo.ErrBadRequest } - intParam, err = strconv.ParseInt(param, 10, 64) + s := db.NewSession() + defer s.Close() + + intParam, err := strconv.ParseInt(param, 10, 64) if err != nil { - return 0, handler.HandleHTTPError(err) + return nil, err } + + p, err := models.GetProjectSimpleByID(s, intParam) + if err != nil { + return nil, err + } + + project = &models.ProjectWithTasksAndBuckets{Project: *p} return }