2026-03-11 15:28:29 +08:00
|
|
|
import 'package:social_app/core/api/i_api_client.dart';
|
|
|
|
|
|
|
|
|
|
import 'models/schedule_item_model.dart';
|
|
|
|
|
|
|
|
|
|
class CalendarApi {
|
|
|
|
|
final IApiClient _client;
|
|
|
|
|
static const _prefix = '/api/v1/schedule-items';
|
|
|
|
|
|
|
|
|
|
CalendarApi(this._client);
|
|
|
|
|
|
|
|
|
|
Future<List<ScheduleItemModel>> listByRange({
|
|
|
|
|
required DateTime startAt,
|
|
|
|
|
required DateTime endAt,
|
|
|
|
|
}) async {
|
|
|
|
|
final response = await _client.get(
|
|
|
|
|
'$_prefix?start_at=${Uri.encodeQueryComponent(startAt.toUtc().toIso8601String())}&end_at=${Uri.encodeQueryComponent(endAt.toUtc().toIso8601String())}',
|
|
|
|
|
);
|
|
|
|
|
final data = response.data;
|
|
|
|
|
if (data is! List) {
|
|
|
|
|
return const [];
|
|
|
|
|
}
|
|
|
|
|
return data
|
|
|
|
|
.whereType<Map<String, dynamic>>()
|
|
|
|
|
.map(ScheduleItemModel.fromJson)
|
|
|
|
|
.toList();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Future<ScheduleItemModel> getById(String id) async {
|
|
|
|
|
final response = await _client.get('$_prefix/$id');
|
|
|
|
|
return ScheduleItemModel.fromJson(response.data as Map<String, dynamic>);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Future<ScheduleItemModel> create(ScheduleItemModel request) async {
|
|
|
|
|
final response = await _client.post(_prefix, data: request.toCreateJson());
|
|
|
|
|
return ScheduleItemModel.fromJson(response.data as Map<String, dynamic>);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Future<ScheduleItemModel> update(ScheduleItemModel request) async {
|
|
|
|
|
final response = await _client.patch(
|
|
|
|
|
'$_prefix/${request.id}',
|
|
|
|
|
data: request.toUpdateJson(),
|
|
|
|
|
);
|
|
|
|
|
return ScheduleItemModel.fromJson(response.data as Map<String, dynamic>);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Future<void> delete(String id) async {
|
|
|
|
|
await _client.delete('$_prefix/$id');
|
|
|
|
|
}
|
2026-03-11 20:51:56 +08:00
|
|
|
|
|
|
|
|
Future<void> acceptSubscription(String itemId) async {
|
|
|
|
|
await _client.post('$_prefix/$itemId/accept');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Future<void> rejectSubscription(String itemId) async {
|
|
|
|
|
await _client.post('$_prefix/$itemId/reject');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Future<void> share(
|
|
|
|
|
String itemId, {
|
2026-03-19 18:43:08 +08:00
|
|
|
required String phone,
|
2026-03-11 20:51:56 +08:00
|
|
|
bool view = true,
|
|
|
|
|
bool edit = false,
|
|
|
|
|
bool invite = false,
|
|
|
|
|
}) async {
|
|
|
|
|
await _client.post(
|
|
|
|
|
'$_prefix/$itemId/share',
|
|
|
|
|
data: {
|
2026-03-19 18:43:08 +08:00
|
|
|
'phone': phone,
|
2026-03-11 20:51:56 +08:00
|
|
|
'permission_view': view,
|
|
|
|
|
'permission_edit': edit,
|
|
|
|
|
'permission_invite': invite,
|
|
|
|
|
},
|
|
|
|
|
);
|
|
|
|
|
}
|
2026-03-11 15:28:29 +08:00
|
|
|
}
|