Skip to content

Commit 7456647

Browse files
committed
refactor(api): register data operations for efficient processing
- Introduce DataOperationRegistry for managing data operations - Replace switch-case statements with registered operations for update and delete - Improve scalability and maintainability of data operation handling
1 parent 50a0e2b commit 7456647

File tree

1 file changed

+19
-114
lines changed

1 file changed

+19
-114
lines changed

routes/api/v1/data/[id]/index.dart

Lines changed: 19 additions & 114 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import 'package:data_repository/data_repository.dart';
66
import 'package:flutter_news_app_api_server_full_source_code/src/helpers/response_helper.dart';
77
import 'package:flutter_news_app_api_server_full_source_code/src/middlewares/ownership_check_middleware.dart';
88
import 'package:flutter_news_app_api_server_full_source_code/src/rbac/permission_service.dart';
9+
import 'package:flutter_news_app_api_server_full_source_code/src/registry/data_operation_registry.dart';
910
import 'package:flutter_news_app_api_server_full_source_code/src/registry/model_registry.dart';
1011
import 'package:flutter_news_app_api_server_full_source_code/src/services/user_preference_limit_service.dart';
1112
import 'package:logging/logging.dart';
@@ -185,70 +186,16 @@ Future<dynamic> _updateItem(
185186
'Executing _updateItem for model "$modelName", id "$id", userId: $userId.',
186187
);
187188
try {
188-
switch (modelName) {
189-
case 'headline':
190-
return await context.read<DataRepository<Headline>>().update(
191-
id: id,
192-
item: itemToUpdate as Headline,
193-
userId: userId,
194-
);
195-
case 'topic':
196-
return await context.read<DataRepository<Topic>>().update(
197-
id: id,
198-
item: itemToUpdate as Topic,
199-
userId: userId,
200-
);
201-
case 'source':
202-
return await context.read<DataRepository<Source>>().update(
203-
id: id,
204-
item: itemToUpdate as Source,
205-
userId: userId,
206-
);
207-
case 'country':
208-
return await context.read<DataRepository<Country>>().update(
209-
id: id,
210-
item: itemToUpdate as Country,
211-
userId: userId,
212-
);
213-
case 'language':
214-
return await context.read<DataRepository<Language>>().update(
215-
id: id,
216-
item: itemToUpdate as Language,
217-
userId: userId,
218-
);
219-
case 'user':
220-
final repo = context.read<DataRepository<User>>();
221-
final existingUser = context.read<FetchedItem<dynamic>>().data as User;
222-
final updatedUser = existingUser.copyWith(
223-
feedActionStatus: (itemToUpdate as User).feedActionStatus,
224-
);
225-
return await repo.update(id: id, item: updatedUser, userId: userId);
226-
case 'user_app_settings':
227-
return await context.read<DataRepository<UserAppSettings>>().update(
228-
id: id,
229-
item: itemToUpdate as UserAppSettings,
230-
userId: userId,
231-
);
232-
case 'user_content_preferences':
233-
return await context
234-
.read<DataRepository<UserContentPreferences>>()
235-
.update(
236-
id: id,
237-
item: itemToUpdate as UserContentPreferences,
238-
userId: userId,
239-
);
240-
case 'remote_config':
241-
return await context.read<DataRepository<RemoteConfig>>().update(
242-
id: id,
243-
item: itemToUpdate as RemoteConfig,
244-
userId: userId,
245-
);
246-
default:
247-
_logger.warning('Unsupported model type "$modelName" for update operation.');
248-
throw OperationFailedException(
249-
'Unsupported model type "$modelName" for update operation.',
250-
);
189+
final registry = context.read<DataOperationRegistry>();
190+
final updater = registry.itemUpdaters[modelName];
191+
192+
if (updater == null) {
193+
_logger.warning('Unsupported model type "$modelName" for update operation.');
194+
throw OperationFailedException(
195+
'Unsupported model type "$modelName" for update operation.',
196+
);
251197
}
198+
return await updater(context, id, itemToUpdate, userId);
252199
} catch (e, s) {
253200
_logger.severe(
254201
'Unhandled exception in _updateItem for model "$modelName", id "$id".',
@@ -272,58 +219,16 @@ Future<void> _deleteItem(
272219
'Executing _deleteItem for model "$modelName", id "$id", userId: $userId.',
273220
);
274221
try {
275-
switch (modelName) {
276-
case 'headline':
277-
return await context.read<DataRepository<Headline>>().delete(
278-
id: id,
279-
userId: userId,
280-
);
281-
case 'topic':
282-
return await context.read<DataRepository<Topic>>().delete(
283-
id: id,
284-
userId: userId,
285-
);
286-
case 'source':
287-
return await context.read<DataRepository<Source>>().delete(
288-
id: id,
289-
userId: userId,
290-
);
291-
case 'country':
292-
return await context.read<DataRepository<Country>>().delete(
293-
id: id,
294-
userId: userId,
295-
);
296-
case 'language':
297-
return await context.read<DataRepository<Language>>().delete(
298-
id: id,
299-
userId: userId,
300-
);
301-
case 'user':
302-
return await context.read<DataRepository<User>>().delete(
303-
id: id,
304-
userId: userId,
305-
);
306-
case 'user_app_settings':
307-
return await context.read<DataRepository<UserAppSettings>>().delete(
308-
id: id,
309-
userId: userId,
310-
);
311-
case 'user_content_preferences':
312-
return await context.read<DataRepository<UserContentPreferences>>().delete(
313-
id: id,
314-
userId: userId,
315-
);
316-
case 'remote_config':
317-
return await context.read<DataRepository<RemoteConfig>>().delete(
318-
id: id,
319-
userId: userId,
320-
);
321-
default:
322-
_logger.warning('Unsupported model type "$modelName" for delete operation.');
323-
throw OperationFailedException(
324-
'Unsupported model type "$modelName" for delete operation.',
325-
);
222+
final registry = context.read<DataOperationRegistry>();
223+
final deleter = registry.itemDeleters[modelName];
224+
225+
if (deleter == null) {
226+
_logger.warning('Unsupported model type "$modelName" for delete operation.');
227+
throw OperationFailedException(
228+
'Unsupported model type "$modelName" for delete operation.',
229+
);
326230
}
231+
return await deleter(context, id, userId);
327232
} catch (e, s) {
328233
_logger.severe(
329234
'Unhandled exception in _deleteItem for model "$modelName", id "$id".',

0 commit comments

Comments
 (0)