247 lines
7.8 KiB
Go
247 lines
7.8 KiB
Go
package app
|
||
|
||
import (
|
||
"encoding/json"
|
||
"strconv"
|
||
|
||
"git.echol.cn/loser/st/server/global"
|
||
"git.echol.cn/loser/st/server/model/app/request"
|
||
"git.echol.cn/loser/st/server/model/common"
|
||
commonResponse "git.echol.cn/loser/st/server/model/common/response"
|
||
"git.echol.cn/loser/st/server/service"
|
||
"github.com/gin-gonic/gin"
|
||
"go.uber.org/zap"
|
||
)
|
||
|
||
type CharacterApi struct{}
|
||
|
||
// CreateCharacter
|
||
// @Tags AppCharacter
|
||
// @Summary 创建角色卡
|
||
// @Produce application/json
|
||
// @Param data body request.CreateCharacterRequest true "角色卡信息"
|
||
// @Success 200 {object} commonResponse.Response{data=response.CharacterResponse} "创建成功"
|
||
// @Router /app/character [post]
|
||
// @Security ApiKeyAuth
|
||
func (a *CharacterApi) CreateCharacter(c *gin.Context) {
|
||
userID := common.GetAppUserID(c)
|
||
|
||
var req request.CreateCharacterRequest
|
||
err := c.ShouldBindJSON(&req)
|
||
if err != nil {
|
||
commonResponse.FailWithMessage(err.Error(), c)
|
||
return
|
||
}
|
||
|
||
resp, err := service.ServiceGroupApp.AppServiceGroup.CharacterService.CreateCharacter(userID, &req)
|
||
if err != nil {
|
||
global.GVA_LOG.Error("创建角色卡失败", zap.Error(err))
|
||
commonResponse.FailWithMessage(err.Error(), c)
|
||
return
|
||
}
|
||
|
||
commonResponse.OkWithData(resp, c)
|
||
}
|
||
|
||
// GetCharacterList
|
||
// @Tags AppCharacter
|
||
// @Summary 获取角色卡列表
|
||
// @Produce application/json
|
||
// @Param page query int false "页码"
|
||
// @Param pageSize query int false "每页数量"
|
||
// @Param keyword query string false "关键词"
|
||
// @Param tag query string false "标签"
|
||
// @Param isPublic query bool false "是否公开"
|
||
// @Success 200 {object} commonResponse.Response{data=response.CharacterListResponse} "获取成功"
|
||
// @Router /app/character [get]
|
||
// @Security ApiKeyAuth
|
||
func (a *CharacterApi) GetCharacterList(c *gin.Context) {
|
||
userID := common.GetAppUserID(c)
|
||
|
||
var req request.GetCharacterListRequest
|
||
req.Page, _ = strconv.Atoi(c.DefaultQuery("page", "1"))
|
||
req.PageSize, _ = strconv.Atoi(c.DefaultQuery("pageSize", "20"))
|
||
req.Keyword = c.Query("keyword")
|
||
req.Tag = c.Query("tag")
|
||
|
||
if isPublicStr := c.Query("isPublic"); isPublicStr != "" {
|
||
isPublic := isPublicStr == "true"
|
||
req.IsPublic = &isPublic
|
||
}
|
||
|
||
// 参数验证
|
||
if req.Page < 1 {
|
||
req.Page = 1
|
||
}
|
||
if req.PageSize < 1 || req.PageSize > 100 {
|
||
req.PageSize = 20
|
||
}
|
||
|
||
resp, err := service.ServiceGroupApp.AppServiceGroup.CharacterService.GetCharacterList(userID, &req)
|
||
if err != nil {
|
||
global.GVA_LOG.Error("获取角色卡列表失败", zap.Error(err))
|
||
commonResponse.FailWithMessage(err.Error(), c)
|
||
return
|
||
}
|
||
|
||
commonResponse.OkWithData(resp, c)
|
||
}
|
||
|
||
// GetCharacterByID
|
||
// @Tags AppCharacter
|
||
// @Summary 获取角色卡详情
|
||
// @Produce application/json
|
||
// @Param id path int true "角色卡ID"
|
||
// @Success 200 {object} commonResponse.Response{data=response.CharacterResponse} "获取成功"
|
||
// @Router /app/character/:id [get]
|
||
// @Security ApiKeyAuth
|
||
func (a *CharacterApi) GetCharacterByID(c *gin.Context) {
|
||
userID := common.GetAppUserID(c)
|
||
characterID, err := strconv.ParseUint(c.Param("id"), 10, 32)
|
||
if err != nil {
|
||
commonResponse.FailWithMessage("无效的角色卡ID", c)
|
||
return
|
||
}
|
||
|
||
resp, err := service.ServiceGroupApp.AppServiceGroup.CharacterService.GetCharacterByID(userID, uint(characterID))
|
||
if err != nil {
|
||
global.GVA_LOG.Error("获取角色卡详情失败", zap.Error(err))
|
||
commonResponse.FailWithMessage(err.Error(), c)
|
||
return
|
||
}
|
||
|
||
commonResponse.OkWithData(resp, c)
|
||
}
|
||
|
||
// UpdateCharacter
|
||
// @Tags AppCharacter
|
||
// @Summary 更新角色卡
|
||
// @Produce application/json
|
||
// @Param id path int true "角色卡ID"
|
||
// @Param data body request.UpdateCharacterRequest true "角色卡信息"
|
||
// @Success 200 {object} commonResponse.Response{msg=string} "更新成功"
|
||
// @Router /app/character/:id [put]
|
||
// @Security ApiKeyAuth
|
||
func (a *CharacterApi) UpdateCharacter(c *gin.Context) {
|
||
userID := common.GetAppUserID(c)
|
||
characterID, err := strconv.ParseUint(c.Param("id"), 10, 32)
|
||
if err != nil {
|
||
commonResponse.FailWithMessage("无效的角色卡ID", c)
|
||
return
|
||
}
|
||
|
||
var req request.UpdateCharacterRequest
|
||
err = c.ShouldBindJSON(&req)
|
||
if err != nil {
|
||
commonResponse.FailWithMessage(err.Error(), c)
|
||
return
|
||
}
|
||
|
||
err = service.ServiceGroupApp.AppServiceGroup.CharacterService.UpdateCharacter(userID, uint(characterID), &req)
|
||
if err != nil {
|
||
global.GVA_LOG.Error("更新角色卡失败", zap.Error(err))
|
||
commonResponse.FailWithMessage(err.Error(), c)
|
||
return
|
||
}
|
||
|
||
commonResponse.OkWithMessage("更新成功", c)
|
||
}
|
||
|
||
// DeleteCharacter
|
||
// @Tags AppCharacter
|
||
// @Summary 删除角色卡
|
||
// @Produce application/json
|
||
// @Param id path int true "角色卡ID"
|
||
// @Success 200 {object} commonResponse.Response{msg=string} "删除成功"
|
||
// @Router /app/character/:id [delete]
|
||
// @Security ApiKeyAuth
|
||
func (a *CharacterApi) DeleteCharacter(c *gin.Context) {
|
||
userID := common.GetAppUserID(c)
|
||
characterID, err := strconv.ParseUint(c.Param("id"), 10, 32)
|
||
if err != nil {
|
||
commonResponse.FailWithMessage("无效的角色卡ID", c)
|
||
return
|
||
}
|
||
|
||
err = service.ServiceGroupApp.AppServiceGroup.CharacterService.DeleteCharacter(userID, uint(characterID))
|
||
if err != nil {
|
||
global.GVA_LOG.Error("删除角色卡失败", zap.Error(err))
|
||
commonResponse.FailWithMessage(err.Error(), c)
|
||
return
|
||
}
|
||
|
||
commonResponse.OkWithMessage("删除成功", c)
|
||
}
|
||
|
||
// UploadCharacter
|
||
// @Tags AppCharacter
|
||
// @Summary 上传角色卡文件(PNG/JSON)
|
||
// @Accept multipart/form-data
|
||
// @Produce application/json
|
||
// @Param file formData file true "角色卡文件"
|
||
// @Success 200 {object} commonResponse.Response{data=response.CharacterResponse} "上传成功"
|
||
// @Router /app/character/upload [post]
|
||
// @Security ApiKeyAuth
|
||
func (a *CharacterApi) UploadCharacter(c *gin.Context) {
|
||
userID := common.GetAppUserID(c)
|
||
|
||
file, err := c.FormFile("file")
|
||
if err != nil {
|
||
commonResponse.FailWithMessage("请选择文件", c)
|
||
return
|
||
}
|
||
|
||
// 根据文件类型选择导入方式
|
||
contentType := file.Header.Get("Content-Type")
|
||
var resp interface{}
|
||
|
||
if contentType == "image/png" || contentType == "image/x-png" {
|
||
resp, err = service.ServiceGroupApp.AppServiceGroup.CharacterService.ImportCharacterFromPNG(userID, file)
|
||
} else if contentType == "application/json" {
|
||
resp, err = service.ServiceGroupApp.AppServiceGroup.CharacterService.ImportCharacterFromJSON(userID, file)
|
||
} else {
|
||
commonResponse.FailWithMessage("不支持的文件类型,仅支持 PNG 和 JSON", c)
|
||
return
|
||
}
|
||
|
||
if err != nil {
|
||
global.GVA_LOG.Error("上传角色卡失败", zap.Error(err))
|
||
commonResponse.FailWithMessage(err.Error(), c)
|
||
return
|
||
}
|
||
|
||
commonResponse.OkWithData(resp, c)
|
||
}
|
||
|
||
// ExportCharacter
|
||
// @Tags AppCharacter
|
||
// @Summary 导出角色卡为 JSON
|
||
// @Produce application/json
|
||
// @Param id path int true "角色卡ID"
|
||
// @Success 200 {object} utils.CharacterCardV2 "导出成功"
|
||
// @Router /app/character/:id/export [get]
|
||
// @Security ApiKeyAuth
|
||
func (a *CharacterApi) ExportCharacter(c *gin.Context) {
|
||
userID := common.GetAppUserID(c)
|
||
characterID, err := strconv.ParseUint(c.Param("id"), 10, 32)
|
||
if err != nil {
|
||
commonResponse.FailWithMessage("无效的角色卡ID", c)
|
||
return
|
||
}
|
||
|
||
card, err := service.ServiceGroupApp.AppServiceGroup.CharacterService.ExportCharacterToJSON(userID, uint(characterID))
|
||
if err != nil {
|
||
global.GVA_LOG.Error("导出角色卡失败", zap.Error(err))
|
||
commonResponse.FailWithMessage(err.Error(), c)
|
||
return
|
||
}
|
||
|
||
// 设置下载响应头
|
||
c.Header("Content-Type", "application/json")
|
||
c.Header("Content-Disposition", "attachment; filename=character_"+c.Param("id")+".json")
|
||
|
||
// 直接返回 JSON
|
||
jsonData, _ := json.MarshalIndent(card, "", " ")
|
||
c.Data(200, "application/json", jsonData)
|
||
}
|