package logic import ( "context" "spark-server/internal/module/upload/entity" "spark-server/internal/pkg/errs" "spark-server/internal/pkg/reqctx" "spark-server/internal/pkg/validate" ) const maxCredentialBatch = 3 // BatchCreateInput issues up to three Presigned PUTs in one call (thumb / preview / orig). type BatchCreateInput struct { Items []CreateInput `json:"items" validate:"required,min=1,max=3,dive" label:"field.upload_items" errmsg:"required:validate.upload.items_required;min:validate.upload.items_required;max:validate.upload.items_invalid"` } func (s *Service) CreateCredentials(ctx context.Context, userID int64, in *BatchCreateInput) (*entity.CredentialSet, error) { if !s.ready() { return nil, errs.ErrAvailable } if userID <= 0 { return nil, errs.ErrUnauthorized } if in == nil { return nil, errs.ErrInvalidArgument } if err := validate.StructLang(reqctx.Lang(ctx), in); err != nil { return nil, err } if n := len(in.Items); n < 1 || n > maxCredentialBatch { return nil, errs.ErrInvalidArgument } for range in.Items { if !s.allow(userID) { return nil, errs.ErrRateLimited } } items := make([]entity.Credential, 0, len(in.Items)) for i := range in.Items { cred, err := s.issuePut(ctx, userID, &in.Items[i]) if err != nil { return nil, err } items = append(items, *cred) } return &entity.CredentialSet{Items: items}, nil }