from typing import Any, Dict, Optional from flask import jsonify class ApiError(Exception): def __init__( self, code: str, message: str, status_code: int, details: Optional[Dict[str, Any]] = None, ) -> None: super().__init__(message) self.code = code self.message = message self.status_code = status_code self.details = details or {} def to_response(self): return jsonify( { "error": { "code": self.code, "message": self.message, "details": self.details, } } ), self.status_code def register_error_handlers(app) -> None: @app.errorhandler(ApiError) def handle_api_error(error: ApiError): return error.to_response() @app.errorhandler(Exception) def handle_unexpected_error(error: Exception): app.logger.exception("Unhandled API error: %s", error) return ApiError( "INTERNAL_ERROR", "Terjadi kesalahan internal pada server.", 500, ).to_response()