8
8
from todo .constants .messages import AppMessages
9
9
from todo .utils .invite_code_utils import generate_invite_code
10
10
from typing import List
11
+ from todo .models .audit_log import AuditLogModel
12
+ from todo .repositories .audit_log_repository import AuditLogRepository
11
13
12
14
DEFAULT_ROLE_ID = "1"
13
15
@@ -90,6 +92,15 @@ def create_team(cls, dto: CreateTeamDTO, created_by_user_id: str) -> CreateTeamR
90
92
if user_teams :
91
93
UserTeamDetailsRepository .create_many (user_teams )
92
94
95
+ # Audit log for team creation
96
+ AuditLogRepository .create (
97
+ AuditLogModel (
98
+ team_id = created_team .id ,
99
+ action = "team_created" ,
100
+ performed_by = PyObjectId (created_by_user_id ),
101
+ )
102
+ )
103
+
93
104
# Convert to DTO
94
105
team_dto = TeamDTO (
95
106
id = str (created_team .id ),
@@ -226,6 +237,15 @@ def join_team_by_invite_code(cls, invite_code: str, user_id: str) -> TeamDTO:
226
237
)
227
238
UserTeamDetailsRepository .create (user_team )
228
239
240
+ # Audit log for team join
241
+ AuditLogRepository .create (
242
+ AuditLogModel (
243
+ team_id = team .id ,
244
+ action = "member_joined_team" ,
245
+ performed_by = PyObjectId (user_id ),
246
+ )
247
+ )
248
+
229
249
# 4. Return team details
230
250
return TeamDTO (
231
251
id = str (team .id ),
@@ -283,6 +303,15 @@ def update_team(cls, team_id: str, dto: UpdateTeamDTO, updated_by_user_id: str)
283
303
if not success :
284
304
raise ValueError (f"Failed to update team members for team with id { team_id } " )
285
305
306
+ # Audit log for team update
307
+ AuditLogRepository .create (
308
+ AuditLogModel (
309
+ team_id = PyObjectId (team_id ),
310
+ action = "team_updated" ,
311
+ performed_by = PyObjectId (updated_by_user_id ),
312
+ )
313
+ )
314
+
286
315
# Convert to DTO
287
316
return TeamDTO (
288
317
id = str (updated_team .id ),
@@ -364,6 +393,17 @@ def add_team_members(cls, team_id: str, member_ids: List[str], added_by_user_id:
364
393
if new_user_teams :
365
394
UserTeamDetailsRepository .create_many (new_user_teams )
366
395
396
+ # Audit log for team member addition
397
+ for member_id in member_ids :
398
+ AuditLogRepository .create (
399
+ AuditLogModel (
400
+ team_id = team .id ,
401
+ action = "member_added_to_team" ,
402
+ performed_by = PyObjectId (added_by_user_id ),
403
+ details = {"added_member_id" : member_id },
404
+ )
405
+ )
406
+
367
407
# Return updated team details
368
408
return TeamDTO (
369
409
id = str (team .id ),
@@ -384,10 +424,20 @@ class TeamOrUserNotFound(Exception):
384
424
pass
385
425
386
426
@classmethod
387
- def remove_member_from_team (cls , user_id : str , team_id : str ):
427
+ def remove_member_from_team (cls , user_id : str , team_id : str , removed_by_user_id : str = None ):
388
428
from todo .repositories .user_team_details_repository import UserTeamDetailsRepository
389
429
390
430
success = UserTeamDetailsRepository .remove_member_from_team (user_id = user_id , team_id = team_id )
391
431
if not success :
392
432
raise cls .TeamOrUserNotFound ()
433
+
434
+ # Audit log for team member removal
435
+ AuditLogRepository .create (
436
+ AuditLogModel (
437
+ team_id = PyObjectId (team_id ),
438
+ action = "member_removed_from_team" ,
439
+ performed_by = PyObjectId (removed_by_user_id ) if removed_by_user_id else PyObjectId (user_id ),
440
+ )
441
+ )
442
+
393
443
return True
0 commit comments