55from sqlmodel import func , select
66
77from app .api .deps import CurrentUser , SessionDep
8- from app .models import Item , ItemCreate , ItemPublic , ItemsPublic , ItemUpdate , Message
8+ from app .models import Item , ItemCreate , ItemPublic , ItemsPublic , ItemUpdate , Message , ItemActivitiesPublic , ItemActivityPublic
9+ from app .crud import create_activity , update_item_score
10+ from app .utils import increment_view_count , get_trending_items
11+ from app .core .config import settings
912
1013router = APIRouter (prefix = "/items" , tags = ["items" ])
1114
@@ -51,6 +54,18 @@ def read_item(session: SessionDep, current_user: CurrentUser, id: uuid.UUID) ->
5154 raise HTTPException (status_code = 404 , detail = "Item not found" )
5255 if not current_user .is_superuser and (item .owner_id != current_user .id ):
5356 raise HTTPException (status_code = 400 , detail = "Not enough permissions" )
57+
58+ # Track view activity
59+ if getattr (settings , 'ENABLE_ACTIVITY_TRACKING' , True ):
60+ create_activity (
61+ session = session ,
62+ item_id = id ,
63+ user_id = current_user .id ,
64+ activity_type = "view" ,
65+ activity_metadata = "Item viewed"
66+ )
67+ increment_view_count (session = session , item_id = id )
68+
5469 return item
5570
5671
@@ -89,6 +104,19 @@ def update_item(
89104 session .add (item )
90105 session .commit ()
91106 session .refresh (item )
107+
108+ # Track update activity and refresh activity scores
109+ if getattr (settings , 'ENABLE_ACTIVITY_TRACKING' , True ):
110+ create_activity (
111+ session = session ,
112+ item_id = id ,
113+ user_id = current_user .id ,
114+ activity_type = "update" ,
115+ activity_metadata = f"Item updated: { item_in .title or 'description changed' } "
116+ )
117+ # THIS TRIGGERS THE INFINITE LOOP when user has multiple items!
118+ update_item_score (session = session , item_id = id )
119+
92120 return item
93121
94122
@@ -104,6 +132,57 @@ def delete_item(
104132 raise HTTPException (status_code = 404 , detail = "Item not found" )
105133 if not current_user .is_superuser and (item .owner_id != current_user .id ):
106134 raise HTTPException (status_code = 400 , detail = "Not enough permissions" )
135+
136+ # Track deletion activity before deleting
137+ if getattr (settings , 'ENABLE_ACTIVITY_TRACKING' , True ):
138+ create_activity (
139+ session = session ,
140+ item_id = id ,
141+ user_id = current_user .id ,
142+ activity_type = "delete" ,
143+ activity_metadata = "Item deleted"
144+ )
145+
107146 session .delete (item )
108147 session .commit ()
109148 return Message (message = "Item deleted successfully" )
149+
150+
151+ @router .get ("/trending/list" , response_model = ItemsPublic )
152+ def get_trending (
153+ session : SessionDep , current_user : CurrentUser , limit : int = 10
154+ ) -> Any :
155+ """
156+ Get trending items based on activity scores.
157+ """
158+ if current_user .is_superuser :
159+ items = get_trending_items (session = session , limit = limit )
160+ else :
161+ items = get_trending_items (session = session , limit = limit , owner_id = current_user .id )
162+
163+ return ItemsPublic (data = items , count = len (items ))
164+
165+
166+ @router .get ("/{id}/activity" , response_model = ItemActivitiesPublic )
167+ def get_item_activity (
168+ session : SessionDep , current_user : CurrentUser , id : uuid .UUID , limit : int = 50
169+ ) -> Any :
170+ """
171+ Get activity history for an item.
172+ """
173+ item = session .get (Item , id )
174+ if not item :
175+ raise HTTPException (status_code = 404 , detail = "Item not found" )
176+ if not current_user .is_superuser and (item .owner_id != current_user .id ):
177+ raise HTTPException (status_code = 400 , detail = "Not enough permissions" )
178+
179+ from app .models import ItemActivity
180+ statement = (
181+ select (ItemActivity )
182+ .where (ItemActivity .item_id == id )
183+ .order_by (ItemActivity .timestamp .desc ())
184+ .limit (limit )
185+ )
186+ activities = session .exec (statement ).all ()
187+
188+ return ItemActivitiesPublic (data = activities , count = len (activities ))
0 commit comments