Files
wehub-resource-sync 6ede33ccdb
Build and Push Docker Images / create_manifest (web, surfsense-web, , cpu) (push) Has been cancelled
Build and Push Docker Images / finalize_release (push) Has been cancelled
Obsidian Plugin Lint / lint (push) Has been cancelled
Build and Push Docker Images / build (./surfsense_web, cpu, ./surfsense_web/Dockerfile, web, surfsense-web, ubuntu-24.04-arm, linux/arm64, arm64, , runner, false, cpu) (push) Has been cancelled
Build and Push Docker Images / build (./surfsense_web, cpu, ./surfsense_web/Dockerfile, web, surfsense-web, ubuntu-latest, linux/amd64, amd64, , runner, false, cpu) (push) Has been cancelled
Build and Push Docker Images / compute_version (push) Has been cancelled
Build and Push Docker Images / build (./surfsense_backend, cpu, ./surfsense_backend/Dockerfile, backend, surfsense-backend, ubuntu-24.04-arm, linux/arm64, arm64, , production, false, cpu) (push) Has been cancelled
Build and Push Docker Images / build (./surfsense_backend, cpu, ./surfsense_backend/Dockerfile, backend, surfsense-backend, ubuntu-latest, linux/amd64, amd64, , production, false, cpu) (push) Has been cancelled
Build and Push Docker Images / build (./surfsense_backend, cu126, ./surfsense_backend/Dockerfile, backend, surfsense-backend, ubuntu-24.04-arm, linux/arm64, arm64, -cuda126, production, true, cuda126) (push) Has been cancelled
Build and Push Docker Images / build (./surfsense_backend, cu126, ./surfsense_backend/Dockerfile, backend, surfsense-backend, ubuntu-latest, linux/amd64, amd64, -cuda126, production, true, cuda126) (push) Has been cancelled
Build and Push Docker Images / build (./surfsense_backend, cu128, ./surfsense_backend/Dockerfile, backend, surfsense-backend, ubuntu-24.04-arm, linux/arm64, arm64, -cuda, production, true, cuda) (push) Has been cancelled
Build and Push Docker Images / build (./surfsense_backend, cu128, ./surfsense_backend/Dockerfile, backend, surfsense-backend, ubuntu-latest, linux/amd64, amd64, -cuda, production, true, cuda) (push) Has been cancelled
Build and Push Docker Images / verify_digests (push) Has been cancelled
Build and Push Docker Images / create_manifest (backend, surfsense-backend, , cpu) (push) Has been cancelled
Build and Push Docker Images / create_manifest (backend, surfsense-backend, -cuda, cuda) (push) Has been cancelled
Build and Push Docker Images / create_manifest (backend, surfsense-backend, -cuda126, cuda126) (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:33:44 +08:00

105 lines
2.9 KiB
Python

"""Structured error hierarchy for SurfSense.
Every error response follows a backward-compatible contract:
{
"error": {
"code": "SOME_ERROR_CODE",
"message": "Human-readable, client-safe message.",
"status": 422,
"request_id": "req_...",
"timestamp": "2026-04-14T12:00:00Z",
"report_url": "https://github.com/MODSetter/SurfSense/issues"
},
"detail": "Human-readable, client-safe message." # legacy compat
}
"""
from __future__ import annotations
ISSUES_URL = "https://github.com/MODSetter/SurfSense/issues"
GENERIC_5XX_MESSAGE = (
"An internal error occurred. Please try again or report this issue if it persists."
)
class SurfSenseError(Exception):
"""Base exception that global handlers translate into the structured envelope."""
def __init__(
self,
message: str = GENERIC_5XX_MESSAGE,
*,
code: str = "INTERNAL_ERROR",
status_code: int = 500,
safe_for_client: bool = True,
) -> None:
super().__init__(message)
self.message = message
self.code = code
self.status_code = status_code
self.safe_for_client = safe_for_client
class ConnectorError(SurfSenseError):
def __init__(self, message: str, *, code: str = "CONNECTOR_ERROR") -> None:
super().__init__(message, code=code, status_code=502)
class DatabaseError(SurfSenseError):
def __init__(
self,
message: str = "A database error occurred.",
*,
code: str = "DATABASE_ERROR",
) -> None:
super().__init__(message, code=code, status_code=500)
class ConfigurationError(SurfSenseError):
def __init__(
self,
message: str = "A configuration error occurred.",
*,
code: str = "CONFIGURATION_ERROR",
) -> None:
super().__init__(message, code=code, status_code=500)
class ExternalServiceError(SurfSenseError):
def __init__(
self,
message: str = "An external service is unavailable.",
*,
code: str = "EXTERNAL_SERVICE_ERROR",
) -> None:
super().__init__(message, code=code, status_code=502)
class NotFoundError(SurfSenseError):
def __init__(
self,
message: str = "The requested resource was not found.",
*,
code: str = "NOT_FOUND",
) -> None:
super().__init__(message, code=code, status_code=404)
class ForbiddenError(SurfSenseError):
def __init__(
self,
message: str = "You don't have permission to access this resource.",
*,
code: str = "FORBIDDEN",
) -> None:
super().__init__(message, code=code, status_code=403)
class ValidationError(SurfSenseError):
def __init__(
self, message: str = "Validation failed.", *, code: str = "VALIDATION_ERROR"
) -> None:
super().__init__(message, code=code, status_code=422)