Skip to content

Commit

Permalink
Merge pull request #18 from albertms10/feat/reduce-json-properties-ke…
Browse files Browse the repository at this point in the history
…y-length

feat(model): reduce JSON properties key length
  • Loading branch information
albertms10 committed Dec 5, 2021
2 parents f08fc06 + ae0689d commit 9cdae9b
Show file tree
Hide file tree
Showing 11 changed files with 183 additions and 116 deletions.
35 changes: 23 additions & 12 deletions lib/model/booking.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,15 @@ import 'package:cabin_booking/utils/time_of_day_extension.dart';
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';

abstract class _JsonFields {
static const description = 'de';
static const date = 'd';
static const startTime = 'st';
static const endTime = 'et';
static const status = 's';
static const isLocked = 'il';
}

class Booking extends Item {
String? description;
DateTime? date;
Expand Down Expand Up @@ -33,23 +42,25 @@ class Booking extends Item {
}) : super(id: id);

Booking.from(Map<String, dynamic> other)
: description = other['description'] as String?,
date = DateTime.tryParse(other['date'] as String),
startTime = TimeOfDayExtension.tryParse(other['startTime'] as String),
endTime = TimeOfDayExtension.tryParse(other['endTime'] as String),
status = BookingStatus.values[other['status'] as int],
isLocked = other['isLocked'] as bool,
: description = other[_JsonFields.description] as String?,
date = DateTime.tryParse(other[_JsonFields.date] as String),
startTime =
TimeOfDayExtension.tryParse(other[_JsonFields.startTime] as String),
endTime =
TimeOfDayExtension.tryParse(other[_JsonFields.endTime] as String),
status = BookingStatus.values[other[_JsonFields.status] as int],
isLocked = other[_JsonFields.isLocked] as bool,
super.from(other);

@override
Map<String, dynamic> toJson() => {
...super.toJson(),
'description': description,
'date': date!.toIso8601String().split('T').first,
'startTime': startTime!.format24Hour(),
'endTime': endTime!.format24Hour(),
'status': status.index,
'isLocked': isLocked,
_JsonFields.description: description,
_JsonFields.date: date!.toIso8601String().split('T').first,
_JsonFields.startTime: startTime!.format24Hour(),
_JsonFields.endTime: endTime!.format24Hour(),
_JsonFields.status: status.index,
_JsonFields.isLocked: isLocked,
};

DateTime get startDateTime => date!.addTimeOfDay(startTime);
Expand Down
42 changes: 26 additions & 16 deletions lib/model/cabin.dart
Original file line number Diff line number Diff line change
@@ -1,47 +1,57 @@
import 'package:cabin_booking/model/booking.dart';
import 'package:cabin_booking/model/booking_manager.dart';
import 'package:cabin_booking/model/cabin_components.dart';
import 'package:cabin_booking/model/cabin_elements/cabin_elements.dart';
import 'package:cabin_booking/model/date_range.dart';
import 'package:cabin_booking/model/item.dart';
import 'package:cabin_booking/model/recurring_booking.dart';
import 'package:flutter/material.dart';

abstract class _JsonFields {
static const number = 'n';
static const elements = 'e';
static const bookings = 'b';
static const recurringBookings = 'rb';
}

