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

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 

15 

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 

29 

30if TYPE_CHECKING: 

31 from flipdare.backend.app_scheduler import AppScheduler 

32 

33__all__ = ["BackendManager"] 

34 

35 

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__() 

53 

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 

65 

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 

70 

71 self._storage_bucket_name = bucket_name 

72 

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 

78 

79 @property 

80 def app_scheduler(self) -> AppScheduler: 

81 from flipdare.backend.app_scheduler import AppScheduler 

82 

83 if self._app_scheduler is None: 

84 self._app_scheduler = AppScheduler.instance() 

85 

86 return self._app_scheduler 

87 

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 

93 

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 

99 

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 

105 

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 

111 

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 

117 

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 

123 

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 

129 

130 @property 

131 def indexer(self) -> IndexerService: 

132 from flipdare.backend.indexer_service import IndexerService 

133 

134 if self._indexer is None: 

135 self._indexer = IndexerService.instance() 

136 return self._indexer 

137 

138 @property 

139 def storage_client(self) -> AppStorageClient: 

140 return AppStorageClient(self.storage_bucket) 

141 

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 

147 

148 @storage_bucket.setter 

149 def storage_bucket(self, bucket: StorageBucket) -> None: 

150 self._storage_bucket = bucket