diff --git a/backend/internal/api/handlers/import_handler.go b/backend/internal/api/handlers/import_handler.go index d82f75a0..e48fe90d 100644 --- a/backend/internal/api/handlers/import_handler.go +++ b/backend/internal/api/handlers/import_handler.go @@ -606,55 +606,6 @@ func (h *ImportHandler) Cancel(c *gin.Context) { c.JSON(http.StatusNotFound, gin.H{"error": "session not found"}) } -// processImport handles the import logic for both mounted and uploaded files. -func (h *ImportHandler) processImport(caddyfilePath, originalName string) error { - // Validate Caddy binary - if err := h.importerservice.ValidateCaddyBinary(); err != nil { - return fmt.Errorf("caddy binary not available: %w", err) - } - - // Parse and extract hosts - result, err := h.importerservice.ImportFile(caddyfilePath) - if err != nil { - return fmt.Errorf("import failed: %w", err) - } - - // Check for conflicts with existing hosts - existingHosts, _ := h.proxyHostSvc.List() - existingDomains := make(map[string]bool) - for _, host := range existingHosts { - existingDomains[host.DomainNames] = true - } - - for _, parsed := range result.Hosts { - if existingDomains[parsed.DomainNames] { - // Append the raw domain name so frontend can match conflicts against domain strings - result.Conflicts = append(result.Conflicts, parsed.DomainNames) - } - } - - // Create import session - session := models.ImportSession{ - UUID: uuid.NewString(), - SourceFile: originalName, - Status: "pending", - ParsedData: string(mustMarshal(result)), - ConflictReport: string(mustMarshal(result.Conflicts)), - } - - if err := h.db.Create(&session).Error; err != nil { - return fmt.Errorf("failed to create session: %w", err) - } - - // Backup original file - if _, err := caddy.BackupCaddyfile(caddyfilePath, filepath.Join(h.importDir, "backups")); err != nil { - // Non-fatal, log and continue - fmt.Printf("Warning: failed to backup Caddyfile: %v\n", err) - } - - return nil -} - // CheckMountedImport checks for mounted Caddyfile on startup. func CheckMountedImport(db *gorm.DB, mountPath, caddyBinary, importDir string) error { if _, err := os.Stat(mountPath); os.IsNotExist(err) { diff --git a/backend/internal/api/handlers/import_handler_test.go b/backend/internal/api/handlers/import_handler_test.go index 5afc84a3..a7dc6e7f 100644 --- a/backend/internal/api/handlers/import_handler_test.go +++ b/backend/internal/api/handlers/import_handler_test.go @@ -216,10 +216,10 @@ func TestImportHandler_Upload(t *testing.T) { router.ServeHTTP(w, req) // The fake caddy script returns empty JSON, so import might fail or succeed with empty result - // But processImport calls ImportFile which calls ParseCaddyfile which calls caddy adapt + // But Upload calls ImportFile which calls ParseCaddyfile which calls caddy adapt // fake_caddy.sh echoes `{"apps":{}}` // ExtractHosts will return empty result - // processImport should succeed + // Upload should succeed assert.Equal(t, http.StatusOK, w.Code) } @@ -373,7 +373,7 @@ func TestImportHandler_Upload_Failure(t *testing.T) { assert.Equal(t, http.StatusBadRequest, w.Code) var resp map[string]interface{} json.Unmarshal(w.Body.Bytes(), &resp) - // The error message comes from processImport -> ImportFile -> "import failed: ..." + // The error message comes from Upload -> ImportFile -> "import failed: ..." assert.Contains(t, resp["error"], "import failed") } diff --git a/backend/internal/services/uptime_service.go b/backend/internal/services/uptime_service.go index 3cd04024..eb85304e 100644 --- a/backend/internal/services/uptime_service.go +++ b/backend/internal/services/uptime_service.go @@ -49,7 +49,8 @@ func (s *UptimeService) SyncMonitors() error { publicURL := fmt.Sprintf("%s://%s", scheme, firstDomain) internalURL := fmt.Sprintf("%s:%d", host.ForwardHost, host.ForwardPort) - if err == gorm.ErrRecordNotFound { + switch err { + case gorm.ErrRecordNotFound: // Create new monitor name := host.Name if name == "" { @@ -68,7 +69,7 @@ func (s *UptimeService) SyncMonitors() error { if err := s.DB.Create(&monitor).Error; err != nil { log.Printf("Failed to create monitor for host %d: %v", host.ID, err) } - } else if err == nil { + case nil: // Always sync the name from proxy host newName := host.Name if newName == "" { @@ -215,9 +216,10 @@ func (s *UptimeService) checkMonitor(monitor models.UptimeMonitor) { title := fmt.Sprintf("Monitor %s is %s", monitor.Name, strings.ToUpper(newStatus)) nType := models.NotificationTypeInfo - if newStatus == "down" { + switch newStatus { + case "down": nType = models.NotificationTypeError - } else if newStatus == "up" { + case "up": nType = models.NotificationTypeSuccess } diff --git a/frontend/src/components/ForwardAuthSettings.tsx b/frontend/src/components/ForwardAuthSettings.tsx index 831ee0f7..bab7e6ea 100644 --- a/frontend/src/components/ForwardAuthSettings.tsx +++ b/frontend/src/components/ForwardAuthSettings.tsx @@ -35,7 +35,7 @@ export default function ForwardAuthSettings() { queryClient.invalidateQueries({ queryKey: ['forwardAuth'] }); toast.success('Forward Auth configuration saved'); }, - onError: (error: any) => { + onError: (error: Error & { response?: { data?: { error?: string } } }) => { toast.error(error.response?.data?.error || 'Failed to save configuration'); }, }); @@ -45,7 +45,7 @@ export default function ForwardAuthSettings() { const template = templates[provider]; setFormData({ ...formData, - provider: provider as any, + provider: provider as 'authelia' | 'authentik' | 'pomerium' | 'custom', address: template.address, trust_forward_header: template.trust_forward_header, }); diff --git a/frontend/src/components/ProxyHostForm.tsx b/frontend/src/components/ProxyHostForm.tsx index 53862828..5ad0e871 100644 --- a/frontend/src/components/ProxyHostForm.tsx +++ b/frontend/src/components/ProxyHostForm.tsx @@ -141,10 +141,11 @@ export default function ProxyHostForm({ host, onSubmit, onCancel }: ProxyHostFor try { await onSubmit(formData) - } catch (err: any) { + } catch (err: unknown) { console.error("Submit error:", err) // Extract error message from axios response if available - const message = err.response?.data?.error || err.message || 'Failed to save proxy host' + const errorObj = err as { response?: { data?: { error?: string } }; message?: string } + const message = errorObj.response?.data?.error || errorObj.message || 'Failed to save proxy host' setError(message) } finally { setLoading(false) diff --git a/frontend/src/pages/Security/Policies.tsx b/frontend/src/pages/Security/Policies.tsx index b8d7dd61..8ca9eb82 100644 --- a/frontend/src/pages/Security/Policies.tsx +++ b/frontend/src/pages/Security/Policies.tsx @@ -59,8 +59,9 @@ export default function Policies() { } setIsModalOpen(false); resetForm(); - } catch (error: any) { - toast.error(error.response?.data?.error || 'Failed to save policy'); + } catch (error: unknown) { + const err = error as { response?: { data?: { error?: string } } }; + toast.error(err.response?.data?.error || 'Failed to save policy'); } }; @@ -69,8 +70,9 @@ export default function Policies() { try { await deletePolicy(uuid); toast.success('Policy deleted successfully'); - } catch (error: any) { - toast.error(error.response?.data?.error || 'Failed to delete policy'); + } catch (error: unknown) { + const err = error as { response?: { data?: { error?: string } } }; + toast.error(err.response?.data?.error || 'Failed to delete policy'); } } }; diff --git a/frontend/src/pages/Security/Providers.tsx b/frontend/src/pages/Security/Providers.tsx index 5b3b7838..6ed02ccc 100644 --- a/frontend/src/pages/Security/Providers.tsx +++ b/frontend/src/pages/Security/Providers.tsx @@ -75,8 +75,9 @@ export default function Providers() { } setIsModalOpen(false); resetForm(); - } catch (error: any) { - toast.error(error.response?.data?.error || 'Failed to save provider'); + } catch (error: unknown) { + const err = error as { response?: { data?: { error?: string } } }; + toast.error(err.response?.data?.error || 'Failed to save provider'); } }; @@ -85,8 +86,9 @@ export default function Providers() { try { await deleteProvider(uuid); toast.success('Provider deleted successfully'); - } catch (error: any) { - toast.error(error.response?.data?.error || 'Failed to delete provider'); + } catch (error: unknown) { + const err = error as { response?: { data?: { error?: string } } }; + toast.error(err.response?.data?.error || 'Failed to delete provider'); } } }; @@ -214,7 +216,7 @@ export default function Providers() {