1+ from typing import Optional
2+ from backend .models .dtos .user_dto import AuthUserDTO
3+ from backend .models .postgis .statuses import ProjectStatus
4+ from backend .services .users .authentication_service import login_required_optional
15from databases import Database
26from fastapi import APIRouter , Depends , Request , Query
3-
7+ from fastapi . responses import JSONResponse
48from backend .db import get_db
59from backend .services .project_service import ProjectService
610from backend .services .stats_service import StatsService
1620async def get_activities (
1721 project_id : int ,
1822 page : int = Query (1 , description = "Page of results user requested" , ge = 1 ),
23+ user : Optional [AuthUserDTO ] = Depends (login_required_optional ),
1924 db : Database = Depends (get_db ),
2025):
2126 """
@@ -44,14 +49,46 @@ async def get_activities(
4449 500:
4550 description: Internal Server Error
4651 """
47- await ProjectService .exists (project_id , db )
52+
53+ is_private , status = await ProjectService .get_project_privacy_and_status (
54+ project_id , db
55+ )
56+ # If private or draft, enforce login + permission
57+ if is_private or status == ProjectStatus .DRAFT .value :
58+ user_id = user .id if user else None
59+ if user is None :
60+ return JSONResponse (
61+ content = {
62+ "Error" : "User not permitted: Private Project" ,
63+ "SubCode" : "PrivateProject" ,
64+ },
65+ status_code = 403 ,
66+ )
67+
68+ project_dto = await ProjectService .get_project_dto_for_mapper (
69+ project_id ,
70+ user_id ,
71+ db ,
72+ )
73+ if not project_dto :
74+
75+ return JSONResponse (
76+ content = {
77+ "Error" : "User not permitted: Private Project" ,
78+ "SubCode" : "PrivateProject" ,
79+ },
80+ status_code = 403 ,
81+ )
4882 activity = await StatsService .get_latest_activity (project_id , page , db )
4983 return activity
5084
5185
5286@router .get ("/{project_id}/activities/latest/" )
5387async def get_latest_activities (
54- request : Request , project_id : int , db : Database = Depends (get_db )
88+ request : Request ,
89+ project_id : int ,
90+ user : Optional [AuthUserDTO ] = Depends (login_required_optional ),
91+ db : Database = Depends (get_db ),
5592):
5693 """
5794 Get latest user activity on all of project task
@@ -74,6 +111,35 @@ async def get_latest_activities(
74111 500:
75112 description: Internal Server Error
76113 """
77- await ProjectService .exists (project_id , db )
114+
115+ is_private , status = await ProjectService .get_project_privacy_and_status (
116+ project_id , db
117+ )
118+ # If private or draft, enforce login + permission
119+ if is_private or status == ProjectStatus .DRAFT .value :
120+ user_id = user .id if user else None
121+ if user is None :
122+ return JSONResponse (
123+ content = {
124+ "Error" : "User not permitted: Private Project" ,
125+ "SubCode" : "PrivateProject" ,
126+ },
127+ status_code = 403 ,
128+ )
129+
130+ project_dto = await ProjectService .get_project_dto_for_mapper (
131+ project_id ,
132+ user_id ,
133+ db ,
134+ )
135+ if not project_dto :
136+
137+ return JSONResponse (
138+ content = {
139+ "Error" : "User not permitted: Private Project" ,
140+ "SubCode" : "PrivateProject" ,
141+ },
142+ status_code = 403 ,
143+ )
78144 activity = await StatsService .get_last_activity (project_id , db )
79145 return activity
0 commit comments