Files
smartmate/backend/api/task-class.go
LoveLosita e5a4114202 Version: 0.2.5.dev.260211
feat: 🗑️ 新增删除任务类接口并实现级联删除

- 通过 task_class 与 task_item 两张表建立级联关系 🔗
- 删除 task_class 时自动删除关联的 task_item
- 保证数据一致性,避免产生孤立数据 
2026-02-11 18:44:13 +08:00

174 lines
5.0 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package api
import (
"context"
"net/http"
"strconv"
"time"
"github.com/LoveLosita/smartflow/backend/model"
"github.com/LoveLosita/smartflow/backend/respond"
"github.com/LoveLosita/smartflow/backend/service"
"github.com/gin-gonic/gin"
)
type TaskClassHandler struct {
svc *service.TaskClassService
}
// NewTaskClassHandler组装 Handler 的“工厂”
func NewTaskClassHandler(svc *service.TaskClassService) *TaskClassHandler {
return &TaskClassHandler{
svc: svc, // 把传进来的 Service 揣进口袋里
}
}
const (
create = 0
update = 1
)
func (api *TaskClassHandler) UserAddTaskClass(c *gin.Context) {
var req model.UserAddTaskClassRequest
err := c.ShouldBindJSON(&req)
if err != nil {
c.JSON(http.StatusBadRequest, respond.WrongParamType)
return
}
userIDInterface := c.GetInt("user_id")
// 创建一个带 1 秒超时的上下文
ctx, cancel := context.WithTimeout(c.Request.Context(), 1*time.Second)
defer cancel() // 记得释放资源
err = api.svc.AddOrUpdateTaskClass(ctx, &req, userIDInterface, create, 0)
if err != nil {
respond.DealWithError(c, err)
return
}
c.JSON(http.StatusOK, respond.Ok)
}
func (api *TaskClassHandler) UserGetTaskClassInfos(c *gin.Context) {
userIDInterface := c.GetInt("user_id")
// 创建一个带 1 秒超时的上下文
ctx, cancel := context.WithTimeout(c.Request.Context(), 1*time.Second)
defer cancel() // 记得释放资源
resp, err := api.svc.GetUserTaskClassInfos(ctx, userIDInterface)
if err != nil {
respond.DealWithError(c, err)
return
}
c.JSON(http.StatusOK, respond.RespWithData(respond.Ok, resp))
}
func (api *TaskClassHandler) UserGetCompleteTaskClass(c *gin.Context) {
taskClassID := c.Query("task_class_id")
//将taskClassID转换为int
intTaskClassID, err := strconv.Atoi(taskClassID)
if err != nil {
c.JSON(http.StatusBadRequest, respond.WrongParamType)
return
}
if taskClassID == "" {
c.JSON(http.StatusBadRequest, respond.MissingParam)
return
}
userIDInterface := c.GetInt("user_id")
// 创建一个带 1 秒超时的上下文
ctx, cancel := context.WithTimeout(c.Request.Context(), 1*time.Second)
defer cancel() // 记得释放资源
resp, err := api.svc.GetUserCompleteTaskClass(ctx, userIDInterface, intTaskClassID)
if err != nil {
respond.DealWithError(c, err)
return
}
c.JSON(http.StatusOK, respond.RespWithData(respond.Ok, resp))
}
func (api *TaskClassHandler) UserUpdateTaskClass(c *gin.Context) {
var req model.UserAddTaskClassRequest
err := c.ShouldBindJSON(&req)
if err != nil {
c.JSON(http.StatusBadRequest, respond.WrongParamType)
return
}
taskClassID := c.Query("task_class_id")
//将taskClassID转换为int
intTaskClassID, err := strconv.Atoi(taskClassID)
userIDInterface := c.GetInt("user_id")
// 创建一个带 1 秒超时的上下文
ctx, cancel := context.WithTimeout(c.Request.Context(), 1*time.Second)
defer cancel() // 记得释放资源
err = api.svc.AddOrUpdateTaskClass(ctx, &req, userIDInterface, update, intTaskClassID)
if err != nil {
respond.DealWithError(c, err)
return
}
c.JSON(http.StatusOK, respond.Ok)
}
func (api *TaskClassHandler) UserAddTaskClassItemIntoSchedule(c *gin.Context) {
var req model.UserInsertTaskClassItemToScheduleRequest
err := c.ShouldBindJSON(&req)
if err != nil {
c.JSON(http.StatusBadRequest, respond.WrongParamType)
return
}
taskID := c.Query("task_item_id")
//将taskID转换为int
intTaskID, err := strconv.Atoi(taskID)
if err != nil {
c.JSON(http.StatusBadRequest, respond.WrongParamType)
return
}
userIDInterface := c.GetInt("user_id")
// 创建一个带 1 秒超时的上下文
ctx, cancel := context.WithTimeout(c.Request.Context(), 1*time.Second)
defer cancel() // 记得释放资源
err = api.svc.AddTaskClassItemIntoSchedule(ctx, &req, userIDInterface, intTaskID)
if err != nil {
respond.DealWithError(c, err)
return
}
c.JSON(http.StatusOK, respond.Ok)
}
func (api *TaskClassHandler) DeleteTaskClassItem(c *gin.Context) {
taskID := c.Query("task_item_id")
//将taskID转换为int
intTaskID, err := strconv.Atoi(taskID)
if err != nil {
c.JSON(http.StatusBadRequest, respond.WrongParamType)
return
}
userID := c.GetInt("user_id")
// 创建一个带 1 秒超时的上下文
ctx, cancel := context.WithTimeout(c.Request.Context(), 1*time.Second)
defer cancel() // 记得释放资源
err = api.svc.DeleteTaskClassItem(ctx, userID, intTaskID)
if err != nil {
respond.DealWithError(c, err)
return
}
c.JSON(http.StatusOK, respond.Ok)
}
func (api *TaskClassHandler) DeleteTaskClass(c *gin.Context) {
taskClassID := c.Query("task_class_id")
//将taskClassID转换为int
intTaskClassID, err := strconv.Atoi(taskClassID)
if err != nil {
c.JSON(http.StatusBadRequest, respond.WrongParamType)
return
}
userID := c.GetInt("user_id")
// 创建一个带 1 秒超时的上下文
ctx, cancel := context.WithTimeout(c.Request.Context(), 1*time.Second)
defer cancel() // 记得释放资源
err = api.svc.DeleteTaskClass(ctx, userID, intTaskClassID)
if err != nil {
respond.DealWithError(c, err)
return
}
c.JSON(http.StatusOK, respond.Ok)
}