it0/it0_app/lib/features/tasks/data/datasources/tasks_datasource.dart

75 lines
2.1 KiB
Dart

import 'package:dio/dio.dart';
import '../../../../core/config/api_endpoints.dart';
import '../models/task_model.dart';
/// Remote datasource for task CRUD operations.
class TasksDatasource {
final Dio _dio;
TasksDatasource(this._dio);
/// Fetches all tasks, optionally filtered by status.
Future<List<TaskModel>> fetchTasks({String? status}) async {
final queryParams = <String, dynamic>{};
if (status != null) queryParams['status'] = status;
final response = await _dio.get(
ApiEndpoints.opsTasks,
queryParameters: queryParams.isNotEmpty ? queryParams : null,
);
final data = response.data;
List<dynamic> items;
if (data is List) {
items = data;
} else if (data is Map && data.containsKey('items')) {
items = data['items'] as List;
} else {
items = [];
}
return items
.map((item) => TaskModel.fromJson(item as Map<String, dynamic>))
.toList();
}
/// Fetches a single task by ID.
Future<TaskModel> fetchTaskById(String id) async {
final response = await _dio.get('${ApiEndpoints.opsTasks}/$id');
return TaskModel.fromJson(response.data as Map<String, dynamic>);
}
/// Creates a new task.
Future<TaskModel> createTask({
required String title,
String? description,
String? priority,
String? serverId,
}) async {
final body = <String, dynamic>{
'title': title,
if (description != null) 'description': description,
if (priority != null) 'priority': priority,
if (serverId != null) 'serverId': serverId,
};
final response = await _dio.post(ApiEndpoints.opsTasks, data: body);
return TaskModel.fromJson(response.data as Map<String, dynamic>);
}
/// Updates an existing task.
Future<TaskModel> updateTask(String id, Map<String, dynamic> updates) async {
final response = await _dio.patch(
'${ApiEndpoints.opsTasks}/$id',
data: updates,
);
return TaskModel.fromJson(response.data as Map<String, dynamic>);
}
/// Deletes a task by ID.
Future<void> deleteTask(String id) async {
await _dio.delete('${ApiEndpoints.opsTasks}/$id');
}
}