refactor(handler): extract DoReadAll from ReadAllWeb

This commit is contained in:
kolaente 2026-04-20 10:50:02 +02:00
parent 12feb63e4c
commit be988d47e2
2 changed files with 29 additions and 22 deletions

View File

@ -106,3 +106,31 @@ func DoReadOne(_ context.Context, obj CObject, a web.Auth) (maxPermission int, e
events.DispatchPending(s)
return maxPermission, nil
}
// DoReadAll runs the ReadAll + commit pipeline for a CObject. obj may carry
// scoping context (e.g., TaskID on LabelTask). Returns the result slice/
// interface, the result count, and total count. Pagination header math and
// nil-slice normalization remain the caller's responsibility.
func DoReadAll(_ context.Context, obj CObject, a web.Auth, search string, page, perPage int) (result any, resultCount int, total int64, err error) {
s := db.NewSession()
defer func() {
if cerr := s.Close(); cerr != nil {
log.Errorf("Could not close session: %s", cerr)
}
}()
result, resultCount, total, err = obj.ReadAll(s, a, search, page, perPage)
if err != nil {
_ = s.Rollback()
events.CleanupPending(s)
return nil, 0, 0, err
}
if err = s.Commit(); err != nil {
events.CleanupPending(s)
return nil, 0, 0, err
}
events.DispatchPending(s)
return result, resultCount, total, nil
}

View File

@ -25,8 +25,6 @@ import (
"strconv"
vconfig "code.vikunja.io/api/pkg/config"
"code.vikunja.io/api/pkg/db"
"code.vikunja.io/api/pkg/events"
"code.vikunja.io/api/pkg/log"
"code.vikunja.io/api/pkg/models"
"code.vikunja.io/api/pkg/modules/auth"
@ -91,22 +89,11 @@ func (c *WebHandler) ReadAllWeb(ctx *echo.Context) error {
perPageNumber = vconfig.ServiceMaxItemsPerPage.GetInt()
}
// Create the db session
s := db.NewSession()
defer func() {
err = s.Close()
if err != nil {
log.Errorf("Could not close session: %s", err)
}
}()
// Search
search := ctx.QueryParam("s")
result, resultCount, numberOfItems, err := currentStruct.ReadAll(s, currentAuth, search, pageNumber, perPageNumber)
result, resultCount, numberOfItems, err := DoReadAll(ctx.Request().Context(), currentStruct, currentAuth, search, pageNumber, perPageNumber)
if err != nil {
_ = s.Rollback()
events.CleanupPending(s)
return err
}
@ -127,14 +114,6 @@ func (c *WebHandler) ReadAllWeb(ctx *echo.Context) error {
ctx.Response().Header().Set("x-pagination-result-count", strconv.FormatInt(int64(resultCount), 10))
ctx.Response().Header().Set("Access-Control-Expose-Headers", "x-pagination-total-pages, x-pagination-result-count")
err = s.Commit()
if err != nil {
events.CleanupPending(s)
return err
}
events.DispatchPending(s)
// Ensure we return an empty array instead of null when there are no results.
// We need to use reflection here because a nil slice wrapped in an interface{}
// is not equal to nil (the interface contains a nil value but is not nil itself).