From 46a5549e53a7b79fd58faf880946eb6e6942290b Mon Sep 17 00:00:00 2001 From: Mo Tarbin Date: Thu, 28 Nov 2024 11:30:39 -0500 Subject: [PATCH 1/3] Update Priority as standalone endpoint --- internal/chore/handler.go | 24 ++++-------------------- internal/chore/repo/repository.go | 10 +++++++++- 2 files changed, 13 insertions(+), 21 deletions(-) diff --git a/internal/chore/handler.go b/internal/chore/handler.go index d104576..2a646f5 100644 --- a/internal/chore/handler.go +++ b/internal/chore/handler.go @@ -1070,10 +1070,10 @@ func (h *Handler) ModifyHistory(c *gin.Context) { func (h *Handler) updatePriority(c *gin.Context) { type PriorityReq struct { - Priority *int `json:"priority" binding:"required,gt=-1"` + Priority *int `json:"priority" binding:"required,gt=-1,lt=5"` } - currrentUser, ok := auth.CurrentUser(c) + currentUser, ok := auth.CurrentUser(c) if !ok { c.JSON(500, gin.H{ "error": "Error getting current user", @@ -1099,23 +1099,7 @@ func (h *Handler) updatePriority(c *gin.Context) { return } - chore, err := h.choreRepo.GetChore(c, id) - if err != nil { - c.JSON(500, gin.H{ - "error": "Error getting chore", - }) - return - } - - if currrentUser.ID != chore.CreatedBy { - c.JSON(403, gin.H{ - "error": "You are not allowed to update this chore", - }) - return - } - - chore.Priority = *priorityReq.Priority - if err := h.choreRepo.UpsertChore(c, chore); err != nil { + if err := h.choreRepo.UpdateChorePriority(c, currentUser.ID, id, *priorityReq.Priority); err != nil { c.JSON(500, gin.H{ "error": "Error updating priority", }) @@ -1123,7 +1107,7 @@ func (h *Handler) updatePriority(c *gin.Context) { } c.JSON(200, gin.H{ - "res": chore, + "message": "Priority updated successfully", }) } diff --git a/internal/chore/repo/repository.go b/internal/chore/repo/repository.go index 3768fdf..bdd75ad 100644 --- a/internal/chore/repo/repository.go +++ b/internal/chore/repo/repository.go @@ -2,6 +2,7 @@ package chore import ( "context" + "errors" "fmt" "time" @@ -22,7 +23,14 @@ func NewChoreRepository(db *gorm.DB, cfg *config.Config) *ChoreRepository { func (r *ChoreRepository) UpsertChore(c context.Context, chore *chModel.Chore) error { return r.db.WithContext(c).Model(&chore).Save(chore).Error } - +func (r *ChoreRepository) UpdateChorePriority(c context.Context, userID int, choreID int, priority int) error { + var affectedRows int64 + r.db.WithContext(c).Model(&chModel.Chore{}).Where("id = ? and created_by = ?", choreID, userID).Update("priority", priority).Count(&affectedRows) + if affectedRows == 0 { + return errors.New("no rows affected") + } + return nil +} func (r *ChoreRepository) UpdateChores(c context.Context, chores []*chModel.Chore) error { return r.db.WithContext(c).Save(&chores).Error } From a3c5a81ce4360d54e58737a07210fc9022d4a6cf Mon Sep 17 00:00:00 2001 From: Mo Tarbin Date: Thu, 28 Nov 2024 11:32:37 -0500 Subject: [PATCH 2/3] Update ChoreLabels struct with `not null` constraints --- internal/chore/model/model.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/internal/chore/model/model.go b/internal/chore/model/model.go index 2feabad..4f335c7 100644 --- a/internal/chore/model/model.go +++ b/internal/chore/model/model.go @@ -107,8 +107,8 @@ type Label struct { } type ChoreLabels struct { - ChoreID int `json:"choreId" gorm:"primaryKey;autoIncrement:false"` - LabelID int `json:"labelId" gorm:"primaryKey;autoIncrement:false"` - UserID int `json:"userId" gorm:"primaryKey;autoIncrement:false"` + ChoreID int `json:"choreId" gorm:"primaryKey;autoIncrement:false;not null"` + LabelID int `json:"labelId" gorm:"primaryKey;autoIncrement:false;not null"` + UserID int `json:"userId" gorm:"primaryKey;autoIncrement:false;not null"` Label Label } From a8f8550a6646ff418f14643a6260b295f748dd7b Mon Sep 17 00:00:00 2001 From: Mo Tarbin Date: Fri, 29 Nov 2024 19:04:49 -0500 Subject: [PATCH 3/3] Add API endpoint to retrieve all chores via API --- internal/chore/api.go | 56 +++++++++++++++++++++++++++++++++++++++++++ main.go | 3 +++ 2 files changed, 59 insertions(+) create mode 100644 internal/chore/api.go diff --git a/internal/chore/api.go b/internal/chore/api.go new file mode 100644 index 0000000..5dfa720 --- /dev/null +++ b/internal/chore/api.go @@ -0,0 +1,56 @@ +package chore + +import ( + "donetick.com/core/config" + chRepo "donetick.com/core/internal/chore/repo" + "donetick.com/core/internal/utils" + jwt "github.com/appleboy/gin-jwt/v2" + "github.com/gin-gonic/gin" + + limiter "github.com/ulule/limiter/v3" + + uRepo "donetick.com/core/internal/user/repo" +) + +type API struct { + choreRepo *chRepo.ChoreRepository + userRepo *uRepo.UserRepository +} + +func NewAPI(cr *chRepo.ChoreRepository, userRepo *uRepo.UserRepository) *API { + return &API{ + choreRepo: cr, + userRepo: userRepo, + } +} + +func (h *API) GetAllChores(c *gin.Context) { + + apiToken := c.GetHeader("secretkey") + if apiToken == "" { + c.JSON(401, gin.H{"error": "Unauthorized"}) + return + } + user, err := h.userRepo.GetUserByToken(c, apiToken) + if err != nil { + c.JSON(401, gin.H{"error": "Unauthorized"}) + return + } + chores, err := h.choreRepo.GetChores(c, user.CircleID, user.ID) + if err != nil { + c.JSON(500, gin.H{"error": err.Error()}) + return + } + c.JSON(200, chores) +} + +func APIs(cfg *config.Config, api *API, r *gin.Engine, auth *jwt.GinJWTMiddleware, limiter *limiter.Limiter) { + + thingsAPI := r.Group("api/v1/chore") + + thingsAPI.Use(utils.TimeoutMiddleware(cfg.Server.WriteTimeout), utils.RateLimitMiddleware(limiter)) + { + thingsAPI.GET("", api.GetAllChores) + } + +} diff --git a/main.go b/main.go index 399060a..f128cba 100644 --- a/main.go +++ b/main.go @@ -85,11 +85,14 @@ func main() { fx.Provide(thing.NewWebhook), fx.Provide(thing.NewHandler), + fx.Provide(chore.NewAPI), + fx.Provide(frontend.NewHandler), // fx.Invoke(RunApp), fx.Invoke( chore.Routes, + chore.APIs, user.Routes, circle.Routes, thing.Routes,