fix(t243): allow deleting unreferenced procurement drafts

This commit is contained in:
QiuSW
2026-07-29 16:45:25 +08:00
parent 62eee74a70
commit 24eef29076
12 changed files with 504 additions and 102 deletions
+23 -11
View File
@@ -60,14 +60,19 @@ func invalidError(code, message string, fields map[string]string) *Error {
}
var (
ErrRepositoryNotFound = errors.New("repository resource not found")
ErrIdempotencyConflict = errors.New("idempotency key payload conflict")
ErrSourceReferenceConflict = errors.New("source reference conflict")
ErrAssetUnavailable = errors.New("asset is unavailable")
ErrTaskStateConflict = errors.New("task state conflict")
ErrFreightOrderInUse = errors.New("freight order is in use")
ErrRepositoryUnavailable = errors.New("repository unavailable")
ErrRepositoryInvariant = errors.New("repository invariant failed")
ErrRepositoryNotFound = errors.New("repository resource not found")
ErrIdempotencyConflict = errors.New("idempotency key payload conflict")
ErrSourceReferenceConflict = errors.New("source reference conflict")
ErrAssetUnavailable = errors.New("asset is unavailable")
ErrTaskStateConflict = errors.New("task state conflict")
ErrFreightOrderHasReference = errors.New(
"freight order has a procurement reference",
)
ErrFreightOrderHasPurchaseTask = errors.New(
"freight order has a purchase task",
)
ErrRepositoryUnavailable = errors.New("repository unavailable")
ErrRepositoryInvariant = errors.New("repository invariant failed")
)
func wrapRepositoryError(err error) error {
@@ -107,11 +112,18 @@ func wrapRepositoryError(err error) error {
"task state does not allow this operation",
err,
)
case errors.Is(err, ErrFreightOrderInUse):
case errors.Is(err, ErrFreightOrderHasPurchaseTask):
return newError(
ErrorKindConflict,
"FREIGHT_ORDER_IN_USE",
"freight order is already used by procurement",
"FREIGHT_ORDER_HAS_PURCHASE_TASK",
"freight order already has a purchase task",
err,
)
case errors.Is(err, ErrFreightOrderHasReference):
return newError(
ErrorKindConflict,
"FREIGHT_ORDER_HAS_REFERENCE",
"freight order already has a procurement reference",
err,
)
case errors.Is(err, ErrRepositoryUnavailable):
@@ -385,7 +385,7 @@ func validFreightOrderSyncCommand(idempotencyKey string) CreateFreightSyncComman
}
}
func TestDeleteFreightOrderValidatesConflictAndCleansImages(t *testing.T) {
func TestDeleteFreightOrderValidatesConflictsAndCleansImages(t *testing.T) {
repository := &syncTrackingRepository{
deleteStorageKeys: []string{"first/image.jpg", "second/image.jpg"},
}
@@ -420,17 +420,34 @@ func TestDeleteFreightOrderValidatesConflictAndCleansImages(t *testing.T) {
t.Fatalf("deleted image keys = %#v", imageCache.deleted)
}
repository.deleteErr = ErrFreightOrderInUse
repository.deleteErr = ErrFreightOrderHasReference
err = service.DeleteOrder(context.Background(), command)
assertUsecaseError(t, err, ErrorKindConflict, "FREIGHT_ORDER_IN_USE")
assertUsecaseError(
t,
err,
ErrorKindConflict,
"FREIGHT_ORDER_HAS_REFERENCE",
)
if len(imageCache.deleted) != 2 {
t.Fatalf("conflicting delete cleaned images = %#v", imageCache.deleted)
t.Fatalf("reference conflict cleaned images = %#v", imageCache.deleted)
}
repository.deleteErr = ErrFreightOrderHasPurchaseTask
err = service.DeleteOrder(context.Background(), command)
assertUsecaseError(
t,
err,
ErrorKindConflict,
"FREIGHT_ORDER_HAS_PURCHASE_TASK",
)
if len(imageCache.deleted) != 2 {
t.Fatalf("task conflict cleaned images = %#v", imageCache.deleted)
}
command.OrderID = "invalid"
err = service.DeleteOrder(context.Background(), command)
assertUsecaseError(t, err, ErrorKindInvalid, "FREIGHT_DELETE_INVALID")
if repository.deleteCalls != 2 {
if repository.deleteCalls != 3 {
t.Fatalf("invalid delete reached repository %d times", repository.deleteCalls)
}
}