feat(t242): delete unused freight orders
This commit is contained in:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user