Skip to content

Commit 8d29c66

Browse files
committed
Added: document database logging (#26)
1 parent 30f157c commit 8d29c66

File tree

3 files changed

+50
-3
lines changed

3 files changed

+50
-3
lines changed

libreforms_fastapi/app/__init__.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -213,10 +213,10 @@ async def start_test_logger():
213213

214214
# Initialize the document database
215215
if config.MONGODB_ENABLED:
216-
DocumentDatabase = ManageMongoDB(config=form_config, timezone=config.TIMEZONE)
216+
DocumentDatabase = ManageMongoDB(config=form_config, timezone=config.TIMEZONE, env=config.ENVIRONMENT)
217217
logger.info('MongoDB has been initialized')
218218
else:
219-
DocumentDatabase = ManageTinyDB(config=form_config, timezone=config.TIMEZONE)
219+
DocumentDatabase = ManageTinyDB(config=form_config, timezone=config.TIMEZONE, env=config.ENVIRONMENT)
220220
logger.info('TinyDB has been initialized')
221221

222222
# Here we define an API key header for the api view functions.

libreforms_fastapi/utils/document_database.py

+47-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
from tinydb import TinyDB, Query
66
from abc import ABC, abstractmethod
77

8+
from libreforms_fastapi.utils.logging import set_logger
9+
810
class CollectionDoesNotExist(Exception):
911
"""Exception raised when attempting to access a collection that does not exist."""
1012
def __init__(self, form_name):
@@ -15,6 +17,10 @@ class ManageDocumentDB(ABC):
1517
def __init__(self, config: dict, timezone: ZoneInfo):
1618
self.config = config
1719

20+
# Set default log_name if not already set by a subclass
21+
if not hasattr(self, 'log_name'):
22+
self.log_name = "document_db.log"
23+
1824
# Here we'll set metadata field names
1925
self.document_id_field = "_document_id"
2026
self.is_deleted_field = "_is_deleted"
@@ -102,10 +108,20 @@ def restore_database_from_backup(self, form_name:str, backup_filename:str, backu
102108

103109

104110
class ManageTinyDB(ManageDocumentDB):
105-
def __init__(self, config: dict, timezone: ZoneInfo, db_path: str = "instance/"):
111+
def __init__(self, config: dict, timezone: ZoneInfo, db_path: str = "instance/", use_logger=True, env="development"):
106112
self.db_path = db_path
107113
os.makedirs(self.db_path, exist_ok=True)
108114

115+
self.log_name = "tinydb.log"
116+
self.use_logger = use_logger
117+
118+
if self.use_logger:
119+
self.logger = set_logger(
120+
environment=env,
121+
log_file_name=self.log_name,
122+
namespace=self.log_name
123+
)
124+
109125
super().__init__(config, timezone)
110126

111127
# Here we create a Query object to ship with the class
@@ -162,19 +178,32 @@ def create_document(self, form_name:str, json_data, metadata={}):
162178
# document_id = self.databases[form_name].insert(data_dict)
163179
_ = self.databases[form_name].insert(data_dict)
164180

181+
if self.use_logger:
182+
self.logger.info(f"Inserted document for {form_name} with document_id {document_id}")
183+
165184
return document_id
166185

167186
def update_document(self, form_name:str, json_data, metadata={}):
168187
"""Updates existing form in specified form's database."""
188+
189+
# Placeholder for logger
190+
169191
pass
170192

171193
def sign_document(self, form_name:str, json_data, metadata={}):
172194
"""Manage signatures existing form in specified form's database."""
195+
196+
# Placeholder for logger
197+
198+
173199
pass
174200

175201

176202
def approve_document(self, form_name:str, json_data, metadata={}):
177203
"""Manage approval for existing form in specified form's database."""
204+
205+
# Placeholder for logger
206+
178207
pass
179208

180209

@@ -190,11 +219,15 @@ def delete_document(self, form_name:str, search_query, permanent:bool=False):
190219
self._check_form_exists(form_name)
191220
if permanent:
192221
self.databases[form_name].remove(search_query)
222+
# Placeholder for logger
193223
else:
194224
# Perform a soft delete
195225
for doc_id in [d.doc_id for d in self.databases[form_name].search(search_query)]:
196226
self.databases[form_name].update({self.is_deleted_field: True}, doc_ids=[doc_id])
197227

228+
# Placeholder for logger
229+
230+
198231
def get_all_documents(self, form_name:str, exclude_deleted=True):
199232
"""Retrieves all entries from the specified form's database."""
200233
self._check_form_exists(form_name)
@@ -208,6 +241,7 @@ def get_one_document(self, form_name:str, search_query, exclude_deleted=True):
208241
self._check_form_exists(form_name)
209242
if exclude_deleted:
210243
search_query &= Query()[self.is_deleted_field] == False
244+
211245
return self.databases[form_name].get(search_query)
212246

213247
def restore_document(self, form_name:str, search_query):
@@ -216,6 +250,8 @@ def restore_document(self, form_name:str, search_query):
216250
for doc_id in [d.doc_id for d in self.databases[form_name].search(search_query)]:
217251
self.databases[form_name].update({self.is_deleted_field: False}, doc_ids=[doc_id])
218252

253+
# Placeholder for logger
254+
219255
def backup_database(self, form_name:str):
220256
"""Creates a backup of the specified form's database."""
221257
self._check_form_exists(form_name)
@@ -232,6 +268,9 @@ def backup_database(self, form_name:str):
232268
source_path = self._get_db_path(form_name)
233269
shutil.copyfile(source_path, backup_path)
234270

271+
if self.use_logger:
272+
self.logger.info(f"Successfully backed up {form_name} collection to {backup_path}")
273+
235274
return backup_path
236275

237276
def restore_database_from_backup(self, form_name:str, backup_filename:str, backup_before_overwriting:bool=True):
@@ -247,7 +286,14 @@ def restore_database_from_backup(self, form_name:str, backup_filename:str, backu
247286
self.backup_database(form_name)
248287

249288
shutil.copyfile(backup_path, self._get_db_path(form_name))
289+
290+
if self.use_logger:
291+
self.logger.info(f"Successfully restored {form_name} collection to from backup {backup_path}")
292+
250293
else:
294+
if self.use_logger:
295+
self.logger.error(f"Failed to restore {form_name} collection from backup - {backup_path} does not exist")
296+
251297
raise FileNotFoundError("Backup file does not exist.")
252298

253299
# Reinitialize the databse instances

libreforms_fastapi/utils/logging.py

+1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
def set_logger(environment, log_file_name, namespace, log_directory=os.path.join(os.getcwd(), 'instance', 'log')):
55
logger = logging.getLogger(namespace)
6+
logger.setLevel(logging.INFO)
67

78
if environment == "production":
89
os.makedirs(log_directory, exist_ok=True)

0 commit comments

Comments
 (0)