Coverage for model/utils/response.py: 100%
25 statements
« prev ^ index » next coverage.py v7.9.2, created at 2026-07-24 16:42 +0000
« prev ^ index » next coverage.py v7.9.2, created at 2026-07-24 16:42 +0000
1from typing import Any
2from fastapi import HTTPException
3from fastapi.responses import JSONResponse, RedirectResponse
5__all__ = ['NOJException', 'HTTPResponse', 'HTTPRedirect', 'HTTPError']
8class NOJException(HTTPException):
9 """Carries the {status, message, data} envelope used by all NOJ error responses."""
11 def __init__(self, message: str, status_code: int, data: Any = None):
12 super().__init__(status_code=status_code)
13 self.message = message
14 self.data = data
17def _apply_cookies(resp, cookies: dict):
18 for k, v in cookies.items():
19 if v is None:
20 resp.delete_cookie(k.replace('_httponly', ''))
21 else:
22 httponly = k.endswith('_httponly')
23 resp.set_cookie(k.replace('_httponly', ''), v, httponly=httponly)
24 return resp
27def HTTPResponse(
28 message: str = '',
29 status_code: int = 200,
30 status: str = 'ok',
31 data: Any = None,
32 cookies: dict | None = None,
33) -> JSONResponse:
34 resp = JSONResponse(
35 {
36 'status': status,
37 'message': message,
38 'data': data,
39 },
40 status_code=status_code,
41 )
42 return _apply_cookies(resp, cookies or {})
45def HTTPRedirect(
46 location: str,
47 status_code: int = 302,
48 cookies: dict | None = None,
49) -> RedirectResponse:
50 resp = RedirectResponse(location, status_code=status_code)
51 return _apply_cookies(resp, cookies or {})
54def HTTPError(
55 message: str,
56 status_code: int,
57 data: Any = None,
58 logout: bool = False,
59) -> JSONResponse:
60 cookies = {'piann': None, 'jwt': None} if logout else {}
61 return HTTPResponse(message, status_code, 'err', data, cookies)