Coverage for functions \ flipdare \ service \ _service_provider.py: 86%

192 statements  

« prev     ^ index     » next       coverage.py v7.13.0, created at 2026-05-08 12:22 +1000

1#!/usr/bin/env python 

2# Copyright (c) 2026 Flipdare Pty Ltd. All rights reserved. 

3# 

4# This file is part of Flipdare's proprietary software and contains 

5# confidential and copyrighted material. Unauthorised copying, 

6# modification, distribution, or use of this file is strictly 

7# prohibited without prior written permission from Flipdare Pty Ltd. 

8# 

9# This software includes third-party components licensed under MIT, 

10# BSD, and Apache 2.0 licences. See THIRD_PARTY_NOTICES for details. 

11# 

12 

13from __future__ import annotations 

14from typing import TYPE_CHECKING 

15from flipdare.app_log import LOG 

16from flipdare.app_types import ( 

17 ChatBridge, 

18 ComplianceBridge, 

19 ContentBridge, 

20 DareBridge, 

21 FlagBridge, 

22 FriendBridge, 

23 GroupBridge, 

24 InviteBridge, 

25 PledgeBridge, 

26 RestrictionBridge, 

27 UserBridge, 

28) 

29from flipdare.core import Singleton 

30from flipdare.error import ServerError 

31from flipdare.backend.app_storage_client import AppStorageClient 

32 

33if TYPE_CHECKING: 

34 from flipdare.service.payments.risk_service import RiskService 

35 from flipdare.service.payments.app_payment_service import AppPaymentService 

36 from flipdare.firestore.payment_issue_db import PaymentIssueDb 

37 from flipdare.service.dare_service import DareService 

38 from flipdare.service.safety.moderation_service import ModerationService 

39 from flipdare.service.group_service import GroupService 

40 from flipdare.service.flag_service import FlagService 

41 from flipdare.service.user_service import UserService 

42 from flipdare.service.safety.reputation_service import ReputationService 

43 from flipdare.manager.backend_manager import BackendManager 

44 from google.cloud.storage.bucket import Bucket as StorageBucket 

45 from flipdare.service.content_service import ContentService 

46 from flipdare.service.friend_service import FriendService 

47 from flipdare.backend.indexer_service import IndexerService 

48 from flipdare.manager.service_manager import ServiceManager 

49 from flipdare.manager.db_manager import DbManager 

50 from flipdare.manager.search_manager import SearchManager 

51 from flipdare.service.notification_service import NotificationService 

52 from flipdare.backend.app_logger import AppLogger 

53 from flipdare.backend.exchange_rate_monitor import ExchangeRateMonitor 

54 from flipdare.backend.job_logger import JobLogger 

55 from flipdare.mailer.admin_mailer import AdminMailer 

56 from flipdare.mailer.user_mailer import UserMailer 

57 from flipdare.firestore.backend.app_log_db import AppLogDb 

58 from flipdare.firestore.backend.app_stat_db import AppStatDb 

59 from flipdare.firestore.backend.compliance_db import ComplianceDb 

60 from flipdare.firestore.chat_db import ChatDb 

61 from flipdare.firestore.content_db import ContentDb 

62 from flipdare.firestore.dare_db import DareDb 

63 from flipdare.firestore.flag_db import FlagDb 

64 from flipdare.firestore.friend_db import FriendDb 

65 from flipdare.firestore.group_db import GroupDb 

66 from flipdare.firestore.invite_db import InviteDb 

67 from flipdare.firestore.issue_db import IssueDb 

68 from flipdare.firestore.pledge_db import PledgeDb 

69 from flipdare.firestore.restriction_db import RestrictionDb 

70 from flipdare.firestore.user_db import UserDb 

71 from flipdare.firestore.user_summary_db import UserSummaryDb 

72 from flipdare.service.safety.restriction_service import RestrictionService 

73 

74__all__ = ["ServiceProvider"] 

75 

76 

77class ServiceProvider(Singleton): 

78 

79 __slots__ = ( 

80 "_backend_manager", 

81 "_db_manager", 

82 "_safety_manager", 

83 "_search_manager", 

84 "_service_manager", 

85 ) 

