Implement multi-file upload functionality for companies and enhance file upload routes
This commit is contained in:
@@ -1,6 +1,8 @@
|
||||
package company
|
||||
|
||||
import (
|
||||
"mime/multipart"
|
||||
|
||||
"tm/internal/user"
|
||||
"tm/pkg/logger"
|
||||
"tm/pkg/response"
|
||||
@@ -307,3 +309,70 @@ func (h *Handler) UpdateVerification(c echo.Context) error {
|
||||
"message": "Company verification updated successfully",
|
||||
}, "Company verification updated successfully")
|
||||
}
|
||||
|
||||
// UploadDocuments uploads multiple documents for a company (Web Panel)
|
||||
// @Summary Upload company documents
|
||||
// @Description Upload one or more files and attach them to the company (max 20 files per request). Use form field "files" for multiple files.
|
||||
// @Tags Admin-Companies
|
||||
// @Accept multipart/form-data
|
||||
// @Produce json
|
||||
// @Param id path string true "Company ID"
|
||||
// @Param files formData file true "Files to upload (repeat field for multiple files)"
|
||||
// @Success 200 {object} response.APIResponse{data=UploadDocumentsResponse} "Documents uploaded successfully"
|
||||
// @Failure 400 {object} response.APIResponse "Bad request - No files or all uploads failed"
|
||||
// @Failure 404 {object} response.APIResponse "Not found - Company not found"
|
||||
// @Failure 422 {object} response.APIResponse "Validation error - Too many files"
|
||||
// @Failure 500 {object} response.APIResponse "Internal server error"
|
||||
// @Security BearerAuth
|
||||
// @Router /admin/v1/companies/{id}/documents [post]
|
||||
func (h *Handler) UploadDocuments(c echo.Context) error {
|
||||
id := c.Param("id")
|
||||
userID, err := user.GetUserIDFromContext(c)
|
||||
if err != nil {
|
||||
return response.Unauthorized(c, "User not authenticated")
|
||||
}
|
||||
|
||||
form, err := c.MultipartForm()
|
||||
if err != nil {
|
||||
return response.ValidationError(c, "Invalid multipart form", err.Error())
|
||||
}
|
||||
|
||||
files := collectCompanyUploadFiles(form)
|
||||
if len(files) == 0 {
|
||||
return response.BadRequest(c, "No files provided", "Use form field \"files\" with one or more files")
|
||||
}
|
||||
if len(files) > maxCompanyDocumentsUpload {
|
||||
return response.ValidationError(c, "Too many files", "Maximum 20 files per request")
|
||||
}
|
||||
|
||||
result, err := h.service.UploadDocuments(c.Request().Context(), id, userID, files)
|
||||
if err != nil {
|
||||
switch err.Error() {
|
||||
case "company not found":
|
||||
return response.NotFound(c, "Company not found")
|
||||
case "no files provided", "too many files in request":
|
||||
return response.BadRequest(c, err.Error(), "")
|
||||
case "all file uploads failed":
|
||||
return response.BadRequest(c, "All file uploads failed", "")
|
||||
default:
|
||||
return response.InternalServerError(c, "Failed to upload company documents")
|
||||
}
|
||||
}
|
||||
|
||||
message := "Company documents uploaded successfully"
|
||||
if len(result.Failed) > 0 {
|
||||
message = "Some company documents uploaded successfully"
|
||||
}
|
||||
|
||||
return response.Success(c, result, message)
|
||||
}
|
||||
|
||||
func collectCompanyUploadFiles(form *multipart.Form) []*multipart.FileHeader {
|
||||
if form == nil {
|
||||
return nil
|
||||
}
|
||||
if files := form.File["files"]; len(files) > 0 {
|
||||
return files
|
||||
}
|
||||
return form.File["file"]
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user