Coverage for functions \ flipdare \ manager \ backend_manager.py: 86%
98 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
16from flipdare.backend.app_stats import AppStats
17from flipdare.backend.indexer_service import IndexerService
18from flipdare.app_config import get_app_config
19from flipdare.core.singleton import Singleton
20from flipdare.backend.runtime_config_admin import RuntimeConfigAdmin
21from google.cloud.storage.bucket import Bucket as StorageBucket
22from flipdare.backend.app_logger import AppLogger
23from flipdare.backend.exchange_rate_monitor import ExchangeRateMonitor
24from flipdare.backend.job_logger import JobLogger
25from flipdare.mailer.admin_mailer import AdminMailer
26from flipdare.mailer.user_mailer import UserMailer
27from flipdare.job.job_admin import JobAdmin
28from flipdare.backend.app_storage_client import AppStorageClient
30if TYPE_CHECKING:
31 from flipdare.backend.app_scheduler import AppScheduler
33__all__ = ["BackendManager"]
36class BackendManager(Singleton):
37 def __init__(
38 self,
39 job_admin: JobAdmin | None = None,
40 app_logger: AppLogger | None = None,
41 job_logger: JobLogger | None = None,
42 app_stats: AppStats | None = None,
43 app_scheduler: AppScheduler | None = None,
44 runtime_config: RuntimeConfigAdmin | None = None,
45 admin_mailer: AdminMailer | None = None,
46 user_mailer: UserMailer | None = None,
47 exchange_rate_monitor: ExchangeRateMonitor | None = None,
48 indexer: IndexerService | None = None,
49 storage_bucket: StorageBucket | None = None,
50 bucket_name: str | None = None,
51 ) -> None:
52 super().__init__()
54 self._job_admin = job_admin
55 self._app_logger = app_logger
56 self._job_logger = job_logger
57 self._admin_mailer = admin_mailer
58 self._user_mailer = user_mailer
59 self._exchange_rate_monitor = exchange_rate_monitor
60 self._app_scheduler = app_scheduler
61 self._app_stats = app_stats
62 self._runtime_config = runtime_config
63 self._storage_bucket = storage_bucket
64 self._indexer = indexer
66 if bucket_name is None:
67 bucket_name = storage_bucket.name if storage_bucket is not None else None
68 if bucket_name is None:
69 bucket_name = get_app_config().storage_bucket_name
71 self._storage_bucket_name = bucket_name
73 @property
74 def job_admin(self) -> JobAdmin:
75 if self._job_admin is None:
76 self._job_admin = JobAdmin.instance()
77 return self._job_admin
79 @property
80 def app_scheduler(self) -> AppScheduler:
81 from flipdare.backend.app_scheduler import AppScheduler
83 if self._app_scheduler is None:
84 self._app_scheduler = AppScheduler.instance()
86 return self._app_scheduler
88 @property
89 def app_logger(self) -> AppLogger:
90 if self._app_logger is None:
91 self._app_logger = AppLogger.instance()
92 return self._app_logger
94 @property
95 def job_logger(self) -> JobLogger:
96 if self._job_logger is None:
97 self._job_logger = JobLogger.instance()
98 return self._job_logger
100 @property
101 def app_stats(self) -> AppStats:
102 if self._app_stats is None:
103 self._app_stats = AppStats.instance()
104 return self._app_stats
106 @property
107 def admin_mailer(self) -> AdminMailer:
108 if self._admin_mailer is None:
109 self._admin_mailer = AdminMailer.instance()
110 return self._admin_mailer
112 @property
113 def user_mailer(self) -> UserMailer:
114 if self._user_mailer is None:
115 self._user_mailer = UserMailer.instance()
116 return self._user_mailer
118 @property
119 def exchange_rate_monitor(self) -> ExchangeRateMonitor:
120 if self._exchange_rate_monitor is None:
121 self._exchange_rate_monitor = ExchangeRateMonitor.instance()
122 return self._exchange_rate_monitor
124 @property
125 def runtime_config(self) -> RuntimeConfigAdmin:
126 if self._runtime_config is None:
127 self._runtime_config = RuntimeConfigAdmin.instance()
128 return self._runtime_config
130 @property
131 def indexer(self) -> IndexerService:
132 from flipdare.backend.indexer_service import IndexerService
134 if self._indexer is None:
135 self._indexer = IndexerService.instance()
136 return self._indexer
138 @property
139 def storage_client(self) -> AppStorageClient:
140 return AppStorageClient(self.storage_bucket)
142 @property
143 def storage_bucket(self) -> StorageBucket:
144 if self._storage_bucket is None:
145 self._storage_bucket = StorageBucket(self._storage_bucket_name)
146 return self._storage_bucket
148 @storage_bucket.setter
149 def storage_bucket(self, bucket: StorageBucket) -> None:
150 self._storage_bucket = bucket