86 

87 def __init__( 

88 self, 

89 db_manager: DbManager | None = None, 

90 service_manager: ServiceManager | None = None, 

91 search_manager: SearchManager | None = None, 

92 backend_manager: BackendManager | None = None, 

93 ) -> None: 

94 Singleton.__init__(self) 

95 self._db_manager = db_manager 

96 self._service_manager = service_manager 

97 self._search_manager = search_manager 

98 self._backend_manager = backend_manager 

99 

100 # ------------------------------------------------------------------------- 

101 # Managers 

102 # ------------------------------------------------------------------------- 

103 

104 @property 

105 def service_manager(self) -> ServiceManager: 

106 from flipdare.services import get_service_manager 

107 

108 if self._service_manager is None: 

109 self._service_manager = get_service_manager() 

110 

111 return self._service_manager 

112 

113 @property 

114 def db_manager(self) -> DbManager: 

115 from flipdare.services import get_db_manager 

116 

117 if self._db_manager is None: 

118 self._db_manager = get_db_manager() 

119 

120 return self._db_manager 

121 

122 @property 

123 def search_manager(self) -> SearchManager: 

124 from flipdare.services import get_search_manager 

125 

126 if self._search_manager is None: 

127 self._search_manager = get_search_manager() 

128 

129 return self._search_manager 

130 

131 @property 

132 def backend_manager(self) -> BackendManager: 

133 from flipdare.services import get_backend_manager 

134 

135 if self._backend_manager is None: 

136 self._backend_manager = get_backend_manager() 

137 

138 return self._backend_manager 

139 

140 # ------------------------------------------------------------------------- 

141 # Backend 

142 # ------------------------------------------------------------------------- 

143 

144 @property 

145 def indexer(self) -> IndexerService: 

146 return self.backend_manager.indexer 

147 

148 @property 

149 def app_logger(self) -> AppLogger: 

150 return self.backend_manager.app_logger 

151 

152 @property 

153 def job_logger(self) -> JobLogger: 

154 return self.backend_manager.job_logger 

155 

156 @property 

157 def user_mailer(self) -> UserMailer: 

158 return self.backend_manager.user_mailer 

159 

160 @property 

161 def admin_mailer(self) -> AdminMailer: 

162 return self.backend_manager.admin_mailer 

163 

164 @property 

165 def dare_service(self) -> DareService: 

166 return self.service_manager.dare 

167 

168 @property 

169 def exchange_rate_monitor(self) -> ExchangeRateMonitor: 

170 return self.backend_manager.exchange_rate_monitor 

171 

172 @property 

173 def storage_client(self) -> AppStorageClient: 

174 return self.backend_manager.storage_client 

175 

176 # ------------------------------------------------------------------------- 

177 # Storage 

178 # ------------------------------------------------------------------------- 

179 

180 @property 

181 def storage_bucket(self) -> StorageBucket: 

182 return self.backend_manager.storage_bucket 

183 

184 @property 

185 def storage_util(self) -> AppStorageClient: 

186 return self.backend_manager.storage_client 

187 

188 @property 

189 def storage_bucket_name(self) -> str: 

190 try: 

191 return str(self.storage_bucket.name) 

192 except Exception as e: 

193 msg = f"Error getting bucket name: {e}" 

194 LOG().error(msg) 

195 raise ServerError(message=msg, error=e) from e 

196 

197 # ------------------------------------------------------------------------- 

198 # Services 

199 # ------------------------------------------------------------------------- 

200 

201 @property 

202 def user_service(self) -> UserService: 

203 return self.service_manager.user 

204 

205 @property 

206 def group_service(self) -> GroupService: 

207 return self.service_manager.group 

208 

209 @property 

210 def flag_service(self) -> FlagService: 

211 return self.service_manager.flag 

212 

213 @property 

214 def friend_service(self) -> FriendService: 

215 return self.service_manager.friend 

216 

217 @property 

218 def content_service(self) -> ContentService: 

219 return self.service_manager.content 

220 

221 @property 

222 def notification_service(self) -> NotificationService: 

