refactor(uploads): drop legacy multipart code paths
The presigned-URL upload flow (POST /api/uploads/presign + direct B2 POST
+ upload_ids[] in entity creation) is now the only image upload path. The
legacy multipart routes and DTO fields used by older clients are removed:
Removed:
- POST /api/uploads/image/ (legacy multipart upload → URL)
- POST /api/uploads/document/ (legacy multipart upload → URL)
- POST /api/uploads/completion/ (legacy multipart upload → URL)
- Multipart branch in POST /api/task-completions/ (now JSON-only)
- CreateTaskCompletionRequest.ImageURLs DTO field
- UpdateTaskCompletionRequest.ImageURLs DTO field
- CreateDocumentRequest.ImageURLs DTO field
- Service-layer ImageURLs loops in task_service.CreateCompletion,
task_service.UpdateCompletion, document_service.CreateDocument
- Tests exercising the removed paths
- Now-unused imports (strings/time/decimal) in task_handler.go
Kept:
- DELETE /api/uploads/ (orphan-cleanup endpoint, still useful)
- POST /api/uploads/presign/ (the new path)
- POST /api/documents/:id/images/ (uses storage_service.Upload directly,
same multipart pattern but separate code path; deferred for now)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1781,45 +1781,11 @@ func TestStaticDataHandler_RefreshStaticData(t *testing.T) {
|
||||
// =============================================================================
|
||||
// Upload Handler - Additional Error Paths
|
||||
// =============================================================================
|
||||
|
||||
func TestUploadHandler_UploadImage_NoFile(t *testing.T) {
|
||||
storageSvc := newTestStorageService("/var/uploads")
|
||||
handler := NewUploadHandler(storageSvc, nil)
|
||||
e := testutil.SetupTestRouter()
|
||||
|
||||
e.POST("/api/uploads/image", handler.UploadImage)
|
||||
|
||||
t.Run("no file returns 400", func(t *testing.T) {
|
||||
w := testutil.MakeRequest(e, "POST", "/api/uploads/image", nil, "")
|
||||
testutil.AssertStatusCode(t, w, http.StatusBadRequest)
|
||||
})
|
||||
}
|
||||
|
||||
func TestUploadHandler_UploadDocument_NoFile(t *testing.T) {
|
||||
storageSvc := newTestStorageService("/var/uploads")
|
||||
handler := NewUploadHandler(storageSvc, nil)
|
||||
e := testutil.SetupTestRouter()
|
||||
|
||||
e.POST("/api/uploads/document", handler.UploadDocument)
|
||||
|
||||
t.Run("no file returns 400", func(t *testing.T) {
|
||||
w := testutil.MakeRequest(e, "POST", "/api/uploads/document", nil, "")
|
||||
testutil.AssertStatusCode(t, w, http.StatusBadRequest)
|
||||
})
|
||||
}
|
||||
|
||||
func TestUploadHandler_UploadCompletion_NoFile(t *testing.T) {
|
||||
storageSvc := newTestStorageService("/var/uploads")
|
||||
handler := NewUploadHandler(storageSvc, nil)
|
||||
e := testutil.SetupTestRouter()
|
||||
|
||||
e.POST("/api/uploads/completion", handler.UploadCompletion)
|
||||
|
||||
t.Run("no file returns 400", func(t *testing.T) {
|
||||
w := testutil.MakeRequest(e, "POST", "/api/uploads/completion", nil, "")
|
||||
testutil.AssertStatusCode(t, w, http.StatusBadRequest)
|
||||
})
|
||||
}
|
||||
//
|
||||
// Multipart upload handlers (UploadImage / UploadDocument / UploadCompletion)
|
||||
// were removed alongside the legacy /api/uploads/{image,document,completion}
|
||||
// routes. The presigned-URL flow (POST /api/uploads/presign) is exercised by
|
||||
// integration tests that hit the full pipeline.
|
||||
|
||||
func TestUploadHandler_DeleteFile_OwnershipDenied(t *testing.T) {
|
||||
storageSvc := newTestStorageService("/var/uploads")
|
||||
|
||||
Reference in New Issue
Block a user