Add Support for Advance Labels ( LabelV2)
Add Support for Custom Migration to keep supporting two database( sqlite and postgres) Migration from Label to LabelV2
This commit is contained in:
parent
6dc8092ff4
commit
0c07b33359
12 changed files with 730 additions and 49 deletions
176
internal/label/handler.go
Normal file
176
internal/label/handler.go
Normal file
|
@ -0,0 +1,176 @@
|
|||
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)
|
||||
}
|
||||
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue