详情页面kd 展示,发布时间必填

This commit is contained in:
yml2213
2026-06-12 21:24:13 +08:00
parent f6ea3e29a6
commit 7c2f5e34c3
11 changed files with 148 additions and 5 deletions
@@ -28,6 +28,10 @@ func writeListingError(c *gin.Context, err error) {
response.BadRequest(c, "哈夫币数量不正确")
case errors.Is(err, ErrMissingScreenshot):
response.BadRequest(c, "请至少上传一张账号截图")
case errors.Is(err, ErrMissingOnlineTime):
response.BadRequest(c, "请选择在线时间")
case errors.Is(err, ErrInvalidOnlineTime):
response.BadRequest(c, "在线时间不正确")
case errors.Is(err, ErrAgreementRequired):
response.BadRequest(c, "请先阅读并同意发布协议")
case errors.Is(err, ErrMissingUploaderName):
@@ -17,6 +17,8 @@ var (
ErrDepositTooLow = errors.New("listing deposit too low")
ErrInvalidHafCoin = errors.New("invalid haf coin amount")
ErrMissingScreenshot = errors.New("missing screenshot")
ErrMissingOnlineTime = errors.New("missing online time")
ErrInvalidOnlineTime = errors.New("invalid online time")
ErrAgreementRequired = errors.New("listing publish agreement required")
ErrMissingUploaderName = errors.New("missing uploader name")
ErrMissingUploadData = errors.New("missing upload data")
@@ -18,6 +18,9 @@ func (s *Service) Create(ctx context.Context, ownerID uint64, req CreateRequest)
if err := validateRequest(req, rules); err != nil {
return nil, err
}
if err := validateRequiredOnlineTime(req); err != nil {
return nil, err
}
reviewRequired, err := s.reviewRequired(ctx)
if err != nil {
return nil, err
@@ -36,6 +39,9 @@ func (s *Service) Update(ctx context.Context, ownerID uint64, id uint64, req Upd
if err := validateRequest(req, rules); err != nil {
return nil, err
}
if err := validateRequiredOnlineTime(req); err != nil {
return nil, err
}
reviewRequired, err := s.reviewRequired(ctx)
if err != nil {
return nil, err
@@ -58,6 +58,44 @@ func TestValidateRequestRequiresDepositAboveConsumables(t *testing.T) {
}
}
func TestValidateRequiredOnlineTime(t *testing.T) {
req := CreateRequest{
AssetSummary: map[string]any{
"online_time": map[string]any{
"start": "09:00",
"end": "23:00",
},
},
}
if err := validateRequiredOnlineTime(req); err != nil {
t.Fatalf("expected valid online time, got %v", err)
}
}
func TestValidateRequiredOnlineTimeRejectsMissing(t *testing.T) {
req := CreateRequest{AssetSummary: map[string]any{}}
if err := validateRequiredOnlineTime(req); err != ErrMissingOnlineTime {
t.Fatalf("expected ErrMissingOnlineTime, got %v", err)
}
}
func TestValidateRequiredOnlineTimeRejectsInvalidRange(t *testing.T) {
req := CreateRequest{
AssetSummary: map[string]any{
"online_time": map[string]any{
"start": "23:00",
"end": "09:00",
},
},
}
if err := validateRequiredOnlineTime(req); err != ErrInvalidOnlineTime {
t.Fatalf("expected ErrInvalidOnlineTime, got %v", err)
}
}
func TestCreateRequiresPublishAgreements(t *testing.T) {
service := NewService(&Repository{}, nil)
@@ -41,6 +41,63 @@ func validateRequest(req CreateRequest, rules publishRules) error {
return nil
}
func validateRequiredOnlineTime(req CreateRequest) error {
start, end, ok := readOnlineTime(req.AssetSummary)
if !ok {
return ErrMissingOnlineTime
}
startMinute, ok := parseOnlineMinute(start)
if !ok {
return ErrInvalidOnlineTime
}
endMinute, ok := parseOnlineMinute(end)
if !ok {
return ErrInvalidOnlineTime
}
if startMinute >= endMinute {
return ErrInvalidOnlineTime
}
return nil
}
func readOnlineTime(summary map[string]any) (string, string, bool) {
if summary == nil {
return "", "", false
}
raw, ok := summary["online_time"]
if !ok {
return "", "", false
}
onlineTime, ok := raw.(map[string]any)
if !ok {
return "", "", false
}
start, okStart := onlineTime["start"].(string)
end, okEnd := onlineTime["end"].(string)
start = strings.TrimSpace(start)
end = strings.TrimSpace(end)
return start, end, okStart && okEnd && start != "" && end != ""
}
func parseOnlineMinute(value string) (int, bool) {
parts := strings.Split(strings.TrimSpace(value), ":")
if len(parts) != 2 {
return 0, false
}
hour, err := strconv.Atoi(parts[0])
if err != nil {
return 0, false
}
minute, err := strconv.Atoi(parts[1])
if err != nil {
return 0, false
}
if hour < 0 || hour > 23 || minute < 0 || minute > 59 {
return 0, false
}
return hour*60 + minute, true
}
func consumableValue(summary map[string]any) float64 {
if summary == nil {
return 0