91 lines
2.2 KiB
Go
91 lines
2.2 KiB
Go
package routes
|
|
|
|
import (
|
|
"database/sql"
|
|
"errors"
|
|
"net/http"
|
|
|
|
"git.red-panda.pet/pandaware/house/backend/db"
|
|
"git.red-panda.pet/pandaware/house/backend/middleware"
|
|
"git.red-panda.pet/pandaware/house/backend/router"
|
|
)
|
|
|
|
func init() {
|
|
routes["GET"]["/user/{id}/tasks"] = new(UserTasks)
|
|
}
|
|
|
|
type userTasksResponse struct {
|
|
Tasks []db.Task `json:"tasks"`
|
|
TaskCategories []db.TaskCategory `json:"task_categories"`
|
|
Categories []db.Category `json:"categories"`
|
|
}
|
|
|
|
type UserTasks struct{}
|
|
|
|
// Authorize implements router.AuthorizedRoute.
|
|
func (u *UserTasks) Authorize(ctx *router.Context) error {
|
|
return middleware.Authenticated(ctx)
|
|
}
|
|
|
|
// ValidateParams implements router.ValidatedParamRoute.
|
|
func (u *UserTasks) ValidateParams(ctx *router.Context) error {
|
|
if ctx.Parameter("id") == "me" {
|
|
return nil
|
|
}
|
|
return middleware.ValidateUUIDParam(ctx, "id")
|
|
}
|
|
|
|
// Handle implements router.Route.
|
|
func (u *UserTasks) Handle(ctx *router.Context) error {
|
|
user := middleware.User(u, ctx)
|
|
id := ctx.Parameter("id")
|
|
|
|
if id == "me" {
|
|
id = user.ID
|
|
}
|
|
|
|
tx, err := ctx.DB.BeginTx(ctx, &sql.TxOptions{
|
|
ReadOnly: true,
|
|
})
|
|
|
|
query := ctx.Query.WithTx(tx)
|
|
|
|
if err != nil {
|
|
return ctx.GenericError(err, http.StatusInternalServerError)
|
|
}
|
|
|
|
tasks, err := query.TasksForUser(ctx, id)
|
|
|
|
if err != nil && !errors.Is(err, sql.ErrNoRows) {
|
|
return ctx.GenericError(err, http.StatusInternalServerError)
|
|
}
|
|
|
|
taskIDs := make([]int64, len(tasks))
|
|
for i, task := range tasks {
|
|
taskIDs[i] = task.ID
|
|
}
|
|
|
|
taskCategories, err := query.TaskCategoriesOf(ctx, taskIDs)
|
|
if err != nil {
|
|
return ctx.GenericError(err, http.StatusInternalServerError)
|
|
}
|
|
|
|
categories, err := query.CategoriesOf(ctx, taskIDs)
|
|
if err != nil && !errors.Is(err, sql.ErrNoRows) {
|
|
return ctx.GenericError(err, http.StatusInternalServerError)
|
|
}
|
|
|
|
err = tx.Commit()
|
|
if err != nil {
|
|
return ctx.GenericError(err, http.StatusInternalServerError)
|
|
}
|
|
|
|
return ctx.JSON(200, userTasksResponse{
|
|
Tasks: append([]db.Task{}, tasks...),
|
|
TaskCategories: append([]db.TaskCategory{}, taskCategories...),
|
|
Categories: append([]db.Category{}, categories...),
|
|
})
|
|
}
|
|
|
|
var _ router.AuthorizedRoute = new(UserTasks)
|
|
var _ router.ValidatedParamRoute = new(UserTasks)
|