pet-ai/server/plugin/wechat-integration/api/mp_material_api.go

294 lines
8.4 KiB
Go
Raw Permalink 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 (
"io"
"strconv"
"github.com/flipped-aurora/gin-vue-admin/server/global"
"github.com/flipped-aurora/gin-vue-admin/server/model/common/response"
wechatResponse "github.com/flipped-aurora/gin-vue-admin/server/plugin/wechat-integration/model/response"
"github.com/flipped-aurora/gin-vue-admin/server/plugin/wechat-integration/service"
"github.com/gin-gonic/gin"
"go.uber.org/zap"
)
type MpMaterialApi struct{}
var mpMaterialService = service.ServiceGroupApp.MpMaterialService
// GetMaterialList 获取素材列表
// @Tags MpMaterial
// @Summary 获取素材列表
// @Description 获取公众号素材列表
// @Accept json
// @Produce json
// @Param page query int false "页码"
// @Param pageSize query int false "每页数量"
// @Param materialType query string false "素材类型"
// @Param permanent query bool false "是否永久素材"
// @Success 200 {object} response.Response{data=response.PageResult} "获取成功"
// @Router /wechat/mp/material [get]
func (m *MpMaterialApi) GetMaterialList(c *gin.Context) {
page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
pageSize, _ := strconv.Atoi(c.DefaultQuery("pageSize", "10"))
materialType := c.Query("materialType")
var permanent *bool
if p := c.Query("permanent"); p != "" {
if perm, err := strconv.ParseBool(p); err == nil {
permanent = &perm
}
}
if page <= 0 {
page = 1
}
if pageSize <= 0 || pageSize > 100 {
pageSize = 10
}
materials, total, err := mpMaterialService.GetMaterialList(page, pageSize, materialType, permanent)
if err != nil {
global.GVA_LOG.Error("获取素材列表失败!", zap.Error(err))
response.FailWithMessage("获取失败: "+err.Error(), c)
return
}
response.OkWithDetailed(wechatResponse.PageResult{
List: materials,
Total: total,
Page: page,
PageSize: pageSize,
}, "获取成功", c)
}
// GetMaterialByID 获取素材详情
// @Tags MpMaterial
// @Summary 获取素材详情
// @Description 根据ID获取素材详细信息
// @Accept json
// @Produce json
// @Param id path int true "素材ID"
// @Success 200 {object} response.Response{data=model.MpMaterial} "获取成功"
// @Router /wechat/mp/material/{id} [get]
func (m *MpMaterialApi) GetMaterialByID(c *gin.Context) {
idStr := c.Param("id")
id, err := strconv.ParseUint(idStr, 10, 32)
if err != nil {
response.FailWithMessage("无效的素材ID", c)
return
}
material, err := mpMaterialService.GetMaterialByID(uint(id))
if err != nil {
global.GVA_LOG.Error("获取素材详情失败!", zap.Error(err))
response.FailWithMessage("获取失败: "+err.Error(), c)
return
}
response.OkWithData(material, c)
}
// UploadTempMaterial 上传临时素材
// @Tags MpMaterial
// @Summary 上传临时素材
// @Description 上传临时素材到微信服务器
// @Accept multipart/form-data
// @Produce json
// @Param file formData file true "素材文件"
// @Param type formData string true "素材类型image、voice、video、thumb"
// @Success 200 {object} response.Response{data=model.MpMaterial} "上传成功"
// @Router /wechat/mp/material/temp [post]
func (m *MpMaterialApi) UploadTempMaterial(c *gin.Context) {
// 获取上传的文件
file, header, err := c.Request.FormFile("file")
if err != nil {
response.FailWithMessage("获取文件失败: "+err.Error(), c)
return
}
defer file.Close()
materialType := c.PostForm("type")
if materialType == "" {
response.FailWithMessage("素材类型不能为空", c)
return
}
// 验证素材类型
validTypes := map[string]bool{
"image": true,
"voice": true,
"video": true,
"thumb": true,
}
if !validTypes[materialType] {
response.FailWithMessage("无效的素材类型", c)
return
}
material, err := mpMaterialService.UploadTempMaterial(file, header.Filename, materialType)
if err != nil {
global.GVA_LOG.Error("上传临时素材失败!", zap.Error(err))
response.FailWithMessage("上传失败: "+err.Error(), c)
return
}
response.OkWithDetailed(material, "上传成功", c)
}
// UploadPermanentMaterial 上传永久素材
// @Tags MpMaterial
// @Summary 上传永久素材
// @Description 上传永久素材到微信服务器
// @Accept multipart/form-data
// @Produce json
// @Param file formData file true "素材文件"
// @Param type formData string true "素材类型image、voice、video、thumb"
// @Success 200 {object} response.Response{data=model.MpMaterial} "上传成功"
// @Router /wechat/mp/material/permanent [post]
func (m *MpMaterialApi) UploadPermanentMaterial(c *gin.Context) {
// 获取上传的文件
file, header, err := c.Request.FormFile("file")
if err != nil {
response.FailWithMessage("获取文件失败: "+err.Error(), c)
return
}
defer file.Close()
materialType := c.PostForm("type")
if materialType == "" {
response.FailWithMessage("素材类型不能为空", c)
return
}
// 验证素材类型
validTypes := map[string]bool{
"image": true,
"voice": true,
"video": true,
"thumb": true,
}
if !validTypes[materialType] {
response.FailWithMessage("无效的素材类型", c)
return
}
material, err := mpMaterialService.UploadPermanentMaterial(file, header.Filename, materialType)
if err != nil {
global.GVA_LOG.Error("上传永久素材失败!", zap.Error(err))
response.FailWithMessage("上传失败: "+err.Error(), c)
return
}
response.OkWithDetailed(material, "上传成功", c)
}
// DeleteMaterial 删除素材
// @Tags MpMaterial
// @Summary 删除素材
// @Description 删除指定的素材
// @Accept json
// @Produce json
// @Param id path int true "素材ID"
// @Success 200 {object} response.Response "删除成功"
// @Router /wechat/mp/material/{id} [delete]
func (m *MpMaterialApi) DeleteMaterial(c *gin.Context) {
idStr := c.Param("id")
id, err := strconv.ParseUint(idStr, 10, 32)
if err != nil {
response.FailWithMessage("无效的素材ID", c)
return
}
err = mpMaterialService.DeleteMaterial(uint(id))
if err != nil {
global.GVA_LOG.Error("删除素材失败!", zap.Error(err))
response.FailWithMessage("删除失败: "+err.Error(), c)
return
}
response.OkWithMessage("删除成功", c)
}
// GetMaterialByMediaID 根据MediaID获取素材
// @Tags MpMaterial
// @Summary 根据MediaID获取素材
// @Description 根据微信MediaID获取素材信息
// @Accept json
// @Produce json
// @Param mediaId query string true "微信MediaID"
// @Success 200 {object} response.Response{data=model.MpMaterial} "获取成功"
// @Router /wechat/mp/material/media [get]
func (m *MpMaterialApi) GetMaterialByMediaID(c *gin.Context) {
mediaID := c.Query("mediaId")
if mediaID == "" {
response.FailWithMessage("MediaID不能为空", c)
return
}
material, err := mpMaterialService.GetMaterialByMediaID(mediaID)
if err != nil {
global.GVA_LOG.Error("获取素材失败!", zap.Error(err))
response.FailWithMessage("获取失败: "+err.Error(), c)
return
}
response.OkWithData(material, c)
}
// DownloadMaterial 下载素材
// @Tags MpMaterial
// @Summary 下载素材
// @Description 从微信服务器下载素材
// @Accept json
// @Produce json
// @Param mediaId query string true "素材MediaID"
// @Success 200 {object} response.Response "下载成功"
// @Router /wechat/mp/material/download [get]
func (m *MpMaterialApi) DownloadMaterial(c *gin.Context) {
mediaID := c.Query("mediaId")
if mediaID == "" {
response.FailWithMessage("MediaID不能为空", c)
return
}
reader, filename, err := mpMaterialService.DownloadMaterial(mediaID)
if err != nil {
global.GVA_LOG.Error("下载素材失败!", zap.Error(err))
response.FailWithMessage("下载失败: "+err.Error(), c)
return
}
defer reader.Close()
// 设置响应头
c.Header("Content-Disposition", "attachment; filename="+filename)
c.Header("Content-Type", "application/octet-stream")
// 将文件内容写入响应
_, err = io.Copy(c.Writer, reader)
if err != nil {
global.GVA_LOG.Error("写入响应失败!", zap.Error(err))
response.FailWithMessage("下载失败", c)
return
}
}
// SyncMaterials 同步素材
// @Tags MpMaterial
// @Summary 同步素材
// @Description 从微信服务器同步素材列表
// @Accept json
// @Produce json
// @Success 200 {object} response.Response "同步成功"
// @Router /wechat/mp/material/sync [post]
func (m *MpMaterialApi) SyncMaterials(c *gin.Context) {
err := mpMaterialService.SyncMaterialsFromWechat()
if err != nil {
global.GVA_LOG.Error("同步素材失败!", zap.Error(err))
response.FailWithMessage("同步失败: "+err.Error(), c)
return
}
response.OkWithMessage("同步成功", c)
}