TF-3578 Calendar event show free busy status

This commit is contained in:
DatDang
2025-04-02 11:25:06 +07:00
committed by Dat H. Pham
parent 0703d14761
commit 4538959d30
21 changed files with 456 additions and 15 deletions
@@ -1,9 +1,14 @@
import 'dart:async';
import 'package:core/utils/app_logger.dart';
import 'package:jmap_dart_client/http/http_client.dart';
import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/core/id.dart';
import 'package:jmap_dart_client/jmap/core/request/request_invocation.dart';
import 'package:jmap_dart_client/jmap/core/response/response_object.dart';
import 'package:jmap_dart_client/jmap/jmap_request.dart';
import 'package:jmap_dart_client/jmap/mail/calendar/attendance/get_calendar_event_attendance_method.dart';
import 'package:jmap_dart_client/jmap/mail/calendar/attendance/get_calendar_event_attendance_response.dart';
import 'package:jmap_dart_client/jmap/mail/calendar/parse/calendar_event_parse_method.dart';
import 'package:jmap_dart_client/jmap/mail/calendar/parse/calendar_event_parse_response.dart';
import 'package:jmap_dart_client/jmap/mail/calendar/reply/calendar_event_accept_method.dart';
@@ -23,8 +28,20 @@ class CalendarEventAPI {
Future<List<BlobCalendarEvent>> parse(AccountId accountId, Set<Id> blobIds) async {
final requestBuilder = JmapRequestBuilder(_httpClient, ProcessingInvocation());
// Parse
final calendarEventParseMethod = CalendarEventParseMethod(accountId, blobIds);
final calendarEventParseInvocation = requestBuilder.invocation(calendarEventParseMethod);
// Free/Busy query
final calendarEventAttendanceGetMethod = GetCalendarEventAttendanceMethod(
accountId,
blobIds.toList(),
);
final calendarEventAttendanceGetInvocation = requestBuilder.invocation(
calendarEventAttendanceGetMethod,
);
final response = await (requestBuilder
..usings(calendarEventParseMethod.requiredCapabilities))
.build()
@@ -33,11 +50,24 @@ class CalendarEventAPI {
final calendarEventParseResponse = response.parse<CalendarEventParseResponse>(
calendarEventParseInvocation.methodCallId,
CalendarEventParseResponse.deserialize);
final calendarEventAttendanceGetResponse = _parseCalendarEventAttendance(
response,
calendarEventAttendanceGetInvocation.methodCallId,
);
final calendarBlobIdStatusMap = Map.fromEntries(
(calendarEventAttendanceGetResponse?.list ?? []).map(
(calendarEventAttendance) => MapEntry(
calendarEventAttendance.blobId,
calendarEventAttendance.isFree,
),
),
);
if (calendarEventParseResponse?.parsed?.isNotEmpty == true) {
return calendarEventParseResponse!.parsed!.entries
.map((entry) => BlobCalendarEvent(
blobId: entry.key,
isFree: calendarBlobIdStatusMap[entry.key] ?? true,
calendarEventList: entry.value))
.toList();
} else if (calendarEventParseResponse?.notParsable?.isNotEmpty == true) {
@@ -49,6 +79,20 @@ class CalendarEventAPI {
}
}
GetCalendarEventAttendanceResponse? _parseCalendarEventAttendance(
ResponseObject response,
MethodCallId methodCallId,
) {
try {
return response.parse<GetCalendarEventAttendanceResponse>(
methodCallId,
GetCalendarEventAttendanceResponse.deserialize);
} catch (e) {
logError('CalendarEventAPI.parse free/busy query error: $e');
return null;
}
}
Future<CalendarEventAcceptResponse> acceptEventInvitation(
AccountId accountId,
Set<Id> blobIds,
@@ -66,6 +66,7 @@ class CalendarEventRepositoryImpl extends CalendarEventRepository {
calendarEventList: await Future.wait(blobCalendarEvent.calendarEventList.map((calendarEvent) {
return _transformCalendarEventDescription(calendarEvent, transformConfiguration);
})),
isFree: blobCalendarEvent.isFree,
);
}));
}