spark-server/internal/module/square/logic/media_check.go
DESKTOP-L8OUL9F\gfl0034 715ace7ac6 feat(square): 广场 Bot/RSS 发布与媒体校验
支持广场机器人发帖与媒体类型检查,并补充相关迁移与 i18n。
2026-09-24 23:07:06 +08:00

57 lines
1.5 KiB
Go

package logic
import (
"context"
"spark-server/internal/module/square/entity"
"spark-server/internal/pkg/errs"
"spark-server/internal/pkg/i18n"
"spark-server/internal/pkg/media"
"spark-server/internal/pkg/reqctx"
"go.uber.org/zap"
)
// checkMediaMeta validates client-declared w/h/size on user publish.
// Default: log only; media.user_reject=true returns ErrMediaOversized (40005).
func (s *Service) checkMediaMeta(ctx context.Context, images []*entity.Image, video *entity.Video) error {
if s == nil || !s.media.Enabled {
return nil
}
var v *media.Violation
if video != nil {
v = s.media.CheckPublishVideo(&media.VideoMeta{
Width: video.Width, Height: video.Height, Size: video.Size, DurationMS: video.DurationMS,
})
} else {
metas := make([]media.ImageMeta, 0, len(images))
for _, img := range images {
if img == nil {
continue
}
metas = append(metas, media.ImageMeta{Width: img.Width, Height: img.Height, Size: img.Size})
}
v = s.media.CheckPublishImages(metas)
}
if v == nil {
return nil
}
log := s.log
if log == nil {
log = zap.NewNop()
}
log.Warn("square media oversize",
zap.String("kind", string(v.Kind)),
zap.String("reason", v.Reason),
zap.Int("w", v.Width),
zap.Int("h", v.Height),
zap.Int("max_edge", v.MaxEdge),
zap.Int64("size", v.Size),
zap.Int64("max_size", v.MaxSize),
)
if !s.media.UserReject {
return nil
}
return errs.ErrMediaOversized.WithMsg(i18n.T(reqctx.Lang(ctx), i18n.KeyMediaOversized, nil))
}