catface_backend_go/app/http/controller/web/animal_controller.go

125 lines
3.6 KiB
Go
Raw Normal View History

2024-10-14 13:49:16 +08:00
package web
import (
"catface/app/global/consts"
"catface/app/global/errcode"
"catface/app/global/variable"
"catface/app/model"
"catface/app/utils/model_handler"
"catface/app/utils/query_handler"
"catface/app/utils/response"
"fmt"
"strconv"
"github.com/gin-gonic/gin"
"gorm.io/gorm"
)
type Animals struct { // INFO 起到一个标记的作用,这样 web.xxx 的时候不同模块就不会命名冲突了。
}
func buildSelectAttrs(db *gorm.DB, attrs string) *gorm.DB {
if len(attrs) > 0 {
// 1. 获取空 Field
fieldMap := model_handler.GetModelField(model.Animal{})
// 2. 开始检查请求字段
attrsArray := query_handler.StringToStringArray(attrs)
for _, attr := range attrsArray {
if attr == "*" { // 不需要过滤,直接返回
return db
} else if attr == "avatar" {
fieldMap["avatar_height"] = true
fieldMap["avatar_width"] = true
}
// 过滤 无效 的请求字段
if _, ok := fieldMap[attr]; ok {
fieldMap[attr] = true
continue
}
}
// 3. 装填字段,并 Select
var validSelectedFields []string
for key, value := range fieldMap {
if value {
validSelectedFields = append(validSelectedFields, key)
}
}
db = db.Select(validSelectedFields)
}
return db
}
/**
* @description: 通过检查字段的方式构建 Where 函数
* @param {*gorm.DB} db
* @param {map[string][]uint8} conditions
* @return {*}
*/
func buildQuery(db *gorm.DB, conditions map[string][]uint8) *gorm.DB {
for field, values := range conditions {
if len(values) == 0 || len(values) == 1 && values[0] == 0 {
continue
}
db = db.Where(field+" in (?)", values)
}
return db
}
func (a *Animals) List(context *gin.Context) {
// 1. Get Params
attrs := context.GetString(consts.ValidatorPrefix + "attrs")
gender := query_handler.StringToUint8Array(context.GetString(consts.ValidatorPrefix + "gender"))
breed := query_handler.StringToUint8Array(context.GetString(consts.ValidatorPrefix + "breed"))
sterilzation := query_handler.StringToUint8Array(context.GetString(consts.ValidatorPrefix + "sterilzation"))
status := query_handler.StringToUint8Array(context.GetString(consts.ValidatorPrefix + "status"))
num := context.GetFloat64(consts.ValidatorPrefix + "num")
skip := context.GetFloat64(consts.ValidatorPrefix + "skip")
// 创建条件映射
conditions := map[string][]uint8{
"gender": gender,
"breed": breed,
"sterilization": sterilzation,
"status": status,
}
// 2. Select & Filter
if num == 0 {
num = 10
}
db := variable.GormDbMysql.Table("animals").Limit(int(num)).Offset(int(skip))
db = buildSelectAttrs(db, attrs)
db = buildQuery(db, conditions)
// 3. Find
var animals []model.Animal
err := db.Find(&animals).Error
if err != nil {
response.Fail(context, errcode.ErrAnimalSqlFind, errcode.ErrMsg[errcode.ErrAnimalSqlFind], err) // UPDATE consts ?
} else {
response.Success(context, consts.CurdStatusOkMsg, animals)
}
}
func (a *Animals) Detail(context *gin.Context) {
// 1. Get Params
anmId, err := strconv.Atoi(context.Param("anm_id"))
if err != nil {
response.Fail(context, errcode.ErrAnimalSqlFind, errcode.ErrMsg[errcode.ErrAnimalSqlFind], err)
return
}
fmt.Println("anmId:", anmId)
// 2. Select & Filter
var animal model.Animal
err = variable.GormDbMysql.Table("animals").Model(&animal).Where("id = ?", anmId).Scan(&animal).Error // TIP GORM.First 采取默认的
if err != nil {
response.Fail(context, errcode.ErrAnimalSqlFind, errcode.ErrMsg[errcode.ErrAnimalSqlFind], err) // UPDATE consts ?
} else {
response.Success(context, consts.CurdStatusOkMsg, animal)
}
}