fix: enhance publish record deletion logic and add soft delete functionality
Backend CI / Backend (push) Successful in 14m47s

This commit is contained in:
2026-06-19 17:20:35 +08:00
parent 8a1623b9c6
commit 18aa681b01
10 changed files with 49 additions and 39 deletions
+30 -18
View File
@@ -425,16 +425,17 @@ func (s *MediaService) DeletePublishRecord(ctx context.Context, recordID int64)
var publishBatchID int64
var articleID int64
var cancelErrorJSON []byte
cancelErrorJSON, err = marshalOptionalJSON(map[string]any{
var publishStatus string
cancelErrorJSONBytes, err := marshalOptionalJSON(map[string]any{
"reason": "publish_record_deleted",
"source": "tenant_web",
})
if err != nil {
return nil, response.ErrInternal(50044, "publish_record_delete_payload_failed", "failed to delete publish record")
}
cancelErrorJSON := string(cancelErrorJSONBytes)
err = tx.QueryRow(ctx, `
SELECT pr.publish_batch_id, pr.article_id
SELECT pr.publish_batch_id, pr.article_id, pr.status
FROM publish_records pr
JOIN articles a
ON a.id = pr.article_id
@@ -447,7 +448,7 @@ func (s *MediaService) DeletePublishRecord(ctx context.Context, recordID int64)
AND pb.initiator_user_id = $3
AND pr.deleted_at IS NULL
FOR UPDATE OF pr
`, recordID, actor.TenantID, actor.UserID).Scan(&publishBatchID, &articleID)
`, recordID, actor.TenantID, actor.UserID).Scan(&publishBatchID, &articleID, &publishStatus)
if err != nil {
if errors.Is(err, pgx.ErrNoRows) {
return nil, response.ErrNotFound(40435, "publish_record_not_found", "publish record not found")
@@ -468,20 +469,22 @@ func (s *MediaService) DeletePublishRecord(ctx context.Context, recordID int64)
return nil, response.ErrNotFound(40435, "publish_record_not_found", "publish record not found")
}
if _, err := tx.Exec(ctx, `
UPDATE desktop_tasks
SET status = 'aborted',
error = $3,
active_attempt_id = NULL,
lease_token_hash = NULL,
lease_expires_at = NULL,
updated_at = NOW()
WHERE tenant_id = $1
AND kind = 'publish'
AND status = 'queued'
AND payload->>'publish_record_id' = $2
`, actor.TenantID, recordID, cancelErrorJSON); err != nil {
return nil, response.ErrInternal(50044, "publish_record_delete_cancel_task_failed", "failed to cancel queued publish task before deleting record")
if publishRecordMayHaveQueuedTask(publishStatus) {
if _, err := tx.Exec(ctx, `
UPDATE desktop_tasks
SET status = 'aborted',
error = $3::jsonb,
active_attempt_id = NULL,
lease_token_hash = NULL,
lease_expires_at = NULL,
updated_at = NOW()
WHERE tenant_id = $1
AND kind = 'publish'
AND status = 'queued'
AND payload->>'publish_record_id' = $2::text
`, actor.TenantID, recordID, cancelErrorJSON); err != nil {
return nil, response.ErrInternal(50044, "publish_record_delete_cancel_task_failed", "failed to cancel queued publish task before deleting record")
}
}
batchStatus, err := recalculatePublishBatchStatus(ctx, tx, publishBatchID)
@@ -532,6 +535,15 @@ func publishPlatformRequiresCover(platformID string) bool {
}
}
func publishRecordMayHaveQueuedTask(status string) bool {
switch strings.TrimSpace(status) {
case "queued", "publishing", "pending", "running":
return true
default:
return false
}
}
func pointerStringValue(value *string) string {
if value == nil {
return ""