feat(server): 公开封面路由 /api/v1/app/cover(App 模型清单缩略图)
This commit is contained in:
@@ -3,6 +3,8 @@ package controller
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/gogf/gf/v2/net/ghttp"
|
||||
|
||||
"observer-server/biz/model/dto"
|
||||
"observer-server/biz/service"
|
||||
)
|
||||
@@ -16,3 +18,16 @@ var AppVersion = &cAppVersion{}
|
||||
func (c *cAppVersion) GetUpdate(ctx context.Context, req *dto.AppUpdateReq) (*dto.AppUpdateRes, error) {
|
||||
return service.AppVersion.GetUpdate(ctx, req)
|
||||
}
|
||||
|
||||
// Cover 数据集封面(直写响应体:service 定位文件,controller 输出二进制;
|
||||
// 公开接口,App 模型清单缩略图。URL 不随封面更换变化,必须 no-store 防缓存旧图)
|
||||
func (c *cAppVersion) Cover(ctx context.Context, req *dto.AppCoverReq) (*dto.AppCoverRes, error) {
|
||||
path, err := service.Dataset.AppCoverFile(ctx, req.NamePrefix)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
r := ghttp.RequestFromCtx(ctx)
|
||||
r.Response.Header().Set("Cache-Control", "no-store")
|
||||
r.Response.ServeFile(path)
|
||||
return &dto.AppCoverRes{}, nil
|
||||
}
|
||||
|
||||
@@ -20,3 +20,13 @@ type AppUpdateRes struct {
|
||||
Notes string `json:"notes"`
|
||||
Models []*ModelCatalogItem `json:"models,omitempty"`
|
||||
}
|
||||
|
||||
// AppCoverReq 数据集封面(公开接口:App 模型清单缩略图,无需登录态)。
|
||||
// namePrefix 为训练文件名前缀(模型发布命名,与 downloadUrl 文件名一致)。
|
||||
type AppCoverReq struct {
|
||||
g.Meta `path:"/app/cover" method:"get" summary:"数据集封面" tags:"版本"`
|
||||
NamePrefix string `json:"namePrefix" v:"required"`
|
||||
}
|
||||
|
||||
// AppCoverRes 封面响应(controller 直写响应体,此结构仅占位)
|
||||
type AppCoverRes struct{}
|
||||
|
||||
@@ -338,6 +338,19 @@ func (s *datasetService) CoverFile(ctx context.Context, datasetId int64, name, f
|
||||
return path, nil
|
||||
}
|
||||
|
||||
// AppCoverFile 公开封面定位(App 模型清单缩略图):按训练文件名前缀查数据集,
|
||||
// 复用 CoverFile 的归属校验(数据集不存在/无封面/文件缺失 → 404 错误码)。
|
||||
func (s *datasetService) AppCoverFile(ctx context.Context, namePrefix string) (string, error) {
|
||||
d, err := dao.Dataset.GetByNamePrefix(ctx, strings.TrimSpace(namePrefix))
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
if d == nil {
|
||||
return "", gerror.NewCode(common.CodeDatasetNotFound)
|
||||
}
|
||||
return s.CoverFile(ctx, d.Id, "", "")
|
||||
}
|
||||
|
||||
// AdminDeleteCover 删除数据集封面:删文件 + 清 cover 字段(列表卡片恢复占位图)
|
||||
func (s *datasetService) AdminDeleteCover(ctx context.Context, req *dto.AdminDatasetCoverDeleteReq) (*dto.AdminDatasetCoverDeleteRes, error) {
|
||||
dataset, err := dao.Dataset.GetById(ctx, req.DatasetId)
|
||||
|
||||
Reference in New Issue
Block a user