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
« 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#
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
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
74__all__ = ["ServiceProvider"]
77class ServiceProvider(Singleton):
79 __slots__ = (
80 "_backend_manager",
81 "_db_manager",
82 "_safety_manager",
83 "_search_manager",
84 "_service_manager",
85 )
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
100 # -------------------------------------------------------------------------
101 # Managers
102 # -------------------------------------------------------------------------
104 @property
105 def service_manager(self) -> ServiceManager:
106 from flipdare.services import get_service_manager
108 if self._service_manager is None:
109 self._service_manager = get_service_manager()
111 return self._service_manager
113 @property
114 def db_manager(self) -> DbManager:
115 from flipdare.services import get_db_manager
117 if self._db_manager is None:
118 self._db_manager = get_db_manager()
120 return self._db_manager
122 @property
123 def search_manager(self) -> SearchManager:
124 from flipdare.services import get_search_manager
126 if self._search_manager is None:
127 self._search_manager = get_search_manager()
129 return self._search_manager
131 @property
132 def backend_manager(self) -> BackendManager:
133 from flipdare.services import get_backend_manager
135 if self._backend_manager is None:
136 self._backend_manager = get_backend_manager()
138 return self._backend_manager
140 # -------------------------------------------------------------------------
141 # Backend
142 # -------------------------------------------------------------------------
144 @property
145 def indexer(self) -> IndexerService:
146 return self.backend_manager.indexer
148 @property
149 def app_logger(self) -> AppLogger:
150 return self.backend_manager.app_logger
152 @property
153 def job_logger(self) -> JobLogger:
154 return self.backend_manager.job_logger
156 @property
157 def user_mailer(self) -> UserMailer:
158 return self.backend_manager.user_mailer
160 @property
161 def admin_mailer(self) -> AdminMailer:
162 return self.backend_manager.admin_mailer
164 @property
165 def dare_service(self) -> DareService:
166 return self.service_manager.dare
168 @property
169 def exchange_rate_monitor(self) -> ExchangeRateMonitor:
170 return self.backend_manager.exchange_rate_monitor
172 @property
173 def storage_client(self) -> AppStorageClient:
174 return self.backend_manager.storage_client
176 # -------------------------------------------------------------------------
177 # Storage
178 # -------------------------------------------------------------------------
180 @property
181 def storage_bucket(self) -> StorageBucket:
182 return self.backend_manager.storage_bucket
184 @property
185 def storage_util(self) -> AppStorageClient:
186 return self.backend_manager.storage_client
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
197 # -------------------------------------------------------------------------
198 # Services
199 # -------------------------------------------------------------------------
201 @property
202 def user_service(self) -> UserService:
203 return self.service_manager.user
205 @property
206 def group_service(self) -> GroupService:
207 return self.service_manager.group
209 @property
210 def flag_service(self) -> FlagService:
211 return self.service_manager.flag
213 @property
214 def friend_service(self) -> FriendService:
215 return self.service_manager.friend
217 @property
218 def content_service(self) -> ContentService:
219 return self.service_manager.content
221 @property
222 def notification_service(self) -> NotificationService:
223 return self.service_manager.notification
225 @property
226 def restriction_service(self) -> RestrictionService:
227 return self.service_manager.restriction
229 @property
230 def reputation_service(self) -> ReputationService:
231 return self.service_manager.reputation
233 @property
234 def moderation_service(self) -> ModerationService:
235 return self.service_manager.moderation
237 @property
238 def payment_service(self) -> AppPaymentService:
239 return self.service_manager.payment
241 @property
242 def risk_service(self) -> RiskService:
243 return self.service_manager.risk
245 # -------------------------------------------------------------------------
246 # Databases
247 # -------------------------------------------------------------------------
249 @property
250 def user_db(self) -> UserDb:
251 return self.db_manager.user_db
253 @property
254 def friend_db(self) -> FriendDb:
255 return self.db_manager.friend_db
257 @property
258 def group_db(self) -> GroupDb:
259 return self.db_manager.group_db
261 @property
262 def dare_db(self) -> DareDb:
263 return self.db_manager.dare_db
265 @property
266 def pledge_db(self) -> PledgeDb:
267 return self.db_manager.pledge_db
269 @property
270 def flag_db(self) -> FlagDb:
271 return self.db_manager.flag_db
273 @property
274 def issue_db(self) -> IssueDb:
275 return self.db_manager.issue_db
277 @property
278 def payment_issue_db(self) -> PaymentIssueDb:
279 return self.db_manager.payment_issue_db
281 @property
282 def restriction_db(self) -> RestrictionDb:
283 return self.db_manager.restriction_db
285 @property
286 def content_db(self) -> ContentDb:
287 return self.db_manager.content_db
289 @property
290 def invite_db(self) -> InviteDb:
291 return self.db_manager.invite_db
293 @property
294 def summary_db(self) -> UserSummaryDb:
295 return self.db_manager.summary_db
297 @property
298 def stat_db(self) -> AppStatDb:
299 return self.db_manager.stat_db
301 @property
302 def compliance_db(self) -> ComplianceDb:
303 return self.db_manager.compliance_db
305 @property
306 def chat_db(self) -> ChatDb:
307 return self.db_manager.chat_db
309 @property
310 def log_db(self) -> AppLogDb:
311 return self.db_manager.log_db
313 # -------------------------------------------------------------------------
314 # Bridges
315 # -------------------------------------------------------------------------
317 @property
318 def user_bridge(self) -> UserBridge:
319 return self.db_manager.user_bridge
321 @property
322 def friend_bridge(self) -> FriendBridge:
323 return self.db_manager.friend_bridge
325 @property
326 def group_bridge(self) -> GroupBridge:
327 return self.db_manager.group_bridge
329 @property
330 def invite_bridge(self) -> InviteBridge:
331 return self.db_manager.invite_bridge
333 @property
334 def dare_bridge(self) -> DareBridge:
335 return self.db_manager.dare_bridge
337 @property
338 def pledge_bridge(self) -> PledgeBridge:
339 return self.db_manager.pledge_bridge
341 @property
342 def flag_bridge(self) -> FlagBridge:
343 return self.db_manager.flag_bridge
345 @property
346 def content_bridge(self) -> ContentBridge:
347 return self.db_manager.content_bridge
349 @property
350 def chat_bridge(self) -> ChatBridge:
351 return self.db_manager.chat_bridge
353 @property
354 def compliance_bridge(self) -> ComplianceBridge:
355 return self.db_manager.compliance_bridge
357 @property
358 def restriction_bridge(self) -> RestrictionBridge:
359 return self.db_manager.restriction_bridge