package user import ( "RenewCMS/api/pkg/apperr" "RenewCMS/api/pkg/claims" "RenewCMS/internal/infrastructure/useCases" "context" "errors" "net/http" "strconv" ) type ExportHandler struct { ExportUseCase *useCases.ExportUserDataUseCase } func NewExportHandler(export *useCases.ExportUserDataUseCase) *ExportHandler { return &ExportHandler{ExportUseCase: export} } func (h *ExportHandler) Export(w http.ResponseWriter, r *http.Request) { userId, ok := claims.UserId(r) if !ok { http.Error(w, apperr.UnauthorizedErrorMessage, http.StatusUnauthorized) return } archive, err := h.ExportUseCase.Export(r.Context(), userId) if errors.Is(err, context.Canceled) || errors.Is(err, context.DeadlineExceeded) { http.Error(w, "Service unavailable", http.StatusServiceUnavailable) return } if err != nil { http.Error(w, "Internal server error", http.StatusInternalServerError) return } w.Header().Set("Content-Type", "application/zip") w.Header().Set("Cache-Control", "no-store") w.Header().Set("Content-Disposition", "attachment; filename=\""+archive.Filename+"\"") w.Header().Set("Content-Length", strconv.Itoa(len(archive.Content))) w.WriteHeader(http.StatusOK) _, _ = w.Write(archive.Content) }