@@ -36,22 +36,40 @@ import '../../../_middleware.dart';
3636Future <Response > onRequest (RequestContext context, String id) async {
3737 // Read dependencies provided by middleware
3838 final modelName = context.read <String >();
39- // Read ModelConfig for fromJson (needed for PUT)
4039 final modelConfig = context.read <ModelConfig <dynamic >>();
41- // Read the unique RequestId provided by the root middleware
4240 final requestId = context.read <RequestId >().id;
41+ // Since requireAuthentication is used, User is guaranteed to be non-null.
42+ final authenticatedUser = context.read <User >();
4343
4444 try {
4545 switch (context.request.method) {
4646 case HttpMethod .get :
47- // Pass requestId down to the handler
48- return await _handleGet (context, id, modelName, requestId);
47+ return await _handleGet (
48+ context,
49+ id,
50+ modelName,
51+ modelConfig, // Pass modelConfig
52+ authenticatedUser,
53+ requestId,
54+ );
4955 case HttpMethod .put:
50- // Pass requestId down to the handler
51- return await _handlePut (context, id, modelName, modelConfig, requestId);
56+ return await _handlePut (
57+ context,
58+ id,
59+ modelName,
60+ modelConfig,
61+ authenticatedUser,
62+ requestId,
63+ );
5264 case HttpMethod .delete:
53- // DELETE doesn't return a body, so no metadata needed here
54- return await _handleDelete (context, id, modelName, requestId);
65+ return await _handleDelete (
66+ context,
67+ id,
68+ modelName,
69+ modelConfig, // Pass modelConfig
70+ authenticatedUser,
71+ requestId,
72+ );
5573 // Add cases for other methods if needed in the future
5674 default :
5775 // Methods not allowed on the item endpoint
@@ -83,24 +101,34 @@ Future<Response> _handleGet(
83101 RequestContext context,
84102 String id,
85103 String modelName,
86- String requestId, // Receive requestId
104+ ModelConfig <dynamic > modelConfig, // Receive modelConfig
105+ User authenticatedUser, // Receive authenticatedUser
106+ String requestId,
87107) async {
88108 dynamic item; // Use dynamic
109+
110+ String ? userIdForRepoCall;
111+ if (modelConfig.ownership == ModelOwnership .userOwned) {
112+ userIdForRepoCall = authenticatedUser.id;
113+ } else {
114+ userIdForRepoCall = null ;
115+ }
116+
89117 // Repository exceptions (like NotFoundException) will propagate up.
90118 try {
91119 switch (modelName) {
92120 case 'headline' :
93121 final repo = context.read <HtDataRepository <Headline >>();
94- item = await repo.read (id);
122+ item = await repo.read (id: id, userId : userIdForRepoCall );
95123 case 'category' :
96124 final repo = context.read <HtDataRepository <Category >>();
97- item = await repo.read (id);
125+ item = await repo.read (id: id, userId : userIdForRepoCall );
98126 case 'source' :
99127 final repo = context.read <HtDataRepository <Source >>();
100- item = await repo.read (id);
128+ item = await repo.read (id: id, userId : userIdForRepoCall );
101129 case 'country' :
102130 final repo = context.read <HtDataRepository <Country >>();
103- item = await repo.read (id);
131+ item = await repo.read (id: id, userId : userIdForRepoCall );
104132 default :
105133 // This case should ideally be caught by middleware, but added for safety
106134 return Response (
@@ -151,7 +179,8 @@ Future<Response> _handlePut(
151179 String id,
152180 String modelName,
153181 ModelConfig <dynamic > modelConfig,
154- String requestId, // Receive requestId
182+ User authenticatedUser, // Receive authenticatedUser
183+ String requestId,
155184) async {
156185 final requestBody = await context.request.json () as Map <String , dynamic >? ;
157186 if (requestBody == null ) {
@@ -185,6 +214,16 @@ Future<Response> _handlePut(
185214 }
186215
187216 dynamic updatedItem; // Use dynamic
217+
218+ String ? userIdForRepoCall;
219+ if (modelConfig.ownership == ModelOwnership .userOwned) {
220+ userIdForRepoCall = authenticatedUser.id;
221+ } else {
222+ // For global models, update might imply admin rights.
223+ // For now, pass null, assuming repo handles global updates or has other checks.
224+ userIdForRepoCall = null ;
225+ }
226+
188227 // Repository exceptions (like NotFoundException, BadRequestException)
189228 // will propagate up.
190229 try {
@@ -193,57 +232,69 @@ Future<Response> _handlePut(
193232 {
194233 final repo = context.read <HtDataRepository <Headline >>();
195234 final typedItem = itemToUpdate as Headline ;
196- // Validate ID match between path and body
197235 if (typedItem.id != id) {
198236 return Response (
199237 statusCode: HttpStatus .badRequest,
200238 body:
201239 'Bad Request: ID in request body ("${typedItem .id }") does not match ID in path ("$id ").' ,
202240 );
203241 }
204- updatedItem = await repo.update (id, typedItem);
242+ updatedItem = await repo.update (
243+ id: id,
244+ item: typedItem,
245+ userId: userIdForRepoCall,
246+ );
205247 }
206248 case 'category' :
207249 {
208250 final repo = context.read <HtDataRepository <Category >>();
209251 final typedItem = itemToUpdate as Category ;
210- // Validate ID match between path and body
211252 if (typedItem.id != id) {
212253 return Response (
213254 statusCode: HttpStatus .badRequest,
214255 body:
215256 'Bad Request: ID in request body ("${typedItem .id }") does not match ID in path ("$id ").' ,
216257 );
217258 }
218- updatedItem = await repo.update (id, typedItem);
259+ updatedItem = await repo.update (
260+ id: id,
261+ item: typedItem,
262+ userId: userIdForRepoCall,
263+ );
219264 }
220265 case 'source' :
221266 {
222267 final repo = context.read <HtDataRepository <Source >>();
223268 final typedItem = itemToUpdate as Source ;
224- // Validate ID match between path and body
225269 if (typedItem.id != id) {
226270 return Response (
227271 statusCode: HttpStatus .badRequest,
228272 body:
229273 'Bad Request: ID in request body ("${typedItem .id }") does not match ID in path ("$id ").' ,
230274 );
231275 }
232- updatedItem = await repo.update (id, typedItem);
276+ updatedItem = await repo.update (
277+ id: id,
278+ item: typedItem,
279+ userId: userIdForRepoCall,
280+ );
233281 }
234282 case 'country' :
235283 {
236284 final repo = context.read <HtDataRepository <Country >>();
237285 final typedItem = itemToUpdate as Country ;
238- // Validate ID match between path and body
239286 if (typedItem.id != id) {
240287 return Response (
241288 statusCode: HttpStatus .badRequest,
242289 body:
243290 'Bad Request: ID in request body ("${typedItem .id }") does not match ID in path ("$id ").' ,
244291 );
245292 }
246- updatedItem = await repo.update (id, typedItem);
293+ updatedItem = await repo.update (
294+ id: id,
295+ item: typedItem,
296+ userId: userIdForRepoCall,
297+ );
247298 }
248299 default :
249300 // This case should ideally be caught by middleware, but added for safety
@@ -293,20 +344,38 @@ Future<Response> _handleDelete(
293344 RequestContext context,
294345 String id,
295346 String modelName,
296- String requestId, // Receive requestId for logging
347+ ModelConfig <dynamic > modelConfig, // Receive modelConfig
348+ User authenticatedUser, // Receive authenticatedUser
349+ String requestId,
297350) async {
351+ String ? userIdForRepoCall;
352+ if (modelConfig.ownership == ModelOwnership .userOwned) {
353+ userIdForRepoCall = authenticatedUser.id;
354+ } else {
355+ // For global models, delete might imply admin rights.
356+ // For now, pass null.
357+ userIdForRepoCall = null ;
358+ }
359+
298360 // Allow repository exceptions (e.g., NotFoundException) to propagate
299361 // upwards to be handled by the standard error handling mechanism.
300- // (Removed the overly broad try-catch block that was previously here).
301362 switch (modelName) {
302363 case 'headline' :
303- await context.read <HtDataRepository <Headline >>().delete (id);
364+ await context
365+ .read <HtDataRepository <Headline >>()
366+ .delete (id: id, userId: userIdForRepoCall);
304367 case 'category' :
305- await context.read <HtDataRepository <Category >>().delete (id);
368+ await context
369+ .read <HtDataRepository <Category >>()
370+ .delete (id: id, userId: userIdForRepoCall);
306371 case 'source' :
307- await context.read <HtDataRepository <Source >>().delete (id);
372+ await context
373+ .read <HtDataRepository <Source >>()
374+ .delete (id: id, userId: userIdForRepoCall);
308375 case 'country' :
309- await context.read <HtDataRepository <Country >>().delete (id);
376+ await context
377+ .read <HtDataRepository <Country >>()
378+ .delete (id: id, userId: userIdForRepoCall);
310379 default :
311380 // This case should ideally be caught by the data/_middleware.dart,
312381 // but added for safety. Consider logging this unexpected state.
0 commit comments