223 return self.service_manager.notification 

224 

225 @property 

226 def restriction_service(self) -> RestrictionService: 

227 return self.service_manager.restriction 

228 

229 @property 

230 def reputation_service(self) -> ReputationService: 

231 return self.service_manager.reputation 

232 

233 @property 

234 def moderation_service(self) -> ModerationService: 

235 return self.service_manager.moderation 

236 

237 @property 

238 def payment_service(self) -> AppPaymentService: 

239 return self.service_manager.payment 

240 

241 @property 

242 def risk_service(self) -> RiskService: 

243 return self.service_manager.risk 

244 

245 # ------------------------------------------------------------------------- 

246 # Databases 

247 # ------------------------------------------------------------------------- 

248 

249 @property 

250 def user_db(self) -> UserDb: 

251 return self.db_manager.user_db 

252 

253 @property 

254 def friend_db(self) -> FriendDb: 

255 return self.db_manager.friend_db 

256 

257 @property 

258 def group_db(self) -> GroupDb: 

259 return self.db_manager.group_db 

260 

261 @property 

262 def dare_db(self) -> DareDb: 

263 return self.db_manager.dare_db 

264 

265 @property 

266 def pledge_db(self) -> PledgeDb: 

267 return self.db_manager.pledge_db 

268 

269 @property 

270 def flag_db(self) -> FlagDb: 

271 return self.db_manager.flag_db 

272 

273 @property 

274 def issue_db(self) -> IssueDb: 

275 return self.db_manager.issue_db 

276 

277 @property 

278 def payment_issue_db(self) -> PaymentIssueDb: 

279 return self.db_manager.payment_issue_db 

280 

281 @property 

282 def restriction_db(self) -> RestrictionDb: 

283 return self.db_manager.restriction_db 

284 

285 @property 

286 def content_db(self) -> ContentDb: 

287 return self.db_manager.content_db 

288 

289 @property 

290 def invite_db(self) -> InviteDb: 

291 return self.db_manager.invite_db 

292 

293 @property 

294 def summary_db(self) -> UserSummaryDb: 

295 return self.db_manager.summary_db 

296 

297 @property 

298 def stat_db(self) -> AppStatDb: 

299 return self.db_manager.stat_db 

300 

301 @property 

302 def compliance_db(self) -> ComplianceDb: 

303 return self.db_manager.compliance_db 

304 

305 @property 

306 def chat_db(self) -> ChatDb: 

307 return self.db_manager.chat_db 

308 

309 @property 

310 def log_db(self) -> AppLogDb: 

311 return self.db_manager.log_db 

312 

313 # ------------------------------------------------------------------------- 

314 # Bridges 

315 # ------------------------------------------------------------------------- 

316 

317 @property 

318 def user_bridge(self) -> UserBridge: 

319 return self.db_manager.user_bridge 

320 

321 @property 

322 def friend_bridge(self) -> FriendBridge: 

323 return self.db_manager.friend_bridge 

324 

325 @property 

326 def group_bridge(self) -> GroupBridge: 

327 return self.db_manager.group_bridge 

328 

329 @property 

330 def invite_bridge(self) -> InviteBridge: 

331 return self.db_manager.invite_bridge 

332 

333 @property 

334 def dare_bridge(self) -> DareBridge: 

335 return self.db_manager.dare_bridge 

336 

337 @property 

338 def pledge_bridge(self) -> PledgeBridge: 

339 return self.db_manager.pledge_bridge 

340 

341 @property 

342 def flag_bridge(self) -> FlagBridge: 

343 return self.db_manager.flag_bridge 

344 

345 @property 

346 def content_bridge(self) -> ContentBridge: 

347 return self.db_manager.content_bridge 

348 

349 @property 

350 def chat_bridge(self) -> ChatBridge: 

351 return self.db_manager.chat_bridge 

352 

353 @property 

354 def compliance_bridge(self) -> ComplianceBridge: 

355 return self.db_manager.compliance_bridge 

356 

357 @property 

358 def restriction_bridge(self) -> RestrictionBridge: 

359 return self.db_manager.restriction_bridge