|
|
package api
import ( "github.com/gin-gonic/gin" "github.com/gisle/stufflog/database" "github.com/gisle/stufflog/models" "github.com/gisle/stufflog/services" "github.com/gisle/stufflog/slerrors" "sort" )
func Activity(g *gin.RouterGroup, db database.Database, auth *services.AuthService) { type resObj struct { Activity *models.Activity `json:"activity,omitempty"` Activities []*models.Activity `json:"activities,omitempty"` }
g.Use(auth.GinSessionMiddleware(true))
// GET / – List own activities.
g.GET("/", func(c *gin.Context) { user := auth.UserFromContext(c)
activities, err := db.Activities().ListUser(c.Request.Context(), *user) if err != nil { slerrors.GinRespond(c, err) return }
sort.Sort(models.ActivitiesByName(activities))
c.JSON(200, resObj{Activities: activities}) })
// GET / — Find an activity
g.GET("/:id", func(c *gin.Context) { user := auth.UserFromContext(c)
activity, err := db.Activities().FindID(c.Request.Context(), c.Param("id")) if err != nil { slerrors.GinRespond(c, err) return } if activity.UserID != user.ID { slerrors.GinRespond(c, slerrors.NotFound("Activity")) return }
c.JSON(200, resObj{Activity: activity}) })
// POST / – Create an activity
g.POST("/", func(c *gin.Context) { user := auth.UserFromContext(c) activity := models.Activity{}
err := c.BindJSON(&activity) if err != nil { slerrors.GinRespond(c, &slerrors.SLError{Code: 400, Text: err.Error()}) return }
activity.UserID = user.ID activity.GenerateIDs()
err = db.Activities().Insert(c.Request.Context(), activity) if err != nil { slerrors.GinRespond(c, err) return }
c.JSON(200, resObj{Activity: &activity}) })
// PATCH /:id – Update one activity
g.PATCH("/:id", func(c *gin.Context) { user := auth.UserFromContext(c) updates := make([]*models.ActivityUpdate, 0, 8)
err := c.BindJSON(&updates) if err != nil { slerrors.GinRespond(c, &slerrors.SLError{Code: 400, Text: err.Error()}) return }
activity, err := db.Activities().FindID(c.Request.Context(), c.Param("id")) if err != nil { slerrors.GinRespond(c, err) return } if activity.UserID != user.ID { slerrors.GinRespond(c, slerrors.NotFound("Activity")) return }
activity, err = db.Activities().Update(c.Request.Context(), *activity, updates) if err != nil { slerrors.GinRespond(c, err) return }
c.JSON(200, resObj{Activity: activity}) })
// DELETE /:id – Delete an activity
g.DELETE("/:id", func(c *gin.Context) { user := auth.UserFromContext(c)
activity, err := db.Activities().FindID(c.Request.Context(), c.Param("id")) if err != nil { slerrors.GinRespond(c, err) return } if activity.UserID != user.ID { slerrors.GinRespond(c, slerrors.NotFound("Activity")) return }
periods, err := db.Periods().ListActivity(c.Request.Context(), *activity) if err != nil { slerrors.GinRespond(c, slerrors.Wrap(err)) return } if len(periods) > 0 { slerrors.GinRespond(c, slerrors.PreconditionFailed("You cannot delete an activity that's in use.")) return }
err = db.Activities().Remove(c.Request.Context(), *activity) if err != nil { slerrors.GinRespond(c, err) return }
c.JSON(200, resObj{Activity: activity}) }) }
|