class Cabin extends Item {
int number;
late CabinComponents components;
late CabinElements elements;
final BookingManager _bookingManager;

Cabin({
String? id,
this.number = 0,
CabinComponents? components,
CabinElements? elements,
Set<Booking>? bookings,
Set<RecurringBooking>? recurringBookings,
}) : _bookingManager = BookingManager(
bookings: bookings,
recurringBookings: recurringBookings,
),
super(id: id) {
this.components = components ?? CabinComponents();
this.elements = elements ?? CabinElements();
}

Cabin.from(Map<String, dynamic> other)
: number = other['number'] as int,
components =
CabinComponents.from(other['components'] as Map<String, dynamic>),
: number = other[_JsonFields.number] as int,
elements = CabinElements.from(
other[_JsonFields.elements] as Map<String, dynamic>,
),
_bookingManager = BookingManager.from(
bookings: other['bookings'] as List<dynamic>,
recurringBookings: other['recurringBookings'] as List<dynamic>,
bookings: other[_JsonFields.bookings] as List<dynamic>,
recurringBookings:
other[_JsonFields.recurringBookings] as List<dynamic>,
),
super.from(other);

@override
Map<String, dynamic> toJson() => {
...super.toJson(),
'number': number,
'components': components.toJson(),
'bookings': _bookingManager.bookingsToJson(),
'recurringBookings': _bookingManager.recurringBookingsToJson(),
_JsonFields.number: number,
_JsonFields.elements: elements.toJson(),
_JsonFields.bookings: _bookingManager.bookingsToJson(),
_JsonFields.recurringBookings:
_bookingManager.recurringBookingsToJson(),
};

Cabin simplified() => Cabin(id: id, number: number);
Expand Down Expand Up @@ -113,18 +123,18 @@ class Cabin extends Item {
@override
Cabin copyWith({
int? number,
CabinComponents? components,
CabinElements? elements,
}) =>
Cabin(
id: id,
number: number ?? this.number,
components: components ?? this.components,
elements: elements ?? this.elements,
);

@override
void replaceWith(covariant Cabin item) {
number = item.number;
components = item.components;
elements = item.elements;

super.replaceWith(item);
}
Expand Down
53 changes: 0 additions & 53 deletions lib/model/cabin_components.dart

This file was deleted.

39 changes: 39 additions & 0 deletions lib/model/cabin_elements/cabin_elements.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import 'package:cabin_booking/model/cabin_elements/piano.dart';

abstract class _JsonFields {
static const pianos = 'p';
static const lecterns = 'l';
static const chairs = 'c';
static const tables = 't';
}

class CabinElements {
late List<Piano> pianos;
int lecterns;
int chairs;
int tables;

CabinElements({
List<Piano>? pianos,
this.lecterns = 0,
this.chairs = 0,
this.tables = 0,
}) {
this.pianos = pianos ?? <Piano>[];
}

CabinElements.from(Map<String, dynamic> other)
: pianos = (other[_JsonFields.pianos] as List<dynamic>)
.map((piano) => Piano.from(piano))
.toList(),
lecterns = other[_JsonFields.lecterns] as int,
chairs = other[_JsonFields.chairs] as int,
tables = other[_JsonFields.tables] as int;

Map<String, dynamic> toJson() => {
_JsonFields.pianos: pianos.map((piano) => piano.toJson()).toList(),
_JsonFields.lecterns: lecterns,
_JsonFields.chairs: chairs,
_JsonFields.tables: tables,
};
}
28 changes: 28 additions & 0 deletions lib/model/cabin_elements/piano.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
abstract class _JsonFields {
static const brand = 'b';
static const model = 'm';
static const isElectronic = 'ie';
}

class Piano {
String? brand;
String? model;
bool isElectronic;

Piano({
this.brand,
this.model,
this.isElectronic = false,
});

Piano.from(Map<String, dynamic> other)
: brand = other[_JsonFields.brand] as String?,
model = other[_JsonFields.model] as String?,
isElectronic = other[_JsonFields.isElectronic] as bool;

Map<String, dynamic> toJson() => {
_JsonFields.brand: brand,
_JsonFields.model: model,
_JsonFields.isElectronic: isElectronic,
};
}
13 changes: 9 additions & 4 deletions lib/model/date_range.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,11 @@ import 'package:cabin_booking/model/item.dart';
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';

abstract class _JsonFields {
static const startDate = 'sd';
static const endDate = 'ed';
}

class DateRange extends Item {
DateTime? startDate;
DateTime? endDate;
Expand All @@ -18,15 +23,15 @@ class DateRange extends Item {
}

DateRange.from(Map<String, dynamic> other)
: startDate = DateTime.tryParse(other['startDate'] as String),
endDate = DateTime.tryParse(other['endDate'] as String),
: startDate = DateTime.tryParse(other[_JsonFields.startDate] as String),
endDate = DateTime.tryParse(other[_JsonFields.endDate] as String),
super.from(other);

@override
Map<String, dynamic> toJson() => {
...super.toJson(),
'startDate': startDate!.toIso8601String().split('T').first,
'endDate': endDate!.toIso8601String().split('T').first,
_JsonFields.startDate: startDate!.toIso8601String().split('T').first,
_JsonFields.endDate: endDate!.toIso8601String().split('T').first,
};

@override
Expand Down
8 changes: 6 additions & 2 deletions lib/model/holiday.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
import 'package:cabin_booking/model/date_range.dart';

abstract class _JsonFields {
static const kind = 'k';
}

class Holiday extends DateRange {
final HolidayKind kind;

Expand All @@ -15,13 +19,13 @@ class Holiday extends DateRange {
);

Holiday.from(Map<String, dynamic> other)
: kind = HolidayKind.values[other['kind'] as int],
: kind = HolidayKind.values[other[_JsonFields.kind] as int],
super.from(other);

@override
Map<String, dynamic> toJson() => {
...super.toJson(),
'kind': kind.index,
_JsonFields.kind: kind.index,
};
}

Expand Down
31 changes: 21 additions & 10 deletions lib/model/item.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,13 @@ import 'package:cabin_booking/model/serializable.dart';
import 'package:flutter/material.dart';
import 'package:uuid/uuid.dart';

abstract class _JsonFields {
static const id = 'id';
static const creationDateTime = 'cdt';
static const modificationDateTime = 'mdt';
static const modificationCount = 'mc';
}

abstract class Item implements Comparable<Item>, Serializable {
late String id;
final DateTime creationDateTime;
Expand All @@ -15,22 +22,26 @@ abstract class Item implements Comparable<Item>, Serializable {
}

Item.from(Map<String, dynamic> other)
: id = other['id'] as String,
: id = other[_JsonFields.id] as String,
creationDateTime =
DateTime.tryParse(other['creationDateTime'] as String)!,
modificationDateTime = other.containsKey('modificationDateTime')
? DateTime.tryParse(other['modificationDateTime'] as String)
: null,
modificationCount = other['modificationCount'] as int;
DateTime.tryParse(other[_JsonFields.creationDateTime] as String)!,
modificationDateTime =
other.containsKey(_JsonFields.modificationDateTime)
? DateTime.tryParse(
other[_JsonFields.modificationDateTime] as String,
)
: null,
modificationCount = other[_JsonFields.modificationCount] as int;

@override
@mustCallSuper
Map<String, dynamic> toJson() => {
'id': id,
'creationDateTime': creationDateTime.toIso8601String(),
_JsonFields.id: id,
_JsonFields.creationDateTime: creationDateTime.toIso8601String(),
if (modificationDateTime != null)
'modificationDateTime': modificationDateTime!.toIso8601String(),
'modificationCount': modificationCount,
_JsonFields.modificationDateTime:
modificationDateTime!.toIso8601String(),
_JsonFields.modificationCount: modificationCount,
};

Item copyWith();
Expand Down
Loading

0 comments on commit 9cdae9b

Please sign in to comment.