import 'package:dio/dio.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:tatlock_ui/core/api/api_client.dart'; import 'package:tatlock_ui/features/front_hall/data/models/quick_link_model.dart'; import 'package:tatlock_ui/features/front_hall/domain/entities/quick_link.dart'; part 'quick_links_datasource.g.dart'; /// Data source for quick link operations. /// /// Provides CRUD operations for Front Hall quick links via Core API. class QuickLinksDatasource { QuickLinksDatasource(this._dio); final Dio _dio; static const _basePath = '/front-hall/quick-links'; /// Gets all quick links. Future> getQuickLinks() async { final response = await _dio.get>(_basePath); final data = response.data ?? []; return data .map((json) => QuickLinkModel.fromJson(json as Map)) .map((model) => model.toEntity()) .toList(); } /// Gets a single quick link by ID. Future getQuickLink(String id) async { final response = await _dio.get>('$_basePath/$id'); final data = response.data; if (data == null) { throw Exception('Quick link not found: $id'); } return QuickLinkModel.fromJson(data).toEntity(); } /// Creates a new quick link. Future createQuickLink(QuickLink link) async { final model = QuickLinkModel.fromEntity(link); final response = await _dio.post>( _basePath, data: model.toJson(), ); final data = response.data; if (data == null) { throw Exception('Failed to create quick link'); } return QuickLinkModel.fromJson(data).toEntity(); } /// Updates an existing quick link. Future updateQuickLink(QuickLink link) async { final model = QuickLinkModel.fromEntity(link); final response = await _dio.put>( '$_basePath/${link.id}', data: model.toJson(), ); final data = response.data; if (data == null) { throw Exception('Failed to update quick link'); } return QuickLinkModel.fromJson(data).toEntity(); } /// Deletes a quick link. Future deleteQuickLink(String id) async { await _dio.delete('$_basePath/$id'); } /// Reorders quick links by updating sort orders. Future reorderQuickLinks(List orderedIds) async { await _dio.put( '$_basePath/reorder', data: {'ids': orderedIds}, ); } } /// Provides the quick links datasource. @riverpod QuickLinksDatasource quickLinksDatasource(Ref ref) { final dio = ref.watch(coreApiClientProvider); return QuickLinksDatasource(dio); }