feat(t242): delete unused freight orders

This commit is contained in:
QiuSW
2026-07-29 16:10:45 +08:00
parent c80a5c26ed
commit e5f403ff7d
20 changed files with 915 additions and 27 deletions
@@ -236,6 +236,7 @@ type recordingFreightImageCache struct {
creatorSubject string
runID string
err error
deleted []string
}
func (cache *recordingFreightImageCache) CacheRun(
@@ -248,6 +249,12 @@ func (cache *recordingFreightImageCache) CacheRun(
return cache.err
}
func (cache *recordingFreightImageCache) DeleteStoredImages(
storageKeys []string,
) {
cache.deleted = append(cache.deleted, storageKeys...)
}
func TestCreateFreightOrderSyncTimeoutUsesLiveCleanupContext(t *testing.T) {
repository := &syncTrackingRepository{}
source := &blockingOrderSource{}
@@ -378,6 +385,56 @@ func validFreightOrderSyncCommand(idempotencyKey string) CreateFreightSyncComman
}
}
func TestDeleteFreightOrderValidatesConflictAndCleansImages(t *testing.T) {
repository := &syncTrackingRepository{
deleteStorageKeys: []string{"first/image.jpg", "second/image.jpg"},
}
imageCache := &recordingFreightImageCache{}
service, err := NewFreightService(
repository,
&recordingDateSource{},
fakeClock{},
&sequenceIDs{},
time.Minute,
WithFreightImageCache(imageCache),
)
if err != nil {
t.Fatalf("NewFreightService() error = %v", err)
}
command := DeleteFreightOrderCommand{
CreatorSubject: " local-admin ",
ActorUserID: "00000000-0000-4000-8000-000000000099",
OrderID: "00000000-0000-4000-8000-000000000100",
}
if err := service.DeleteOrder(context.Background(), command); err != nil {
t.Fatalf("DeleteOrder() error = %v", err)
}
if repository.deleteCalls != 1 ||
repository.deleteCreatorSubject != "local-admin" ||
repository.deleteOrderID != command.OrderID {
t.Fatalf("delete repository call = %+v", repository)
}
if len(imageCache.deleted) != 2 ||
imageCache.deleted[0] != "first/image.jpg" ||
imageCache.deleted[1] != "second/image.jpg" {
t.Fatalf("deleted image keys = %#v", imageCache.deleted)
}
repository.deleteErr = ErrFreightOrderInUse
err = service.DeleteOrder(context.Background(), command)
assertUsecaseError(t, err, ErrorKindConflict, "FREIGHT_ORDER_IN_USE")
if len(imageCache.deleted) != 2 {
t.Fatalf("conflicting delete 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 {
t.Fatalf("invalid delete reached repository %d times", repository.deleteCalls)
}
}
func TestFreightDateQuerySplitsIntoSevenDayWindows(t *testing.T) {
source := &recordingDateSource{}
service := &FreightService{source: source}
@@ -581,12 +638,17 @@ func (*blockingOrderSource) QueryCreatedRange(
}
type syncTrackingRepository struct {
mu sync.Mutex
startCalls int
completeCalls int
failCalls int
failCode string
failContextErr error
mu sync.Mutex
startCalls int
completeCalls int
failCalls int
failCode string
failContextErr error
deleteCalls int
deleteCreatorSubject string
deleteOrderID string
deleteStorageKeys []string
deleteErr error
}
func (*syncTrackingRepository) CreateFreightSync(
@@ -682,6 +744,17 @@ func (*syncTrackingRepository) GetFreightOrder(
return domain.FreightOrderDetail{}, nil
}
func (repository *syncTrackingRepository) DeleteFreightOrder(
_ context.Context,
creatorSubject, orderID string,
) ([]string, error) {
repository.deleteCalls++
repository.deleteCreatorSubject = creatorSubject
repository.deleteOrderID = orderID
return append([]string(nil), repository.deleteStorageKeys...),
repository.deleteErr
}
func (source *recordingDateSource) EnsureAuthenticated(context.Context) error {
source.ensureCalls++
return source.ensureErr
@@ -800,3 +873,11 @@ func (*dateCaptureRepository) GetFreightOrder(
) (domain.FreightOrderDetail, error) {
return domain.FreightOrderDetail{}, nil
}
func (*dateCaptureRepository) DeleteFreightOrder(
context.Context,
string,
string,
) ([]string, error) {
return nil, nil
}