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 /// dashboard/quick-links endpoint. class QuickLinksDatasource { QuickLinksDatasource(this._dio); final Dio _dio; static const _basePath = '/dashboard/quick-links'; /// Gets all quick links. /// /// API returns: {"links": [...], "total": N} Future> getQuickLinks() async { final response = await _dio.get>(_basePath); final data = response.data; if (data == null) { return []; } final links = data['links'] as List? ?? []; return links .map((json) => QuickLinkModel.fromJson(json as Map)) .map((model) => model.toEntity()) .toList(); } /// Gets a single quick link by ID. Future getQuickLink(int 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 id = int.tryParse(link.id) ?? 0; final response = await _dio.put>( '$_basePath/$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(int id) async { await _dio.delete('$_basePath/$id'); } /// Reorders quick links by updating positions. /// /// API expects: {"link_ids": [1, 2, 3]} Future reorderQuickLinks(List orderedIds) async { await _dio.post( '$_basePath/reorder', data: {'link_ids': orderedIds}, ); } } /// Provides the quick links datasource. @riverpod QuickLinksDatasource quickLinksDatasource(Ref ref) { final dio = ref.watch(coreApiClientProvider); return QuickLinksDatasource(dio); }