Coverage for api/endpoints/organization/__init__.py: 73%

57 statements  

« prev     ^ index     » next       coverage.py v7.6.2, created at 2024-10-10 03:02 +0300

1from typing import Annotated 

2 

3from errors import endpoint_error_handler 

4from exceptions import BadParameterHTTPError, INNNotFound 

5from fastapi import APIRouter, Body, Depends 

6from handlers.authorization.check_role import assert_single_role_access 

7from handlers.grabbers.organizations import orgs_grabber 

8from handlers.grabbers.resources import ( 

9 drivers_data_grabber, 

10 trailers_data_grabber, 

11 trucks_data_grabber, 

12) 

13from handlers.organizations import ( 

14 on_create_organization, 

15 on_get_org_completion, 

16 on_get_organization_resources, 

17 on_inn_update, 

18 on_update_organization_by_id, 

19) 

20from handlers.resources import on_get_resources_for_org 

21from keycloak import idp 

22from mongodb import drivers_col, trailers_col, trucks_col 

23from sotrans_models.models._mongo import PydanticObjectIdPath 

24from sotrans_models.models.organizations import ( 

25 OrganizationCreateModel, 

26 OrganizationDBModel, 

27 OrganizationUpdateModel, 

28 UpdateINNPayload, 

29) 

30from sotrans_models.models.resources.drivers import DriverDBModel 

31from sotrans_models.models.resources.trailers import TrailerDBModel 

32from sotrans_models.models.resources.trucks import TruckDBModel 

33from sotrans_models.models.responses import ( 

34 ErrorRepr, 

35 GenericGetListResponse, 

36 ProfileCompletionResponse, 

37) 

38from sotrans_models.models.roles import SotransRole 

39from sotrans_models.models.users import SotransOIDCUserModel 

40from starlette import status 

41from utils.data_grabber import BaseGetListQueryParams, BaseGetOneQueryParams 

42 

43organizations_router = APIRouter( 

44 prefix="/organizations", tags=["organizations"] 

45) 

46 

47 

48@endpoint_error_handler 

49@organizations_router.post( 

50 "", 

51 response_model=OrganizationDBModel, 

52 status_code=status.HTTP_201_CREATED, 

53) 

54async def create_organization( 

55 user: Annotated[SotransOIDCUserModel, Depends(idp.get_current_user())], 

56 item: OrganizationCreateModel = Body( 

57 examples=[ 

58 { 

59 "inn": "843643634653", 

60 } 

61 ] 

62 ), 

63): 

64 try: 

65 return await on_create_organization(item, user) 

66 except INNNotFound: 

67 raise BadParameterHTTPError("ИНН") 

68 

69 

70@organizations_router.get( 

71 "", 

72 response_model=GenericGetListResponse[OrganizationDBModel], 

73 response_model_exclude_unset=True, 

74) 

75@endpoint_error_handler 

76async def get_organizations( 

77 _: Annotated[ 

78 SotransOIDCUserModel, 

79 Depends( 

80 idp.get_current_user( 

81 required_role_names=[SotransRole.company_logistician] 

82 ) 

83 ), 

84 ], 

85 params: BaseGetListQueryParams = Depends(), 

86): 

87 return await orgs_grabber.get_list(params) 

88 

89 

90@organizations_router.get( 

91 "/{org_id}", 

92 response_model=OrganizationDBModel, 

93 response_model_exclude_unset=True, 

94 responses={404: {"model": ErrorRepr}}, 

95) 

96@endpoint_error_handler 

97async def get_organization( 

98 org_id: PydanticObjectIdPath, 

99 user: Annotated[SotransOIDCUserModel, Depends(idp.get_current_user())], 

100 params: BaseGetOneQueryParams = Depends(), 

101): 

102 if user.organization_id != str(org_id): 

103 assert_single_role_access(user, SotransRole.company_logistician) 

104 return await orgs_grabber.get_one(org_id, params) 

105 

106 

107@organizations_router.patch("/{org_id}", response_model=OrganizationDBModel) 

108async def update_organization( 

109 org_id: PydanticObjectIdPath, 

110 item: OrganizationUpdateModel, 

111 user: Annotated[SotransOIDCUserModel, Depends(idp.get_current_user())], 

112): 

113 return await on_update_organization_by_id(org_id, item, user) 

114 

115 

116@organizations_router.patch( 

117 "/{org_id}/inn", response_model=OrganizationDBModel 

118) 

119async def update_inn( 

120 org_id: PydanticObjectIdPath, 

121 inn_payload: UpdateINNPayload, 

122 user: Annotated[ 

123 SotransOIDCUserModel, 

124 Depends( 

125 idp.get_current_user( 

126 required_role_names=[SotransRole.carrier_director] 

127 ) 

128 ), 

129 ], 

130): 

131 return await on_inn_update(org_id, inn_payload, user) 

132 

133 

134##################################### 

135# Resources 

136##################################### 

137 

138 

139@organizations_router.get("/{org_id}/drivers") 

140async def get_organizations_drivers( 

141 user: Annotated[ 

142 SotransOIDCUserModel, 

143 Depends( 

144 idp.get_current_user( 

145 required_role_names=[SotransRole.carrier_logistician] 

146 ) 

147 ), 

148 ], 

149 org_id: PydanticObjectIdPath, 

150 params: BaseGetListQueryParams = Depends(), 

151) -> GenericGetListResponse[DriverDBModel]: 

152 return await on_get_organization_resources( 

153 drivers_data_grabber, user, org_id, params 

154 ) 

155 

156 

157@organizations_router.get("/{org_id}/trucks") 

158async def get_organizations_trucks( 

159 user: Annotated[ 

160 SotransOIDCUserModel, 

161 Depends( 

162 idp.get_current_user( 

163 required_role_names=[SotransRole.carrier_logistician] 

164 ) 

165 ), 

166 ], 

167 org_id: PydanticObjectIdPath, 

168 params: BaseGetListQueryParams = Depends(), 

169) -> GenericGetListResponse[TruckDBModel]: 

170 return await on_get_organization_resources( 

171 trucks_data_grabber, user, org_id, params 

172 ) 

173 

174 

175@organizations_router.get("/{org_id}/trailers") 

176async def get_organizations_trailers( 

177 org_id: PydanticObjectIdPath, 

178 user: Annotated[ 

179 SotransOIDCUserModel, 

180 Depends( 

181 idp.get_current_user( 

182 required_role_names=[SotransRole.carrier_logistician] 

183 ) 

184 ), 

185 ], 

186 params: BaseGetListQueryParams = Depends(), 

187) -> GenericGetListResponse[TrailerDBModel]: 

188 return await on_get_organization_resources( 

189 trailers_data_grabber, user, org_id, params 

190 ) 

191 

192 

193@organizations_router.get("/{org_id}/completion") 

194async def get_org_completion( 

195 org_id: PydanticObjectIdPath, 

196 _: Annotated[ 

197 SotransOIDCUserModel, 

198 Depends( 

199 idp.get_current_user( 

200 required_role_names=[SotransRole.carrier_logistician] 

201 ) 

202 ), 

203 ], 

204) -> ProfileCompletionResponse: 

205 return await on_get_org_completion(org_id)