donetick/internal/label/handler.go
Mo Tarbin 0c07b33359 Add Support for Advance Labels ( LabelV2)
Add Support for Custom Migration to keep supporting two database( sqlite and postgres)
Migration from Label to LabelV2
2024-11-23 20:29:53 -05:00

176 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)
}
}