diff --git a/database/lib/src/database.dart b/database/lib/src/database.dart index fcb7af7..0a912bd 100644 --- a/database/lib/src/database.dart +++ b/database/lib/src/database.dart @@ -7,26 +7,68 @@ part 'database.g.dart'; final _random = Random(DateTime.now().millisecondsSinceEpoch); int generateId() => _random.nextInt(0xFFFFFFFF); -class WorkModel { +class WorkPartData { final Work work; final List instrumentIds; - WorkModel({ - @required this.work, - @required this.instrumentIds, + WorkPartData({ + this.work, + this.instrumentIds, }); + + factory WorkPartData.fromJson(Map json) => WorkPartData( + work: Work.fromJson(json['work']), + instrumentIds: List.from(json['instrumentIds']), + ); + + Map toJson() => { + 'work': work.toJson(), + 'instrumentIds': instrumentIds, + }; } -class PerformanceModel { - final Person person; - final Ensemble ensemble; - final Instrument role; +class WorkData { + final WorkPartData data; + final List partData; - PerformanceModel({ - this.person, - this.ensemble, - this.role, + WorkData({ + this.data, + this.partData, }); + + factory WorkData.fromJson(Map json) => WorkData( + data: WorkPartData.fromJson(json['data']), + partData: json['partData'] + .map((j) => WorkPartData.fromJson(j)) + .toList(), + ); + + Map toJson() => { + 'data': data.toJson(), + 'partData': partData.map((d) => d.toJson()).toList(), + }; +} + +class RecordingData { + final Recording recording; + final List performances; + + RecordingData({ + this.recording, + this.performances, + }); + + factory RecordingData.fromJson(Map json) => RecordingData( + recording: Recording.fromJson(json['recording']), + performances: json['performances'] + .map((j) => Performance.fromJson(j)) + .toList(), + ); + + Map toJson() => { + 'recording': recording.toJson(), + 'performances': performances.map((p) => p.toJson()).toList(), + }; } @UseMoor( @@ -57,25 +99,25 @@ class Database extends _$Database { await into(instruments).insert(instrument, orReplace: true); } - Future updateWork(WorkModel model, List parts) async { + Future updateWork(WorkData data) async { await transaction(() async { - final workId = model.work.id; + final workId = data.data.work.id; await (delete(works)..where((w) => w.id.equals(workId))).go(); await (delete(works)..where((w) => w.partOf.equals(workId))).go(); - Future insertWork(WorkModel model) async { - await into(works).insert(model.work); + Future insertWork(WorkPartData partData) async { + await into(works).insert(partData.work); await batch((b) => b.insertAll( instrumentations, - model.instrumentIds + partData.instrumentIds .map((id) => - Instrumentation(work: model.work.id, instrument: id)) + Instrumentation(work: partData.work.id, instrument: id)) .toList())); } - await insertWork(model); - for (final part in parts) { - await insertWork(part); + await insertWork(data.data); + for (final partData in data.partData) { + await insertWork(partData); } }); } @@ -84,20 +126,14 @@ class Database extends _$Database { await into(ensembles).insert(ensemble, orReplace: true); } - Future updateRecording( - Recording recording, List models) async { + Future updateRecording(RecordingData data) async { await transaction(() async { await (delete(performances) - ..where((p) => p.recording.equals(recording.id))) + ..where((p) => p.recording.equals(data.recording.id))) .go(); - await into(recordings).insert(recording, orReplace: true); - for (final model in models) { - await into(performances).insert(Performance( - recording: recording.id, - person: model.person?.id, - ensemble: model.ensemble?.id, - role: model.role?.id, - )); + await into(recordings).insert(data.recording, orReplace: true); + for (final performance in data.performances) { + await into(performances).insert(performance); } }); } diff --git a/mobile/lib/editors/recording.dart b/mobile/lib/editors/recording.dart index 9d2beb7..4934cf5 100644 --- a/mobile/lib/editors/recording.dart +++ b/mobile/lib/editors/recording.dart @@ -21,7 +21,7 @@ class _RecordingEditorState extends State { final commentController = TextEditingController(); Work work; - List performances = []; + List performanceModels = []; @override void initState() { @@ -64,7 +64,20 @@ class _RecordingEditorState extends State { comment: commentController.text, ); - await backend.db.updateRecording(recording, performances); + final performances = performanceModels + .map((m) => Performance( + recording: recording.id, + person: m.person?.id, + ensemble: m.ensemble?.id, + role: m.role?.id, + )) + .toList(); + + await backend.db.updateRecording(RecordingData( + recording: recording, + performances: performances, + )); + Navigator.pop(context, recording); }, ) @@ -74,10 +87,10 @@ class _RecordingEditorState extends State { children: [ work != null ? ListTile( - title: WorkText(work.id), - subtitle: ComposersText(work.id), - onTap: selectWork, - ) + title: WorkText(work.id), + subtitle: ComposersText(work.id), + onTap: selectWork, + ) : ListTile( title: Text('Work'), subtitle: Text('Select work'), @@ -111,13 +124,13 @@ class _RecordingEditorState extends State { if (model != null) { setState(() { - performances.add(model); + performanceModels.add(model); }); } }, ), ), - for (final performance in performances) + for (final performance in performanceModels) ListTile( title: Text(performance.person != null ? '${performance.person.firstName} ${performance.person.lastName}' @@ -128,7 +141,7 @@ class _RecordingEditorState extends State { icon: const Icon(Icons.delete), onPressed: () { setState(() { - performances.remove(performance); + performanceModels.remove(performance); }); }, ), diff --git a/mobile/lib/editors/work.dart b/mobile/lib/editors/work.dart index 145acc7..f1b0adf 100644 --- a/mobile/lib/editors/work.dart +++ b/mobile/lib/editors/work.dart @@ -295,7 +295,7 @@ class _WorkEditorState extends State { onPressed: () async { final workId = widget.work?.id ?? generateId(); - final model = WorkModel( + final data = WorkPartData( work: Work( id: workId, title: titleController.text, @@ -304,10 +304,10 @@ class _WorkEditorState extends State { instrumentIds: instruments.map((i) => i.id).toList(), ); - final List partModels = []; + final List partData = []; for (var i = 0; i < parts.length; i++) { final part = parts[i]; - partModels.add(WorkModel( + partData.add(WorkPartData( work: Work( id: generateId(), title: part.titleController.text, @@ -319,8 +319,12 @@ class _WorkEditorState extends State { )); } - await backend.db.updateWork(model, partModels); - Navigator.pop(context, model.work); + await backend.db.updateWork(WorkData( + data: data, + partData: partData, + )); + + Navigator.pop(context, data.work); }, ), ], diff --git a/mobile/lib/selectors/performer.dart b/mobile/lib/selectors/performer.dart index b270c27..dcc66a0 100644 --- a/mobile/lib/selectors/performer.dart +++ b/mobile/lib/selectors/performer.dart @@ -7,6 +7,18 @@ import '../editors/person.dart'; import 'instruments.dart'; +class PerformanceModel { + final Person person; + final Ensemble ensemble; + final Instrument role; + + PerformanceModel({ + this.person, + this.ensemble, + this.role, + }); +} + class PerformerSelector extends StatefulWidget { @override _PerformerSelectorState createState() => _PerformerSelectorState();