177 lines
3.2 KiB
Go
177 lines
3.2 KiB
Go
![]() |
package label
|
||
|
|
||
|
import (
|
||
|
"strconv"
|
||
|
|
||
|
auth "donetick.com/core/internal/authorization"
|
||
|
lModel "donetick.com/core/internal/label/model"
|
||
|
lRepo "donetick.com/core/internal/label/repo"
|
||
|
jwt "github.com/appleboy/gin-jwt/v2"
|
||
|
"github.com/gin-gonic/gin"
|
||
|
)
|
||
|
|
||
|
type LabelReq struct {
|
||
|
Name string `json:"name" binding:"required"`
|
||
|
Color string `json:"color"`
|
||
|
}
|
||
|
|
||
|
type UpdateLabelReq struct {
|
||
|
ID int `json:"id" binding:"required"`
|
||
|
LabelReq
|
||
|
}
|
||
|
|
||
|
type Handler struct {
|
||
|
lRepo *lRepo.LabelRepository
|
||
|
}
|
||
|
|
||
|
func NewHandler(lRepo *lRepo.LabelRepository) *Handler {
|
||
|
return &Handler{
|
||
|
lRepo: lRepo,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (h *Handler) getLabels(c *gin.Context) {
|
||
|
// get current user:
|
||
|
currentUser, ok := auth.CurrentUser(c)
|
||
|
if !ok {
|
||
|
c.JSON(500, gin.H{
|
||
|
"error": "Error getting current user",
|
||
|
})
|
||
|
return
|
||
|
}
|
||
|
|
||
|
labels, err := h.lRepo.GetUserLabels(c, currentUser.ID, currentUser.CircleID)
|
||
|
if err != nil {
|
||
|
c.JSON(500, gin.H{
|
||
|
"error": "Error getting labels",
|
||
|
})
|
||
|
return
|
||
|
}
|
||
|
c.JSON(200,
|
||
|
labels,
|
||
|
)
|
||
|
}
|
||
|
|
||
|
func (h *Handler) createLabel(c *gin.Context) {
|
||
|
// get current user:
|
||
|
currentUser, ok := auth.CurrentUser(c)
|
||
|
if !ok {
|
||
|
c.JSON(500, gin.H{
|
||
|
"error": "Error getting current user",
|
||
|
})
|
||
|
return
|
||
|
}
|
||
|
|
||
|
var req LabelReq
|
||
|
if err := c.ShouldBindJSON(&req); err != nil {
|
||
|
c.JSON(400, gin.H{
|
||
|
"error": "Error binding label",
|
||
|
})
|
||
|
return
|
||
|
}
|
||
|
|
||
|
label := &lModel.Label{
|
||
|
Name: req.Name,
|
||
|
Color: req.Color,
|
||
|
CreatedBy: currentUser.ID,
|
||
|
}
|
||
|
if err := h.lRepo.CreateLabels(c, []*lModel.Label{label}); err != nil {
|
||
|
c.JSON(500, gin.H{
|
||
|
"error": "Error creating label",
|
||
|
})
|
||
|
return
|
||
|
}
|
||
|
|
||
|
c.JSON(200, gin.H{
|
||
|
"res": label,
|
||
|
})
|
||
|
}
|
||
|
|
||
|
func (h *Handler) updateLabel(c *gin.Context) {
|
||
|
currentUser, ok := auth.CurrentUser(c)
|
||
|
if !ok {
|
||
|
c.JSON(500, gin.H{
|
||
|
"error": "Error getting current user",
|
||
|
})
|
||
|
return
|
||
|
}
|
||
|
|
||
|
var req UpdateLabelReq
|
||
|
if err := c.ShouldBindJSON(&req); err != nil {
|
||
|
c.JSON(400, gin.H{
|
||
|
"error": "Error binding label",
|
||
|
})
|
||
|
return
|
||
|
}
|
||
|
|
||
|
label := &lModel.Label{
|
||
|
Name: req.Name,
|
||
|
Color: req.Color,
|
||
|
ID: req.ID,
|
||
|
}
|
||
|
if err := h.lRepo.UpdateLabel(c, currentUser.ID, label); err != nil {
|
||
|
c.JSON(500, gin.H{
|
||
|
"error": "Error updating label",
|
||
|
})
|
||
|
return
|
||
|
}
|
||
|
|
||
|
c.JSON(200, gin.H{
|
||
|
"res": label,
|
||
|
})
|
||
|
}
|
||
|
|
||
|
func (h *Handler) deleteLabel(c *gin.Context) {
|
||
|
currentUser, ok := auth.CurrentUser(c)
|
||
|
// read label id from path:
|
||
|
|
||
|
if !ok {
|
||
|
c.JSON(500, gin.H{
|
||
|
"error": "Error getting current user",
|
||
|
})
|
||
|
return
|
||
|
}
|
||
|
|
||
|
labelIDRaw := c.Param("id")
|
||
|
if labelIDRaw == "" {
|
||
|
c.JSON(400, gin.H{
|
||
|
"error": "Label ID is required",
|
||
|
})
|
||
|
return
|
||
|
}
|
||
|
|
||
|
labelID, err := strconv.Atoi(labelIDRaw)
|
||
|
if err != nil {
|
||
|
c.JSON(400, gin.H{
|
||
|
"error": "Invalid label ID",
|
||
|
})
|
||
|
return
|
||
|
}
|
||
|
|
||
|
// unassociate label from all chores:
|
||
|
if err := h.lRepo.DeassignLabelFromAllChoreAndDelete(c, currentUser.ID, labelID); err != nil {
|
||
|
c.JSON(500, gin.H{
|
||
|
"error": "Error unassociating label from chores",
|
||
|
})
|
||
|
return
|
||
|
}
|
||
|
|
||
|
c.JSON(200, gin.H{
|
||
|
"res": "Label deleted",
|
||
|
})
|
||
|
|
||
|
}
|
||
|
|
||
|
func Routes(r *gin.Engine, h *Handler, auth *jwt.GinJWTMiddleware) {
|
||
|
|
||
|
labelRoutes := r.Group("labels")
|
||
|
labelRoutes.Use(auth.MiddlewareFunc())
|
||
|
{
|
||
|
labelRoutes.GET("", h.getLabels)
|
||
|
labelRoutes.POST("", h.createLabel)
|
||
|
labelRoutes.PUT("", h.updateLabel)
|
||
|
labelRoutes.DELETE("/:id", h.deleteLabel)
|
||
|
}
|
||
|
|
||
|
}
|