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

1from typing import Any 

2from fastapi import HTTPException 

3from fastapi.responses import JSONResponse, RedirectResponse 

4 

5__all__ = ['NOJException', 'HTTPResponse', 'HTTPRedirect', 'HTTPError'] 

6 

7 

8class NOJException(HTTPException): 

9 """Carries the {status, message, data} envelope used by all NOJ error responses.""" 

10 

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 

15 

16 

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 

25 

26 

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 {}) 

43 

44 

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 {}) 

52 

53 

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)