hardened API decoding against server fields the models did not expect

The Talk room list crashed for a new account because the server omits
lastMessage for rooms without a visible message and the model required it.
Beyond that single field, a review of the Talk models against the OpenAPI
spec of the installed version (23.0.8) found the same crash class in several
places: closed enums over open server values (inCall bitmask, rich-object
types, actor and message types), a deleted parent sent as {id, deleted},
and the autocomplete status arriving as an object.

- json_serializable `checked: true`: decode errors now name class and field
- lists (rooms, messages, participants, autocomplete) decode per entry;
  a malformed entry is skipped and reported via ClientErrorReporter
- unknownEnumValue fallbacks for all response enums of Talk and breakers
- lastMessage nullable; inCall as bitmask; deleted parent placeholder;
  autocomplete status object/string; fixed shareWithDisplayNameUnique key
- GetRoomParams no longer sends null query parameters

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HrepDTL4qDe35TuS29sLW3
This commit is contained in:
2026-09-29 16:35:41 +02:00
co-authored by Claude Fable 5.1
parent a79b376bb3
commit 279b973e89
92 changed files with 2150 additions and 963 deletions
@@ -6,12 +6,22 @@ part of 'mc_holiday.dart';
// JsonSerializableGenerator
// **************************************************************************
McHoliday _$McHolidayFromJson(Map<String, dynamic> json) => McHoliday(
shortName: json['shortName'] as String,
longName: json['longName'] as String,
startDate: McHoliday._dateFromJson(json['startDate'] as String),
endDate: McHoliday._dateFromJson(json['endDate'] as String),
);
McHoliday _$McHolidayFromJson(Map<String, dynamic> json) =>
$checkedCreate('McHoliday', json, ($checkedConvert) {
final val = McHoliday(
shortName: $checkedConvert('shortName', (v) => v as String),
longName: $checkedConvert('longName', (v) => v as String),
startDate: $checkedConvert(
'startDate',
(v) => McHoliday._dateFromJson(v as String),
),
endDate: $checkedConvert(
'endDate',
(v) => McHoliday._dateFromJson(v as String),
),
);
return val;
});
Map<String, dynamic> _$McHolidayToJson(McHoliday instance) => <String, dynamic>{
'shortName': instance.shortName,
@@ -8,12 +8,15 @@ part of 'absence_prefill_response.dart';
AbsencePrefillResponse _$AbsencePrefillResponseFromJson(
Map<String, dynamic> json,
) => AbsencePrefillResponse(
firstName: json['firstName'] as String? ?? '',
lastName: json['lastName'] as String? ?? '',
className: json['className'] as String? ?? '',
phone: json['phone'] as String? ?? '',
);
) => $checkedCreate('AbsencePrefillResponse', json, ($checkedConvert) {
final val = AbsencePrefillResponse(
firstName: $checkedConvert('firstName', (v) => v as String? ?? ''),
lastName: $checkedConvert('lastName', (v) => v as String? ?? ''),
className: $checkedConvert('className', (v) => v as String? ?? ''),
phone: $checkedConvert('phone', (v) => v as String? ?? ''),
);
return val;
});
Map<String, dynamic> _$AbsencePrefillResponseToJson(
AbsencePrefillResponse instance,
@@ -7,14 +7,17 @@ part of 'auth_login_response.dart';
// **************************************************************************
AuthLoginUser _$AuthLoginUserFromJson(Map<String, dynamic> json) =>
AuthLoginUser(
id: json['id'] as String,
username: json['username'] as String,
firstName: json['firstName'] as String,
lastName: json['lastName'] as String,
userType: json['userType'] as String?,
className: json['className'] as String?,
);
$checkedCreate('AuthLoginUser', json, ($checkedConvert) {
final val = AuthLoginUser(
id: $checkedConvert('id', (v) => v as String),
username: $checkedConvert('username', (v) => v as String),
firstName: $checkedConvert('firstName', (v) => v as String),
lastName: $checkedConvert('lastName', (v) => v as String),
userType: $checkedConvert('userType', (v) => v as String?),
className: $checkedConvert('className', (v) => v as String?),
);
return val;
});
Map<String, dynamic> _$AuthLoginUserToJson(AuthLoginUser instance) =>
<String, dynamic>{
@@ -27,12 +30,21 @@ Map<String, dynamic> _$AuthLoginUserToJson(AuthLoginUser instance) =>
};
AuthLoginResponse _$AuthLoginResponseFromJson(Map<String, dynamic> json) =>
AuthLoginResponse(
token: json['token'] as String,
tokenId: json['tokenId'] as String,
expiresAt: AuthLoginResponse._expiresFromJson(json['expiresAt']),
user: AuthLoginUser.fromJson(json['user'] as Map<String, dynamic>),
);
$checkedCreate('AuthLoginResponse', json, ($checkedConvert) {
final val = AuthLoginResponse(
token: $checkedConvert('token', (v) => v as String),
tokenId: $checkedConvert('tokenId', (v) => v as String),
expiresAt: $checkedConvert(
'expiresAt',
(v) => AuthLoginResponse._expiresFromJson(v),
),
user: $checkedConvert(
'user',
(v) => AuthLoginUser.fromJson(v as Map<String, dynamic>),
),
);
return val;
});
Map<String, dynamic> _$AuthLoginResponseToJson(AuthLoginResponse instance) =>
<String, dynamic>{
@@ -25,6 +25,7 @@ class GetBreakersResponse extends ApiResponse {
@JsonSerializable()
class BreakerRule {
@JsonKey(unknownEnumValue: BreakerArea.unknown)
List<BreakerArea> areas;
String message;
@@ -69,4 +70,7 @@ enum BreakerArea {
feedback,
@JsonValue('MORE')
more,
/// An area the backend added after this build; no module maps to it.
unknown,
}
@@ -7,15 +7,25 @@ part of 'get_breakers_response.dart';
// **************************************************************************
GetBreakersResponse _$GetBreakersResponseFromJson(Map<String, dynamic> json) =>
GetBreakersResponse(
(json['rules'] as List<dynamic>?)
?.map((e) => BreakerRule.fromJson(e as Map<String, dynamic>))
.toList() ??
[],
)
..headers = (json['headers'] as Map<String, dynamic>?)?.map(
(k, e) => MapEntry(k, e as String),
$checkedCreate('GetBreakersResponse', json, ($checkedConvert) {
final val = GetBreakersResponse(
$checkedConvert(
'rules',
(v) =>
(v as List<dynamic>?)
?.map((e) => BreakerRule.fromJson(e as Map<String, dynamic>))
.toList() ??
[],
),
);
$checkedConvert(
'headers',
(v) => val.headers = (v as Map<String, dynamic>?)?.map(
(k, e) => MapEntry(k, e as String),
),
);
return val;
});
Map<String, dynamic> _$GetBreakersResponseToJson(
GetBreakersResponse instance,
@@ -24,13 +34,26 @@ Map<String, dynamic> _$GetBreakersResponseToJson(
'rules': instance.rules.map((e) => e.toJson()).toList(),
};
BreakerRule _$BreakerRuleFromJson(Map<String, dynamic> json) => BreakerRule(
(json['areas'] as List<dynamic>)
.map((e) => $enumDecode(_$BreakerAreaEnumMap, e))
.toList(),
json['message'] as String,
(json['maxBuild'] as num?)?.toInt(),
);
BreakerRule _$BreakerRuleFromJson(Map<String, dynamic> json) =>
$checkedCreate('BreakerRule', json, ($checkedConvert) {
final val = BreakerRule(
$checkedConvert(
'areas',
(v) => (v as List<dynamic>)
.map(
(e) => $enumDecode(
_$BreakerAreaEnumMap,
e,
unknownValue: BreakerArea.unknown,
),
)
.toList(),
),
$checkedConvert('message', (v) => v as String),
$checkedConvert('maxBuild', (v) => (v as num?)?.toInt()),
);
return val;
});
Map<String, dynamic> _$BreakerRuleToJson(BreakerRule instance) =>
<String, dynamic>{
@@ -52,4 +75,5 @@ const _$BreakerAreaEnumMap = {
BreakerArea.dates: 'DATES',
BreakerArea.feedback: 'FEEDBACK',
BreakerArea.more: 'MORE',
BreakerArea.unknown: 'unknown',
};
@@ -8,13 +8,28 @@ part of 'get_capabilities_response.dart';
CapabilitiesResponse _$CapabilitiesResponseFromJson(
Map<String, dynamic> json,
) => CapabilitiesResponse(
viewForeignTimetables: json['viewForeignTimetables'] as bool? ?? false,
pushNotifications: json['pushNotifications'] as bool? ?? false,
timetablePastDays: (json['timetablePastDays'] as num?)?.toInt(),
timetableFutureDays: (json['timetableFutureDays'] as num?)?.toInt(),
userType: json['userType'] as String?,
);
) => $checkedCreate('CapabilitiesResponse', json, ($checkedConvert) {
final val = CapabilitiesResponse(
viewForeignTimetables: $checkedConvert(
'viewForeignTimetables',
(v) => v as bool? ?? false,
),
pushNotifications: $checkedConvert(
'pushNotifications',
(v) => v as bool? ?? false,
),
timetablePastDays: $checkedConvert(
'timetablePastDays',
(v) => (v as num?)?.toInt(),
),
timetableFutureDays: $checkedConvert(
'timetableFutureDays',
(v) => (v as num?)?.toInt(),
),
userType: $checkedConvert('userType', (v) => v as String?),
);
return val;
});
Map<String, dynamic> _$CapabilitiesResponseToJson(
CapabilitiesResponse instance,
@@ -7,14 +7,20 @@ part of 'get_ticker_response.dart';
// **************************************************************************
TickerResponse _$TickerResponseFromJson(Map<String, dynamic> json) =>
TickerResponse(
schemaVersion: (json['schemaVersion'] as num?)?.toInt() ?? 1,
available: json['available'] as bool? ?? false,
hash: json['hash'] as String?,
publishedAt: json['publishedAt'] as String?,
webUrl: json['webUrl'] as String? ?? '/ticker',
content: json['content'] as Map<String, dynamic>?,
);
$checkedCreate('TickerResponse', json, ($checkedConvert) {
final val = TickerResponse(
schemaVersion: $checkedConvert(
'schemaVersion',
(v) => (v as num?)?.toInt() ?? 1,
),
available: $checkedConvert('available', (v) => v as bool? ?? false),
hash: $checkedConvert('hash', (v) => v as String?),
publishedAt: $checkedConvert('publishedAt', (v) => v as String?),
webUrl: $checkedConvert('webUrl', (v) => v as String? ?? '/ticker'),
content: $checkedConvert('content', (v) => v as Map<String, dynamic>?),
);
return val;
});
Map<String, dynamic> _$TickerResponseToJson(TickerResponse instance) =>
<String, dynamic>{
@@ -7,15 +7,26 @@ part of 'get_ticker_nav_response.dart';
// **************************************************************************
TickerNavResponse _$TickerNavResponseFromJson(Map<String, dynamic> json) =>
TickerNavResponse(
schemaVersion: (json['schemaVersion'] as num?)?.toInt() ?? 1,
navHash: json['navHash'] as String? ?? '',
sections:
(json['sections'] as List<dynamic>?)
?.map((e) => TickerNavSection.fromJson(e as Map<String, dynamic>))
.toList() ??
[],
);
$checkedCreate('TickerNavResponse', json, ($checkedConvert) {
final val = TickerNavResponse(
schemaVersion: $checkedConvert(
'schemaVersion',
(v) => (v as num?)?.toInt() ?? 1,
),
navHash: $checkedConvert('navHash', (v) => v as String? ?? ''),
sections: $checkedConvert(
'sections',
(v) =>
(v as List<dynamic>?)
?.map(
(e) => TickerNavSection.fromJson(e as Map<String, dynamic>),
)
.toList() ??
[],
),
);
return val;
});
Map<String, dynamic> _$TickerNavResponseToJson(TickerNavResponse instance) =>
<String, dynamic>{
@@ -25,14 +36,22 @@ Map<String, dynamic> _$TickerNavResponseToJson(TickerNavResponse instance) =>
};
TickerNavSection _$TickerNavSectionFromJson(Map<String, dynamic> json) =>
TickerNavSection(
title: json['title'] as String? ?? '',
pages:
(json['pages'] as List<dynamic>?)
?.map((e) => TickerNavPage.fromJson(e as Map<String, dynamic>))
.toList() ??
[],
);
$checkedCreate('TickerNavSection', json, ($checkedConvert) {
final val = TickerNavSection(
title: $checkedConvert('title', (v) => v as String? ?? ''),
pages: $checkedConvert(
'pages',
(v) =>
(v as List<dynamic>?)
?.map(
(e) => TickerNavPage.fromJson(e as Map<String, dynamic>),
)
.toList() ??
[],
),
);
return val;
});
Map<String, dynamic> _$TickerNavSectionToJson(TickerNavSection instance) =>
<String, dynamic>{
@@ -41,15 +60,21 @@ Map<String, dynamic> _$TickerNavSectionToJson(TickerNavSection instance) =>
};
TickerNavPage _$TickerNavPageFromJson(Map<String, dynamic> json) =>
TickerNavPage(
title: json['title'] as String? ?? '',
slug: json['slug'] as String? ?? '',
kind: json['kind'] as String? ?? 'CONTENT',
hash: json['hash'] as String?,
externalUrl: json['externalUrl'] as String?,
externalUrlNewTab: json['externalUrlNewTab'] as bool?,
fileUrl: json['fileUrl'] as String?,
);
$checkedCreate('TickerNavPage', json, ($checkedConvert) {
final val = TickerNavPage(
title: $checkedConvert('title', (v) => v as String? ?? ''),
slug: $checkedConvert('slug', (v) => v as String? ?? ''),
kind: $checkedConvert('kind', (v) => v as String? ?? 'CONTENT'),
hash: $checkedConvert('hash', (v) => v as String?),
externalUrl: $checkedConvert('externalUrl', (v) => v as String?),
externalUrlNewTab: $checkedConvert(
'externalUrlNewTab',
(v) => v as bool?,
),
fileUrl: $checkedConvert('fileUrl', (v) => v as String?),
);
return val;
});
Map<String, dynamic> _$TickerNavPageToJson(TickerNavPage instance) =>
<String, dynamic>{
@@ -7,22 +7,31 @@ part of 'get_ticker_page_response.dart';
// **************************************************************************
TickerPageResponse _$TickerPageResponseFromJson(Map<String, dynamic> json) =>
TickerPageResponse(
schemaVersion: (json['schemaVersion'] as num?)?.toInt() ?? 1,
slug: json['slug'] as String?,
title: json['title'] as String?,
kind: json['kind'] as String? ?? 'CONTENT',
content: json['content'] as Map<String, dynamic>?,
externalUrl: json['externalUrl'] as String?,
externalUrlNewTab: json['externalUrlNewTab'] as bool?,
fileUrl: json['fileUrl'] as String?,
contentType: json['contentType'] as String?,
filename: json['filename'] as String?,
hash: json['hash'] as String?,
webUrl: json['webUrl'] as String?,
publishedAt: json['publishedAt'] as String?,
fileFetchedAt: json['fileFetchedAt'] as String?,
);
$checkedCreate('TickerPageResponse', json, ($checkedConvert) {
final val = TickerPageResponse(
schemaVersion: $checkedConvert(
'schemaVersion',
(v) => (v as num?)?.toInt() ?? 1,
),
slug: $checkedConvert('slug', (v) => v as String?),
title: $checkedConvert('title', (v) => v as String?),
kind: $checkedConvert('kind', (v) => v as String? ?? 'CONTENT'),
content: $checkedConvert('content', (v) => v as Map<String, dynamic>?),
externalUrl: $checkedConvert('externalUrl', (v) => v as String?),
externalUrlNewTab: $checkedConvert(
'externalUrlNewTab',
(v) => v as bool?,
),
fileUrl: $checkedConvert('fileUrl', (v) => v as String?),
contentType: $checkedConvert('contentType', (v) => v as String?),
filename: $checkedConvert('filename', (v) => v as String?),
hash: $checkedConvert('hash', (v) => v as String?),
webUrl: $checkedConvert('webUrl', (v) => v as String?),
publishedAt: $checkedConvert('publishedAt', (v) => v as String?),
fileFetchedAt: $checkedConvert('fileFetchedAt', (v) => v as String?),
);
return val;
});
Map<String, dynamic> _$TickerPageResponseToJson(TickerPageResponse instance) =>
<String, dynamic>{
@@ -36,6 +36,15 @@ class ClientErrorReporter {
);
}
/// Server entries the decoder could not map (see `decodeListLenient`): the
/// app keeps working without them, the report says which field drifted.
static void reportDecodeWarnings(String context, Iterable<String> warnings) {
for (final warning in warnings) {
log('$context: skipped entry: $warning');
_report(errorType: 'decode', message: warning, context: context);
}
}
static void _report({
required String errorType,
required String message,
@@ -7,11 +7,14 @@ part of 'timetable_get_classes_response.dart';
// **************************************************************************
McTimetableClass _$McTimetableClassFromJson(Map<String, dynamic> json) =>
McTimetableClass(
id: (json['id'] as num).toInt(),
shortName: json['shortName'] as String,
longName: json['longName'] as String,
);
$checkedCreate('McTimetableClass', json, ($checkedConvert) {
final val = McTimetableClass(
id: $checkedConvert('id', (v) => (v as num).toInt()),
shortName: $checkedConvert('shortName', (v) => v as String),
longName: $checkedConvert('longName', (v) => v as String),
);
return val;
});
Map<String, dynamic> _$McTimetableClassToJson(McTimetableClass instance) =>
<String, dynamic>{
@@ -22,15 +25,23 @@ Map<String, dynamic> _$McTimetableClassToJson(McTimetableClass instance) =>
TimetableGetClassesResponse _$TimetableGetClassesResponseFromJson(
Map<String, dynamic> json,
) =>
TimetableGetClassesResponse(
result: (json['result'] as List<dynamic>)
.map((e) => McTimetableClass.fromJson(e as Map<String, dynamic>))
.toList(),
)
..headers = (json['headers'] as Map<String, dynamic>?)?.map(
(k, e) => MapEntry(k, e as String),
);
) => $checkedCreate('TimetableGetClassesResponse', json, ($checkedConvert) {
final val = TimetableGetClassesResponse(
result: $checkedConvert(
'result',
(v) => (v as List<dynamic>)
.map((e) => McTimetableClass.fromJson(e as Map<String, dynamic>))
.toList(),
),
);
$checkedConvert(
'headers',
(v) => val.headers = (v as Map<String, dynamic>?)?.map(
(k, e) => MapEntry(k, e as String),
),
);
return val;
});
Map<String, dynamic> _$TimetableGetClassesResponseToJson(
TimetableGetClassesResponse instance,
@@ -8,15 +8,23 @@ part of 'timetable_get_holidays_response.dart';
TimetableGetHolidaysResponse _$TimetableGetHolidaysResponseFromJson(
Map<String, dynamic> json,
) =>
TimetableGetHolidaysResponse(
result: (json['result'] as List<dynamic>)
.map((e) => McHoliday.fromJson(e as Map<String, dynamic>))
.toList(),
)
..headers = (json['headers'] as Map<String, dynamic>?)?.map(
(k, e) => MapEntry(k, e as String),
);
) => $checkedCreate('TimetableGetHolidaysResponse', json, ($checkedConvert) {
final val = TimetableGetHolidaysResponse(
result: $checkedConvert(
'result',
(v) => (v as List<dynamic>)
.map((e) => McHoliday.fromJson(e as Map<String, dynamic>))
.toList(),
),
);
$checkedConvert(
'headers',
(v) => val.headers = (v as Map<String, dynamic>?)?.map(
(k, e) => MapEntry(k, e as String),
),
);
return val;
});
Map<String, dynamic> _$TimetableGetHolidaysResponseToJson(
TimetableGetHolidaysResponse instance,
@@ -6,11 +6,15 @@ part of 'timetable_get_rooms_response.dart';
// JsonSerializableGenerator
// **************************************************************************
McRoom _$McRoomFromJson(Map<String, dynamic> json) => McRoom(
id: (json['id'] as num).toInt(),
shortName: json['shortName'] as String,
longName: json['longName'] as String,
);
McRoom _$McRoomFromJson(Map<String, dynamic> json) =>
$checkedCreate('McRoom', json, ($checkedConvert) {
final val = McRoom(
id: $checkedConvert('id', (v) => (v as num).toInt()),
shortName: $checkedConvert('shortName', (v) => v as String),
longName: $checkedConvert('longName', (v) => v as String),
);
return val;
});
Map<String, dynamic> _$McRoomToJson(McRoom instance) => <String, dynamic>{
'id': instance.id,
@@ -20,15 +24,23 @@ Map<String, dynamic> _$McRoomToJson(McRoom instance) => <String, dynamic>{
TimetableGetRoomsResponse _$TimetableGetRoomsResponseFromJson(
Map<String, dynamic> json,
) =>
TimetableGetRoomsResponse(
result: (json['result'] as List<dynamic>)
.map((e) => McRoom.fromJson(e as Map<String, dynamic>))
.toList(),
)
..headers = (json['headers'] as Map<String, dynamic>?)?.map(
(k, e) => MapEntry(k, e as String),
);
) => $checkedCreate('TimetableGetRoomsResponse', json, ($checkedConvert) {
final val = TimetableGetRoomsResponse(
result: $checkedConvert(
'result',
(v) => (v as List<dynamic>)
.map((e) => McRoom.fromJson(e as Map<String, dynamic>))
.toList(),
),
);
$checkedConvert(
'headers',
(v) => val.headers = (v as Map<String, dynamic>?)?.map(
(k, e) => MapEntry(k, e as String),
),
);
return val;
});
Map<String, dynamic> _$TimetableGetRoomsResponseToJson(
TimetableGetRoomsResponse instance,
@@ -8,20 +8,27 @@ part of 'timetable_get_schoolyear_response.dart';
TimetableGetSchoolyearResponse _$TimetableGetSchoolyearResponseFromJson(
Map<String, dynamic> json,
) =>
TimetableGetSchoolyearResponse(
id: (json['id'] as num).toInt(),
name: json['name'] as String,
startDate: TimetableGetSchoolyearResponse._dateFromJson(
json['startDate'] as String,
),
endDate: TimetableGetSchoolyearResponse._dateFromJson(
json['endDate'] as String,
),
)
..headers = (json['headers'] as Map<String, dynamic>?)?.map(
(k, e) => MapEntry(k, e as String),
);
) => $checkedCreate('TimetableGetSchoolyearResponse', json, ($checkedConvert) {
final val = TimetableGetSchoolyearResponse(
id: $checkedConvert('id', (v) => (v as num).toInt()),
name: $checkedConvert('name', (v) => v as String),
startDate: $checkedConvert(
'startDate',
(v) => TimetableGetSchoolyearResponse._dateFromJson(v as String),
),
endDate: $checkedConvert(
'endDate',
(v) => TimetableGetSchoolyearResponse._dateFromJson(v as String),
),
);
$checkedConvert(
'headers',
(v) => val.headers = (v as Map<String, dynamic>?)?.map(
(k, e) => MapEntry(k, e as String),
),
);
return val;
});
Map<String, dynamic> _$TimetableGetSchoolyearResponseToJson(
TimetableGetSchoolyearResponse instance,
@@ -7,12 +7,15 @@ part of 'timetable_get_students_response.dart';
// **************************************************************************
McTimetableStudent _$McTimetableStudentFromJson(Map<String, dynamic> json) =>
McTimetableStudent(
id: (json['id'] as num).toInt(),
firstName: json['firstName'] as String,
lastName: json['lastName'] as String,
displayName: json['displayName'] as String,
);
$checkedCreate('McTimetableStudent', json, ($checkedConvert) {
final val = McTimetableStudent(
id: $checkedConvert('id', (v) => (v as num).toInt()),
firstName: $checkedConvert('firstName', (v) => v as String),
lastName: $checkedConvert('lastName', (v) => v as String),
displayName: $checkedConvert('displayName', (v) => v as String),
);
return val;
});
Map<String, dynamic> _$McTimetableStudentToJson(McTimetableStudent instance) =>
<String, dynamic>{
@@ -24,15 +27,23 @@ Map<String, dynamic> _$McTimetableStudentToJson(McTimetableStudent instance) =>
TimetableGetStudentsResponse _$TimetableGetStudentsResponseFromJson(
Map<String, dynamic> json,
) =>
TimetableGetStudentsResponse(
result: (json['result'] as List<dynamic>)
.map((e) => McTimetableStudent.fromJson(e as Map<String, dynamic>))
.toList(),
)
..headers = (json['headers'] as Map<String, dynamic>?)?.map(
(k, e) => MapEntry(k, e as String),
);
) => $checkedCreate('TimetableGetStudentsResponse', json, ($checkedConvert) {
final val = TimetableGetStudentsResponse(
result: $checkedConvert(
'result',
(v) => (v as List<dynamic>)
.map((e) => McTimetableStudent.fromJson(e as Map<String, dynamic>))
.toList(),
),
);
$checkedConvert(
'headers',
(v) => val.headers = (v as Map<String, dynamic>?)?.map(
(k, e) => MapEntry(k, e as String),
),
);
return val;
});
Map<String, dynamic> _$TimetableGetStudentsResponseToJson(
TimetableGetStudentsResponse instance,
@@ -6,12 +6,16 @@ part of 'timetable_get_subjects_response.dart';
// JsonSerializableGenerator
// **************************************************************************
McSubject _$McSubjectFromJson(Map<String, dynamic> json) => McSubject(
id: (json['id'] as num).toInt(),
shortName: json['shortName'] as String,
longName: json['longName'] as String,
color: json['color'] as String?,
);
McSubject _$McSubjectFromJson(Map<String, dynamic> json) =>
$checkedCreate('McSubject', json, ($checkedConvert) {
final val = McSubject(
id: $checkedConvert('id', (v) => (v as num).toInt()),
shortName: $checkedConvert('shortName', (v) => v as String),
longName: $checkedConvert('longName', (v) => v as String),
color: $checkedConvert('color', (v) => v as String?),
);
return val;
});
Map<String, dynamic> _$McSubjectToJson(McSubject instance) => <String, dynamic>{
'id': instance.id,
@@ -22,15 +26,23 @@ Map<String, dynamic> _$McSubjectToJson(McSubject instance) => <String, dynamic>{
TimetableGetSubjectsResponse _$TimetableGetSubjectsResponseFromJson(
Map<String, dynamic> json,
) =>
TimetableGetSubjectsResponse(
result: (json['result'] as List<dynamic>)
.map((e) => McSubject.fromJson(e as Map<String, dynamic>))
.toList(),
)
..headers = (json['headers'] as Map<String, dynamic>?)?.map(
(k, e) => MapEntry(k, e as String),
);
) => $checkedCreate('TimetableGetSubjectsResponse', json, ($checkedConvert) {
final val = TimetableGetSubjectsResponse(
result: $checkedConvert(
'result',
(v) => (v as List<dynamic>)
.map((e) => McSubject.fromJson(e as Map<String, dynamic>))
.toList(),
),
);
$checkedConvert(
'headers',
(v) => val.headers = (v as Map<String, dynamic>?)?.map(
(k, e) => MapEntry(k, e as String),
),
);
return val;
});
Map<String, dynamic> _$TimetableGetSubjectsResponseToJson(
TimetableGetSubjectsResponse instance,
@@ -8,11 +8,14 @@ part of 'timetable_get_teachers_response.dart';
McTimetableTeacherElement _$McTimetableTeacherElementFromJson(
Map<String, dynamic> json,
) => McTimetableTeacherElement(
id: (json['id'] as num).toInt(),
shortName: json['shortName'] as String,
displayName: json['displayName'] as String,
);
) => $checkedCreate('McTimetableTeacherElement', json, ($checkedConvert) {
final val = McTimetableTeacherElement(
id: $checkedConvert('id', (v) => (v as num).toInt()),
shortName: $checkedConvert('shortName', (v) => v as String),
displayName: $checkedConvert('displayName', (v) => v as String),
);
return val;
});
Map<String, dynamic> _$McTimetableTeacherElementToJson(
McTimetableTeacherElement instance,
@@ -24,18 +27,26 @@ Map<String, dynamic> _$McTimetableTeacherElementToJson(
TimetableGetTeachersResponse _$TimetableGetTeachersResponseFromJson(
Map<String, dynamic> json,
) =>
TimetableGetTeachersResponse(
result: (json['result'] as List<dynamic>)
.map(
(e) =>
McTimetableTeacherElement.fromJson(e as Map<String, dynamic>),
)
.toList(),
)
..headers = (json['headers'] as Map<String, dynamic>?)?.map(
(k, e) => MapEntry(k, e as String),
);
) => $checkedCreate('TimetableGetTeachersResponse', json, ($checkedConvert) {
final val = TimetableGetTeachersResponse(
result: $checkedConvert(
'result',
(v) => (v as List<dynamic>)
.map(
(e) =>
McTimetableTeacherElement.fromJson(e as Map<String, dynamic>),
)
.toList(),
),
);
$checkedConvert(
'headers',
(v) => val.headers = (v as Map<String, dynamic>?)?.map(
(k, e) => MapEntry(k, e as String),
),
);
return val;
});
Map<String, dynamic> _$TimetableGetTeachersResponseToJson(
TimetableGetTeachersResponse instance,
@@ -7,12 +7,24 @@ part of 'timetable_get_timegrid_response.dart';
// **************************************************************************
McTimegridUnit _$McTimegridUnitFromJson(Map<String, dynamic> json) =>
McTimegridUnit(
dayOfWeek: _dayFromJson(json['dayOfWeek'] as String),
label: json['label'] as String,
startTime: McTimegridUnit._timeFromJson(json['startTime'] as String),
endTime: McTimegridUnit._timeFromJson(json['endTime'] as String),
);
$checkedCreate('McTimegridUnit', json, ($checkedConvert) {
final val = McTimegridUnit(
dayOfWeek: $checkedConvert(
'dayOfWeek',
(v) => _dayFromJson(v as String),
),
label: $checkedConvert('label', (v) => v as String),
startTime: $checkedConvert(
'startTime',
(v) => McTimegridUnit._timeFromJson(v as String),
),
endTime: $checkedConvert(
'endTime',
(v) => McTimegridUnit._timeFromJson(v as String),
),
);
return val;
});
Map<String, dynamic> _$McTimegridUnitToJson(McTimegridUnit instance) =>
<String, dynamic>{
@@ -24,15 +36,23 @@ Map<String, dynamic> _$McTimegridUnitToJson(McTimegridUnit instance) =>
TimetableGetTimegridResponse _$TimetableGetTimegridResponseFromJson(
Map<String, dynamic> json,
) =>
TimetableGetTimegridResponse(
result: (json['result'] as List<dynamic>)
.map((e) => McTimegridUnit.fromJson(e as Map<String, dynamic>))
.toList(),
)
..headers = (json['headers'] as Map<String, dynamic>?)?.map(
(k, e) => MapEntry(k, e as String),
);
) => $checkedCreate('TimetableGetTimegridResponse', json, ($checkedConvert) {
final val = TimetableGetTimegridResponse(
result: $checkedConvert(
'result',
(v) => (v as List<dynamic>)
.map((e) => McTimegridUnit.fromJson(e as Map<String, dynamic>))
.toList(),
),
);
$checkedConvert(
'headers',
(v) => val.headers = (v as Map<String, dynamic>?)?.map(
(k, e) => MapEntry(k, e as String),
),
);
return val;
});
Map<String, dynamic> _$TimetableGetTimegridResponseToJson(
TimetableGetTimegridResponse instance,
@@ -7,14 +7,23 @@ part of 'timetable_get_week_response.dart';
// **************************************************************************
McTimetableTeacher _$McTimetableTeacherFromJson(Map<String, dynamic> json) =>
McTimetableTeacher(
shortName: json['shortName'] as String,
displayName: json['displayName'] as String,
originalShortName: json['originalShortName'] as String?,
originalDisplayName: json['originalDisplayName'] as String?,
id: (json['id'] as num?)?.toInt(),
originalId: (json['originalId'] as num?)?.toInt(),
);
$checkedCreate('McTimetableTeacher', json, ($checkedConvert) {
final val = McTimetableTeacher(
shortName: $checkedConvert('shortName', (v) => v as String),
displayName: $checkedConvert('displayName', (v) => v as String),
originalShortName: $checkedConvert(
'originalShortName',
(v) => v as String?,
),
originalDisplayName: $checkedConvert(
'originalDisplayName',
(v) => v as String?,
),
id: $checkedConvert('id', (v) => (v as num?)?.toInt()),
originalId: $checkedConvert('originalId', (v) => (v as num?)?.toInt()),
);
return val;
});
Map<String, dynamic> _$McTimetableTeacherToJson(McTimetableTeacher instance) =>
<String, dynamic>{
@@ -26,31 +35,53 @@ Map<String, dynamic> _$McTimetableTeacherToJson(McTimetableTeacher instance) =>
'originalId': instance.originalId,
};
McTimetableEntry _$McTimetableEntryFromJson(Map<String, dynamic> json) =>
McTimetableEntry(
id: (json['id'] as num).toInt(),
date: McTimetableEntry._dateFromJson(json['date'] as String),
startTime: McTimetableEntry._timeFromJson(json['startTime'] as String),
endTime: McTimetableEntry._timeFromJson(json['endTime'] as String),
subjects: (json['subjects'] as List<dynamic>)
.map((e) => e as String)
.toList(),
teachers: (json['teachers'] as List<dynamic>)
McTimetableEntry _$McTimetableEntryFromJson(
Map<String, dynamic> json,
) => $checkedCreate('McTimetableEntry', json, ($checkedConvert) {
final val = McTimetableEntry(
id: $checkedConvert('id', (v) => (v as num).toInt()),
date: $checkedConvert(
'date',
(v) => McTimetableEntry._dateFromJson(v as String),
),
startTime: $checkedConvert(
'startTime',
(v) => McTimetableEntry._timeFromJson(v as String),
),
endTime: $checkedConvert(
'endTime',
(v) => McTimetableEntry._timeFromJson(v as String),
),
subjects: $checkedConvert(
'subjects',
(v) => (v as List<dynamic>).map((e) => e as String).toList(),
),
teachers: $checkedConvert(
'teachers',
(v) => (v as List<dynamic>)
.map((e) => McTimetableTeacher.fromJson(e as Map<String, dynamic>))
.toList(),
rooms: (json['rooms'] as List<dynamic>).map((e) => e as String).toList(),
classNames: (json['classNames'] as List<dynamic>)
.map((e) => e as String)
.toList(),
lessonType: json['lessonType'] as String,
status: json['status'] as String,
substitutionText: json['substitutionText'] as String?,
lessonText: json['lessonText'] as String?,
infoText: json['infoText'] as String?,
classIds: (json['classIds'] as List<dynamic>?)
?.map((e) => (e as num).toInt())
.toList(),
);
),
rooms: $checkedConvert(
'rooms',
(v) => (v as List<dynamic>).map((e) => e as String).toList(),
),
classNames: $checkedConvert(
'classNames',
(v) => (v as List<dynamic>).map((e) => e as String).toList(),
),
lessonType: $checkedConvert('lessonType', (v) => v as String),
status: $checkedConvert('status', (v) => v as String),
substitutionText: $checkedConvert('substitutionText', (v) => v as String?),
lessonText: $checkedConvert('lessonText', (v) => v as String?),
infoText: $checkedConvert('infoText', (v) => v as String?),
classIds: $checkedConvert(
'classIds',
(v) => (v as List<dynamic>?)?.map((e) => (e as num).toInt()).toList(),
),
);
return val;
});
Map<String, dynamic> _$McTimetableEntryToJson(McTimetableEntry instance) =>
<String, dynamic>{
@@ -72,17 +103,31 @@ Map<String, dynamic> _$McTimetableEntryToJson(McTimetableEntry instance) =>
TimetableGetWeekResponse _$TimetableGetWeekResponseFromJson(
Map<String, dynamic> json,
) =>
TimetableGetWeekResponse(
from: McTimetableEntry._dateFromJson(json['from'] as String),
until: McTimetableEntry._dateFromJson(json['until'] as String),
entries: (json['entries'] as List<dynamic>)
.map((e) => McTimetableEntry.fromJson(e as Map<String, dynamic>))
.toList(),
)
..headers = (json['headers'] as Map<String, dynamic>?)?.map(
(k, e) => MapEntry(k, e as String),
);
) => $checkedCreate('TimetableGetWeekResponse', json, ($checkedConvert) {
final val = TimetableGetWeekResponse(
from: $checkedConvert(
'from',
(v) => McTimetableEntry._dateFromJson(v as String),
),
until: $checkedConvert(
'until',
(v) => McTimetableEntry._dateFromJson(v as String),
),
entries: $checkedConvert(
'entries',
(v) => (v as List<dynamic>)
.map((e) => McTimetableEntry.fromJson(e as Map<String, dynamic>))
.toList(),
),
);
$checkedConvert(
'headers',
(v) => val.headers = (v as Map<String, dynamic>?)?.map(
(k, e) => MapEntry(k, e as String),
),
);
return val;
});
Map<String, dynamic> _$TimetableGetWeekResponseToJson(
TimetableGetWeekResponse instance,
@@ -7,13 +7,16 @@ part of 'user_search_response.dart';
// **************************************************************************
McUserSearchResult _$McUserSearchResultFromJson(Map<String, dynamic> json) =>
McUserSearchResult(
username: json['username'] as String,
firstName: json['firstName'] as String,
lastName: json['lastName'] as String,
userType: json['userType'] as String,
className: json['className'] as String?,
);
$checkedCreate('McUserSearchResult', json, ($checkedConvert) {
final val = McUserSearchResult(
username: $checkedConvert('username', (v) => v as String),
firstName: $checkedConvert('firstName', (v) => v as String),
lastName: $checkedConvert('lastName', (v) => v as String),
userType: $checkedConvert('userType', (v) => v as String),
className: $checkedConvert('className', (v) => v as String?),
);
return val;
});
Map<String, dynamic> _$McUserSearchResultToJson(McUserSearchResult instance) =>
<String, dynamic>{
@@ -25,14 +28,25 @@ Map<String, dynamic> _$McUserSearchResultToJson(McUserSearchResult instance) =>
};
UserSearchResponse _$UserSearchResponseFromJson(Map<String, dynamic> json) =>
UserSearchResponse(
result: (json['result'] as List<dynamic>)
.map((e) => McUserSearchResult.fromJson(e as Map<String, dynamic>))
.toList(),
)
..headers = (json['headers'] as Map<String, dynamic>?)?.map(
(k, e) => MapEntry(k, e as String),
$checkedCreate('UserSearchResponse', json, ($checkedConvert) {
final val = UserSearchResponse(
result: $checkedConvert(
'result',
(v) => (v as List<dynamic>)
.map(
(e) => McUserSearchResult.fromJson(e as Map<String, dynamic>),
)
.toList(),
),
);
$checkedConvert(
'headers',
(v) => val.headers = (v as Map<String, dynamic>?)?.map(
(k, e) => MapEntry(k, e as String),
),
);
return val;
});
Map<String, dynamic> _$UserSearchResponseToJson(UserSearchResponse instance) =>
<String, dynamic>{