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
@@ -75,6 +75,7 @@ func registerAdminAPI(routes gin.IRoutes, services AdminServices) error {
)
routes.GET("/api/v1/freight-orders", handler.listFreightOrders)
routes.GET("/api/v1/freight-orders/:id", handler.freightOrderDetail)
routes.DELETE("/api/v1/freight-orders/:id", handler.deleteFreightOrder)
}
if services.FreightImages != nil {
routes.GET(
@@ -534,6 +534,92 @@ func TestAdminFreightAPIImportsAllItemsWithoutPII(t *testing.T) {
!strings.Contains(replay.Body.String(), createBody.Sync.ID) {
t.Fatalf("replay status/body = %d / %s", replay.Code, replay.Body)
}
deletedOrderID := listBody.Items[0].ID
deletedImageURL := detailBody.Items[0].ImageURL
deleteResponse := performAdminRequest(
t,
router,
http.MethodDelete,
"/api/v1/freight-orders/"+deletedOrderID,
"",
nil,
"",
)
if deleteResponse.Code != http.StatusNoContent ||
deleteResponse.Body.Len() != 0 ||
deleteResponse.Header().Get("Cache-Control") != "no-store" {
t.Fatalf(
"delete status/body/headers = %d / %s / %#v",
deleteResponse.Code,
deleteResponse.Body,
deleteResponse.Header(),
)
}
deletedDetail := performAdminRequest(
t,
router,
http.MethodGet,
"/api/v1/freight-orders/"+deletedOrderID,
"",
nil,
"",
)
deletedImage := performAdminRequest(
t,
router,
http.MethodGet,
deletedImageURL,
"",
nil,
"",
)
repeatedDelete := performAdminRequest(
t,
router,
http.MethodDelete,
"/api/v1/freight-orders/"+deletedOrderID,
"",
nil,
"",
)
if deletedDetail.Code != http.StatusNotFound ||
deletedImage.Code != http.StatusNotFound ||
repeatedDelete.Code != http.StatusNoContent {
t.Fatalf(
"after delete detail/image/replay = %d / %d / %d",
deletedDetail.Code,
deletedImage.Code,
repeatedDelete.Code,
)
}
reimport := performAdminRequest(
t,
router,
http.MethodPost,
"/api/v1/freight-syncs",
"application/json",
strings.NewReader(
`{"mode":"ORDER_NUMBER","order_number":"SOURCE-12"}`,
),
"freight-sync-after-delete",
)
if reimport.Code != http.StatusCreated {
t.Fatalf("reimport status/body = %d / %s", reimport.Code, reimport.Body)
}
reimportedList := performAdminRequest(
t,
router,
http.MethodGet,
"/api/v1/freight-orders",
"",
nil,
"",
)
decodeResponse(t, reimportedList, &listBody)
if len(listBody.Items) != 1 ||
listBody.Items[0].ID == deletedOrderID {
t.Fatalf("reimported orders = %+v", listBody.Items)
}
}
func TestAdminFreightDateSyncAdvancesInspectableWatermark(t *testing.T) {
@@ -687,6 +773,26 @@ func TestAdminProcurementAPIProducesImmutablePendingTask(t *testing.T) {
createRequest.Body,
)
}
deleteInUse := performAdminRequest(
t,
fixture.router,
http.MethodDelete,
"/api/v1/freight-orders/"+orderBody.Items[0].ID,
"",
nil,
"",
)
if deleteInUse.Code != http.StatusConflict ||
!strings.Contains(
deleteInUse.Body.String(),
`"code":"FREIGHT_ORDER_IN_USE"`,
) {
t.Fatalf(
"delete in-use status/body = %d / %s",
deleteInUse.Code,
deleteInUse.Body,
)
}
var requestBody struct {
Request struct {
ID string `json:"id"`
@@ -255,6 +255,23 @@ func (h *adminHandlers) freightOrderDetail(ctx *gin.Context) {
ctx.JSON(http.StatusOK, response)
}
func (h *adminHandlers) deleteFreightOrder(ctx *gin.Context) {
err := h.services.Freight.DeleteOrder(
ctx.Request.Context(),
usecase.DeleteFreightOrderCommand{
CreatorSubject: localAdminSubject,
ActorUserID: adminActorUserID(ctx),
OrderID: ctx.Param("id"),
},
)
if err != nil {
writeUsecaseError(ctx, err)
return
}
ctx.Header("Cache-Control", "no-store")
ctx.Status(http.StatusNoContent)
}
func freightSyncResponse(run domain.FreightSyncRun) gin.H {
return gin.H{
"id": run.ID,