You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

122 lines
3.0 KiB

4 years ago
4 years ago
4 years ago
4 years ago
  1. package api
  2. import (
  3. "github.com/gin-gonic/gin"
  4. "github.com/gissleh/stufflog/database"
  5. "github.com/gissleh/stufflog/internal/auth"
  6. "github.com/gissleh/stufflog/internal/generate"
  7. "github.com/gissleh/stufflog/internal/slerrors"
  8. "github.com/gissleh/stufflog/models"
  9. "github.com/gissleh/stufflog/services"
  10. "time"
  11. )
  12. func Task(g *gin.RouterGroup, db database.Database) {
  13. l := services.Loader{DB: db}
  14. defaultActive := true
  15. g.GET("/", handler("tasks", func(c *gin.Context) (interface{}, error) {
  16. filter := models.TaskFilter{}
  17. if setting := c.Query("active"); setting != "" {
  18. active := setting == "true"
  19. filter.Active = &active
  20. } else {
  21. filter.Active = &defaultActive
  22. }
  23. return l.ListTasks(c, filter)
  24. }))
  25. g.GET("/:id", handler("task", func(c *gin.Context) (interface{}, error) {
  26. return l.FindTask(c, c.Param("id"))
  27. }))
  28. g.POST("/", handler("task", func(c *gin.Context) (interface{}, error) {
  29. createdTime := time.Now()
  30. task := models.Task{}
  31. err := c.BindJSON(&task)
  32. if err != nil {
  33. return nil, slerrors.BadRequest("Invalid JSON")
  34. }
  35. if task.EndTime != nil && task.EndTime.Before(createdTime) {
  36. return nil, slerrors.BadRequest("Task end time must be later than current time.")
  37. }
  38. if task.ItemAmount <= 0 {
  39. return nil, slerrors.BadRequest("Item amount cannot be zero or negative.")
  40. }
  41. project, err := l.FindProject(c.Request.Context(), task.ProjectID)
  42. if err != nil {
  43. return nil, err
  44. }
  45. item, err := l.FindItem(c.Request.Context(), task.ItemID)
  46. if err != nil {
  47. return nil, err
  48. }
  49. task.ID = generate.TaskID()
  50. task.UserID = auth.UserID(c)
  51. task.CreatedTime = time.Now().UTC()
  52. task.ItemID = item.ID
  53. task.ProjectID = project.ID
  54. err = db.Tasks().Insert(c.Request.Context(), task)
  55. if err != nil {
  56. return nil, err
  57. }
  58. return &models.TaskResult{
  59. Task: task,
  60. Logs: []*models.Log{},
  61. Item: &item.Item,
  62. CompletedAmount: 0,
  63. }, nil
  64. }))
  65. g.PUT("/:id", handler("task", func(c *gin.Context) (interface{}, error) {
  66. update := models.TaskUpdate{}
  67. err := c.BindJSON(&update)
  68. if err != nil {
  69. return nil, slerrors.BadRequest("Invalid JSON")
  70. }
  71. task, err := l.FindTask(c.Request.Context(), c.Param("id"))
  72. if err != nil {
  73. return nil, err
  74. }
  75. task.Update(update)
  76. if task.EndTime != nil && task.EndTime.Before(task.CreatedTime) {
  77. return nil, slerrors.BadRequest("Task end time must be later than it was created.")
  78. }
  79. if task.ItemAmount <= 0 {
  80. return nil, slerrors.BadRequest("Item amount cannot be zero or negative.")
  81. }
  82. err = db.Tasks().Update(c.Request.Context(), task.Task)
  83. if err != nil {
  84. return nil, err
  85. }
  86. return task, nil
  87. }))
  88. g.DELETE("/:id", handler("task", func(c *gin.Context) (interface{}, error) {
  89. task, err := l.FindTask(c.Request.Context(), c.Param("id"))
  90. if err != nil {
  91. return nil, err
  92. }
  93. if len(task.Logs) > 0 {
  94. return nil, slerrors.Forbidden("cannot delete tasks with logs.")
  95. }
  96. err = db.Tasks().Delete(c.Request.Context(), task.Task)
  97. if err != nil {
  98. return nil, err
  99. }
  100. return task, nil
  101. }))
  102. }