详情页面kd 展示,发布时间必填
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user