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
@@ -617,6 +617,112 @@ func (store *Store) GetFreightOrder(
return domain.FreightOrderDetail{Order: order, Items: items}, nil
}
func (store *Store) DeleteFreightOrder(
ctx context.Context,
creatorSubject, orderID string,
) ([]string, error) {
tx, err := store.db.BeginTx(ctx, nil)
if err != nil {
return nil, repositoryFailure(err)
}
defer tx.Rollback()
var storedOrderID string
err = tx.QueryRowContext(
ctx,
`SELECT id FROM freight_orders
WHERE creator_subject = ? AND id = ?`,
creatorSubject,
orderID,
).Scan(&storedOrderID)
if errors.Is(err, sql.ErrNoRows) {
return nil, nil
}
if err != nil {
return nil, repositoryFailure(err)
}
var inUse int
err = tx.QueryRowContext(
ctx,
`SELECT EXISTS (
SELECT 1
FROM freight_order_items AS item
JOIN procurement_requests AS request
ON request.freight_order_item_id = item.id
WHERE item.freight_order_id = ?
)`,
storedOrderID,
).Scan(&inUse)
if err != nil {
return nil, repositoryFailure(err)
}
if inUse != 0 {
return nil, usecase.ErrFreightOrderInUse
}
rows, err := tx.QueryContext(
ctx,
`SELECT image.storage_key
FROM freight_item_images AS image
JOIN freight_order_items AS item
ON item.id = image.freight_order_item_id
WHERE item.freight_order_id = ?
AND image.status = 'READY'
AND image.storage_key IS NOT NULL
ORDER BY image.storage_key`,
storedOrderID,
)
if err != nil {
return nil, repositoryFailure(err)
}
storageKeys := make([]string, 0)
for rows.Next() {
var storageKey string
if err := rows.Scan(&storageKey); err != nil {
rows.Close()
return nil, repositoryFailure(err)
}
storageKeys = append(storageKeys, storageKey)
}
if err := rows.Err(); err != nil {
rows.Close()
return nil, repositoryFailure(err)
}
if err := rows.Close(); err != nil {
return nil, repositoryFailure(err)
}
if _, err := tx.ExecContext(
ctx,
`DELETE FROM freight_order_items WHERE freight_order_id = ?`,
storedOrderID,
); err != nil {
return nil, repositoryFailure(err)
}
result, err := tx.ExecContext(
ctx,
`DELETE FROM freight_orders
WHERE creator_subject = ? AND id = ?`,
creatorSubject,
storedOrderID,
)
if err != nil {
return nil, repositoryFailure(err)
}
deleted, err := result.RowsAffected()
if err != nil {
return nil, repositoryFailure(err)
}
if deleted != 1 {
return nil, repositoryFailure(usecase.ErrRepositoryInvariant)
}
if err := tx.Commit(); err != nil {
return nil, repositoryFailure(err)
}
return storageKeys, nil
}
const freightSyncSelect = `SELECT
id, creator_subject, created_by_user_id, mode, order_number,
created_from, created_to, watermark_through, query_sha256, status,