From 67d7a374d4623a0dd5ebd54b3ae58136e1600623 Mon Sep 17 00:00:00 2001 From: Joshua Burman Date: Sun, 15 Dec 2024 22:21:23 -0500 Subject: [PATCH 1/9] down with daos, mild refactoring, moving to pulling from real data --- lib/database/daos/activities_dao.dart | 35 +++ lib/database/daos/activities_dao.g.dart | 8 + lib/database/daos/media_items_dao.dart | 37 +++ lib/database/daos/media_items_dao.g.dart | 8 + lib/database/daos/session_activities_dao.dart | 24 ++ .../daos/session_activities_dao.g.dart | 11 + lib/database/daos/sessions_dao.dart | 17 ++ lib/database/daos/sessions_dao.g.dart | 8 + lib/{ => database}/database.dart | 16 +- lib/{ => database}/database.g.dart | 263 ++++++------------ lib/database/seed.dart | 160 +++++++++++ lib/main.dart | 81 +----- lib/screens/activities_screen.dart | 37 +-- lib/screens/sessions_screen.dart | 80 ++---- lib/widgets/activity_card.dart | 54 ++-- lib/widgets/activity_view.dart | 33 +-- lib/widgets/media_card.dart | 18 +- lib/widgets/session_card.dart | 2 +- lib/widgets/session_view.dart | 230 ++++++--------- lib/widgets/session_view_achievements.dart | 65 +++++ lib/widgets/session_view_activities.dart | 28 ++ lib/widgets/session_view_media.dart | 44 +++ 22 files changed, 731 insertions(+), 528 deletions(-) create mode 100644 lib/database/daos/activities_dao.dart create mode 100644 lib/database/daos/activities_dao.g.dart create mode 100644 lib/database/daos/media_items_dao.dart create mode 100644 lib/database/daos/media_items_dao.g.dart create mode 100644 lib/database/daos/session_activities_dao.dart create mode 100644 lib/database/daos/session_activities_dao.g.dart create mode 100644 lib/database/daos/sessions_dao.dart create mode 100644 lib/database/daos/sessions_dao.g.dart rename lib/{ => database}/database.dart (90%) rename lib/{ => database}/database.g.dart (95%) create mode 100644 lib/database/seed.dart create mode 100644 lib/widgets/session_view_achievements.dart create mode 100644 lib/widgets/session_view_activities.dart create mode 100644 lib/widgets/session_view_media.dart diff --git a/lib/database/daos/activities_dao.dart b/lib/database/daos/activities_dao.dart new file mode 100644 index 0000000..3a50042 --- /dev/null +++ b/lib/database/daos/activities_dao.dart @@ -0,0 +1,35 @@ +import 'package:drift/drift.dart'; +import 'package:sendtrain/database/database.dart'; + +part 'activities_dao.g.dart'; + +@DriftAccessor(tables: [Activities]) +class ActivitiesDao extends DatabaseAccessor with _$ActivitiesDaoMixin { + ActivitiesDao(super.db); + + Future> all() async { + return await select(activities).get(); + } + + Future> find(int id) async { + return await (select(activities)..where((activity) => activity.id.equals(id) )).get(); + } + + Future> sessionActivities(int id) async { + final result = select(db.sessionActivities).join( + [ + innerJoin( + db.activities, + db.activities.id + .equalsExp(db.sessionActivities.activityId), + ), + ], + )..where(db.sessionActivities.sessionId.equals(id)); + + final activities = (await result.get()) + .map((e) => e.readTable(db.activities)) + .toList(); + + return activities; + } +} \ No newline at end of file diff --git a/lib/database/daos/activities_dao.g.dart b/lib/database/daos/activities_dao.g.dart new file mode 100644 index 0000000..076f68c --- /dev/null +++ b/lib/database/daos/activities_dao.g.dart @@ -0,0 +1,8 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'activities_dao.dart'; + +// ignore_for_file: type=lint +mixin _$ActivitiesDaoMixin on DatabaseAccessor { + $ActivitiesTable get activities => attachedDatabase.activities; +} diff --git a/lib/database/daos/media_items_dao.dart b/lib/database/daos/media_items_dao.dart new file mode 100644 index 0000000..2f2fced --- /dev/null +++ b/lib/database/daos/media_items_dao.dart @@ -0,0 +1,37 @@ +import 'package:drift/drift.dart'; +import 'package:sendtrain/database/database.dart'; + +part 'media_items_dao.g.dart'; + +@DriftAccessor(tables: [MediaItems]) +class MediaItemsDao extends DatabaseAccessor with _$MediaItemsDaoMixin { + MediaItemsDao(super.db); + + Future> all() async { + return await select(mediaItems).get(); + } + + Future> find(int id) async { + return await (select(mediaItems)..where((mediaItem) => mediaItem.id.equals(id) )).get(); + } + + Future> mediaItemsFromSession(Session session) async { + final result = select(db.objectMediaItems).join( + [ + innerJoin( + db.mediaItems, + db.mediaItems.id.equalsExp(db.objectMediaItems.mediaId), + ), + ], + ) + ..where( + db.objectMediaItems.objectType.equals(ObjectType.sessions.name)) + ..where(db.objectMediaItems.objectId.equals(session.id)); + + final mediaItems = (await result.get()) + .map((e) => e.readTable(db.mediaItems)) + .toList(); + + return mediaItems; + } +} diff --git a/lib/database/daos/media_items_dao.g.dart b/lib/database/daos/media_items_dao.g.dart new file mode 100644 index 0000000..0055aa8 --- /dev/null +++ b/lib/database/daos/media_items_dao.g.dart @@ -0,0 +1,8 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'media_items_dao.dart'; + +// ignore_for_file: type=lint +mixin _$MediaItemsDaoMixin on DatabaseAccessor { + $MediaItemsTable get mediaItems => attachedDatabase.mediaItems; +} diff --git a/lib/database/daos/session_activities_dao.dart b/lib/database/daos/session_activities_dao.dart new file mode 100644 index 0000000..bb4a0c6 --- /dev/null +++ b/lib/database/daos/session_activities_dao.dart @@ -0,0 +1,24 @@ +import 'package:drift/drift.dart'; +import 'package:sendtrain/database/database.dart'; + +part 'session_activities_dao.g.dart'; + +@DriftAccessor(tables: [SessionActivities]) +class SessionActivitiesDao extends DatabaseAccessor with _$SessionActivitiesDaoMixin { + SessionActivitiesDao(super.db); + + Future> all() async { + return await select(sessionActivities).get(); + } + + Future> find(int id) async { + return await (select(sessionActivities)..where((sessionActivity) => sessionActivity.id.equals(id) )).get(); + } + + Future> sessionActivitiesBySessionId(int id) async { + final result = db.managers.sessionActivities + .filter((sessionActivity) => sessionActivity.sessionId.id(id)); + + return result.get(); + } +} \ No newline at end of file diff --git a/lib/database/daos/session_activities_dao.g.dart b/lib/database/daos/session_activities_dao.g.dart new file mode 100644 index 0000000..911e7a9 --- /dev/null +++ b/lib/database/daos/session_activities_dao.g.dart @@ -0,0 +1,11 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'session_activities_dao.dart'; + +// ignore_for_file: type=lint +mixin _$SessionActivitiesDaoMixin on DatabaseAccessor { + $SessionsTable get sessions => attachedDatabase.sessions; + $ActivitiesTable get activities => attachedDatabase.activities; + $SessionActivitiesTable get sessionActivities => + attachedDatabase.sessionActivities; +} diff --git a/lib/database/daos/sessions_dao.dart b/lib/database/daos/sessions_dao.dart new file mode 100644 index 0000000..bb7aee5 --- /dev/null +++ b/lib/database/daos/sessions_dao.dart @@ -0,0 +1,17 @@ +import 'package:drift/drift.dart'; +import 'package:sendtrain/database/database.dart'; + +part 'sessions_dao.g.dart'; + +@DriftAccessor(tables: [Sessions]) +class SessionsDao extends DatabaseAccessor with _$SessionsDaoMixin { + SessionsDao(super.db); + + Future> all() async { + return await select(sessions).get(); + } + + Future> find(int id) async { + return await (select(sessions)..where((session) => session.id.equals(id) )).get(); + } +} \ No newline at end of file diff --git a/lib/database/daos/sessions_dao.g.dart b/lib/database/daos/sessions_dao.g.dart new file mode 100644 index 0000000..a2d2318 --- /dev/null +++ b/lib/database/daos/sessions_dao.g.dart @@ -0,0 +1,8 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'sessions_dao.dart'; + +// ignore_for_file: type=lint +mixin _$SessionsDaoMixin on DatabaseAccessor { + $SessionsTable get sessions => attachedDatabase.sessions; +} diff --git a/lib/database.dart b/lib/database/database.dart similarity index 90% rename from lib/database.dart rename to lib/database/database.dart index efeb00e..d44025c 100644 --- a/lib/database.dart +++ b/lib/database/database.dart @@ -1,5 +1,7 @@ import 'package:drift/drift.dart'; import 'package:drift_flutter/drift_flutter.dart'; +import 'package:sendtrain/database/daos/activities_dao.dart'; +import 'package:sendtrain/database/daos/sessions_dao.dart'; part 'database.g.dart'; @@ -74,9 +76,15 @@ class Actions extends Table { DateTimeColumn get createdAt => dateTime().withDefault(Variable(DateTime.now()))(); } +enum ObjectType { + actions, + activities, + sessions, +} class ObjectMediaItems extends Table { IntColumn get id => integer().autoIncrement()(); - IntColumn get objectId => integer().references(Actions, #id)(); + IntColumn get objectId => integer()(); + TextColumn get objectType => textEnum()(); IntColumn get mediaId => integer().references(MediaItems, #id)(); DateTimeColumn get createdAt => dateTime().withDefault(Variable(DateTime.now()))(); } @@ -89,7 +97,7 @@ class MediaItems extends Table { IntColumn get id => integer().autoIncrement()(); TextColumn get title => text().withLength(min: 3, max: 32)(); TextColumn get description => text().named('body')(); - TextColumn get reference => text().withLength(min: 3, max: 32)(); + TextColumn get reference => text().withLength(min: 3, max: 256)(); TextColumn get type => textEnum()(); DateTimeColumn get createdAt => dateTime().withDefault(Variable(DateTime.now()))(); } @@ -102,6 +110,10 @@ class MediaItems extends Table { Actions, ObjectMediaItems, MediaItems +], daos: [ + SessionsDao, + ActivitiesDao, + MediaItems ]) class AppDatabase extends _$AppDatabase { diff --git a/lib/database.g.dart b/lib/database/database.g.dart similarity index 95% rename from lib/database.g.dart rename to lib/database/database.g.dart index 539d583..d254f27 100644 --- a/lib/database.g.dart +++ b/lib/database/database.g.dart @@ -1644,7 +1644,7 @@ class $MediaItemsTable extends MediaItems late final GeneratedColumn reference = GeneratedColumn( 'reference', aliasedName, false, additionalChecks: - GeneratedColumn.checkTextLength(minTextLength: 3, maxTextLength: 32), + GeneratedColumn.checkTextLength(minTextLength: 3, maxTextLength: 256), type: DriftSqlType.string, requiredDuringInsert: true); static const VerificationMeta _typeMeta = const VerificationMeta('type'); @@ -1975,10 +1975,15 @@ class $ObjectMediaItemsTable extends ObjectMediaItems @override late final GeneratedColumn objectId = GeneratedColumn( 'object_id', aliasedName, false, - type: DriftSqlType.int, - requiredDuringInsert: true, - defaultConstraints: - GeneratedColumn.constraintIsAlways('REFERENCES actions (id)')); + type: DriftSqlType.int, requiredDuringInsert: true); + static const VerificationMeta _objectTypeMeta = + const VerificationMeta('objectType'); + @override + late final GeneratedColumnWithTypeConverter objectType = + GeneratedColumn('object_type', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true) + .withConverter( + $ObjectMediaItemsTable.$converterobjectType); static const VerificationMeta _mediaIdMeta = const VerificationMeta('mediaId'); @override @@ -1997,7 +2002,8 @@ class $ObjectMediaItemsTable extends ObjectMediaItems requiredDuringInsert: false, defaultValue: Variable(DateTime.now())); @override - List get $columns => [id, objectId, mediaId, createdAt]; + List get $columns => + [id, objectId, objectType, mediaId, createdAt]; @override String get aliasedName => _alias ?? actualTableName; @override @@ -2017,6 +2023,7 @@ class $ObjectMediaItemsTable extends ObjectMediaItems } else if (isInserting) { context.missing(_objectIdMeta); } + context.handle(_objectTypeMeta, const VerificationResult.success()); if (data.containsKey('media_id')) { context.handle(_mediaIdMeta, mediaId.isAcceptableOrUnknown(data['media_id']!, _mediaIdMeta)); @@ -2040,6 +2047,9 @@ class $ObjectMediaItemsTable extends ObjectMediaItems .read(DriftSqlType.int, data['${effectivePrefix}id'])!, objectId: attachedDatabase.typeMapping .read(DriftSqlType.int, data['${effectivePrefix}object_id'])!, + objectType: $ObjectMediaItemsTable.$converterobjectType.fromSql( + attachedDatabase.typeMapping.read( + DriftSqlType.string, data['${effectivePrefix}object_type'])!), mediaId: attachedDatabase.typeMapping .read(DriftSqlType.int, data['${effectivePrefix}media_id'])!, createdAt: attachedDatabase.typeMapping @@ -2051,16 +2061,21 @@ class $ObjectMediaItemsTable extends ObjectMediaItems $ObjectMediaItemsTable createAlias(String alias) { return $ObjectMediaItemsTable(attachedDatabase, alias); } + + static JsonTypeConverter2 $converterobjectType = + const EnumNameConverter(ObjectType.values); } class ObjectMediaItem extends DataClass implements Insertable { final int id; final int objectId; + final ObjectType objectType; final int mediaId; final DateTime createdAt; const ObjectMediaItem( {required this.id, required this.objectId, + required this.objectType, required this.mediaId, required this.createdAt}); @override @@ -2068,6 +2083,10 @@ class ObjectMediaItem extends DataClass implements Insertable { final map = {}; map['id'] = Variable(id); map['object_id'] = Variable(objectId); + { + map['object_type'] = Variable( + $ObjectMediaItemsTable.$converterobjectType.toSql(objectType)); + } map['media_id'] = Variable(mediaId); map['created_at'] = Variable(createdAt); return map; @@ -2077,6 +2096,7 @@ class ObjectMediaItem extends DataClass implements Insertable { return ObjectMediaItemsCompanion( id: Value(id), objectId: Value(objectId), + objectType: Value(objectType), mediaId: Value(mediaId), createdAt: Value(createdAt), ); @@ -2088,6 +2108,8 @@ class ObjectMediaItem extends DataClass implements Insertable { return ObjectMediaItem( id: serializer.fromJson(json['id']), objectId: serializer.fromJson(json['objectId']), + objectType: $ObjectMediaItemsTable.$converterobjectType + .fromJson(serializer.fromJson(json['objectType'])), mediaId: serializer.fromJson(json['mediaId']), createdAt: serializer.fromJson(json['createdAt']), ); @@ -2098,16 +2120,23 @@ class ObjectMediaItem extends DataClass implements Insertable { return { 'id': serializer.toJson(id), 'objectId': serializer.toJson(objectId), + 'objectType': serializer.toJson( + $ObjectMediaItemsTable.$converterobjectType.toJson(objectType)), 'mediaId': serializer.toJson(mediaId), 'createdAt': serializer.toJson(createdAt), }; } ObjectMediaItem copyWith( - {int? id, int? objectId, int? mediaId, DateTime? createdAt}) => + {int? id, + int? objectId, + ObjectType? objectType, + int? mediaId, + DateTime? createdAt}) => ObjectMediaItem( id: id ?? this.id, objectId: objectId ?? this.objectId, + objectType: objectType ?? this.objectType, mediaId: mediaId ?? this.mediaId, createdAt: createdAt ?? this.createdAt, ); @@ -2115,6 +2144,8 @@ class ObjectMediaItem extends DataClass implements Insertable { return ObjectMediaItem( id: data.id.present ? data.id.value : this.id, objectId: data.objectId.present ? data.objectId.value : this.objectId, + objectType: + data.objectType.present ? data.objectType.value : this.objectType, mediaId: data.mediaId.present ? data.mediaId.value : this.mediaId, createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, ); @@ -2125,6 +2156,7 @@ class ObjectMediaItem extends DataClass implements Insertable { return (StringBuffer('ObjectMediaItem(') ..write('id: $id, ') ..write('objectId: $objectId, ') + ..write('objectType: $objectType, ') ..write('mediaId: $mediaId, ') ..write('createdAt: $createdAt') ..write(')')) @@ -2132,13 +2164,14 @@ class ObjectMediaItem extends DataClass implements Insertable { } @override - int get hashCode => Object.hash(id, objectId, mediaId, createdAt); + int get hashCode => Object.hash(id, objectId, objectType, mediaId, createdAt); @override bool operator ==(Object other) => identical(this, other) || (other is ObjectMediaItem && other.id == this.id && other.objectId == this.objectId && + other.objectType == this.objectType && other.mediaId == this.mediaId && other.createdAt == this.createdAt); } @@ -2146,30 +2179,36 @@ class ObjectMediaItem extends DataClass implements Insertable { class ObjectMediaItemsCompanion extends UpdateCompanion { final Value id; final Value objectId; + final Value objectType; final Value mediaId; final Value createdAt; const ObjectMediaItemsCompanion({ this.id = const Value.absent(), this.objectId = const Value.absent(), + this.objectType = const Value.absent(), this.mediaId = const Value.absent(), this.createdAt = const Value.absent(), }); ObjectMediaItemsCompanion.insert({ this.id = const Value.absent(), required int objectId, + required ObjectType objectType, required int mediaId, this.createdAt = const Value.absent(), }) : objectId = Value(objectId), + objectType = Value(objectType), mediaId = Value(mediaId); static Insertable custom({ Expression? id, Expression? objectId, + Expression? objectType, Expression? mediaId, Expression? createdAt, }) { return RawValuesInsertable({ if (id != null) 'id': id, if (objectId != null) 'object_id': objectId, + if (objectType != null) 'object_type': objectType, if (mediaId != null) 'media_id': mediaId, if (createdAt != null) 'created_at': createdAt, }); @@ -2178,11 +2217,13 @@ class ObjectMediaItemsCompanion extends UpdateCompanion { ObjectMediaItemsCompanion copyWith( {Value? id, Value? objectId, + Value? objectType, Value? mediaId, Value? createdAt}) { return ObjectMediaItemsCompanion( id: id ?? this.id, objectId: objectId ?? this.objectId, + objectType: objectType ?? this.objectType, mediaId: mediaId ?? this.mediaId, createdAt: createdAt ?? this.createdAt, ); @@ -2197,6 +2238,10 @@ class ObjectMediaItemsCompanion extends UpdateCompanion { if (objectId.present) { map['object_id'] = Variable(objectId.value); } + if (objectType.present) { + map['object_type'] = Variable( + $ObjectMediaItemsTable.$converterobjectType.toSql(objectType.value)); + } if (mediaId.present) { map['media_id'] = Variable(mediaId.value); } @@ -2211,6 +2256,7 @@ class ObjectMediaItemsCompanion extends UpdateCompanion { return (StringBuffer('ObjectMediaItemsCompanion(') ..write('id: $id, ') ..write('objectId: $objectId, ') + ..write('objectType: $objectType, ') ..write('mediaId: $mediaId, ') ..write('createdAt: $createdAt') ..write(')')) @@ -2231,6 +2277,8 @@ abstract class _$AppDatabase extends GeneratedDatabase { late final $MediaItemsTable mediaItems = $MediaItemsTable(this); late final $ObjectMediaItemsTable objectMediaItems = $ObjectMediaItemsTable(this); + late final SessionsDao sessionsDao = SessionsDao(this as AppDatabase); + late final ActivitiesDao activitiesDao = ActivitiesDao(this as AppDatabase); @override Iterable> get allTables => allSchemaEntities.whereType>(); @@ -3254,23 +3302,6 @@ final class $$ActionsTableReferences return ProcessedTableManager( manager.$state.copyWith(prefetchedData: cache)); } - - static MultiTypedResultKey<$ObjectMediaItemsTable, List> - _objectMediaItemsRefsTable(_$AppDatabase db) => - MultiTypedResultKey.fromTable(db.objectMediaItems, - aliasName: $_aliasNameGenerator( - db.actions.id, db.objectMediaItems.objectId)); - - $$ObjectMediaItemsTableProcessedTableManager get objectMediaItemsRefs { - final manager = - $$ObjectMediaItemsTableTableManager($_db, $_db.objectMediaItems) - .filter((f) => f.objectId.id($_item.id)); - - final cache = - $_typedResult.readTableOrNull(_objectMediaItemsRefsTable($_db)); - return ProcessedTableManager( - manager.$state.copyWith(prefetchedData: cache)); - } } class $$ActionsTableFilterComposer @@ -3317,27 +3348,6 @@ class $$ActionsTableFilterComposer )); return f(composer); } - - Expression objectMediaItemsRefs( - Expression Function($$ObjectMediaItemsTableFilterComposer f) f) { - final $$ObjectMediaItemsTableFilterComposer composer = $composerBuilder( - composer: this, - getCurrentColumn: (t) => t.id, - referencedTable: $db.objectMediaItems, - getReferencedColumn: (t) => t.objectId, - builder: (joinBuilder, - {$addJoinBuilderToRootComposer, - $removeJoinBuilderFromRootComposer}) => - $$ObjectMediaItemsTableFilterComposer( - $db: $db, - $table: $db.objectMediaItems, - $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, - joinBuilder: joinBuilder, - $removeJoinBuilderFromRootComposer: - $removeJoinBuilderFromRootComposer, - )); - return f(composer); - } } class $$ActionsTableOrderingComposer @@ -3409,27 +3419,6 @@ class $$ActionsTableAnnotationComposer )); return f(composer); } - - Expression objectMediaItemsRefs( - Expression Function($$ObjectMediaItemsTableAnnotationComposer a) f) { - final $$ObjectMediaItemsTableAnnotationComposer composer = $composerBuilder( - composer: this, - getCurrentColumn: (t) => t.id, - referencedTable: $db.objectMediaItems, - getReferencedColumn: (t) => t.objectId, - builder: (joinBuilder, - {$addJoinBuilderToRootComposer, - $removeJoinBuilderFromRootComposer}) => - $$ObjectMediaItemsTableAnnotationComposer( - $db: $db, - $table: $db.objectMediaItems, - $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, - joinBuilder: joinBuilder, - $removeJoinBuilderFromRootComposer: - $removeJoinBuilderFromRootComposer, - )); - return f(composer); - } } class $$ActionsTableTableManager extends RootTableManager< @@ -3443,8 +3432,7 @@ class $$ActionsTableTableManager extends RootTableManager< $$ActionsTableUpdateCompanionBuilder, (Action, $$ActionsTableReferences), Action, - PrefetchHooks Function( - {bool activityActionsRefs, bool objectMediaItemsRefs})> { + PrefetchHooks Function({bool activityActionsRefs})> { $$ActionsTableTableManager(_$AppDatabase db, $ActionsTable table) : super(TableManagerState( db: db, @@ -3487,13 +3475,11 @@ class $$ActionsTableTableManager extends RootTableManager< .map((e) => (e.readTable(table), $$ActionsTableReferences(db, table, e))) .toList(), - prefetchHooksCallback: ( - {activityActionsRefs = false, objectMediaItemsRefs = false}) { + prefetchHooksCallback: ({activityActionsRefs = false}) { return PrefetchHooks( db: db, explicitlyWatchedTables: [ - if (activityActionsRefs) db.activityActions, - if (objectMediaItemsRefs) db.objectMediaItems + if (activityActionsRefs) db.activityActions ], addJoins: null, getPrefetchedDataCallback: (items) async { @@ -3509,18 +3495,6 @@ class $$ActionsTableTableManager extends RootTableManager< referencedItemsForCurrentItem: (item, referencedItems) => referencedItems.where((e) => e.actionId == item.id), - typedResults: items), - if (objectMediaItemsRefs) - await $_getPrefetchedData( - currentTable: table, - referencedTable: $$ActionsTableReferences - ._objectMediaItemsRefsTable(db), - managerFromTypedResult: (p0) => - $$ActionsTableReferences(db, table, p0) - .objectMediaItemsRefs, - referencedItemsForCurrentItem: (item, - referencedItems) => - referencedItems.where((e) => e.objectId == item.id), typedResults: items) ]; }, @@ -3540,8 +3514,7 @@ typedef $$ActionsTableProcessedTableManager = ProcessedTableManager< $$ActionsTableUpdateCompanionBuilder, (Action, $$ActionsTableReferences), Action, - PrefetchHooks Function( - {bool activityActionsRefs, bool objectMediaItemsRefs})>; + PrefetchHooks Function({bool activityActionsRefs})>; typedef $$ActivityActionsTableCreateCompanionBuilder = ActivityActionsCompanion Function({ Value id, @@ -4142,6 +4115,7 @@ typedef $$ObjectMediaItemsTableCreateCompanionBuilder = ObjectMediaItemsCompanion Function({ Value id, required int objectId, + required ObjectType objectType, required int mediaId, Value createdAt, }); @@ -4149,6 +4123,7 @@ typedef $$ObjectMediaItemsTableUpdateCompanionBuilder = ObjectMediaItemsCompanion Function({ Value id, Value objectId, + Value objectType, Value mediaId, Value createdAt, }); @@ -4158,19 +4133,6 @@ final class $$ObjectMediaItemsTableReferences extends BaseReferences< $$ObjectMediaItemsTableReferences( super.$_db, super.$_table, super.$_typedResult); - static $ActionsTable _objectIdTable(_$AppDatabase db) => - db.actions.createAlias( - $_aliasNameGenerator(db.objectMediaItems.objectId, db.actions.id)); - - $$ActionsTableProcessedTableManager get objectId { - final manager = $$ActionsTableTableManager($_db, $_db.actions) - .filter((f) => f.id($_item.objectId!)); - final item = $_typedResult.readTableOrNull(_objectIdTable($_db)); - if (item == null) return manager; - return ProcessedTableManager( - manager.$state.copyWith(prefetchedData: [item])); - } - static $MediaItemsTable _mediaIdTable(_$AppDatabase db) => db.mediaItems.createAlias( $_aliasNameGenerator(db.objectMediaItems.mediaId, db.mediaItems.id)); @@ -4197,29 +4159,17 @@ class $$ObjectMediaItemsTableFilterComposer ColumnFilters get id => $composableBuilder( column: $table.id, builder: (column) => ColumnFilters(column)); + ColumnFilters get objectId => $composableBuilder( + column: $table.objectId, builder: (column) => ColumnFilters(column)); + + ColumnWithTypeConverterFilters + get objectType => $composableBuilder( + column: $table.objectType, + builder: (column) => ColumnWithTypeConverterFilters(column)); + ColumnFilters get createdAt => $composableBuilder( column: $table.createdAt, builder: (column) => ColumnFilters(column)); - $$ActionsTableFilterComposer get objectId { - final $$ActionsTableFilterComposer composer = $composerBuilder( - composer: this, - getCurrentColumn: (t) => t.objectId, - referencedTable: $db.actions, - getReferencedColumn: (t) => t.id, - builder: (joinBuilder, - {$addJoinBuilderToRootComposer, - $removeJoinBuilderFromRootComposer}) => - $$ActionsTableFilterComposer( - $db: $db, - $table: $db.actions, - $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, - joinBuilder: joinBuilder, - $removeJoinBuilderFromRootComposer: - $removeJoinBuilderFromRootComposer, - )); - return composer; - } - $$MediaItemsTableFilterComposer get mediaId { final $$MediaItemsTableFilterComposer composer = $composerBuilder( composer: this, @@ -4253,29 +4203,15 @@ class $$ObjectMediaItemsTableOrderingComposer ColumnOrderings get id => $composableBuilder( column: $table.id, builder: (column) => ColumnOrderings(column)); + ColumnOrderings get objectId => $composableBuilder( + column: $table.objectId, builder: (column) => ColumnOrderings(column)); + + ColumnOrderings get objectType => $composableBuilder( + column: $table.objectType, builder: (column) => ColumnOrderings(column)); + ColumnOrderings get createdAt => $composableBuilder( column: $table.createdAt, builder: (column) => ColumnOrderings(column)); - $$ActionsTableOrderingComposer get objectId { - final $$ActionsTableOrderingComposer composer = $composerBuilder( - composer: this, - getCurrentColumn: (t) => t.objectId, - referencedTable: $db.actions, - getReferencedColumn: (t) => t.id, - builder: (joinBuilder, - {$addJoinBuilderToRootComposer, - $removeJoinBuilderFromRootComposer}) => - $$ActionsTableOrderingComposer( - $db: $db, - $table: $db.actions, - $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, - joinBuilder: joinBuilder, - $removeJoinBuilderFromRootComposer: - $removeJoinBuilderFromRootComposer, - )); - return composer; - } - $$MediaItemsTableOrderingComposer get mediaId { final $$MediaItemsTableOrderingComposer composer = $composerBuilder( composer: this, @@ -4309,29 +4245,16 @@ class $$ObjectMediaItemsTableAnnotationComposer GeneratedColumn get id => $composableBuilder(column: $table.id, builder: (column) => column); + GeneratedColumn get objectId => + $composableBuilder(column: $table.objectId, builder: (column) => column); + + GeneratedColumnWithTypeConverter get objectType => + $composableBuilder( + column: $table.objectType, builder: (column) => column); + GeneratedColumn get createdAt => $composableBuilder(column: $table.createdAt, builder: (column) => column); - $$ActionsTableAnnotationComposer get objectId { - final $$ActionsTableAnnotationComposer composer = $composerBuilder( - composer: this, - getCurrentColumn: (t) => t.objectId, - referencedTable: $db.actions, - getReferencedColumn: (t) => t.id, - builder: (joinBuilder, - {$addJoinBuilderToRootComposer, - $removeJoinBuilderFromRootComposer}) => - $$ActionsTableAnnotationComposer( - $db: $db, - $table: $db.actions, - $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, - joinBuilder: joinBuilder, - $removeJoinBuilderFromRootComposer: - $removeJoinBuilderFromRootComposer, - )); - return composer; - } - $$MediaItemsTableAnnotationComposer get mediaId { final $$MediaItemsTableAnnotationComposer composer = $composerBuilder( composer: this, @@ -4364,7 +4287,7 @@ class $$ObjectMediaItemsTableTableManager extends RootTableManager< $$ObjectMediaItemsTableUpdateCompanionBuilder, (ObjectMediaItem, $$ObjectMediaItemsTableReferences), ObjectMediaItem, - PrefetchHooks Function({bool objectId, bool mediaId})> { + PrefetchHooks Function({bool mediaId})> { $$ObjectMediaItemsTableTableManager( _$AppDatabase db, $ObjectMediaItemsTable table) : super(TableManagerState( @@ -4379,24 +4302,28 @@ class $$ObjectMediaItemsTableTableManager extends RootTableManager< updateCompanionCallback: ({ Value id = const Value.absent(), Value objectId = const Value.absent(), + Value objectType = const Value.absent(), Value mediaId = const Value.absent(), Value createdAt = const Value.absent(), }) => ObjectMediaItemsCompanion( id: id, objectId: objectId, + objectType: objectType, mediaId: mediaId, createdAt: createdAt, ), createCompanionCallback: ({ Value id = const Value.absent(), required int objectId, + required ObjectType objectType, required int mediaId, Value createdAt = const Value.absent(), }) => ObjectMediaItemsCompanion.insert( id: id, objectId: objectId, + objectType: objectType, mediaId: mediaId, createdAt: createdAt, ), @@ -4406,7 +4333,7 @@ class $$ObjectMediaItemsTableTableManager extends RootTableManager< $$ObjectMediaItemsTableReferences(db, table, e) )) .toList(), - prefetchHooksCallback: ({objectId = false, mediaId = false}) { + prefetchHooksCallback: ({mediaId = false}) { return PrefetchHooks( db: db, explicitlyWatchedTables: [], @@ -4423,16 +4350,6 @@ class $$ObjectMediaItemsTableTableManager extends RootTableManager< dynamic, dynamic, dynamic>>(state) { - if (objectId) { - state = state.withJoin( - currentTable: table, - currentColumn: table.objectId, - referencedTable: - $$ObjectMediaItemsTableReferences._objectIdTable(db), - referencedColumn: - $$ObjectMediaItemsTableReferences._objectIdTable(db).id, - ) as T; - } if (mediaId) { state = state.withJoin( currentTable: table, @@ -4465,7 +4382,7 @@ typedef $$ObjectMediaItemsTableProcessedTableManager = ProcessedTableManager< $$ObjectMediaItemsTableUpdateCompanionBuilder, (ObjectMediaItem, $$ObjectMediaItemsTableReferences), ObjectMediaItem, - PrefetchHooks Function({bool objectId, bool mediaId})>; + PrefetchHooks Function({bool mediaId})>; class $AppDatabaseManager { final _$AppDatabase _db; diff --git a/lib/database/seed.dart b/lib/database/seed.dart new file mode 100644 index 0000000..ee9b6f6 --- /dev/null +++ b/lib/database/seed.dart @@ -0,0 +1,160 @@ +import 'dart:math'; + +import 'package:drift/drift.dart'; +import 'package:sendtrain/database/database.dart'; + +void seedDb() { + final database = AppDatabase(); + + // seed data setup + final List sessionValues = [ + [ + 'Projecting @ Climbers Rock', + 'Beta pully beta beta pinch one arm crimpy. Futuristic pinch, dyno dynamic drop knee climb. Climbing ondra slopey onsight beta ondra power endurance.' + ], + [ + 'Moonboard @ Boardroom', + 'Beta pully beta beta pinch one arm crimpy. Futuristic pinch, dyno dynamic drop knee climb. Climbing ondra slopey onsight beta ondra power endurance.' + ], + [ + 'Off-Wall Training', + 'Beta pully beta beta pinch one arm crimpy. Futuristic pinch, dyno dynamic drop knee climb. Climbing ondra slopey onsight beta ondra power endurance.' + ], + [ + 'Climbing Outdoors', + 'Beta pully beta beta pinch one arm crimpy. Futuristic pinch, dyno dynamic drop knee climb. Climbing ondra slopey onsight beta ondra power endurance.' + ], + [ + 'Volume Session @ Gravity', + 'Beta pully beta beta pinch one arm crimpy. Futuristic pinch, dyno dynamic drop knee climb. Climbing ondra slopey onsight beta ondra power endurance.' + ], + ]; + + final List mediaItems = [ + [ + 'https://www.climbing.com/wp-content/uploads/2022/06/campus-board-e1655470701154.jpeg', + MediaType.image + ], + ['BgheYcxhrsw', MediaType.youtube] + ]; + + final int totalSessions = 15; + final int totalActivities = 6; + final int totalActions = 5; + final int totalMedia = 5; + final random = Random(); + + // seed loop + for (int i = 0; i < totalSessions; i++) { + // session things + var status = SessionStatus.completed; + if (i == 0) status = SessionStatus.started; + if (i == 1) status = SessionStatus.pending; + + final sessionValue = + sessionValues[random.nextInt(sessionValues.length)]; + database + .into(database.sessions) + .insert(SessionsCompanion.insert( + title: sessionValue[0], + content: sessionValue[1], + status: status, + date: Value(DateTime.now()))) + .then((sessionId) { + // activities things + for (int j = 0; j < random.nextInt(totalActivities); j++) { + database + .into(database.activities) + .insert(ActivitiesCompanion.insert( + title: "test activity $j", + type: ActivityType + .values[random.nextInt(ActivityType.values.length)], + description: "test training activity $j", + category: ActivityCategories.values[ + random.nextInt(ActivityCategories.values.length)])) + .then((activityId) { + // session activity relationships + database + .into(database.sessionActivities) + .insert(SessionActivitiesCompanion.insert( + sessionId: sessionId, + activityId: activityId, + results: Value("results json, will need to test"), + achievements: Value("comma, seperated, items"), + )); + + // actions + for (int k = 0; k < random.nextInt(totalActions); k++) { + database + .into(database.actions) + .insert(ActionsCompanion.insert( + title: 'test action $k', + description: 'test action description $k', + set: '')) + .then((actionId) { + // add activity action association + database.into(database.activityActions).insert( + ActivityActionsCompanion.insert( + activityId: activityId, actionId: actionId)); + + for (int l = 0; l < random.nextInt(totalMedia); l++) { + final mediaItem = + mediaItems[random.nextInt(mediaItems.length)]; + database + .into(database.mediaItems) + .insert(MediaItemsCompanion.insert( + title: 'media title $l', + description: 'media description $l', + reference: mediaItem[0], + type: mediaItem[1])) + .then((mediaId) { + database.into(database.objectMediaItems).insert( + ObjectMediaItemsCompanion.insert( + objectId: actionId, + mediaId: mediaId, + objectType: ObjectType.actions)); + }); + } + }); + } + + for (int l = 0; l < random.nextInt(totalMedia); l++) { + final mediaItem = mediaItems[random.nextInt(mediaItems.length)]; + database + .into(database.mediaItems) + .insert(MediaItemsCompanion.insert( + title: 'media title $l', + description: 'media description $l', + reference: mediaItem[0], + type: mediaItem[1])) + .then((mediaId) { + database.into(database.objectMediaItems).insert( + ObjectMediaItemsCompanion.insert( + objectId: activityId, + mediaId: mediaId, + objectType: ObjectType.activities)); + }); + } + }); + } + + for (int l = 0; l < random.nextInt(totalMedia); l++) { + final mediaItem = mediaItems[random.nextInt(mediaItems.length)]; + database + .into(database.mediaItems) + .insert(MediaItemsCompanion.insert( + title: 'media title $l', + description: 'media description $l', + reference: mediaItem[0], + type: mediaItem[1])) + .then((mediaId) { + database.into(database.objectMediaItems).insert( + ObjectMediaItemsCompanion.insert( + objectId: sessionId, + mediaId: mediaId, + objectType: ObjectType.sessions)); + }); + } + }); + } +} \ No newline at end of file diff --git a/lib/main.dart b/lib/main.dart index a172575..34a88c6 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,16 +1,17 @@ -import 'package:drift/drift.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:sendtrain/database.dart'; import 'package:sendtrain/models/activity_timer_model.dart'; import 'package:sendtrain/screens/activities_screen.dart'; import 'package:sendtrain/screens/sessions_screen.dart'; +// ignore: unused_import +import 'package:sendtrain/database/seed.dart'; class SendTrain extends StatelessWidget { const SendTrain({super.key}); @override Widget build(BuildContext context) { + // seedDb(); return MaterialApp( title: "Sendtrain", theme: ThemeData.dark(useMaterial3: true), @@ -92,82 +93,6 @@ class _AppState extends State { } void main() { - // final database = AppDatabase(); - - // database.into(database.sessions).insert(SessionsCompanion.insert( - // title: 'Projecting @ Climbers Rock', - // content: 'Beta pully beta beta pinch one arm crimpy. Futuristic pinch, dyno dynamic drop knee climb. Climbing ondra slopey onsight beta ondra power endurance.', - // status: SessionStatus.started, - // date: Value(DateTime.now()))); - - // database.into(database.sessions).insert(SessionsCompanion.insert( - // title: 'Moonboard @ Boardroom', - // content: 'Beta pully beta beta pinch one arm crimpy. Futuristic pinch, dyno dynamic drop knee climb. Climbing ondra slopey onsight beta ondra power endurance.', - // status: SessionStatus.pending, - // date: Value(DateTime.now()))); - - // database.into(database.sessions).insert(SessionsCompanion.insert( - // title: 'Moonboard @ Boardroom', - // content: 'Beta pully beta beta pinch one arm crimpy. Futuristic pinch, dyno dynamic drop knee climb. Climbing ondra slopey onsight beta ondra power endurance.', - // status: SessionStatus.completed, - // date: Value(DateTime.now()))); - - // database.into(database.sessions).insert(SessionsCompanion.insert( - // title: 'Projecting @ Climbers Rock', - // content: 'Beta pully beta beta pinch one arm crimpy. Futuristic pinch, dyno dynamic drop knee climb. Climbing ondra slopey onsight beta ondra power endurance.', - // status: SessionStatus.completed, - // date: Value(DateTime.now()))); - - // database.into(database.sessions).insert(SessionsCompanion.insert( - // title: 'Off-Wall Training', - // content: 'Beta pully beta beta pinch one arm crimpy. Futuristic pinch, dyno dynamic drop knee climb. Climbing ondra slopey onsight beta ondra power endurance.', - // status: SessionStatus.missed, - // date: Value(DateTime.now()))); - - // database.into(database.sessions).insert(SessionsCompanion.insert( - // title: 'Off-Wall Training', - // content: 'Beta pully beta beta pinch one arm crimpy. Futuristic pinch, dyno dynamic drop knee climb. Climbing ondra slopey onsight beta ondra power endurance.', - // status: SessionStatus.completed, - // date: Value(DateTime.now()))); - - // database.into(database.activities).insert(ActivitiesCompanion.insert( - // title: "test activity", - // type: ActivityType.technical, - // description: "test training activity", - // category: ActivityCategories.fundamentals)); - - // database - // .into(database.sessionActivities) - // .insert(SessionActivitiesCompanion.insert( - // sessionId: 1, - // activityId: 1, - // results: Value("results json, will need to test"), - // achievements: Value("comma, seperated, items"), - // )); - - // database.into(database.actions).insert(ActionsCompanion.insert( - // title: "test action title", - // description: "teste action description", - // set: "not sure how the json will work yet", - // )); - - // database - // .into(database.activityActions) - // .insert(ActivityActionsCompanion.insert( - // activityId: 1, - // actionId: 1, - // )); - - // database.into(database.mediaItems).insert(MediaItemsCompanion.insert( - // title: "test youtube media item", - // description: "this is a test youtube item", - // reference: "sZVAEy9UmoY", - // type: MediaType.youtube)); - - // database - // .into(database.objectMediaItems) - // .insert(ObjectMediaItemsCompanion.insert(objectId: 1, mediaId: 1)); - runApp( ChangeNotifierProvider( create: (context) => ActivityTimerModel(), diff --git a/lib/screens/activities_screen.dart b/lib/screens/activities_screen.dart index 1e73c57..b4fa536 100644 --- a/lib/screens/activities_screen.dart +++ b/lib/screens/activities_screen.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:sendtrain/classes/activity_action.dart'; +import 'package:sendtrain/database/database.dart' hide ActivityAction; import 'package:sendtrain/models/activity_model.dart'; import '../widgets/activities_header.dart'; @@ -13,6 +14,7 @@ class ActivitiesScreen extends StatefulWidget { } class _ActivitiesScreenState extends State { + final Activity? activity = null; final data = ActivityModel( id: 1, @@ -40,23 +42,24 @@ class _ActivitiesScreenState extends State { @override Widget build(BuildContext context) { - List activities = List.generate(10, (i) => ActivityCard(activity: data)); + return Text("N/A"); + // List activities = List.generate(10, (i) => ActivityCard(activity: data, data: activity)); - return Padding( - padding: const EdgeInsets.fromLTRB(10, 15, 10, 0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const ActivitiesHeader(), - Expanded( - child: GridView.count( - primary: false, - padding: const EdgeInsets.fromLTRB(0, 0, 0, 0), - crossAxisSpacing: 10, - mainAxisSpacing: 10, - crossAxisCount: 2, - children: activities, - )) - ])); + // return Padding( + // padding: const EdgeInsets.fromLTRB(10, 15, 10, 0), + // child: Column( + // crossAxisAlignment: CrossAxisAlignment.start, + // children: [ + // const ActivitiesHeader(), + // Expanded( + // child: GridView.count( + // primary: false, + // padding: const EdgeInsets.fromLTRB(0, 0, 0, 0), + // crossAxisSpacing: 10, + // mainAxisSpacing: 10, + // crossAxisCount: 2, + // children: activities, + // )) + // ])); } } diff --git a/lib/screens/sessions_screen.dart b/lib/screens/sessions_screen.dart index a9fe230..84d21b0 100644 --- a/lib/screens/sessions_screen.dart +++ b/lib/screens/sessions_screen.dart @@ -1,31 +1,31 @@ -import 'package:drift/drift.dart' hide Column; import 'package:flutter/material.dart'; -import 'package:sendtrain/database.dart'; +import 'package:sendtrain/database/daos/sessions_dao.dart'; +import 'package:sendtrain/database/database.dart'; import '../widgets/session_card.dart'; class SessionsScreen extends StatelessWidget { final AppDatabase database = AppDatabase(); SessionsScreen({super.key}); - Future> getSessions() async { - // database.managers.sessions.filter((session) => session.status(SessionStatus.pending)); - return await database.managers.sessions.get(); - } - @override Widget build(BuildContext context) { return FutureBuilder>( - future: getSessions(), + future: SessionsDao(database).all(), builder: (context, snapshot) { if (snapshot.hasData) { + database.close(); final sessions = snapshot.data!; - final pending = sessions.where((session) => session.status == SessionStatus.completed || session.status == SessionStatus.missed); - final upcoming = sessions.firstWhere((session) => session.status == SessionStatus.pending); - final current = sessions.firstWhere((session) => session.status == SessionStatus.started); + final pending = sessions.where((session) => + session.status == SessionStatus.completed || + session.status == SessionStatus.missed); + final upcoming = sessions.firstWhere( + (session) => session.status == SessionStatus.pending); + final current = sessions.firstWhere( + (session) => session.status == SessionStatus.started); - List previousSessions = List.generate(pending.length, (i) => SessionCard(type: 1, session: pending.elementAt(i))); - Widget upcomingSession = - SessionCard(session: upcoming); + List previousSessions = List.generate(pending.length, + (i) => SessionCard(type: 1, session: pending.elementAt(i))); + Widget upcomingSession = SessionCard(session: upcoming); Widget currentSession = SessionCard(session: current); database.close(); @@ -36,19 +36,22 @@ class SessionsScreen extends StatelessWidget { const Padding( padding: EdgeInsets.fromLTRB(15, 5, 0, 0), child: Text( - style: TextStyle(fontSize: 25, fontWeight: FontWeight.bold), + style: TextStyle( + fontSize: 25, fontWeight: FontWeight.bold), 'Current:')), currentSession, const Padding( padding: EdgeInsets.fromLTRB(15, 30, 0, 0), child: Text( - style: TextStyle(fontSize: 25, fontWeight: FontWeight.bold), + style: TextStyle( + fontSize: 25, fontWeight: FontWeight.bold), 'Upcoming:')), upcomingSession, const Padding( padding: EdgeInsets.fromLTRB(15, 30, 0, 0), child: Text( - style: TextStyle(fontSize: 25, fontWeight: FontWeight.bold), + style: TextStyle( + fontSize: 25, fontWeight: FontWeight.bold), 'Previous:')), SizedBox( width: double.infinity, @@ -66,48 +69,5 @@ class SessionsScreen extends StatelessWidget { return const CircularProgressIndicator(); } }); - - // List previousSessions = List.generate( - // 10, (i) => SessionCard(state: 1, type: 1, session: _sessions.first)); - // Widget upcomingSession = SessionCard(state: 2, session: _sessions.first); - // Widget currentSession = SessionCard(session: _sessions.first); - - // return Column( - // crossAxisAlignment: CrossAxisAlignment.start, - // children: [ - // const Padding( - // padding: EdgeInsets.fromLTRB(15, 5, 0, 0), - // child: Text( - // style: TextStyle(fontSize: 25, fontWeight: FontWeight.bold), - // 'Current:')), - // currentSession, - // const Padding( - // padding: EdgeInsets.fromLTRB(15, 30, 0, 0), - // child: Text( - // style: TextStyle(fontSize: 25, fontWeight: FontWeight.bold), - // 'Upcoming:')), - // upcomingSession, - // const Padding( - // padding: EdgeInsets.fromLTRB(15, 30, 0, 0), - // child: Text( - // style: TextStyle(fontSize: 25, fontWeight: FontWeight.bold), - // 'Previous:')), - // SizedBox( - // width: double.infinity, - // height: 160, - // child: GridView.count( - // padding: const EdgeInsets.fromLTRB(15, 10, 0, 0), - // scrollDirection: Axis.horizontal, - // crossAxisSpacing: 5, - // mainAxisSpacing: 5, - // crossAxisCount: 1, - // children: previousSessions)) - // // Flexible( - // // child: ListView( - // // scrollDirection: Axis.vertical, - // // children: previousSessions, - // // )), - // ], - // ); } } diff --git a/lib/widgets/activity_card.dart b/lib/widgets/activity_card.dart index 20386bc..e93a29e 100644 --- a/lib/widgets/activity_card.dart +++ b/lib/widgets/activity_card.dart @@ -1,14 +1,16 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:sendtrain/classes/media.dart'; +import 'package:sendtrain/database/database.dart'; import 'package:sendtrain/models/activity_model.dart'; import 'package:sendtrain/models/activity_timer_model.dart'; import 'package:sendtrain/widgets/activity_view.dart'; class ActivityCard extends StatefulWidget { final ActivityModel activity; + final Activity data; - const ActivityCard({super.key, required this.activity}); + const ActivityCard({super.key, required this.activity, required this.data}); @override State createState() => ActivityCardState(); @@ -34,28 +36,28 @@ class ActivityCardState extends State { : Theme.of(context).colorScheme.surfaceContainerLow, clipBehavior: Clip.hardEdge, child: InkWell( - onTap: () => showGeneralDialog( - barrierColor: Colors.black.withOpacity(0.5), - transitionDuration: const Duration(milliseconds: 220), - transitionBuilder: (BuildContext context, - Animation animation, - Animation secondaryAnimation, - Widget child) { - Animation custom = Tween( - begin: const Offset(0.0, 1.0), - end: const Offset(0.0, 0.0)) - .animate(animation); - return SlideTransition( - position: custom, - child: Dialog.fullscreen( - child: ActivityView(activity: widget.activity))); - }, - barrierDismissible: true, - barrierLabel: '', - context: context, - pageBuilder: (context, animation1, animation2) { - return Container(); - }), + // onTap: () => showGeneralDialog( + // barrierColor: Colors.black.withOpacity(0.5), + // transitionDuration: const Duration(milliseconds: 220), + // transitionBuilder: (BuildContext context, + // Animation animation, + // Animation secondaryAnimation, + // Widget child) { + // Animation custom = Tween( + // begin: const Offset(0.0, 1.0), + // end: const Offset(0.0, 0.0)) + // .animate(animation); + // return SlideTransition( + // position: custom, + // child: Dialog.fullscreen( + // child: ActivityView(activity: widget.activity))); + // }, + // barrierDismissible: true, + // barrierLabel: '', + // context: context, + // pageBuilder: (context, animation1, animation2) { + // return Container(); + // }), child: Column( mainAxisSize: MainAxisSize.min, children: [ @@ -79,13 +81,13 @@ class ActivityCardState extends State { if (atm.activity?.id == widget.activity.id) { return Text( maxLines: 1, - "${widget.activity.title} (${formattedTime(atm.totalTime)})"); + "${widget.data.title} (${formattedTime(atm.totalTime)})"); } else { - return Text(maxLines: 1, widget.activity.title); + return Text(maxLines: 1, widget.data.title); } }, ), - subtitle: Text(maxLines: 2, widget.activity.description), + subtitle: Text(maxLines: 2, widget.data.description), trailing: IconButton( visualDensity: VisualDensity.compact, icon: Icon(Icons.close_rounded), diff --git a/lib/widgets/activity_view.dart b/lib/widgets/activity_view.dart index 67634db..0c01a08 100644 --- a/lib/widgets/activity_view.dart +++ b/lib/widgets/activity_view.dart @@ -193,22 +193,23 @@ class ActivityViewMedia extends StatelessWidget { } } - List mediaCards = - List.generate(media.length, (i) => MediaCard(media: media[i])); + return Text("media!"); + // List mediaCards = + // List.generate(media.length, (i) => MediaCard(media: media[i])); - return Column( - children: [ - SizedBox( - width: double.infinity, - height: 100, - child: GridView.count( - padding: const EdgeInsets.fromLTRB(15, 0, 0, 0), - scrollDirection: Axis.horizontal, - crossAxisSpacing: 5, - mainAxisSpacing: 5, - crossAxisCount: 1, - children: mediaCards)) - ], - ); + // return Column( + // children: [ + // SizedBox( + // width: double.infinity, + // height: 100, + // child: GridView.count( + // padding: const EdgeInsets.fromLTRB(15, 0, 0, 0), + // scrollDirection: Axis.horizontal, + // crossAxisSpacing: 5, + // mainAxisSpacing: 5, + // crossAxisCount: 1, + // children: mediaCards)) + // ], + // ); } } diff --git a/lib/widgets/media_card.dart b/lib/widgets/media_card.dart index e47af51..a8f00f8 100644 --- a/lib/widgets/media_card.dart +++ b/lib/widgets/media_card.dart @@ -1,11 +1,11 @@ import 'package:flutter/material.dart'; -import 'package:sendtrain/classes/media.dart'; +import 'package:sendtrain/database/database.dart'; import 'package:youtube_player_flutter/youtube_player_flutter.dart'; class MediaCard extends StatelessWidget { const MediaCard({super.key, required this.media}); - final Media media; + final MediaItem media; @override Widget build(BuildContext context) { @@ -14,22 +14,22 @@ class MediaCard extends StatelessWidget { flags: const YoutubePlayerFlags( autoPlay: false, mute: true, showLiveFullscreenButton: false)); - DecorationImage mediaImage(Media media) { + DecorationImage mediaImage(MediaItem media) { String image = ''; - if (media.type == "image") { + if (media.type == MediaType.image) { image = media.reference; - } else if (media.type == "youtube") { + } else if (media.type == MediaType.youtube) { image = 'https://img.youtube.com/vi/${media.reference}/0.jpg'; } return DecorationImage(image: NetworkImage(image), fit: BoxFit.cover); } - Widget mediaItem(Media media) { - if (media.type == "image") { + Widget mediaItem(MediaItem media) { + if (media.type == MediaType.image) { return Image(image: NetworkImage(media.reference)); - } else if (media.type == "youtube") { + } else if (media.type == MediaType.youtube) { return YoutubePlayer( controller: controller, aspectRatio: 16 / 9, @@ -62,7 +62,7 @@ class MediaCard extends StatelessWidget { mediaItem(media), const SizedBox(height: 15), Text( - '${media.description}', + media.description, style: const TextStyle(fontSize: 20), ), const Divider( diff --git a/lib/widgets/session_card.dart b/lib/widgets/session_card.dart index 8499635..4f452cb 100644 --- a/lib/widgets/session_card.dart +++ b/lib/widgets/session_card.dart @@ -3,7 +3,7 @@ import 'package:intl/intl.dart'; import 'package:intl/date_symbol_data_local.dart'; import 'package:sendtrain/classes/activity_action.dart'; import 'package:sendtrain/classes/media.dart'; -import 'package:sendtrain/database.dart' hide ActivityAction; +import 'package:sendtrain/database/database.dart' hide ActivityAction; import 'package:sendtrain/models/activity_model.dart'; import 'package:sendtrain/models/session_model.dart'; import 'package:sendtrain/widgets/session_view.dart'; diff --git a/lib/widgets/session_view.dart b/lib/widgets/session_view.dart index 784736b..d7355fc 100644 --- a/lib/widgets/session_view.dart +++ b/lib/widgets/session_view.dart @@ -1,165 +1,103 @@ +import 'package:drift/drift.dart' hide Column; import 'package:flutter/material.dart'; import 'package:flutter_expandable_fab/flutter_expandable_fab.dart'; import 'package:intl/intl.dart'; import 'package:intl/date_symbol_data_local.dart'; +import 'package:sendtrain/database/daos/activities_dao.dart'; -import 'package:sendtrain/classes/media.dart'; -import 'package:sendtrain/database.dart'; -import 'package:sendtrain/models/activity_model.dart'; +import 'package:sendtrain/database/database.dart'; import 'package:sendtrain/models/session_model.dart'; -import 'package:sendtrain/widgets/activity_card.dart'; -import 'package:sendtrain/widgets/media_card.dart'; +import 'package:sendtrain/widgets/session_view_achievements.dart'; +import 'package:sendtrain/widgets/session_view_activities.dart'; +import 'package:sendtrain/widgets/session_view_media.dart'; class SessionView extends StatelessWidget { - const SessionView({super.key, required this.data, required this.session}); + SessionView({super.key, required this.data, required this.session}); final SessionModel data; final Session session; + final AppDatabase database = AppDatabase(); @override Widget build(BuildContext context) { initializeDateFormatting('en'); final DateFormat dateFormat = DateFormat('yyyy-MM-dd'); - return Scaffold( - floatingActionButtonLocation: ExpandableFab.location, - floatingActionButton: ExpandableFab( - distance: 70, - type: ExpandableFabType.up, - overlayStyle: ExpandableFabOverlayStyle( - color: Colors.black.withOpacity(0.5), - blur: 10, - ), - children: [ - FloatingActionButton.extended( - icon: const Icon(Icons.history_outlined), - label: Text('Restart'), - onPressed: () {}, - ), - FloatingActionButton.extended( - icon: const Icon(Icons.done_all_outlined), - label: Text('Done'), - onPressed: () {}, - ), - FloatingActionButton.extended( - icon: const Icon(Icons.edit_outlined), - label: Text('Edit'), - onPressed: () {}, - ), - ]), - body: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - AppBar( - centerTitle: true, - title: Text('Session @ ${dateFormat.format(session.date as DateTime)}', - style: const TextStyle(fontSize: 15)), - ), - Padding( - padding: const EdgeInsets.only( - left: 15, right: 20, top: 15, bottom: 10), - child: Text( - maxLines: 1, - style: const TextStyle( - fontSize: 25, fontWeight: FontWeight.bold), - session.title)), - SessionViewAchievements(achievements: data.achievements), - Padding( - padding: const EdgeInsets.only(left: 15, right: 15), - child: - Text(style: const TextStyle(fontSize: 15), session.content)), - const Padding( - padding: EdgeInsets.fromLTRB(15, 30, 0, 10), - child: Text( - style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold), - 'Media:')), - SessionViewMedia(media: data.media), - const Padding( - padding: EdgeInsets.fromLTRB(15, 30, 0, 10), - child: Text( - style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold), - 'Activites:')), - SessionViewActivities(activities: data.activities), - ], - )); - } -} - -class SessionViewActivities extends StatelessWidget { - const SessionViewActivities({super.key, this.activities}); - - final List? activities; - - @override - Widget build(BuildContext context) { - return Expanded( - child: ListView.builder( - // shrinkWrap: true, - padding: const EdgeInsets.fromLTRB(10, 0, 10, 0), - itemCount: activities?.length, - itemBuilder: (BuildContext context, int index) { - return ActivityCard(activity: activities![index]); - }, - )); - } -} - -class SessionViewAchievements extends StatelessWidget { - const SessionViewAchievements({super.key, this.achievements}); - - final List? achievements; - - @override - Widget build(BuildContext context) { - return Column( - children: [ - Padding( - padding: const EdgeInsets.only(bottom: 10), - child: SizedBox( - height: 40, - child: ListView.builder( - scrollDirection: Axis.horizontal, - padding: const EdgeInsets.fromLTRB(10, 0, 10, 0), - itemCount: achievements?.length, - itemBuilder: (BuildContext context, int index) { - return Padding( - padding: const EdgeInsets.only(right: 5), - child: ActionChip( - visualDensity: VisualDensity.compact, - avatar: const Icon(Icons.check_circle_outline), - label: Text(maxLines: 1, '${achievements?[index]}'), - onPressed: () {}, - )); - }, - ))), - ], - ); - } -} - -class SessionViewMedia extends StatelessWidget { - const SessionViewMedia({super.key, this.media}); - - final List? media; - - @override - Widget build(BuildContext context) { - List mediaCards = List.generate((media != null) ? media!.length : 0, - (i) => MediaCard(media: media![i])); - - return Column( - children: [ - SizedBox( - width: double.infinity, - height: 100, - child: GridView.count( - padding: const EdgeInsets.fromLTRB(15, 0, 0, 0), - scrollDirection: Axis.horizontal, - crossAxisSpacing: 5, - mainAxisSpacing: 5, - crossAxisCount: 1, - children: mediaCards)) - ], - ); + return FutureBuilder>( + future: ActivitiesDao(database).sessionActivities(session.id), + builder: (context, snapshot) { + if (snapshot.hasData) { + final activities = snapshot.data!; + database.close(); + return Scaffold( + floatingActionButtonLocation: ExpandableFab.location, + floatingActionButton: ExpandableFab( + distance: 70, + type: ExpandableFabType.up, + overlayStyle: ExpandableFabOverlayStyle( + color: Colors.black.withOpacity(0.5), + blur: 10, + ), + children: [ + FloatingActionButton.extended( + icon: const Icon(Icons.history_outlined), + label: Text('Restart'), + onPressed: () {}, + ), + FloatingActionButton.extended( + icon: const Icon(Icons.done_all_outlined), + label: Text('Done'), + onPressed: () {}, + ), + FloatingActionButton.extended( + icon: const Icon(Icons.edit_outlined), + label: Text('Edit'), + onPressed: () {}, + ), + ]), + body: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + AppBar( + centerTitle: true, + title: Text( + 'Session @ ${dateFormat.format(session.date as DateTime)}', + style: const TextStyle(fontSize: 15)), + ), + Padding( + padding: const EdgeInsets.only( + left: 15, right: 20, top: 15, bottom: 10), + child: Text( + maxLines: 1, + style: const TextStyle( + fontSize: 25, fontWeight: FontWeight.bold), + session.title)), + SessionViewAchievements(session: session), + Padding( + padding: const EdgeInsets.only(left: 15, right: 15), + child: Text( + style: const TextStyle(fontSize: 15), + session.content)), + const Padding( + padding: EdgeInsets.fromLTRB(15, 30, 0, 10), + child: Text( + style: TextStyle( + fontSize: 20, fontWeight: FontWeight.bold), + 'Media:')), + SessionViewMedia(session: session, media: data.media), + const Padding( + padding: EdgeInsets.fromLTRB(15, 30, 0, 10), + child: Text( + style: TextStyle( + fontSize: 20, fontWeight: FontWeight.bold), + 'Activites:')), + SessionViewActivities( + activities: data.activities, data: activities), + ], + )); + } else { + return const CircularProgressIndicator(); + } + }); } } diff --git a/lib/widgets/session_view_achievements.dart b/lib/widgets/session_view_achievements.dart new file mode 100644 index 0000000..bb83454 --- /dev/null +++ b/lib/widgets/session_view_achievements.dart @@ -0,0 +1,65 @@ +import 'package:flutter/material.dart'; +import 'package:sendtrain/database/daos/session_activities_dao.dart'; +import 'package:sendtrain/database/database.dart'; + +class SessionViewAchievements extends StatelessWidget { + SessionViewAchievements({super.key, required this.session}); + + final Session session; + final AppDatabase database = AppDatabase(); + + List getAchievements(List sessionActivities) { + List achievements = []; + + for (int i = 0; i < sessionActivities.length; i++) { + final SessionActivity sessionActivity = sessionActivities[i]; + final List? saAchievments = sessionActivity.achievements?.split(','); + + if (saAchievments != null) { + saAchievments.forEach((achievement) => achievements.add(achievement)); + } + } + + return achievements; + } + + @override + Widget build(BuildContext context) { + return FutureBuilder>( + future: SessionActivitiesDao(database).sessionActivitiesBySessionId(session.id), + builder: (context, snapshot) { + if (snapshot.hasData) { + final sessionActivities = snapshot.data!; + final achievements = getAchievements(sessionActivities); + database.close(); + + return Column( + children: [ + Padding( + padding: const EdgeInsets.only(bottom: 10), + child: SizedBox( + height: 40, + child: ListView.builder( + scrollDirection: Axis.horizontal, + padding: const EdgeInsets.fromLTRB(10, 0, 10, 0), + itemCount: achievements.length, + itemBuilder: (BuildContext context, int index) { + return Padding( + padding: const EdgeInsets.only(right: 5), + child: ActionChip( + visualDensity: VisualDensity.compact, + avatar: + const Icon(Icons.check_circle_outline), + label: Text(maxLines: 1, achievements[index]), + onPressed: () {}, + )); + }, + ))), + ], + ); + } else { + return const CircularProgressIndicator(); + } + }); + } +} \ No newline at end of file diff --git a/lib/widgets/session_view_activities.dart b/lib/widgets/session_view_activities.dart new file mode 100644 index 0000000..57c12da --- /dev/null +++ b/lib/widgets/session_view_activities.dart @@ -0,0 +1,28 @@ +import 'dart:math'; + +import 'package:flutter/material.dart'; +import 'package:sendtrain/database/database.dart'; +import 'package:sendtrain/models/activity_model.dart'; +import 'package:sendtrain/widgets/activity_card.dart'; + +class SessionViewActivities extends StatelessWidget { + const SessionViewActivities({super.key, this.activities, required this.data}); + + final List? activities; + final List data; + + @override + Widget build(BuildContext context) { + return Expanded( + child: ListView.builder( + // shrinkWrap: true, + padding: const EdgeInsets.fromLTRB(10, 0, 10, 0), + itemCount: data.length, + itemBuilder: (BuildContext context, int index) { + return ActivityCard( + activity: activities![Random().nextInt(activities!.length)], + data: data[index]); + }, + )); + } +} \ No newline at end of file diff --git a/lib/widgets/session_view_media.dart b/lib/widgets/session_view_media.dart new file mode 100644 index 0000000..d719f5b --- /dev/null +++ b/lib/widgets/session_view_media.dart @@ -0,0 +1,44 @@ +import 'package:flutter/material.dart'; +import 'package:sendtrain/classes/media.dart'; +import 'package:sendtrain/database/daos/media_items_dao.dart'; +import 'package:sendtrain/database/database.dart'; +import 'package:sendtrain/widgets/media_card.dart'; + +class SessionViewMedia extends StatelessWidget { + SessionViewMedia({super.key, this.media, required this.session}); + + final List? media; + final Session session; + final AppDatabase database = AppDatabase(); + + @override + Widget build(BuildContext context) { + return FutureBuilder>( + future: MediaItemsDao(database).mediaItemsFromSession(session), + builder: (context, snapshot) { + if (snapshot.hasData) { + final mediaItems = snapshot.data!; + database.close(); + List mediaCards = List.generate( + mediaItems.length, (i) => MediaCard(media: mediaItems[i])); + + return Column( + children: [ + SizedBox( + width: double.infinity, + height: 100, + child: GridView.count( + padding: const EdgeInsets.fromLTRB(15, 0, 0, 0), + scrollDirection: Axis.horizontal, + crossAxisSpacing: 5, + mainAxisSpacing: 5, + crossAxisCount: 1, + children: mediaCards)) + ], + ); + } else { + return CircularProgressIndicator(); + } + }); + } +} \ No newline at end of file -- 2.47.2 From 5d27744ead065e79f6477d39dcd800638886b12b Mon Sep 17 00:00:00 2001 From: Joshua Burman Date: Fri, 20 Dec 2024 13:56:26 -0500 Subject: [PATCH 2/9] convert to dao calls, prep for migration strategy and first start db seed --- analysis_options.yaml | 4 ++ lib/database/database.dart | 11 ++++++ lib/database/seed.dart | 2 +- lib/main.dart | 17 ++++---- lib/models/activity_timer_model.dart | 15 +++++--- lib/screens/sessions_screen.dart | 17 ++++---- lib/widgets/activity_action_view.dart | 2 +- lib/widgets/activity_card.dart | 45 +++++++++++----------- lib/widgets/session_view.dart | 18 +++++---- lib/widgets/session_view_achievements.dart | 10 ++--- lib/widgets/session_view_media.dart | 12 +++--- 11 files changed, 90 insertions(+), 63 deletions(-) diff --git a/analysis_options.yaml b/analysis_options.yaml index 61b6c4d..ddab027 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -9,6 +9,10 @@ # packages, and plugins designed to encourage good coding practices. include: package:flutter_lints/flutter.yaml +analyzer: + exclude: + - "**/*.g.dart" + linter: # The lint rules applied to this project can be customized in the # section below to disable rules from the `package:flutter_lints/flutter.yaml` diff --git a/lib/database/database.dart b/lib/database/database.dart index d44025c..52d4ad3 100644 --- a/lib/database/database.dart +++ b/lib/database/database.dart @@ -2,6 +2,7 @@ import 'package:drift/drift.dart'; import 'package:drift_flutter/drift_flutter.dart'; import 'package:sendtrain/database/daos/activities_dao.dart'; import 'package:sendtrain/database/daos/sessions_dao.dart'; +import 'package:sendtrain/database/seed.dart'; part 'database.g.dart'; @@ -125,6 +126,16 @@ class AppDatabase extends _$AppDatabase { @override int get schemaVersion => 1; + @override + MigrationStrategy get migration { + return MigrationStrategy( + onCreate: (m) async { + await m.createAll(); // create all tables + await seedDb(); // seed the tables + } + ); + } + static QueryExecutor _openConnection() { // `driftDatabase` from `package:drift_flutter` stores the database in // `getApplicationDocumentsDirectory()`. diff --git a/lib/database/seed.dart b/lib/database/seed.dart index ee9b6f6..27355b0 100644 --- a/lib/database/seed.dart +++ b/lib/database/seed.dart @@ -3,7 +3,7 @@ import 'dart:math'; import 'package:drift/drift.dart'; import 'package:sendtrain/database/database.dart'; -void seedDb() { +Future seedDb() async { final database = AppDatabase(); // seed data setup diff --git a/lib/main.dart b/lib/main.dart index 34a88c6..bd25344 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; +import 'package:sendtrain/database/database.dart'; import 'package:sendtrain/models/activity_timer_model.dart'; import 'package:sendtrain/screens/activities_screen.dart'; import 'package:sendtrain/screens/sessions_screen.dart'; @@ -11,7 +12,6 @@ class SendTrain extends StatelessWidget { @override Widget build(BuildContext context) { - // seedDb(); return MaterialApp( title: "Sendtrain", theme: ThemeData.dark(useMaterial3: true), @@ -93,10 +93,13 @@ class _AppState extends State { } void main() { - runApp( - ChangeNotifierProvider( - create: (context) => ActivityTimerModel(), - child: const SendTrain(), - ), - ); + runApp(MultiProvider( + providers: [ + ChangeNotifierProvider(create: (context) => ActivityTimerModel()), + Provider( + create: (context) => AppDatabase(), + dispose: (context, db) => db.close()), + ], + child: const SendTrain(), + )); } diff --git a/lib/models/activity_timer_model.dart b/lib/models/activity_timer_model.dart index 8159ed8..24e5d11 100644 --- a/lib/models/activity_timer_model.dart +++ b/lib/models/activity_timer_model.dart @@ -2,11 +2,13 @@ import 'dart:async'; import 'package:flutter/material.dart'; import 'package:scrollable_positioned_list/scrollable_positioned_list.dart'; +import 'package:sendtrain/database/database.dart'; import 'package:sendtrain/models/activity_model.dart'; class ActivityTimerModel with ChangeNotifier { int _actionCounter = 0; - ActivityModel? _activity; + ActivityModel? _activityModel; + Activity? _activity; List _sets = []; int _currentActionNum = 0; int _currentSetNum = 0; @@ -20,20 +22,21 @@ class ActivityTimerModel with ChangeNotifier { dynamic get currentAction => currentSet[_currentActionNum]; int get currentSetNum => _currentSetNum; dynamic get currentSet => _sets[_currentSetNum]; - ActivityModel? get activity => _activity; + ActivityModel? get activityModel => _activityModel; + Activity? get activity => _activity; List get sets => _sets; Timer? get periodicTimer => _periodicTimer; bool get isActive => _isActive(); double get progress => _progress; int get totalTime => _totalTime; - void setup(ActivityModel activity) { - if (_activity == null || activity.id != _activity?.id) { + void setup(ActivityModel activityModel) { + if (_activityModel == null || activityModel.id != _activityModel?.id) { _periodicTimer?.cancel(); _progress = 0; _isc = null; - _activity = activity; - _sets = activity.actions[0].items(); + _activityModel = activityModel; + _sets = activityModel.actions[0].items(); _currentActionNum = 0; _currentSetNum = 0; setActionCount(); diff --git a/lib/screens/sessions_screen.dart b/lib/screens/sessions_screen.dart index 84d21b0..22231b1 100644 --- a/lib/screens/sessions_screen.dart +++ b/lib/screens/sessions_screen.dart @@ -1,19 +1,18 @@ import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'package:sendtrain/database/daos/sessions_dao.dart'; import 'package:sendtrain/database/database.dart'; import '../widgets/session_card.dart'; class SessionsScreen extends StatelessWidget { - final AppDatabase database = AppDatabase(); - SessionsScreen({super.key}); + const SessionsScreen({super.key}); @override Widget build(BuildContext context) { return FutureBuilder>( - future: SessionsDao(database).all(), + future: SessionsDao(Provider.of(context)).all(), builder: (context, snapshot) { if (snapshot.hasData) { - database.close(); final sessions = snapshot.data!; final pending = sessions.where((session) => session.status == SessionStatus.completed || @@ -28,8 +27,6 @@ class SessionsScreen extends StatelessWidget { Widget upcomingSession = SessionCard(session: upcoming); Widget currentSession = SessionCard(session: current); - database.close(); - return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -66,7 +63,13 @@ class SessionsScreen extends StatelessWidget { ], ); } else { - return const CircularProgressIndicator(); + return Container( + alignment: Alignment.center, + child: SizedBox( + height: 50.0, + width: 50.0, + child: CircularProgressIndicator(), + )); } }); } diff --git a/lib/widgets/activity_action_view.dart b/lib/widgets/activity_action_view.dart index 2d88665..591fbad 100644 --- a/lib/widgets/activity_action_view.dart +++ b/lib/widgets/activity_action_view.dart @@ -25,7 +25,7 @@ class ActivityActionViewState extends State { Widget build(BuildContext context) { ActivityTimerModel atm = Provider.of(context, listen: true); - List>> sets = atm.activity!.actions[0].items(); + List>> sets = atm.activityModel!.actions[0].items(); // we need to set the scroll controller // so we can update the selected item position diff --git a/lib/widgets/activity_card.dart b/lib/widgets/activity_card.dart index e93a29e..4a5adc2 100644 --- a/lib/widgets/activity_card.dart +++ b/lib/widgets/activity_card.dart @@ -36,28 +36,28 @@ class ActivityCardState extends State { : Theme.of(context).colorScheme.surfaceContainerLow, clipBehavior: Clip.hardEdge, child: InkWell( - // onTap: () => showGeneralDialog( - // barrierColor: Colors.black.withOpacity(0.5), - // transitionDuration: const Duration(milliseconds: 220), - // transitionBuilder: (BuildContext context, - // Animation animation, - // Animation secondaryAnimation, - // Widget child) { - // Animation custom = Tween( - // begin: const Offset(0.0, 1.0), - // end: const Offset(0.0, 0.0)) - // .animate(animation); - // return SlideTransition( - // position: custom, - // child: Dialog.fullscreen( - // child: ActivityView(activity: widget.activity))); - // }, - // barrierDismissible: true, - // barrierLabel: '', - // context: context, - // pageBuilder: (context, animation1, animation2) { - // return Container(); - // }), + onTap: () => showGeneralDialog( + barrierColor: Colors.black.withOpacity(0.5), + transitionDuration: const Duration(milliseconds: 220), + transitionBuilder: (BuildContext context, + Animation animation, + Animation secondaryAnimation, + Widget child) { + Animation custom = Tween( + begin: const Offset(0.0, 1.0), + end: const Offset(0.0, 0.0)) + .animate(animation); + return SlideTransition( + position: custom, + child: Dialog.fullscreen( + child: ActivityView(activity: widget.activity))); + }, + barrierDismissible: true, + barrierLabel: '', + context: context, + pageBuilder: (context, animation1, animation2) { + return Container(); + }), child: Column( mainAxisSize: MainAxisSize.min, children: [ @@ -65,6 +65,7 @@ class ActivityCardState extends State { leading: Padding( padding: const EdgeInsets.fromLTRB(0, 0, 0, 0), child: Container( + padding: EdgeInsets.only(top: 5, bottom: 5), width: 60, decoration: BoxDecoration( image: DecorationImage( diff --git a/lib/widgets/session_view.dart b/lib/widgets/session_view.dart index d7355fc..702ed35 100644 --- a/lib/widgets/session_view.dart +++ b/lib/widgets/session_view.dart @@ -1,8 +1,8 @@ -import 'package:drift/drift.dart' hide Column; import 'package:flutter/material.dart'; import 'package:flutter_expandable_fab/flutter_expandable_fab.dart'; import 'package:intl/intl.dart'; import 'package:intl/date_symbol_data_local.dart'; +import 'package:provider/provider.dart'; import 'package:sendtrain/database/daos/activities_dao.dart'; import 'package:sendtrain/database/database.dart'; @@ -12,11 +12,10 @@ import 'package:sendtrain/widgets/session_view_activities.dart'; import 'package:sendtrain/widgets/session_view_media.dart'; class SessionView extends StatelessWidget { - SessionView({super.key, required this.data, required this.session}); + const SessionView({super.key, required this.data, required this.session}); final SessionModel data; final Session session; - final AppDatabase database = AppDatabase(); @override Widget build(BuildContext context) { @@ -24,11 +23,10 @@ class SessionView extends StatelessWidget { final DateFormat dateFormat = DateFormat('yyyy-MM-dd'); return FutureBuilder>( - future: ActivitiesDao(database).sessionActivities(session.id), + future: ActivitiesDao(Provider.of(context)).sessionActivities(session.id), builder: (context, snapshot) { if (snapshot.hasData) { final activities = snapshot.data!; - database.close(); return Scaffold( floatingActionButtonLocation: ExpandableFab.location, floatingActionButton: ExpandableFab( @@ -84,7 +82,7 @@ class SessionView extends StatelessWidget { style: TextStyle( fontSize: 20, fontWeight: FontWeight.bold), 'Media:')), - SessionViewMedia(session: session, media: data.media), + SessionViewMedia(session: session), const Padding( padding: EdgeInsets.fromLTRB(15, 30, 0, 10), child: Text( @@ -96,7 +94,13 @@ class SessionView extends StatelessWidget { ], )); } else { - return const CircularProgressIndicator(); + return Container( + alignment: Alignment.center, + child: SizedBox( + height: 50.0, + width: 50.0, + child: CircularProgressIndicator(), + )); } }); } diff --git a/lib/widgets/session_view_achievements.dart b/lib/widgets/session_view_achievements.dart index bb83454..df9a827 100644 --- a/lib/widgets/session_view_achievements.dart +++ b/lib/widgets/session_view_achievements.dart @@ -1,12 +1,12 @@ import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'package:sendtrain/database/daos/session_activities_dao.dart'; import 'package:sendtrain/database/database.dart'; class SessionViewAchievements extends StatelessWidget { - SessionViewAchievements({super.key, required this.session}); + const SessionViewAchievements({super.key, required this.session}); final Session session; - final AppDatabase database = AppDatabase(); List getAchievements(List sessionActivities) { List achievements = []; @@ -26,12 +26,12 @@ class SessionViewAchievements extends StatelessWidget { @override Widget build(BuildContext context) { return FutureBuilder>( - future: SessionActivitiesDao(database).sessionActivitiesBySessionId(session.id), + future: SessionActivitiesDao(Provider.of(context)).sessionActivitiesBySessionId(session.id), builder: (context, snapshot) { if (snapshot.hasData) { final sessionActivities = snapshot.data!; final achievements = getAchievements(sessionActivities); - database.close(); + // database.close(); return Column( children: [ @@ -58,7 +58,7 @@ class SessionViewAchievements extends StatelessWidget { ], ); } else { - return const CircularProgressIndicator(); + return Padding(padding: EdgeInsets.all(15), child:CircularProgressIndicator()); } }); } diff --git a/lib/widgets/session_view_media.dart b/lib/widgets/session_view_media.dart index d719f5b..ade8c57 100644 --- a/lib/widgets/session_view_media.dart +++ b/lib/widgets/session_view_media.dart @@ -1,24 +1,22 @@ import 'package:flutter/material.dart'; -import 'package:sendtrain/classes/media.dart'; +import 'package:provider/provider.dart'; import 'package:sendtrain/database/daos/media_items_dao.dart'; import 'package:sendtrain/database/database.dart'; import 'package:sendtrain/widgets/media_card.dart'; class SessionViewMedia extends StatelessWidget { - SessionViewMedia({super.key, this.media, required this.session}); + const SessionViewMedia({super.key, required this.session}); - final List? media; final Session session; - final AppDatabase database = AppDatabase(); @override Widget build(BuildContext context) { return FutureBuilder>( - future: MediaItemsDao(database).mediaItemsFromSession(session), + future: MediaItemsDao(Provider.of(context)).mediaItemsFromSession(session), builder: (context, snapshot) { if (snapshot.hasData) { final mediaItems = snapshot.data!; - database.close(); + // database.close(); List mediaCards = List.generate( mediaItems.length, (i) => MediaCard(media: mediaItems[i])); @@ -37,7 +35,7 @@ class SessionViewMedia extends StatelessWidget { ], ); } else { - return CircularProgressIndicator(); + return Padding(padding: EdgeInsets.all(15), child:CircularProgressIndicator()); } }); } -- 2.47.2 From 68443b3427babd57981073e2083a0da8a558dcf2 Mon Sep 17 00:00:00 2001 From: Joshua Burman Date: Fri, 20 Dec 2024 14:19:17 -0500 Subject: [PATCH 3/9] moved to migration strategy, moved daos to top lib --- build.yaml | 9 + lib/{database => }/daos/activities_dao.dart | 0 lib/{database => }/daos/activities_dao.g.dart | 0 lib/{database => }/daos/media_items_dao.dart | 0 .../daos/media_items_dao.g.dart | 0 .../daos/session_activities_dao.dart | 0 .../daos/session_activities_dao.g.dart | 0 lib/{database => }/daos/sessions_dao.dart | 0 lib/{database => }/daos/sessions_dao.g.dart | 0 lib/database/database.dart | 6 +- lib/database/database.steps.dart | 337 +++ .../sendtrain/drift_schema_v1.json | 1 + .../sendtrain/drift_schema_v2.json | 1 + lib/database/sendtrain/drift_schema_v1.json | 1 + lib/screens/sessions_screen.dart | 4 +- lib/widgets/session_view.dart | 2 +- lib/widgets/session_view_achievements.dart | 2 +- lib/widgets/session_view_media.dart | 2 +- pubspec.yaml | 1 + test/drift/sendtrain/generated/schema.dart | 23 + test/drift/sendtrain/generated/schema_v1.dart | 1916 +++++++++++++++++ test/drift/sendtrain/generated/schema_v2.dart | 1916 +++++++++++++++++ test/drift/sendtrain/migration_test.dart | 104 + 23 files changed, 4317 insertions(+), 8 deletions(-) create mode 100644 build.yaml rename lib/{database => }/daos/activities_dao.dart (100%) rename lib/{database => }/daos/activities_dao.g.dart (100%) rename lib/{database => }/daos/media_items_dao.dart (100%) rename lib/{database => }/daos/media_items_dao.g.dart (100%) rename lib/{database => }/daos/session_activities_dao.dart (100%) rename lib/{database => }/daos/session_activities_dao.g.dart (100%) rename lib/{database => }/daos/sessions_dao.dart (100%) rename lib/{database => }/daos/sessions_dao.g.dart (100%) create mode 100644 lib/database/database.steps.dart create mode 100644 lib/database/drift_schemas/sendtrain/drift_schema_v1.json create mode 100644 lib/database/drift_schemas/sendtrain/drift_schema_v2.json create mode 100644 lib/database/sendtrain/drift_schema_v1.json create mode 100644 test/drift/sendtrain/generated/schema.dart create mode 100644 test/drift/sendtrain/generated/schema_v1.dart create mode 100644 test/drift/sendtrain/generated/schema_v2.dart create mode 100644 test/drift/sendtrain/migration_test.dart diff --git a/build.yaml b/build.yaml new file mode 100644 index 0000000..bc4e1d6 --- /dev/null +++ b/build.yaml @@ -0,0 +1,9 @@ +targets: + $default: + builders: + drift_dev: + options: + schema_dir: lib/database/drift_schemas/ + databases: + # Required: A name for the database and it's path + sendtrain: lib/database/database.dart \ No newline at end of file diff --git a/lib/database/daos/activities_dao.dart b/lib/daos/activities_dao.dart similarity index 100% rename from lib/database/daos/activities_dao.dart rename to lib/daos/activities_dao.dart diff --git a/lib/database/daos/activities_dao.g.dart b/lib/daos/activities_dao.g.dart similarity index 100% rename from lib/database/daos/activities_dao.g.dart rename to lib/daos/activities_dao.g.dart diff --git a/lib/database/daos/media_items_dao.dart b/lib/daos/media_items_dao.dart similarity index 100% rename from lib/database/daos/media_items_dao.dart rename to lib/daos/media_items_dao.dart diff --git a/lib/database/daos/media_items_dao.g.dart b/lib/daos/media_items_dao.g.dart similarity index 100% rename from lib/database/daos/media_items_dao.g.dart rename to lib/daos/media_items_dao.g.dart diff --git a/lib/database/daos/session_activities_dao.dart b/lib/daos/session_activities_dao.dart similarity index 100% rename from lib/database/daos/session_activities_dao.dart rename to lib/daos/session_activities_dao.dart diff --git a/lib/database/daos/session_activities_dao.g.dart b/lib/daos/session_activities_dao.g.dart similarity index 100% rename from lib/database/daos/session_activities_dao.g.dart rename to lib/daos/session_activities_dao.g.dart diff --git a/lib/database/daos/sessions_dao.dart b/lib/daos/sessions_dao.dart similarity index 100% rename from lib/database/daos/sessions_dao.dart rename to lib/daos/sessions_dao.dart diff --git a/lib/database/daos/sessions_dao.g.dart b/lib/daos/sessions_dao.g.dart similarity index 100% rename from lib/database/daos/sessions_dao.g.dart rename to lib/daos/sessions_dao.g.dart diff --git a/lib/database/database.dart b/lib/database/database.dart index 52d4ad3..d2ce42e 100644 --- a/lib/database/database.dart +++ b/lib/database/database.dart @@ -1,7 +1,7 @@ import 'package:drift/drift.dart'; import 'package:drift_flutter/drift_flutter.dart'; -import 'package:sendtrain/database/daos/activities_dao.dart'; -import 'package:sendtrain/database/daos/sessions_dao.dart'; +import 'package:sendtrain/daos/activities_dao.dart'; +import 'package:sendtrain/daos/sessions_dao.dart'; import 'package:sendtrain/database/seed.dart'; part 'database.g.dart'; @@ -124,7 +124,7 @@ class AppDatabase extends _$AppDatabase { AppDatabase() : super(_openConnection()); @override - int get schemaVersion => 1; + int get schemaVersion => 2; @override MigrationStrategy get migration { diff --git a/lib/database/database.steps.dart b/lib/database/database.steps.dart new file mode 100644 index 0000000..3728e64 --- /dev/null +++ b/lib/database/database.steps.dart @@ -0,0 +1,337 @@ +// dart format width=80 +import 'package:drift/internal/versioned_schema.dart' as i0; +import 'package:drift/drift.dart' as i1; +import 'package:drift/drift.dart'; // ignore_for_file: type=lint,unused_import + +// GENERATED BY drift_dev, DO NOT MODIFY. +final class Schema2 extends i0.VersionedSchema { + Schema2({required super.database}) : super(version: 2); + @override + late final List entities = [ + sessions, + activities, + sessionActivities, + actions, + activityActions, + mediaItems, + objectMediaItems, + ]; + late final Shape0 sessions = Shape0( + source: i0.VersionedTable( + entityName: 'sessions', + withoutRowId: false, + isStrict: false, + tableConstraints: [], + columns: [ + _column_0, + _column_1, + _column_2, + _column_3, + _column_4, + _column_5, + ], + attachedDatabase: database, + ), + alias: null); + late final Shape1 activities = Shape1( + source: i0.VersionedTable( + entityName: 'activities', + withoutRowId: false, + isStrict: false, + tableConstraints: [], + columns: [ + _column_0, + _column_1, + _column_6, + _column_2, + _column_7, + _column_5, + ], + attachedDatabase: database, + ), + alias: null); + late final Shape2 sessionActivities = Shape2( + source: i0.VersionedTable( + entityName: 'session_activities', + withoutRowId: false, + isStrict: false, + tableConstraints: [], + columns: [ + _column_0, + _column_8, + _column_9, + _column_10, + _column_11, + _column_5, + ], + attachedDatabase: database, + ), + alias: null); + late final Shape3 actions = Shape3( + source: i0.VersionedTable( + entityName: 'actions', + withoutRowId: false, + isStrict: false, + tableConstraints: [], + columns: [ + _column_0, + _column_1, + _column_2, + _column_12, + _column_5, + ], + attachedDatabase: database, + ), + alias: null); + late final Shape4 activityActions = Shape4( + source: i0.VersionedTable( + entityName: 'activity_actions', + withoutRowId: false, + isStrict: false, + tableConstraints: [], + columns: [ + _column_0, + _column_9, + _column_13, + _column_5, + ], + attachedDatabase: database, + ), + alias: null); + late final Shape5 mediaItems = Shape5( + source: i0.VersionedTable( + entityName: 'media_items', + withoutRowId: false, + isStrict: false, + tableConstraints: [], + columns: [ + _column_0, + _column_1, + _column_2, + _column_14, + _column_6, + _column_5, + ], + attachedDatabase: database, + ), + alias: null); + late final Shape6 objectMediaItems = Shape6( + source: i0.VersionedTable( + entityName: 'object_media_items', + withoutRowId: false, + isStrict: false, + tableConstraints: [], + columns: [ + _column_0, + _column_15, + _column_16, + _column_17, + _column_5, + ], + attachedDatabase: database, + ), + alias: null); +} + +class Shape0 extends i0.VersionedTable { + Shape0({required super.source, required super.alias}) : super.aliased(); + i1.GeneratedColumn get id => + columnsByName['id']! as i1.GeneratedColumn; + i1.GeneratedColumn get title => + columnsByName['title']! as i1.GeneratedColumn; + i1.GeneratedColumn get content => + columnsByName['body']! as i1.GeneratedColumn; + i1.GeneratedColumn get status => + columnsByName['status']! as i1.GeneratedColumn; + i1.GeneratedColumn get date => + columnsByName['date']! as i1.GeneratedColumn; + i1.GeneratedColumn get createdAt => + columnsByName['created_at']! as i1.GeneratedColumn; +} + +i1.GeneratedColumn _column_0(String aliasedName) => + i1.GeneratedColumn('id', aliasedName, false, + hasAutoIncrement: true, + type: i1.DriftSqlType.int, + defaultConstraints: + i1.GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT')); +i1.GeneratedColumn _column_1(String aliasedName) => + i1.GeneratedColumn('title', aliasedName, false, + additionalChecks: i1.GeneratedColumn.checkTextLength( + minTextLength: 3, maxTextLength: 32), + type: i1.DriftSqlType.string); +i1.GeneratedColumn _column_2(String aliasedName) => + i1.GeneratedColumn('body', aliasedName, false, + type: i1.DriftSqlType.string); +i1.GeneratedColumn _column_3(String aliasedName) => + i1.GeneratedColumn('status', aliasedName, false, + type: i1.DriftSqlType.string); +i1.GeneratedColumn _column_4(String aliasedName) => + i1.GeneratedColumn('date', aliasedName, true, + type: i1.DriftSqlType.dateTime); +i1.GeneratedColumn _column_5(String aliasedName) => + i1.GeneratedColumn('created_at', aliasedName, false, + type: i1.DriftSqlType.dateTime, defaultValue: Variable(DateTime.now())); + +class Shape1 extends i0.VersionedTable { + Shape1({required super.source, required super.alias}) : super.aliased(); + i1.GeneratedColumn get id => + columnsByName['id']! as i1.GeneratedColumn; + i1.GeneratedColumn get title => + columnsByName['title']! as i1.GeneratedColumn; + i1.GeneratedColumn get type => + columnsByName['type']! as i1.GeneratedColumn; + i1.GeneratedColumn get description => + columnsByName['body']! as i1.GeneratedColumn; + i1.GeneratedColumn get category => + columnsByName['category']! as i1.GeneratedColumn; + i1.GeneratedColumn get createdAt => + columnsByName['created_at']! as i1.GeneratedColumn; +} + +i1.GeneratedColumn _column_6(String aliasedName) => + i1.GeneratedColumn('type', aliasedName, false, + type: i1.DriftSqlType.string); +i1.GeneratedColumn _column_7(String aliasedName) => + i1.GeneratedColumn('category', aliasedName, false, + type: i1.DriftSqlType.string); + +class Shape2 extends i0.VersionedTable { + Shape2({required super.source, required super.alias}) : super.aliased(); + i1.GeneratedColumn get id => + columnsByName['id']! as i1.GeneratedColumn; + i1.GeneratedColumn get sessionId => + columnsByName['session_id']! as i1.GeneratedColumn; + i1.GeneratedColumn get activityId => + columnsByName['activity_id']! as i1.GeneratedColumn; + i1.GeneratedColumn get results => + columnsByName['results']! as i1.GeneratedColumn; + i1.GeneratedColumn get achievements => + columnsByName['achievements']! as i1.GeneratedColumn; + i1.GeneratedColumn get createdAt => + columnsByName['created_at']! as i1.GeneratedColumn; +} + +i1.GeneratedColumn _column_8(String aliasedName) => + i1.GeneratedColumn('session_id', aliasedName, false, + type: i1.DriftSqlType.int, + defaultConstraints: + i1.GeneratedColumn.constraintIsAlways('REFERENCES sessions (id)')); +i1.GeneratedColumn _column_9(String aliasedName) => + i1.GeneratedColumn('activity_id', aliasedName, false, + type: i1.DriftSqlType.int, + defaultConstraints: i1.GeneratedColumn.constraintIsAlways( + 'REFERENCES activities (id)')); +i1.GeneratedColumn _column_10(String aliasedName) => + i1.GeneratedColumn('results', aliasedName, true, + type: i1.DriftSqlType.string); +i1.GeneratedColumn _column_11(String aliasedName) => + i1.GeneratedColumn('achievements', aliasedName, true, + type: i1.DriftSqlType.string); + +class Shape3 extends i0.VersionedTable { + Shape3({required super.source, required super.alias}) : super.aliased(); + i1.GeneratedColumn get id => + columnsByName['id']! as i1.GeneratedColumn; + i1.GeneratedColumn get title => + columnsByName['title']! as i1.GeneratedColumn; + i1.GeneratedColumn get description => + columnsByName['body']! as i1.GeneratedColumn; + i1.GeneratedColumn get set => + columnsByName['set']! as i1.GeneratedColumn; + i1.GeneratedColumn get createdAt => + columnsByName['created_at']! as i1.GeneratedColumn; +} + +i1.GeneratedColumn _column_12(String aliasedName) => + i1.GeneratedColumn('set', aliasedName, false, + type: i1.DriftSqlType.string); + +class Shape4 extends i0.VersionedTable { + Shape4({required super.source, required super.alias}) : super.aliased(); + i1.GeneratedColumn get id => + columnsByName['id']! as i1.GeneratedColumn; + i1.GeneratedColumn get activityId => + columnsByName['activity_id']! as i1.GeneratedColumn; + i1.GeneratedColumn get actionId => + columnsByName['action_id']! as i1.GeneratedColumn; + i1.GeneratedColumn get createdAt => + columnsByName['created_at']! as i1.GeneratedColumn; +} + +i1.GeneratedColumn _column_13(String aliasedName) => + i1.GeneratedColumn('action_id', aliasedName, false, + type: i1.DriftSqlType.int, + defaultConstraints: + i1.GeneratedColumn.constraintIsAlways('REFERENCES actions (id)')); + +class Shape5 extends i0.VersionedTable { + Shape5({required super.source, required super.alias}) : super.aliased(); + i1.GeneratedColumn get id => + columnsByName['id']! as i1.GeneratedColumn; + i1.GeneratedColumn get title => + columnsByName['title']! as i1.GeneratedColumn; + i1.GeneratedColumn get description => + columnsByName['body']! as i1.GeneratedColumn; + i1.GeneratedColumn get reference => + columnsByName['reference']! as i1.GeneratedColumn; + i1.GeneratedColumn get type => + columnsByName['type']! as i1.GeneratedColumn; + i1.GeneratedColumn get createdAt => + columnsByName['created_at']! as i1.GeneratedColumn; +} + +i1.GeneratedColumn _column_14(String aliasedName) => + i1.GeneratedColumn('reference', aliasedName, false, + additionalChecks: i1.GeneratedColumn.checkTextLength( + minTextLength: 3, maxTextLength: 256), + type: i1.DriftSqlType.string); + +class Shape6 extends i0.VersionedTable { + Shape6({required super.source, required super.alias}) : super.aliased(); + i1.GeneratedColumn get id => + columnsByName['id']! as i1.GeneratedColumn; + i1.GeneratedColumn get objectId => + columnsByName['object_id']! as i1.GeneratedColumn; + i1.GeneratedColumn get objectType => + columnsByName['object_type']! as i1.GeneratedColumn; + i1.GeneratedColumn get mediaId => + columnsByName['media_id']! as i1.GeneratedColumn; + i1.GeneratedColumn get createdAt => + columnsByName['created_at']! as i1.GeneratedColumn; +} + +i1.GeneratedColumn _column_15(String aliasedName) => + i1.GeneratedColumn('object_id', aliasedName, false, + type: i1.DriftSqlType.int); +i1.GeneratedColumn _column_16(String aliasedName) => + i1.GeneratedColumn('object_type', aliasedName, false, + type: i1.DriftSqlType.string); +i1.GeneratedColumn _column_17(String aliasedName) => + i1.GeneratedColumn('media_id', aliasedName, false, + type: i1.DriftSqlType.int, + defaultConstraints: i1.GeneratedColumn.constraintIsAlways( + 'REFERENCES media_items (id)')); +i0.MigrationStepWithVersion migrationSteps({ + required Future Function(i1.Migrator m, Schema2 schema) from1To2, +}) { + return (currentVersion, database) async { + switch (currentVersion) { + case 1: + final schema = Schema2(database: database); + final migrator = i1.Migrator(database, schema); + await from1To2(migrator, schema); + return 2; + default: + throw ArgumentError.value('Unknown migration from $currentVersion'); + } + }; +} + +i1.OnUpgrade stepByStep({ + required Future Function(i1.Migrator m, Schema2 schema) from1To2, +}) => + i0.VersionedSchema.stepByStepHelper( + step: migrationSteps( + from1To2: from1To2, + )); diff --git a/lib/database/drift_schemas/sendtrain/drift_schema_v1.json b/lib/database/drift_schemas/sendtrain/drift_schema_v1.json new file mode 100644 index 0000000..bab55e6 --- /dev/null +++ b/lib/database/drift_schemas/sendtrain/drift_schema_v1.json @@ -0,0 +1 @@ +{"_meta":{"description":"This file contains a serialized version of schema entities for drift.","version":"1.2.0"},"options":{"store_date_time_values_as_text":false},"entities":[{"id":0,"references":[],"type":"table","data":{"name":"sessions","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"title","getter_name":"title","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[{"allowed-lengths":{"min":3,"max":32}}]},{"name":"body","getter_name":"content","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"status","getter_name":"status","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(SessionStatus.values)","dart_type_name":"SessionStatus"}},{"name":"date","getter_name":"date","moor_type":"dateTime","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"Variable(DateTime.now())","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":1,"references":[],"type":"table","data":{"name":"activities","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"title","getter_name":"title","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[{"allowed-lengths":{"min":3,"max":32}}]},{"name":"type","getter_name":"type","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(ActivityType.values)","dart_type_name":"ActivityType"}},{"name":"body","getter_name":"description","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"category","getter_name":"category","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(ActivityCategories.values)","dart_type_name":"ActivityCategories"}},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"Variable(DateTime.now())","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":2,"references":[0,1],"type":"table","data":{"name":"session_activities","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"session_id","getter_name":"sessionId","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES sessions (id)","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES sessions (id)"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]},{"name":"activity_id","getter_name":"activityId","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES activities (id)","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES activities (id)"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]},{"name":"results","getter_name":"results","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"achievements","getter_name":"achievements","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"Variable(DateTime.now())","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":3,"references":[],"type":"table","data":{"name":"actions","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"title","getter_name":"title","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[{"allowed-lengths":{"min":3,"max":32}}]},{"name":"body","getter_name":"description","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"set","getter_name":"set","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"Variable(DateTime.now())","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":4,"references":[1,3],"type":"table","data":{"name":"activity_actions","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"activity_id","getter_name":"activityId","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES activities (id)","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES activities (id)"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]},{"name":"action_id","getter_name":"actionId","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES actions (id)","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES actions (id)"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"Variable(DateTime.now())","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":5,"references":[],"type":"table","data":{"name":"media_items","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"title","getter_name":"title","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[{"allowed-lengths":{"min":3,"max":32}}]},{"name":"body","getter_name":"description","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"reference","getter_name":"reference","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[{"allowed-lengths":{"min":3,"max":256}}]},{"name":"type","getter_name":"type","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(MediaType.values)","dart_type_name":"MediaType"}},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"Variable(DateTime.now())","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":6,"references":[5],"type":"table","data":{"name":"object_media_items","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"object_id","getter_name":"objectId","moor_type":"int","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"object_type","getter_name":"objectType","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(ObjectType.values)","dart_type_name":"ObjectType"}},{"name":"media_id","getter_name":"mediaId","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES media_items (id)","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES media_items (id)"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"Variable(DateTime.now())","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}}]} \ No newline at end of file diff --git a/lib/database/drift_schemas/sendtrain/drift_schema_v2.json b/lib/database/drift_schemas/sendtrain/drift_schema_v2.json new file mode 100644 index 0000000..bab55e6 --- /dev/null +++ b/lib/database/drift_schemas/sendtrain/drift_schema_v2.json @@ -0,0 +1 @@ +{"_meta":{"description":"This file contains a serialized version of schema entities for drift.","version":"1.2.0"},"options":{"store_date_time_values_as_text":false},"entities":[{"id":0,"references":[],"type":"table","data":{"name":"sessions","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"title","getter_name":"title","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[{"allowed-lengths":{"min":3,"max":32}}]},{"name":"body","getter_name":"content","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"status","getter_name":"status","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(SessionStatus.values)","dart_type_name":"SessionStatus"}},{"name":"date","getter_name":"date","moor_type":"dateTime","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"Variable(DateTime.now())","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":1,"references":[],"type":"table","data":{"name":"activities","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"title","getter_name":"title","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[{"allowed-lengths":{"min":3,"max":32}}]},{"name":"type","getter_name":"type","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(ActivityType.values)","dart_type_name":"ActivityType"}},{"name":"body","getter_name":"description","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"category","getter_name":"category","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(ActivityCategories.values)","dart_type_name":"ActivityCategories"}},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"Variable(DateTime.now())","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":2,"references":[0,1],"type":"table","data":{"name":"session_activities","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"session_id","getter_name":"sessionId","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES sessions (id)","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES sessions (id)"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]},{"name":"activity_id","getter_name":"activityId","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES activities (id)","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES activities (id)"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]},{"name":"results","getter_name":"results","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"achievements","getter_name":"achievements","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"Variable(DateTime.now())","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":3,"references":[],"type":"table","data":{"name":"actions","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"title","getter_name":"title","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[{"allowed-lengths":{"min":3,"max":32}}]},{"name":"body","getter_name":"description","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"set","getter_name":"set","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"Variable(DateTime.now())","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":4,"references":[1,3],"type":"table","data":{"name":"activity_actions","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"activity_id","getter_name":"activityId","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES activities (id)","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES activities (id)"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]},{"name":"action_id","getter_name":"actionId","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES actions (id)","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES actions (id)"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"Variable(DateTime.now())","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":5,"references":[],"type":"table","data":{"name":"media_items","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"title","getter_name":"title","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[{"allowed-lengths":{"min":3,"max":32}}]},{"name":"body","getter_name":"description","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"reference","getter_name":"reference","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[{"allowed-lengths":{"min":3,"max":256}}]},{"name":"type","getter_name":"type","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(MediaType.values)","dart_type_name":"MediaType"}},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"Variable(DateTime.now())","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":6,"references":[5],"type":"table","data":{"name":"object_media_items","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"object_id","getter_name":"objectId","moor_type":"int","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"object_type","getter_name":"objectType","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(ObjectType.values)","dart_type_name":"ObjectType"}},{"name":"media_id","getter_name":"mediaId","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES media_items (id)","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES media_items (id)"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"Variable(DateTime.now())","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}}]} \ No newline at end of file diff --git a/lib/database/sendtrain/drift_schema_v1.json b/lib/database/sendtrain/drift_schema_v1.json new file mode 100644 index 0000000..bab55e6 --- /dev/null +++ b/lib/database/sendtrain/drift_schema_v1.json @@ -0,0 +1 @@ +{"_meta":{"description":"This file contains a serialized version of schema entities for drift.","version":"1.2.0"},"options":{"store_date_time_values_as_text":false},"entities":[{"id":0,"references":[],"type":"table","data":{"name":"sessions","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"title","getter_name":"title","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[{"allowed-lengths":{"min":3,"max":32}}]},{"name":"body","getter_name":"content","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"status","getter_name":"status","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(SessionStatus.values)","dart_type_name":"SessionStatus"}},{"name":"date","getter_name":"date","moor_type":"dateTime","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"Variable(DateTime.now())","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":1,"references":[],"type":"table","data":{"name":"activities","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"title","getter_name":"title","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[{"allowed-lengths":{"min":3,"max":32}}]},{"name":"type","getter_name":"type","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(ActivityType.values)","dart_type_name":"ActivityType"}},{"name":"body","getter_name":"description","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"category","getter_name":"category","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(ActivityCategories.values)","dart_type_name":"ActivityCategories"}},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"Variable(DateTime.now())","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":2,"references":[0,1],"type":"table","data":{"name":"session_activities","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"session_id","getter_name":"sessionId","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES sessions (id)","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES sessions (id)"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]},{"name":"activity_id","getter_name":"activityId","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES activities (id)","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES activities (id)"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]},{"name":"results","getter_name":"results","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"achievements","getter_name":"achievements","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"Variable(DateTime.now())","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":3,"references":[],"type":"table","data":{"name":"actions","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"title","getter_name":"title","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[{"allowed-lengths":{"min":3,"max":32}}]},{"name":"body","getter_name":"description","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"set","getter_name":"set","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"Variable(DateTime.now())","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":4,"references":[1,3],"type":"table","data":{"name":"activity_actions","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"activity_id","getter_name":"activityId","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES activities (id)","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES activities (id)"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]},{"name":"action_id","getter_name":"actionId","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES actions (id)","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES actions (id)"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"Variable(DateTime.now())","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":5,"references":[],"type":"table","data":{"name":"media_items","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"title","getter_name":"title","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[{"allowed-lengths":{"min":3,"max":32}}]},{"name":"body","getter_name":"description","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"reference","getter_name":"reference","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[{"allowed-lengths":{"min":3,"max":256}}]},{"name":"type","getter_name":"type","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(MediaType.values)","dart_type_name":"MediaType"}},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"Variable(DateTime.now())","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":6,"references":[5],"type":"table","data":{"name":"object_media_items","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"object_id","getter_name":"objectId","moor_type":"int","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"object_type","getter_name":"objectType","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(ObjectType.values)","dart_type_name":"ObjectType"}},{"name":"media_id","getter_name":"mediaId","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES media_items (id)","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES media_items (id)"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"Variable(DateTime.now())","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}}]} \ No newline at end of file diff --git a/lib/screens/sessions_screen.dart b/lib/screens/sessions_screen.dart index 22231b1..c83c72f 100644 --- a/lib/screens/sessions_screen.dart +++ b/lib/screens/sessions_screen.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:sendtrain/database/daos/sessions_dao.dart'; +import 'package:sendtrain/daos/sessions_dao.dart'; import 'package:sendtrain/database/database.dart'; import '../widgets/session_card.dart'; @@ -12,7 +12,7 @@ class SessionsScreen extends StatelessWidget { return FutureBuilder>( future: SessionsDao(Provider.of(context)).all(), builder: (context, snapshot) { - if (snapshot.hasData) { + if (snapshot.hasData && snapshot.data!.isNotEmpty) { final sessions = snapshot.data!; final pending = sessions.where((session) => session.status == SessionStatus.completed || diff --git a/lib/widgets/session_view.dart b/lib/widgets/session_view.dart index 702ed35..d2da679 100644 --- a/lib/widgets/session_view.dart +++ b/lib/widgets/session_view.dart @@ -3,7 +3,7 @@ import 'package:flutter_expandable_fab/flutter_expandable_fab.dart'; import 'package:intl/intl.dart'; import 'package:intl/date_symbol_data_local.dart'; import 'package:provider/provider.dart'; -import 'package:sendtrain/database/daos/activities_dao.dart'; +import 'package:sendtrain/daos/activities_dao.dart'; import 'package:sendtrain/database/database.dart'; import 'package:sendtrain/models/session_model.dart'; diff --git a/lib/widgets/session_view_achievements.dart b/lib/widgets/session_view_achievements.dart index df9a827..5c85357 100644 --- a/lib/widgets/session_view_achievements.dart +++ b/lib/widgets/session_view_achievements.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:sendtrain/database/daos/session_activities_dao.dart'; +import 'package:sendtrain/daos/session_activities_dao.dart'; import 'package:sendtrain/database/database.dart'; class SessionViewAchievements extends StatelessWidget { diff --git a/lib/widgets/session_view_media.dart b/lib/widgets/session_view_media.dart index ade8c57..54b373c 100644 --- a/lib/widgets/session_view_media.dart +++ b/lib/widgets/session_view_media.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:sendtrain/database/daos/media_items_dao.dart'; +import 'package:sendtrain/daos/media_items_dao.dart'; import 'package:sendtrain/database/database.dart'; import 'package:sendtrain/widgets/media_card.dart'; diff --git a/pubspec.yaml b/pubspec.yaml index b158e65..26710c2 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -61,6 +61,7 @@ dev_dependencies: build_runner: ^2.4.13 json_serializable: ^6.9.0 drift_dev: ^2.22.1 + test: ^1.25.7 # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec diff --git a/test/drift/sendtrain/generated/schema.dart b/test/drift/sendtrain/generated/schema.dart new file mode 100644 index 0000000..b2b7404 --- /dev/null +++ b/test/drift/sendtrain/generated/schema.dart @@ -0,0 +1,23 @@ +// dart format width=80 +// GENERATED CODE, DO NOT EDIT BY HAND. +// ignore_for_file: type=lint +import 'package:drift/drift.dart'; +import 'package:drift/internal/migrations.dart'; +import 'schema_v1.dart' as v1; +import 'schema_v2.dart' as v2; + +class GeneratedHelper implements SchemaInstantiationHelper { + @override + GeneratedDatabase databaseForVersion(QueryExecutor db, int version) { + switch (version) { + case 1: + return v1.DatabaseAtV1(db); + case 2: + return v2.DatabaseAtV2(db); + default: + throw MissingSchemaException(version, versions); + } + } + + static const versions = const [1, 2]; +} diff --git a/test/drift/sendtrain/generated/schema_v1.dart b/test/drift/sendtrain/generated/schema_v1.dart new file mode 100644 index 0000000..3715d3f --- /dev/null +++ b/test/drift/sendtrain/generated/schema_v1.dart @@ -0,0 +1,1916 @@ +// dart format width=80 +// GENERATED CODE, DO NOT EDIT BY HAND. +// ignore_for_file: type=lint +import 'package:drift/drift.dart'; + +class Sessions extends Table with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + Sessions(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, false, + hasAutoIncrement: true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT')); + late final GeneratedColumn title = GeneratedColumn( + 'title', aliasedName, false, + additionalChecks: + GeneratedColumn.checkTextLength(minTextLength: 3, maxTextLength: 32), + type: DriftSqlType.string, + requiredDuringInsert: true); + late final GeneratedColumn content = GeneratedColumn( + 'body', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn status = GeneratedColumn( + 'status', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn date = GeneratedColumn( + 'date', aliasedName, true, + type: DriftSqlType.dateTime, requiredDuringInsert: false); + late final GeneratedColumn createdAt = GeneratedColumn( + 'created_at', aliasedName, false, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + defaultValue: Variable(DateTime.now())); + @override + List get $columns => + [id, title, content, status, date, createdAt]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'sessions'; + @override + Set get $primaryKey => {id}; + @override + SessionsData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return SessionsData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id'])!, + title: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}title'])!, + content: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}body'])!, + status: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}status'])!, + date: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}date']), + createdAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!, + ); + } + + @override + Sessions createAlias(String alias) { + return Sessions(attachedDatabase, alias); + } +} + +class SessionsData extends DataClass implements Insertable { + final int id; + final String title; + final String content; + final String status; + final DateTime? date; + final DateTime createdAt; + const SessionsData( + {required this.id, + required this.title, + required this.content, + required this.status, + this.date, + required this.createdAt}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['title'] = Variable(title); + map['body'] = Variable(content); + map['status'] = Variable(status); + if (!nullToAbsent || date != null) { + map['date'] = Variable(date); + } + map['created_at'] = Variable(createdAt); + return map; + } + + SessionsCompanion toCompanion(bool nullToAbsent) { + return SessionsCompanion( + id: Value(id), + title: Value(title), + content: Value(content), + status: Value(status), + date: date == null && nullToAbsent ? const Value.absent() : Value(date), + createdAt: Value(createdAt), + ); + } + + factory SessionsData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return SessionsData( + id: serializer.fromJson(json['id']), + title: serializer.fromJson(json['title']), + content: serializer.fromJson(json['content']), + status: serializer.fromJson(json['status']), + date: serializer.fromJson(json['date']), + createdAt: serializer.fromJson(json['createdAt']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'title': serializer.toJson(title), + 'content': serializer.toJson(content), + 'status': serializer.toJson(status), + 'date': serializer.toJson(date), + 'createdAt': serializer.toJson(createdAt), + }; + } + + SessionsData copyWith( + {int? id, + String? title, + String? content, + String? status, + Value date = const Value.absent(), + DateTime? createdAt}) => + SessionsData( + id: id ?? this.id, + title: title ?? this.title, + content: content ?? this.content, + status: status ?? this.status, + date: date.present ? date.value : this.date, + createdAt: createdAt ?? this.createdAt, + ); + SessionsData copyWithCompanion(SessionsCompanion data) { + return SessionsData( + id: data.id.present ? data.id.value : this.id, + title: data.title.present ? data.title.value : this.title, + content: data.content.present ? data.content.value : this.content, + status: data.status.present ? data.status.value : this.status, + date: data.date.present ? data.date.value : this.date, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + ); + } + + @override + String toString() { + return (StringBuffer('SessionsData(') + ..write('id: $id, ') + ..write('title: $title, ') + ..write('content: $content, ') + ..write('status: $status, ') + ..write('date: $date, ') + ..write('createdAt: $createdAt') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(id, title, content, status, date, createdAt); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is SessionsData && + other.id == this.id && + other.title == this.title && + other.content == this.content && + other.status == this.status && + other.date == this.date && + other.createdAt == this.createdAt); +} + +class SessionsCompanion extends UpdateCompanion { + final Value id; + final Value title; + final Value content; + final Value status; + final Value date; + final Value createdAt; + const SessionsCompanion({ + this.id = const Value.absent(), + this.title = const Value.absent(), + this.content = const Value.absent(), + this.status = const Value.absent(), + this.date = const Value.absent(), + this.createdAt = const Value.absent(), + }); + SessionsCompanion.insert({ + this.id = const Value.absent(), + required String title, + required String content, + required String status, + this.date = const Value.absent(), + this.createdAt = const Value.absent(), + }) : title = Value(title), + content = Value(content), + status = Value(status); + static Insertable custom({ + Expression? id, + Expression? title, + Expression? content, + Expression? status, + Expression? date, + Expression? createdAt, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (title != null) 'title': title, + if (content != null) 'body': content, + if (status != null) 'status': status, + if (date != null) 'date': date, + if (createdAt != null) 'created_at': createdAt, + }); + } + + SessionsCompanion copyWith( + {Value? id, + Value? title, + Value? content, + Value? status, + Value? date, + Value? createdAt}) { + return SessionsCompanion( + id: id ?? this.id, + title: title ?? this.title, + content: content ?? this.content, + status: status ?? this.status, + date: date ?? this.date, + createdAt: createdAt ?? this.createdAt, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (title.present) { + map['title'] = Variable(title.value); + } + if (content.present) { + map['body'] = Variable(content.value); + } + if (status.present) { + map['status'] = Variable(status.value); + } + if (date.present) { + map['date'] = Variable(date.value); + } + if (createdAt.present) { + map['created_at'] = Variable(createdAt.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('SessionsCompanion(') + ..write('id: $id, ') + ..write('title: $title, ') + ..write('content: $content, ') + ..write('status: $status, ') + ..write('date: $date, ') + ..write('createdAt: $createdAt') + ..write(')')) + .toString(); + } +} + +class Activities extends Table with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + Activities(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, false, + hasAutoIncrement: true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT')); + late final GeneratedColumn title = GeneratedColumn( + 'title', aliasedName, false, + additionalChecks: + GeneratedColumn.checkTextLength(minTextLength: 3, maxTextLength: 32), + type: DriftSqlType.string, + requiredDuringInsert: true); + late final GeneratedColumn type = GeneratedColumn( + 'type', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn description = GeneratedColumn( + 'body', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn category = GeneratedColumn( + 'category', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn createdAt = GeneratedColumn( + 'created_at', aliasedName, false, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + defaultValue: Variable(DateTime.now())); + @override + List get $columns => + [id, title, type, description, category, createdAt]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'activities'; + @override + Set get $primaryKey => {id}; + @override + ActivitiesData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return ActivitiesData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id'])!, + title: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}title'])!, + type: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}type'])!, + description: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}body'])!, + category: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}category'])!, + createdAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!, + ); + } + + @override + Activities createAlias(String alias) { + return Activities(attachedDatabase, alias); + } +} + +class ActivitiesData extends DataClass implements Insertable { + final int id; + final String title; + final String type; + final String description; + final String category; + final DateTime createdAt; + const ActivitiesData( + {required this.id, + required this.title, + required this.type, + required this.description, + required this.category, + required this.createdAt}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['title'] = Variable(title); + map['type'] = Variable(type); + map['body'] = Variable(description); + map['category'] = Variable(category); + map['created_at'] = Variable(createdAt); + return map; + } + + ActivitiesCompanion toCompanion(bool nullToAbsent) { + return ActivitiesCompanion( + id: Value(id), + title: Value(title), + type: Value(type), + description: Value(description), + category: Value(category), + createdAt: Value(createdAt), + ); + } + + factory ActivitiesData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return ActivitiesData( + id: serializer.fromJson(json['id']), + title: serializer.fromJson(json['title']), + type: serializer.fromJson(json['type']), + description: serializer.fromJson(json['description']), + category: serializer.fromJson(json['category']), + createdAt: serializer.fromJson(json['createdAt']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'title': serializer.toJson(title), + 'type': serializer.toJson(type), + 'description': serializer.toJson(description), + 'category': serializer.toJson(category), + 'createdAt': serializer.toJson(createdAt), + }; + } + + ActivitiesData copyWith( + {int? id, + String? title, + String? type, + String? description, + String? category, + DateTime? createdAt}) => + ActivitiesData( + id: id ?? this.id, + title: title ?? this.title, + type: type ?? this.type, + description: description ?? this.description, + category: category ?? this.category, + createdAt: createdAt ?? this.createdAt, + ); + ActivitiesData copyWithCompanion(ActivitiesCompanion data) { + return ActivitiesData( + id: data.id.present ? data.id.value : this.id, + title: data.title.present ? data.title.value : this.title, + type: data.type.present ? data.type.value : this.type, + description: + data.description.present ? data.description.value : this.description, + category: data.category.present ? data.category.value : this.category, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + ); + } + + @override + String toString() { + return (StringBuffer('ActivitiesData(') + ..write('id: $id, ') + ..write('title: $title, ') + ..write('type: $type, ') + ..write('description: $description, ') + ..write('category: $category, ') + ..write('createdAt: $createdAt') + ..write(')')) + .toString(); + } + + @override + int get hashCode => + Object.hash(id, title, type, description, category, createdAt); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is ActivitiesData && + other.id == this.id && + other.title == this.title && + other.type == this.type && + other.description == this.description && + other.category == this.category && + other.createdAt == this.createdAt); +} + +class ActivitiesCompanion extends UpdateCompanion { + final Value id; + final Value title; + final Value type; + final Value description; + final Value category; + final Value createdAt; + const ActivitiesCompanion({ + this.id = const Value.absent(), + this.title = const Value.absent(), + this.type = const Value.absent(), + this.description = const Value.absent(), + this.category = const Value.absent(), + this.createdAt = const Value.absent(), + }); + ActivitiesCompanion.insert({ + this.id = const Value.absent(), + required String title, + required String type, + required String description, + required String category, + this.createdAt = const Value.absent(), + }) : title = Value(title), + type = Value(type), + description = Value(description), + category = Value(category); + static Insertable custom({ + Expression? id, + Expression? title, + Expression? type, + Expression? description, + Expression? category, + Expression? createdAt, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (title != null) 'title': title, + if (type != null) 'type': type, + if (description != null) 'body': description, + if (category != null) 'category': category, + if (createdAt != null) 'created_at': createdAt, + }); + } + + ActivitiesCompanion copyWith( + {Value? id, + Value? title, + Value? type, + Value? description, + Value? category, + Value? createdAt}) { + return ActivitiesCompanion( + id: id ?? this.id, + title: title ?? this.title, + type: type ?? this.type, + description: description ?? this.description, + category: category ?? this.category, + createdAt: createdAt ?? this.createdAt, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (title.present) { + map['title'] = Variable(title.value); + } + if (type.present) { + map['type'] = Variable(type.value); + } + if (description.present) { + map['body'] = Variable(description.value); + } + if (category.present) { + map['category'] = Variable(category.value); + } + if (createdAt.present) { + map['created_at'] = Variable(createdAt.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('ActivitiesCompanion(') + ..write('id: $id, ') + ..write('title: $title, ') + ..write('type: $type, ') + ..write('description: $description, ') + ..write('category: $category, ') + ..write('createdAt: $createdAt') + ..write(')')) + .toString(); + } +} + +class SessionActivities extends Table + with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + SessionActivities(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, false, + hasAutoIncrement: true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT')); + late final GeneratedColumn sessionId = GeneratedColumn( + 'session_id', aliasedName, false, + type: DriftSqlType.int, + requiredDuringInsert: true, + defaultConstraints: + GeneratedColumn.constraintIsAlways('REFERENCES sessions (id)')); + late final GeneratedColumn activityId = GeneratedColumn( + 'activity_id', aliasedName, false, + type: DriftSqlType.int, + requiredDuringInsert: true, + defaultConstraints: + GeneratedColumn.constraintIsAlways('REFERENCES activities (id)')); + late final GeneratedColumn results = GeneratedColumn( + 'results', aliasedName, true, + type: DriftSqlType.string, requiredDuringInsert: false); + late final GeneratedColumn achievements = GeneratedColumn( + 'achievements', aliasedName, true, + type: DriftSqlType.string, requiredDuringInsert: false); + late final GeneratedColumn createdAt = GeneratedColumn( + 'created_at', aliasedName, false, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + defaultValue: Variable(DateTime.now())); + @override + List get $columns => + [id, sessionId, activityId, results, achievements, createdAt]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'session_activities'; + @override + Set get $primaryKey => {id}; + @override + SessionActivitiesData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return SessionActivitiesData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id'])!, + sessionId: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}session_id'])!, + activityId: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}activity_id'])!, + results: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}results']), + achievements: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}achievements']), + createdAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!, + ); + } + + @override + SessionActivities createAlias(String alias) { + return SessionActivities(attachedDatabase, alias); + } +} + +class SessionActivitiesData extends DataClass + implements Insertable { + final int id; + final int sessionId; + final int activityId; + final String? results; + final String? achievements; + final DateTime createdAt; + const SessionActivitiesData( + {required this.id, + required this.sessionId, + required this.activityId, + this.results, + this.achievements, + required this.createdAt}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['session_id'] = Variable(sessionId); + map['activity_id'] = Variable(activityId); + if (!nullToAbsent || results != null) { + map['results'] = Variable(results); + } + if (!nullToAbsent || achievements != null) { + map['achievements'] = Variable(achievements); + } + map['created_at'] = Variable(createdAt); + return map; + } + + SessionActivitiesCompanion toCompanion(bool nullToAbsent) { + return SessionActivitiesCompanion( + id: Value(id), + sessionId: Value(sessionId), + activityId: Value(activityId), + results: results == null && nullToAbsent + ? const Value.absent() + : Value(results), + achievements: achievements == null && nullToAbsent + ? const Value.absent() + : Value(achievements), + createdAt: Value(createdAt), + ); + } + + factory SessionActivitiesData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return SessionActivitiesData( + id: serializer.fromJson(json['id']), + sessionId: serializer.fromJson(json['sessionId']), + activityId: serializer.fromJson(json['activityId']), + results: serializer.fromJson(json['results']), + achievements: serializer.fromJson(json['achievements']), + createdAt: serializer.fromJson(json['createdAt']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'sessionId': serializer.toJson(sessionId), + 'activityId': serializer.toJson(activityId), + 'results': serializer.toJson(results), + 'achievements': serializer.toJson(achievements), + 'createdAt': serializer.toJson(createdAt), + }; + } + + SessionActivitiesData copyWith( + {int? id, + int? sessionId, + int? activityId, + Value results = const Value.absent(), + Value achievements = const Value.absent(), + DateTime? createdAt}) => + SessionActivitiesData( + id: id ?? this.id, + sessionId: sessionId ?? this.sessionId, + activityId: activityId ?? this.activityId, + results: results.present ? results.value : this.results, + achievements: + achievements.present ? achievements.value : this.achievements, + createdAt: createdAt ?? this.createdAt, + ); + SessionActivitiesData copyWithCompanion(SessionActivitiesCompanion data) { + return SessionActivitiesData( + id: data.id.present ? data.id.value : this.id, + sessionId: data.sessionId.present ? data.sessionId.value : this.sessionId, + activityId: + data.activityId.present ? data.activityId.value : this.activityId, + results: data.results.present ? data.results.value : this.results, + achievements: data.achievements.present + ? data.achievements.value + : this.achievements, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + ); + } + + @override + String toString() { + return (StringBuffer('SessionActivitiesData(') + ..write('id: $id, ') + ..write('sessionId: $sessionId, ') + ..write('activityId: $activityId, ') + ..write('results: $results, ') + ..write('achievements: $achievements, ') + ..write('createdAt: $createdAt') + ..write(')')) + .toString(); + } + + @override + int get hashCode => + Object.hash(id, sessionId, activityId, results, achievements, createdAt); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is SessionActivitiesData && + other.id == this.id && + other.sessionId == this.sessionId && + other.activityId == this.activityId && + other.results == this.results && + other.achievements == this.achievements && + other.createdAt == this.createdAt); +} + +class SessionActivitiesCompanion + extends UpdateCompanion { + final Value id; + final Value sessionId; + final Value activityId; + final Value results; + final Value achievements; + final Value createdAt; + const SessionActivitiesCompanion({ + this.id = const Value.absent(), + this.sessionId = const Value.absent(), + this.activityId = const Value.absent(), + this.results = const Value.absent(), + this.achievements = const Value.absent(), + this.createdAt = const Value.absent(), + }); + SessionActivitiesCompanion.insert({ + this.id = const Value.absent(), + required int sessionId, + required int activityId, + this.results = const Value.absent(), + this.achievements = const Value.absent(), + this.createdAt = const Value.absent(), + }) : sessionId = Value(sessionId), + activityId = Value(activityId); + static Insertable custom({ + Expression? id, + Expression? sessionId, + Expression? activityId, + Expression? results, + Expression? achievements, + Expression? createdAt, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (sessionId != null) 'session_id': sessionId, + if (activityId != null) 'activity_id': activityId, + if (results != null) 'results': results, + if (achievements != null) 'achievements': achievements, + if (createdAt != null) 'created_at': createdAt, + }); + } + + SessionActivitiesCompanion copyWith( + {Value? id, + Value? sessionId, + Value? activityId, + Value? results, + Value? achievements, + Value? createdAt}) { + return SessionActivitiesCompanion( + id: id ?? this.id, + sessionId: sessionId ?? this.sessionId, + activityId: activityId ?? this.activityId, + results: results ?? this.results, + achievements: achievements ?? this.achievements, + createdAt: createdAt ?? this.createdAt, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (sessionId.present) { + map['session_id'] = Variable(sessionId.value); + } + if (activityId.present) { + map['activity_id'] = Variable(activityId.value); + } + if (results.present) { + map['results'] = Variable(results.value); + } + if (achievements.present) { + map['achievements'] = Variable(achievements.value); + } + if (createdAt.present) { + map['created_at'] = Variable(createdAt.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('SessionActivitiesCompanion(') + ..write('id: $id, ') + ..write('sessionId: $sessionId, ') + ..write('activityId: $activityId, ') + ..write('results: $results, ') + ..write('achievements: $achievements, ') + ..write('createdAt: $createdAt') + ..write(')')) + .toString(); + } +} + +class Actions extends Table with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + Actions(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, false, + hasAutoIncrement: true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT')); + late final GeneratedColumn title = GeneratedColumn( + 'title', aliasedName, false, + additionalChecks: + GeneratedColumn.checkTextLength(minTextLength: 3, maxTextLength: 32), + type: DriftSqlType.string, + requiredDuringInsert: true); + late final GeneratedColumn description = GeneratedColumn( + 'body', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn set = GeneratedColumn( + 'set', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn createdAt = GeneratedColumn( + 'created_at', aliasedName, false, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + defaultValue: Variable(DateTime.now())); + @override + List get $columns => + [id, title, description, set, createdAt]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'actions'; + @override + Set get $primaryKey => {id}; + @override + ActionsData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return ActionsData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id'])!, + title: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}title'])!, + description: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}body'])!, + set: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}set'])!, + createdAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!, + ); + } + + @override + Actions createAlias(String alias) { + return Actions(attachedDatabase, alias); + } +} + +class ActionsData extends DataClass implements Insertable { + final int id; + final String title; + final String description; + final String set; + final DateTime createdAt; + const ActionsData( + {required this.id, + required this.title, + required this.description, + required this.set, + required this.createdAt}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['title'] = Variable(title); + map['body'] = Variable(description); + map['set'] = Variable(set); + map['created_at'] = Variable(createdAt); + return map; + } + + ActionsCompanion toCompanion(bool nullToAbsent) { + return ActionsCompanion( + id: Value(id), + title: Value(title), + description: Value(description), + set: Value(set), + createdAt: Value(createdAt), + ); + } + + factory ActionsData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return ActionsData( + id: serializer.fromJson(json['id']), + title: serializer.fromJson(json['title']), + description: serializer.fromJson(json['description']), + set: serializer.fromJson(json['set']), + createdAt: serializer.fromJson(json['createdAt']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'title': serializer.toJson(title), + 'description': serializer.toJson(description), + 'set': serializer.toJson(set), + 'createdAt': serializer.toJson(createdAt), + }; + } + + ActionsData copyWith( + {int? id, + String? title, + String? description, + String? set, + DateTime? createdAt}) => + ActionsData( + id: id ?? this.id, + title: title ?? this.title, + description: description ?? this.description, + set: set ?? this.set, + createdAt: createdAt ?? this.createdAt, + ); + ActionsData copyWithCompanion(ActionsCompanion data) { + return ActionsData( + id: data.id.present ? data.id.value : this.id, + title: data.title.present ? data.title.value : this.title, + description: + data.description.present ? data.description.value : this.description, + set: data.set.present ? data.set.value : this.set, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + ); + } + + @override + String toString() { + return (StringBuffer('ActionsData(') + ..write('id: $id, ') + ..write('title: $title, ') + ..write('description: $description, ') + ..write('set: $set, ') + ..write('createdAt: $createdAt') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(id, title, description, set, createdAt); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is ActionsData && + other.id == this.id && + other.title == this.title && + other.description == this.description && + other.set == this.set && + other.createdAt == this.createdAt); +} + +class ActionsCompanion extends UpdateCompanion { + final Value id; + final Value title; + final Value description; + final Value set; + final Value createdAt; + const ActionsCompanion({ + this.id = const Value.absent(), + this.title = const Value.absent(), + this.description = const Value.absent(), + this.set = const Value.absent(), + this.createdAt = const Value.absent(), + }); + ActionsCompanion.insert({ + this.id = const Value.absent(), + required String title, + required String description, + required String set, + this.createdAt = const Value.absent(), + }) : title = Value(title), + description = Value(description), + set = Value(set); + static Insertable custom({ + Expression? id, + Expression? title, + Expression? description, + Expression? set, + Expression? createdAt, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (title != null) 'title': title, + if (description != null) 'body': description, + if (set != null) 'set': set, + if (createdAt != null) 'created_at': createdAt, + }); + } + + ActionsCompanion copyWith( + {Value? id, + Value? title, + Value? description, + Value? set, + Value? createdAt}) { + return ActionsCompanion( + id: id ?? this.id, + title: title ?? this.title, + description: description ?? this.description, + set: set ?? this.set, + createdAt: createdAt ?? this.createdAt, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (title.present) { + map['title'] = Variable(title.value); + } + if (description.present) { + map['body'] = Variable(description.value); + } + if (set.present) { + map['set'] = Variable(set.value); + } + if (createdAt.present) { + map['created_at'] = Variable(createdAt.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('ActionsCompanion(') + ..write('id: $id, ') + ..write('title: $title, ') + ..write('description: $description, ') + ..write('set: $set, ') + ..write('createdAt: $createdAt') + ..write(')')) + .toString(); + } +} + +class ActivityActions extends Table + with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + ActivityActions(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, false, + hasAutoIncrement: true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT')); + late final GeneratedColumn activityId = GeneratedColumn( + 'activity_id', aliasedName, false, + type: DriftSqlType.int, + requiredDuringInsert: true, + defaultConstraints: + GeneratedColumn.constraintIsAlways('REFERENCES activities (id)')); + late final GeneratedColumn actionId = GeneratedColumn( + 'action_id', aliasedName, false, + type: DriftSqlType.int, + requiredDuringInsert: true, + defaultConstraints: + GeneratedColumn.constraintIsAlways('REFERENCES actions (id)')); + late final GeneratedColumn createdAt = GeneratedColumn( + 'created_at', aliasedName, false, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + defaultValue: Variable(DateTime.now())); + @override + List get $columns => [id, activityId, actionId, createdAt]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'activity_actions'; + @override + Set get $primaryKey => {id}; + @override + ActivityActionsData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return ActivityActionsData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id'])!, + activityId: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}activity_id'])!, + actionId: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}action_id'])!, + createdAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!, + ); + } + + @override + ActivityActions createAlias(String alias) { + return ActivityActions(attachedDatabase, alias); + } +} + +class ActivityActionsData extends DataClass + implements Insertable { + final int id; + final int activityId; + final int actionId; + final DateTime createdAt; + const ActivityActionsData( + {required this.id, + required this.activityId, + required this.actionId, + required this.createdAt}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['activity_id'] = Variable(activityId); + map['action_id'] = Variable(actionId); + map['created_at'] = Variable(createdAt); + return map; + } + + ActivityActionsCompanion toCompanion(bool nullToAbsent) { + return ActivityActionsCompanion( + id: Value(id), + activityId: Value(activityId), + actionId: Value(actionId), + createdAt: Value(createdAt), + ); + } + + factory ActivityActionsData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return ActivityActionsData( + id: serializer.fromJson(json['id']), + activityId: serializer.fromJson(json['activityId']), + actionId: serializer.fromJson(json['actionId']), + createdAt: serializer.fromJson(json['createdAt']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'activityId': serializer.toJson(activityId), + 'actionId': serializer.toJson(actionId), + 'createdAt': serializer.toJson(createdAt), + }; + } + + ActivityActionsData copyWith( + {int? id, int? activityId, int? actionId, DateTime? createdAt}) => + ActivityActionsData( + id: id ?? this.id, + activityId: activityId ?? this.activityId, + actionId: actionId ?? this.actionId, + createdAt: createdAt ?? this.createdAt, + ); + ActivityActionsData copyWithCompanion(ActivityActionsCompanion data) { + return ActivityActionsData( + id: data.id.present ? data.id.value : this.id, + activityId: + data.activityId.present ? data.activityId.value : this.activityId, + actionId: data.actionId.present ? data.actionId.value : this.actionId, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + ); + } + + @override + String toString() { + return (StringBuffer('ActivityActionsData(') + ..write('id: $id, ') + ..write('activityId: $activityId, ') + ..write('actionId: $actionId, ') + ..write('createdAt: $createdAt') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(id, activityId, actionId, createdAt); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is ActivityActionsData && + other.id == this.id && + other.activityId == this.activityId && + other.actionId == this.actionId && + other.createdAt == this.createdAt); +} + +class ActivityActionsCompanion extends UpdateCompanion { + final Value id; + final Value activityId; + final Value actionId; + final Value createdAt; + const ActivityActionsCompanion({ + this.id = const Value.absent(), + this.activityId = const Value.absent(), + this.actionId = const Value.absent(), + this.createdAt = const Value.absent(), + }); + ActivityActionsCompanion.insert({ + this.id = const Value.absent(), + required int activityId, + required int actionId, + this.createdAt = const Value.absent(), + }) : activityId = Value(activityId), + actionId = Value(actionId); + static Insertable custom({ + Expression? id, + Expression? activityId, + Expression? actionId, + Expression? createdAt, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (activityId != null) 'activity_id': activityId, + if (actionId != null) 'action_id': actionId, + if (createdAt != null) 'created_at': createdAt, + }); + } + + ActivityActionsCompanion copyWith( + {Value? id, + Value? activityId, + Value? actionId, + Value? createdAt}) { + return ActivityActionsCompanion( + id: id ?? this.id, + activityId: activityId ?? this.activityId, + actionId: actionId ?? this.actionId, + createdAt: createdAt ?? this.createdAt, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (activityId.present) { + map['activity_id'] = Variable(activityId.value); + } + if (actionId.present) { + map['action_id'] = Variable(actionId.value); + } + if (createdAt.present) { + map['created_at'] = Variable(createdAt.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('ActivityActionsCompanion(') + ..write('id: $id, ') + ..write('activityId: $activityId, ') + ..write('actionId: $actionId, ') + ..write('createdAt: $createdAt') + ..write(')')) + .toString(); + } +} + +class MediaItems extends Table with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + MediaItems(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, false, + hasAutoIncrement: true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT')); + late final GeneratedColumn title = GeneratedColumn( + 'title', aliasedName, false, + additionalChecks: + GeneratedColumn.checkTextLength(minTextLength: 3, maxTextLength: 32), + type: DriftSqlType.string, + requiredDuringInsert: true); + late final GeneratedColumn description = GeneratedColumn( + 'body', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn reference = GeneratedColumn( + 'reference', aliasedName, false, + additionalChecks: + GeneratedColumn.checkTextLength(minTextLength: 3, maxTextLength: 256), + type: DriftSqlType.string, + requiredDuringInsert: true); + late final GeneratedColumn type = GeneratedColumn( + 'type', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn createdAt = GeneratedColumn( + 'created_at', aliasedName, false, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + defaultValue: Variable(DateTime.now())); + @override + List get $columns => + [id, title, description, reference, type, createdAt]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'media_items'; + @override + Set get $primaryKey => {id}; + @override + MediaItemsData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return MediaItemsData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id'])!, + title: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}title'])!, + description: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}body'])!, + reference: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}reference'])!, + type: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}type'])!, + createdAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!, + ); + } + + @override + MediaItems createAlias(String alias) { + return MediaItems(attachedDatabase, alias); + } +} + +class MediaItemsData extends DataClass implements Insertable { + final int id; + final String title; + final String description; + final String reference; + final String type; + final DateTime createdAt; + const MediaItemsData( + {required this.id, + required this.title, + required this.description, + required this.reference, + required this.type, + required this.createdAt}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['title'] = Variable(title); + map['body'] = Variable(description); + map['reference'] = Variable(reference); + map['type'] = Variable(type); + map['created_at'] = Variable(createdAt); + return map; + } + + MediaItemsCompanion toCompanion(bool nullToAbsent) { + return MediaItemsCompanion( + id: Value(id), + title: Value(title), + description: Value(description), + reference: Value(reference), + type: Value(type), + createdAt: Value(createdAt), + ); + } + + factory MediaItemsData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return MediaItemsData( + id: serializer.fromJson(json['id']), + title: serializer.fromJson(json['title']), + description: serializer.fromJson(json['description']), + reference: serializer.fromJson(json['reference']), + type: serializer.fromJson(json['type']), + createdAt: serializer.fromJson(json['createdAt']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'title': serializer.toJson(title), + 'description': serializer.toJson(description), + 'reference': serializer.toJson(reference), + 'type': serializer.toJson(type), + 'createdAt': serializer.toJson(createdAt), + }; + } + + MediaItemsData copyWith( + {int? id, + String? title, + String? description, + String? reference, + String? type, + DateTime? createdAt}) => + MediaItemsData( + id: id ?? this.id, + title: title ?? this.title, + description: description ?? this.description, + reference: reference ?? this.reference, + type: type ?? this.type, + createdAt: createdAt ?? this.createdAt, + ); + MediaItemsData copyWithCompanion(MediaItemsCompanion data) { + return MediaItemsData( + id: data.id.present ? data.id.value : this.id, + title: data.title.present ? data.title.value : this.title, + description: + data.description.present ? data.description.value : this.description, + reference: data.reference.present ? data.reference.value : this.reference, + type: data.type.present ? data.type.value : this.type, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + ); + } + + @override + String toString() { + return (StringBuffer('MediaItemsData(') + ..write('id: $id, ') + ..write('title: $title, ') + ..write('description: $description, ') + ..write('reference: $reference, ') + ..write('type: $type, ') + ..write('createdAt: $createdAt') + ..write(')')) + .toString(); + } + + @override + int get hashCode => + Object.hash(id, title, description, reference, type, createdAt); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is MediaItemsData && + other.id == this.id && + other.title == this.title && + other.description == this.description && + other.reference == this.reference && + other.type == this.type && + other.createdAt == this.createdAt); +} + +class MediaItemsCompanion extends UpdateCompanion { + final Value id; + final Value title; + final Value description; + final Value reference; + final Value type; + final Value createdAt; + const MediaItemsCompanion({ + this.id = const Value.absent(), + this.title = const Value.absent(), + this.description = const Value.absent(), + this.reference = const Value.absent(), + this.type = const Value.absent(), + this.createdAt = const Value.absent(), + }); + MediaItemsCompanion.insert({ + this.id = const Value.absent(), + required String title, + required String description, + required String reference, + required String type, + this.createdAt = const Value.absent(), + }) : title = Value(title), + description = Value(description), + reference = Value(reference), + type = Value(type); + static Insertable custom({ + Expression? id, + Expression? title, + Expression? description, + Expression? reference, + Expression? type, + Expression? createdAt, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (title != null) 'title': title, + if (description != null) 'body': description, + if (reference != null) 'reference': reference, + if (type != null) 'type': type, + if (createdAt != null) 'created_at': createdAt, + }); + } + + MediaItemsCompanion copyWith( + {Value? id, + Value? title, + Value? description, + Value? reference, + Value? type, + Value? createdAt}) { + return MediaItemsCompanion( + id: id ?? this.id, + title: title ?? this.title, + description: description ?? this.description, + reference: reference ?? this.reference, + type: type ?? this.type, + createdAt: createdAt ?? this.createdAt, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (title.present) { + map['title'] = Variable(title.value); + } + if (description.present) { + map['body'] = Variable(description.value); + } + if (reference.present) { + map['reference'] = Variable(reference.value); + } + if (type.present) { + map['type'] = Variable(type.value); + } + if (createdAt.present) { + map['created_at'] = Variable(createdAt.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('MediaItemsCompanion(') + ..write('id: $id, ') + ..write('title: $title, ') + ..write('description: $description, ') + ..write('reference: $reference, ') + ..write('type: $type, ') + ..write('createdAt: $createdAt') + ..write(')')) + .toString(); + } +} + +class ObjectMediaItems extends Table + with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + ObjectMediaItems(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, false, + hasAutoIncrement: true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT')); + late final GeneratedColumn objectId = GeneratedColumn( + 'object_id', aliasedName, false, + type: DriftSqlType.int, requiredDuringInsert: true); + late final GeneratedColumn objectType = GeneratedColumn( + 'object_type', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn mediaId = GeneratedColumn( + 'media_id', aliasedName, false, + type: DriftSqlType.int, + requiredDuringInsert: true, + defaultConstraints: + GeneratedColumn.constraintIsAlways('REFERENCES media_items (id)')); + late final GeneratedColumn createdAt = GeneratedColumn( + 'created_at', aliasedName, false, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + defaultValue: Variable(DateTime.now())); + @override + List get $columns => + [id, objectId, objectType, mediaId, createdAt]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'object_media_items'; + @override + Set get $primaryKey => {id}; + @override + ObjectMediaItemsData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return ObjectMediaItemsData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id'])!, + objectId: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}object_id'])!, + objectType: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}object_type'])!, + mediaId: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}media_id'])!, + createdAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!, + ); + } + + @override + ObjectMediaItems createAlias(String alias) { + return ObjectMediaItems(attachedDatabase, alias); + } +} + +class ObjectMediaItemsData extends DataClass + implements Insertable { + final int id; + final int objectId; + final String objectType; + final int mediaId; + final DateTime createdAt; + const ObjectMediaItemsData( + {required this.id, + required this.objectId, + required this.objectType, + required this.mediaId, + required this.createdAt}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['object_id'] = Variable(objectId); + map['object_type'] = Variable(objectType); + map['media_id'] = Variable(mediaId); + map['created_at'] = Variable(createdAt); + return map; + } + + ObjectMediaItemsCompanion toCompanion(bool nullToAbsent) { + return ObjectMediaItemsCompanion( + id: Value(id), + objectId: Value(objectId), + objectType: Value(objectType), + mediaId: Value(mediaId), + createdAt: Value(createdAt), + ); + } + + factory ObjectMediaItemsData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return ObjectMediaItemsData( + id: serializer.fromJson(json['id']), + objectId: serializer.fromJson(json['objectId']), + objectType: serializer.fromJson(json['objectType']), + mediaId: serializer.fromJson(json['mediaId']), + createdAt: serializer.fromJson(json['createdAt']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'objectId': serializer.toJson(objectId), + 'objectType': serializer.toJson(objectType), + 'mediaId': serializer.toJson(mediaId), + 'createdAt': serializer.toJson(createdAt), + }; + } + + ObjectMediaItemsData copyWith( + {int? id, + int? objectId, + String? objectType, + int? mediaId, + DateTime? createdAt}) => + ObjectMediaItemsData( + id: id ?? this.id, + objectId: objectId ?? this.objectId, + objectType: objectType ?? this.objectType, + mediaId: mediaId ?? this.mediaId, + createdAt: createdAt ?? this.createdAt, + ); + ObjectMediaItemsData copyWithCompanion(ObjectMediaItemsCompanion data) { + return ObjectMediaItemsData( + id: data.id.present ? data.id.value : this.id, + objectId: data.objectId.present ? data.objectId.value : this.objectId, + objectType: + data.objectType.present ? data.objectType.value : this.objectType, + mediaId: data.mediaId.present ? data.mediaId.value : this.mediaId, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + ); + } + + @override + String toString() { + return (StringBuffer('ObjectMediaItemsData(') + ..write('id: $id, ') + ..write('objectId: $objectId, ') + ..write('objectType: $objectType, ') + ..write('mediaId: $mediaId, ') + ..write('createdAt: $createdAt') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(id, objectId, objectType, mediaId, createdAt); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is ObjectMediaItemsData && + other.id == this.id && + other.objectId == this.objectId && + other.objectType == this.objectType && + other.mediaId == this.mediaId && + other.createdAt == this.createdAt); +} + +class ObjectMediaItemsCompanion extends UpdateCompanion { + final Value id; + final Value objectId; + final Value objectType; + final Value mediaId; + final Value createdAt; + const ObjectMediaItemsCompanion({ + this.id = const Value.absent(), + this.objectId = const Value.absent(), + this.objectType = const Value.absent(), + this.mediaId = const Value.absent(), + this.createdAt = const Value.absent(), + }); + ObjectMediaItemsCompanion.insert({ + this.id = const Value.absent(), + required int objectId, + required String objectType, + required int mediaId, + this.createdAt = const Value.absent(), + }) : objectId = Value(objectId), + objectType = Value(objectType), + mediaId = Value(mediaId); + static Insertable custom({ + Expression? id, + Expression? objectId, + Expression? objectType, + Expression? mediaId, + Expression? createdAt, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (objectId != null) 'object_id': objectId, + if (objectType != null) 'object_type': objectType, + if (mediaId != null) 'media_id': mediaId, + if (createdAt != null) 'created_at': createdAt, + }); + } + + ObjectMediaItemsCompanion copyWith( + {Value? id, + Value? objectId, + Value? objectType, + Value? mediaId, + Value? createdAt}) { + return ObjectMediaItemsCompanion( + id: id ?? this.id, + objectId: objectId ?? this.objectId, + objectType: objectType ?? this.objectType, + mediaId: mediaId ?? this.mediaId, + createdAt: createdAt ?? this.createdAt, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (objectId.present) { + map['object_id'] = Variable(objectId.value); + } + if (objectType.present) { + map['object_type'] = Variable(objectType.value); + } + if (mediaId.present) { + map['media_id'] = Variable(mediaId.value); + } + if (createdAt.present) { + map['created_at'] = Variable(createdAt.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('ObjectMediaItemsCompanion(') + ..write('id: $id, ') + ..write('objectId: $objectId, ') + ..write('objectType: $objectType, ') + ..write('mediaId: $mediaId, ') + ..write('createdAt: $createdAt') + ..write(')')) + .toString(); + } +} + +class DatabaseAtV1 extends GeneratedDatabase { + DatabaseAtV1(QueryExecutor e) : super(e); + late final Sessions sessions = Sessions(this); + late final Activities activities = Activities(this); + late final SessionActivities sessionActivities = SessionActivities(this); + late final Actions actions = Actions(this); + late final ActivityActions activityActions = ActivityActions(this); + late final MediaItems mediaItems = MediaItems(this); + late final ObjectMediaItems objectMediaItems = ObjectMediaItems(this); + @override + Iterable> get allTables => + allSchemaEntities.whereType>(); + @override + List get allSchemaEntities => [ + sessions, + activities, + sessionActivities, + actions, + activityActions, + mediaItems, + objectMediaItems + ]; + @override + int get schemaVersion => 1; +} diff --git a/test/drift/sendtrain/generated/schema_v2.dart b/test/drift/sendtrain/generated/schema_v2.dart new file mode 100644 index 0000000..2ff297a --- /dev/null +++ b/test/drift/sendtrain/generated/schema_v2.dart @@ -0,0 +1,1916 @@ +// dart format width=80 +// GENERATED CODE, DO NOT EDIT BY HAND. +// ignore_for_file: type=lint +import 'package:drift/drift.dart'; + +class Sessions extends Table with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + Sessions(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, false, + hasAutoIncrement: true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT')); + late final GeneratedColumn title = GeneratedColumn( + 'title', aliasedName, false, + additionalChecks: + GeneratedColumn.checkTextLength(minTextLength: 3, maxTextLength: 32), + type: DriftSqlType.string, + requiredDuringInsert: true); + late final GeneratedColumn content = GeneratedColumn( + 'body', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn status = GeneratedColumn( + 'status', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn date = GeneratedColumn( + 'date', aliasedName, true, + type: DriftSqlType.dateTime, requiredDuringInsert: false); + late final GeneratedColumn createdAt = GeneratedColumn( + 'created_at', aliasedName, false, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + defaultValue: Variable(DateTime.now())); + @override + List get $columns => + [id, title, content, status, date, createdAt]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'sessions'; + @override + Set get $primaryKey => {id}; + @override + SessionsData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return SessionsData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id'])!, + title: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}title'])!, + content: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}body'])!, + status: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}status'])!, + date: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}date']), + createdAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!, + ); + } + + @override + Sessions createAlias(String alias) { + return Sessions(attachedDatabase, alias); + } +} + +class SessionsData extends DataClass implements Insertable { + final int id; + final String title; + final String content; + final String status; + final DateTime? date; + final DateTime createdAt; + const SessionsData( + {required this.id, + required this.title, + required this.content, + required this.status, + this.date, + required this.createdAt}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['title'] = Variable(title); + map['body'] = Variable(content); + map['status'] = Variable(status); + if (!nullToAbsent || date != null) { + map['date'] = Variable(date); + } + map['created_at'] = Variable(createdAt); + return map; + } + + SessionsCompanion toCompanion(bool nullToAbsent) { + return SessionsCompanion( + id: Value(id), + title: Value(title), + content: Value(content), + status: Value(status), + date: date == null && nullToAbsent ? const Value.absent() : Value(date), + createdAt: Value(createdAt), + ); + } + + factory SessionsData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return SessionsData( + id: serializer.fromJson(json['id']), + title: serializer.fromJson(json['title']), + content: serializer.fromJson(json['content']), + status: serializer.fromJson(json['status']), + date: serializer.fromJson(json['date']), + createdAt: serializer.fromJson(json['createdAt']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'title': serializer.toJson(title), + 'content': serializer.toJson(content), + 'status': serializer.toJson(status), + 'date': serializer.toJson(date), + 'createdAt': serializer.toJson(createdAt), + }; + } + + SessionsData copyWith( + {int? id, + String? title, + String? content, + String? status, + Value date = const Value.absent(), + DateTime? createdAt}) => + SessionsData( + id: id ?? this.id, + title: title ?? this.title, + content: content ?? this.content, + status: status ?? this.status, + date: date.present ? date.value : this.date, + createdAt: createdAt ?? this.createdAt, + ); + SessionsData copyWithCompanion(SessionsCompanion data) { + return SessionsData( + id: data.id.present ? data.id.value : this.id, + title: data.title.present ? data.title.value : this.title, + content: data.content.present ? data.content.value : this.content, + status: data.status.present ? data.status.value : this.status, + date: data.date.present ? data.date.value : this.date, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + ); + } + + @override + String toString() { + return (StringBuffer('SessionsData(') + ..write('id: $id, ') + ..write('title: $title, ') + ..write('content: $content, ') + ..write('status: $status, ') + ..write('date: $date, ') + ..write('createdAt: $createdAt') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(id, title, content, status, date, createdAt); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is SessionsData && + other.id == this.id && + other.title == this.title && + other.content == this.content && + other.status == this.status && + other.date == this.date && + other.createdAt == this.createdAt); +} + +class SessionsCompanion extends UpdateCompanion { + final Value id; + final Value title; + final Value content; + final Value status; + final Value date; + final Value createdAt; + const SessionsCompanion({ + this.id = const Value.absent(), + this.title = const Value.absent(), + this.content = const Value.absent(), + this.status = const Value.absent(), + this.date = const Value.absent(), + this.createdAt = const Value.absent(), + }); + SessionsCompanion.insert({ + this.id = const Value.absent(), + required String title, + required String content, + required String status, + this.date = const Value.absent(), + this.createdAt = const Value.absent(), + }) : title = Value(title), + content = Value(content), + status = Value(status); + static Insertable custom({ + Expression? id, + Expression? title, + Expression? content, + Expression? status, + Expression? date, + Expression? createdAt, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (title != null) 'title': title, + if (content != null) 'body': content, + if (status != null) 'status': status, + if (date != null) 'date': date, + if (createdAt != null) 'created_at': createdAt, + }); + } + + SessionsCompanion copyWith( + {Value? id, + Value? title, + Value? content, + Value? status, + Value? date, + Value? createdAt}) { + return SessionsCompanion( + id: id ?? this.id, + title: title ?? this.title, + content: content ?? this.content, + status: status ?? this.status, + date: date ?? this.date, + createdAt: createdAt ?? this.createdAt, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (title.present) { + map['title'] = Variable(title.value); + } + if (content.present) { + map['body'] = Variable(content.value); + } + if (status.present) { + map['status'] = Variable(status.value); + } + if (date.present) { + map['date'] = Variable(date.value); + } + if (createdAt.present) { + map['created_at'] = Variable(createdAt.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('SessionsCompanion(') + ..write('id: $id, ') + ..write('title: $title, ') + ..write('content: $content, ') + ..write('status: $status, ') + ..write('date: $date, ') + ..write('createdAt: $createdAt') + ..write(')')) + .toString(); + } +} + +class Activities extends Table with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + Activities(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, false, + hasAutoIncrement: true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT')); + late final GeneratedColumn title = GeneratedColumn( + 'title', aliasedName, false, + additionalChecks: + GeneratedColumn.checkTextLength(minTextLength: 3, maxTextLength: 32), + type: DriftSqlType.string, + requiredDuringInsert: true); + late final GeneratedColumn type = GeneratedColumn( + 'type', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn description = GeneratedColumn( + 'body', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn category = GeneratedColumn( + 'category', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn createdAt = GeneratedColumn( + 'created_at', aliasedName, false, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + defaultValue: Variable(DateTime.now())); + @override + List get $columns => + [id, title, type, description, category, createdAt]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'activities'; + @override + Set get $primaryKey => {id}; + @override + ActivitiesData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return ActivitiesData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id'])!, + title: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}title'])!, + type: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}type'])!, + description: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}body'])!, + category: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}category'])!, + createdAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!, + ); + } + + @override + Activities createAlias(String alias) { + return Activities(attachedDatabase, alias); + } +} + +class ActivitiesData extends DataClass implements Insertable { + final int id; + final String title; + final String type; + final String description; + final String category; + final DateTime createdAt; + const ActivitiesData( + {required this.id, + required this.title, + required this.type, + required this.description, + required this.category, + required this.createdAt}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['title'] = Variable(title); + map['type'] = Variable(type); + map['body'] = Variable(description); + map['category'] = Variable(category); + map['created_at'] = Variable(createdAt); + return map; + } + + ActivitiesCompanion toCompanion(bool nullToAbsent) { + return ActivitiesCompanion( + id: Value(id), + title: Value(title), + type: Value(type), + description: Value(description), + category: Value(category), + createdAt: Value(createdAt), + ); + } + + factory ActivitiesData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return ActivitiesData( + id: serializer.fromJson(json['id']), + title: serializer.fromJson(json['title']), + type: serializer.fromJson(json['type']), + description: serializer.fromJson(json['description']), + category: serializer.fromJson(json['category']), + createdAt: serializer.fromJson(json['createdAt']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'title': serializer.toJson(title), + 'type': serializer.toJson(type), + 'description': serializer.toJson(description), + 'category': serializer.toJson(category), + 'createdAt': serializer.toJson(createdAt), + }; + } + + ActivitiesData copyWith( + {int? id, + String? title, + String? type, + String? description, + String? category, + DateTime? createdAt}) => + ActivitiesData( + id: id ?? this.id, + title: title ?? this.title, + type: type ?? this.type, + description: description ?? this.description, + category: category ?? this.category, + createdAt: createdAt ?? this.createdAt, + ); + ActivitiesData copyWithCompanion(ActivitiesCompanion data) { + return ActivitiesData( + id: data.id.present ? data.id.value : this.id, + title: data.title.present ? data.title.value : this.title, + type: data.type.present ? data.type.value : this.type, + description: + data.description.present ? data.description.value : this.description, + category: data.category.present ? data.category.value : this.category, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + ); + } + + @override + String toString() { + return (StringBuffer('ActivitiesData(') + ..write('id: $id, ') + ..write('title: $title, ') + ..write('type: $type, ') + ..write('description: $description, ') + ..write('category: $category, ') + ..write('createdAt: $createdAt') + ..write(')')) + .toString(); + } + + @override + int get hashCode => + Object.hash(id, title, type, description, category, createdAt); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is ActivitiesData && + other.id == this.id && + other.title == this.title && + other.type == this.type && + other.description == this.description && + other.category == this.category && + other.createdAt == this.createdAt); +} + +class ActivitiesCompanion extends UpdateCompanion { + final Value id; + final Value title; + final Value type; + final Value description; + final Value category; + final Value createdAt; + const ActivitiesCompanion({ + this.id = const Value.absent(), + this.title = const Value.absent(), + this.type = const Value.absent(), + this.description = const Value.absent(), + this.category = const Value.absent(), + this.createdAt = const Value.absent(), + }); + ActivitiesCompanion.insert({ + this.id = const Value.absent(), + required String title, + required String type, + required String description, + required String category, + this.createdAt = const Value.absent(), + }) : title = Value(title), + type = Value(type), + description = Value(description), + category = Value(category); + static Insertable custom({ + Expression? id, + Expression? title, + Expression? type, + Expression? description, + Expression? category, + Expression? createdAt, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (title != null) 'title': title, + if (type != null) 'type': type, + if (description != null) 'body': description, + if (category != null) 'category': category, + if (createdAt != null) 'created_at': createdAt, + }); + } + + ActivitiesCompanion copyWith( + {Value? id, + Value? title, + Value? type, + Value? description, + Value? category, + Value? createdAt}) { + return ActivitiesCompanion( + id: id ?? this.id, + title: title ?? this.title, + type: type ?? this.type, + description: description ?? this.description, + category: category ?? this.category, + createdAt: createdAt ?? this.createdAt, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (title.present) { + map['title'] = Variable(title.value); + } + if (type.present) { + map['type'] = Variable(type.value); + } + if (description.present) { + map['body'] = Variable(description.value); + } + if (category.present) { + map['category'] = Variable(category.value); + } + if (createdAt.present) { + map['created_at'] = Variable(createdAt.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('ActivitiesCompanion(') + ..write('id: $id, ') + ..write('title: $title, ') + ..write('type: $type, ') + ..write('description: $description, ') + ..write('category: $category, ') + ..write('createdAt: $createdAt') + ..write(')')) + .toString(); + } +} + +class SessionActivities extends Table + with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + SessionActivities(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, false, + hasAutoIncrement: true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT')); + late final GeneratedColumn sessionId = GeneratedColumn( + 'session_id', aliasedName, false, + type: DriftSqlType.int, + requiredDuringInsert: true, + defaultConstraints: + GeneratedColumn.constraintIsAlways('REFERENCES sessions (id)')); + late final GeneratedColumn activityId = GeneratedColumn( + 'activity_id', aliasedName, false, + type: DriftSqlType.int, + requiredDuringInsert: true, + defaultConstraints: + GeneratedColumn.constraintIsAlways('REFERENCES activities (id)')); + late final GeneratedColumn results = GeneratedColumn( + 'results', aliasedName, true, + type: DriftSqlType.string, requiredDuringInsert: false); + late final GeneratedColumn achievements = GeneratedColumn( + 'achievements', aliasedName, true, + type: DriftSqlType.string, requiredDuringInsert: false); + late final GeneratedColumn createdAt = GeneratedColumn( + 'created_at', aliasedName, false, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + defaultValue: Variable(DateTime.now())); + @override + List get $columns => + [id, sessionId, activityId, results, achievements, createdAt]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'session_activities'; + @override + Set get $primaryKey => {id}; + @override + SessionActivitiesData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return SessionActivitiesData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id'])!, + sessionId: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}session_id'])!, + activityId: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}activity_id'])!, + results: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}results']), + achievements: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}achievements']), + createdAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!, + ); + } + + @override + SessionActivities createAlias(String alias) { + return SessionActivities(attachedDatabase, alias); + } +} + +class SessionActivitiesData extends DataClass + implements Insertable { + final int id; + final int sessionId; + final int activityId; + final String? results; + final String? achievements; + final DateTime createdAt; + const SessionActivitiesData( + {required this.id, + required this.sessionId, + required this.activityId, + this.results, + this.achievements, + required this.createdAt}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['session_id'] = Variable(sessionId); + map['activity_id'] = Variable(activityId); + if (!nullToAbsent || results != null) { + map['results'] = Variable(results); + } + if (!nullToAbsent || achievements != null) { + map['achievements'] = Variable(achievements); + } + map['created_at'] = Variable(createdAt); + return map; + } + + SessionActivitiesCompanion toCompanion(bool nullToAbsent) { + return SessionActivitiesCompanion( + id: Value(id), + sessionId: Value(sessionId), + activityId: Value(activityId), + results: results == null && nullToAbsent + ? const Value.absent() + : Value(results), + achievements: achievements == null && nullToAbsent + ? const Value.absent() + : Value(achievements), + createdAt: Value(createdAt), + ); + } + + factory SessionActivitiesData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return SessionActivitiesData( + id: serializer.fromJson(json['id']), + sessionId: serializer.fromJson(json['sessionId']), + activityId: serializer.fromJson(json['activityId']), + results: serializer.fromJson(json['results']), + achievements: serializer.fromJson(json['achievements']), + createdAt: serializer.fromJson(json['createdAt']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'sessionId': serializer.toJson(sessionId), + 'activityId': serializer.toJson(activityId), + 'results': serializer.toJson(results), + 'achievements': serializer.toJson(achievements), + 'createdAt': serializer.toJson(createdAt), + }; + } + + SessionActivitiesData copyWith( + {int? id, + int? sessionId, + int? activityId, + Value results = const Value.absent(), + Value achievements = const Value.absent(), + DateTime? createdAt}) => + SessionActivitiesData( + id: id ?? this.id, + sessionId: sessionId ?? this.sessionId, + activityId: activityId ?? this.activityId, + results: results.present ? results.value : this.results, + achievements: + achievements.present ? achievements.value : this.achievements, + createdAt: createdAt ?? this.createdAt, + ); + SessionActivitiesData copyWithCompanion(SessionActivitiesCompanion data) { + return SessionActivitiesData( + id: data.id.present ? data.id.value : this.id, + sessionId: data.sessionId.present ? data.sessionId.value : this.sessionId, + activityId: + data.activityId.present ? data.activityId.value : this.activityId, + results: data.results.present ? data.results.value : this.results, + achievements: data.achievements.present + ? data.achievements.value + : this.achievements, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + ); + } + + @override + String toString() { + return (StringBuffer('SessionActivitiesData(') + ..write('id: $id, ') + ..write('sessionId: $sessionId, ') + ..write('activityId: $activityId, ') + ..write('results: $results, ') + ..write('achievements: $achievements, ') + ..write('createdAt: $createdAt') + ..write(')')) + .toString(); + } + + @override + int get hashCode => + Object.hash(id, sessionId, activityId, results, achievements, createdAt); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is SessionActivitiesData && + other.id == this.id && + other.sessionId == this.sessionId && + other.activityId == this.activityId && + other.results == this.results && + other.achievements == this.achievements && + other.createdAt == this.createdAt); +} + +class SessionActivitiesCompanion + extends UpdateCompanion { + final Value id; + final Value sessionId; + final Value activityId; + final Value results; + final Value achievements; + final Value createdAt; + const SessionActivitiesCompanion({ + this.id = const Value.absent(), + this.sessionId = const Value.absent(), + this.activityId = const Value.absent(), + this.results = const Value.absent(), + this.achievements = const Value.absent(), + this.createdAt = const Value.absent(), + }); + SessionActivitiesCompanion.insert({ + this.id = const Value.absent(), + required int sessionId, + required int activityId, + this.results = const Value.absent(), + this.achievements = const Value.absent(), + this.createdAt = const Value.absent(), + }) : sessionId = Value(sessionId), + activityId = Value(activityId); + static Insertable custom({ + Expression? id, + Expression? sessionId, + Expression? activityId, + Expression? results, + Expression? achievements, + Expression? createdAt, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (sessionId != null) 'session_id': sessionId, + if (activityId != null) 'activity_id': activityId, + if (results != null) 'results': results, + if (achievements != null) 'achievements': achievements, + if (createdAt != null) 'created_at': createdAt, + }); + } + + SessionActivitiesCompanion copyWith( + {Value? id, + Value? sessionId, + Value? activityId, + Value? results, + Value? achievements, + Value? createdAt}) { + return SessionActivitiesCompanion( + id: id ?? this.id, + sessionId: sessionId ?? this.sessionId, + activityId: activityId ?? this.activityId, + results: results ?? this.results, + achievements: achievements ?? this.achievements, + createdAt: createdAt ?? this.createdAt, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (sessionId.present) { + map['session_id'] = Variable(sessionId.value); + } + if (activityId.present) { + map['activity_id'] = Variable(activityId.value); + } + if (results.present) { + map['results'] = Variable(results.value); + } + if (achievements.present) { + map['achievements'] = Variable(achievements.value); + } + if (createdAt.present) { + map['created_at'] = Variable(createdAt.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('SessionActivitiesCompanion(') + ..write('id: $id, ') + ..write('sessionId: $sessionId, ') + ..write('activityId: $activityId, ') + ..write('results: $results, ') + ..write('achievements: $achievements, ') + ..write('createdAt: $createdAt') + ..write(')')) + .toString(); + } +} + +class Actions extends Table with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + Actions(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, false, + hasAutoIncrement: true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT')); + late final GeneratedColumn title = GeneratedColumn( + 'title', aliasedName, false, + additionalChecks: + GeneratedColumn.checkTextLength(minTextLength: 3, maxTextLength: 32), + type: DriftSqlType.string, + requiredDuringInsert: true); + late final GeneratedColumn description = GeneratedColumn( + 'body', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn set = GeneratedColumn( + 'set', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn createdAt = GeneratedColumn( + 'created_at', aliasedName, false, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + defaultValue: Variable(DateTime.now())); + @override + List get $columns => + [id, title, description, set, createdAt]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'actions'; + @override + Set get $primaryKey => {id}; + @override + ActionsData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return ActionsData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id'])!, + title: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}title'])!, + description: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}body'])!, + set: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}set'])!, + createdAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!, + ); + } + + @override + Actions createAlias(String alias) { + return Actions(attachedDatabase, alias); + } +} + +class ActionsData extends DataClass implements Insertable { + final int id; + final String title; + final String description; + final String set; + final DateTime createdAt; + const ActionsData( + {required this.id, + required this.title, + required this.description, + required this.set, + required this.createdAt}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['title'] = Variable(title); + map['body'] = Variable(description); + map['set'] = Variable(set); + map['created_at'] = Variable(createdAt); + return map; + } + + ActionsCompanion toCompanion(bool nullToAbsent) { + return ActionsCompanion( + id: Value(id), + title: Value(title), + description: Value(description), + set: Value(set), + createdAt: Value(createdAt), + ); + } + + factory ActionsData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return ActionsData( + id: serializer.fromJson(json['id']), + title: serializer.fromJson(json['title']), + description: serializer.fromJson(json['description']), + set: serializer.fromJson(json['set']), + createdAt: serializer.fromJson(json['createdAt']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'title': serializer.toJson(title), + 'description': serializer.toJson(description), + 'set': serializer.toJson(set), + 'createdAt': serializer.toJson(createdAt), + }; + } + + ActionsData copyWith( + {int? id, + String? title, + String? description, + String? set, + DateTime? createdAt}) => + ActionsData( + id: id ?? this.id, + title: title ?? this.title, + description: description ?? this.description, + set: set ?? this.set, + createdAt: createdAt ?? this.createdAt, + ); + ActionsData copyWithCompanion(ActionsCompanion data) { + return ActionsData( + id: data.id.present ? data.id.value : this.id, + title: data.title.present ? data.title.value : this.title, + description: + data.description.present ? data.description.value : this.description, + set: data.set.present ? data.set.value : this.set, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + ); + } + + @override + String toString() { + return (StringBuffer('ActionsData(') + ..write('id: $id, ') + ..write('title: $title, ') + ..write('description: $description, ') + ..write('set: $set, ') + ..write('createdAt: $createdAt') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(id, title, description, set, createdAt); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is ActionsData && + other.id == this.id && + other.title == this.title && + other.description == this.description && + other.set == this.set && + other.createdAt == this.createdAt); +} + +class ActionsCompanion extends UpdateCompanion { + final Value id; + final Value title; + final Value description; + final Value set; + final Value createdAt; + const ActionsCompanion({ + this.id = const Value.absent(), + this.title = const Value.absent(), + this.description = const Value.absent(), + this.set = const Value.absent(), + this.createdAt = const Value.absent(), + }); + ActionsCompanion.insert({ + this.id = const Value.absent(), + required String title, + required String description, + required String set, + this.createdAt = const Value.absent(), + }) : title = Value(title), + description = Value(description), + set = Value(set); + static Insertable custom({ + Expression? id, + Expression? title, + Expression? description, + Expression? set, + Expression? createdAt, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (title != null) 'title': title, + if (description != null) 'body': description, + if (set != null) 'set': set, + if (createdAt != null) 'created_at': createdAt, + }); + } + + ActionsCompanion copyWith( + {Value? id, + Value? title, + Value? description, + Value? set, + Value? createdAt}) { + return ActionsCompanion( + id: id ?? this.id, + title: title ?? this.title, + description: description ?? this.description, + set: set ?? this.set, + createdAt: createdAt ?? this.createdAt, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (title.present) { + map['title'] = Variable(title.value); + } + if (description.present) { + map['body'] = Variable(description.value); + } + if (set.present) { + map['set'] = Variable(set.value); + } + if (createdAt.present) { + map['created_at'] = Variable(createdAt.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('ActionsCompanion(') + ..write('id: $id, ') + ..write('title: $title, ') + ..write('description: $description, ') + ..write('set: $set, ') + ..write('createdAt: $createdAt') + ..write(')')) + .toString(); + } +} + +class ActivityActions extends Table + with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + ActivityActions(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, false, + hasAutoIncrement: true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT')); + late final GeneratedColumn activityId = GeneratedColumn( + 'activity_id', aliasedName, false, + type: DriftSqlType.int, + requiredDuringInsert: true, + defaultConstraints: + GeneratedColumn.constraintIsAlways('REFERENCES activities (id)')); + late final GeneratedColumn actionId = GeneratedColumn( + 'action_id', aliasedName, false, + type: DriftSqlType.int, + requiredDuringInsert: true, + defaultConstraints: + GeneratedColumn.constraintIsAlways('REFERENCES actions (id)')); + late final GeneratedColumn createdAt = GeneratedColumn( + 'created_at', aliasedName, false, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + defaultValue: Variable(DateTime.now())); + @override + List get $columns => [id, activityId, actionId, createdAt]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'activity_actions'; + @override + Set get $primaryKey => {id}; + @override + ActivityActionsData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return ActivityActionsData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id'])!, + activityId: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}activity_id'])!, + actionId: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}action_id'])!, + createdAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!, + ); + } + + @override + ActivityActions createAlias(String alias) { + return ActivityActions(attachedDatabase, alias); + } +} + +class ActivityActionsData extends DataClass + implements Insertable { + final int id; + final int activityId; + final int actionId; + final DateTime createdAt; + const ActivityActionsData( + {required this.id, + required this.activityId, + required this.actionId, + required this.createdAt}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['activity_id'] = Variable(activityId); + map['action_id'] = Variable(actionId); + map['created_at'] = Variable(createdAt); + return map; + } + + ActivityActionsCompanion toCompanion(bool nullToAbsent) { + return ActivityActionsCompanion( + id: Value(id), + activityId: Value(activityId), + actionId: Value(actionId), + createdAt: Value(createdAt), + ); + } + + factory ActivityActionsData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return ActivityActionsData( + id: serializer.fromJson(json['id']), + activityId: serializer.fromJson(json['activityId']), + actionId: serializer.fromJson(json['actionId']), + createdAt: serializer.fromJson(json['createdAt']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'activityId': serializer.toJson(activityId), + 'actionId': serializer.toJson(actionId), + 'createdAt': serializer.toJson(createdAt), + }; + } + + ActivityActionsData copyWith( + {int? id, int? activityId, int? actionId, DateTime? createdAt}) => + ActivityActionsData( + id: id ?? this.id, + activityId: activityId ?? this.activityId, + actionId: actionId ?? this.actionId, + createdAt: createdAt ?? this.createdAt, + ); + ActivityActionsData copyWithCompanion(ActivityActionsCompanion data) { + return ActivityActionsData( + id: data.id.present ? data.id.value : this.id, + activityId: + data.activityId.present ? data.activityId.value : this.activityId, + actionId: data.actionId.present ? data.actionId.value : this.actionId, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + ); + } + + @override + String toString() { + return (StringBuffer('ActivityActionsData(') + ..write('id: $id, ') + ..write('activityId: $activityId, ') + ..write('actionId: $actionId, ') + ..write('createdAt: $createdAt') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(id, activityId, actionId, createdAt); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is ActivityActionsData && + other.id == this.id && + other.activityId == this.activityId && + other.actionId == this.actionId && + other.createdAt == this.createdAt); +} + +class ActivityActionsCompanion extends UpdateCompanion { + final Value id; + final Value activityId; + final Value actionId; + final Value createdAt; + const ActivityActionsCompanion({ + this.id = const Value.absent(), + this.activityId = const Value.absent(), + this.actionId = const Value.absent(), + this.createdAt = const Value.absent(), + }); + ActivityActionsCompanion.insert({ + this.id = const Value.absent(), + required int activityId, + required int actionId, + this.createdAt = const Value.absent(), + }) : activityId = Value(activityId), + actionId = Value(actionId); + static Insertable custom({ + Expression? id, + Expression? activityId, + Expression? actionId, + Expression? createdAt, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (activityId != null) 'activity_id': activityId, + if (actionId != null) 'action_id': actionId, + if (createdAt != null) 'created_at': createdAt, + }); + } + + ActivityActionsCompanion copyWith( + {Value? id, + Value? activityId, + Value? actionId, + Value? createdAt}) { + return ActivityActionsCompanion( + id: id ?? this.id, + activityId: activityId ?? this.activityId, + actionId: actionId ?? this.actionId, + createdAt: createdAt ?? this.createdAt, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (activityId.present) { + map['activity_id'] = Variable(activityId.value); + } + if (actionId.present) { + map['action_id'] = Variable(actionId.value); + } + if (createdAt.present) { + map['created_at'] = Variable(createdAt.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('ActivityActionsCompanion(') + ..write('id: $id, ') + ..write('activityId: $activityId, ') + ..write('actionId: $actionId, ') + ..write('createdAt: $createdAt') + ..write(')')) + .toString(); + } +} + +class MediaItems extends Table with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + MediaItems(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, false, + hasAutoIncrement: true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT')); + late final GeneratedColumn title = GeneratedColumn( + 'title', aliasedName, false, + additionalChecks: + GeneratedColumn.checkTextLength(minTextLength: 3, maxTextLength: 32), + type: DriftSqlType.string, + requiredDuringInsert: true); + late final GeneratedColumn description = GeneratedColumn( + 'body', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn reference = GeneratedColumn( + 'reference', aliasedName, false, + additionalChecks: + GeneratedColumn.checkTextLength(minTextLength: 3, maxTextLength: 256), + type: DriftSqlType.string, + requiredDuringInsert: true); + late final GeneratedColumn type = GeneratedColumn( + 'type', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn createdAt = GeneratedColumn( + 'created_at', aliasedName, false, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + defaultValue: Variable(DateTime.now())); + @override + List get $columns => + [id, title, description, reference, type, createdAt]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'media_items'; + @override + Set get $primaryKey => {id}; + @override + MediaItemsData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return MediaItemsData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id'])!, + title: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}title'])!, + description: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}body'])!, + reference: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}reference'])!, + type: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}type'])!, + createdAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!, + ); + } + + @override + MediaItems createAlias(String alias) { + return MediaItems(attachedDatabase, alias); + } +} + +class MediaItemsData extends DataClass implements Insertable { + final int id; + final String title; + final String description; + final String reference; + final String type; + final DateTime createdAt; + const MediaItemsData( + {required this.id, + required this.title, + required this.description, + required this.reference, + required this.type, + required this.createdAt}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['title'] = Variable(title); + map['body'] = Variable(description); + map['reference'] = Variable(reference); + map['type'] = Variable(type); + map['created_at'] = Variable(createdAt); + return map; + } + + MediaItemsCompanion toCompanion(bool nullToAbsent) { + return MediaItemsCompanion( + id: Value(id), + title: Value(title), + description: Value(description), + reference: Value(reference), + type: Value(type), + createdAt: Value(createdAt), + ); + } + + factory MediaItemsData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return MediaItemsData( + id: serializer.fromJson(json['id']), + title: serializer.fromJson(json['title']), + description: serializer.fromJson(json['description']), + reference: serializer.fromJson(json['reference']), + type: serializer.fromJson(json['type']), + createdAt: serializer.fromJson(json['createdAt']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'title': serializer.toJson(title), + 'description': serializer.toJson(description), + 'reference': serializer.toJson(reference), + 'type': serializer.toJson(type), + 'createdAt': serializer.toJson(createdAt), + }; + } + + MediaItemsData copyWith( + {int? id, + String? title, + String? description, + String? reference, + String? type, + DateTime? createdAt}) => + MediaItemsData( + id: id ?? this.id, + title: title ?? this.title, + description: description ?? this.description, + reference: reference ?? this.reference, + type: type ?? this.type, + createdAt: createdAt ?? this.createdAt, + ); + MediaItemsData copyWithCompanion(MediaItemsCompanion data) { + return MediaItemsData( + id: data.id.present ? data.id.value : this.id, + title: data.title.present ? data.title.value : this.title, + description: + data.description.present ? data.description.value : this.description, + reference: data.reference.present ? data.reference.value : this.reference, + type: data.type.present ? data.type.value : this.type, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + ); + } + + @override + String toString() { + return (StringBuffer('MediaItemsData(') + ..write('id: $id, ') + ..write('title: $title, ') + ..write('description: $description, ') + ..write('reference: $reference, ') + ..write('type: $type, ') + ..write('createdAt: $createdAt') + ..write(')')) + .toString(); + } + + @override + int get hashCode => + Object.hash(id, title, description, reference, type, createdAt); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is MediaItemsData && + other.id == this.id && + other.title == this.title && + other.description == this.description && + other.reference == this.reference && + other.type == this.type && + other.createdAt == this.createdAt); +} + +class MediaItemsCompanion extends UpdateCompanion { + final Value id; + final Value title; + final Value description; + final Value reference; + final Value type; + final Value createdAt; + const MediaItemsCompanion({ + this.id = const Value.absent(), + this.title = const Value.absent(), + this.description = const Value.absent(), + this.reference = const Value.absent(), + this.type = const Value.absent(), + this.createdAt = const Value.absent(), + }); + MediaItemsCompanion.insert({ + this.id = const Value.absent(), + required String title, + required String description, + required String reference, + required String type, + this.createdAt = const Value.absent(), + }) : title = Value(title), + description = Value(description), + reference = Value(reference), + type = Value(type); + static Insertable custom({ + Expression? id, + Expression? title, + Expression? description, + Expression? reference, + Expression? type, + Expression? createdAt, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (title != null) 'title': title, + if (description != null) 'body': description, + if (reference != null) 'reference': reference, + if (type != null) 'type': type, + if (createdAt != null) 'created_at': createdAt, + }); + } + + MediaItemsCompanion copyWith( + {Value? id, + Value? title, + Value? description, + Value? reference, + Value? type, + Value? createdAt}) { + return MediaItemsCompanion( + id: id ?? this.id, + title: title ?? this.title, + description: description ?? this.description, + reference: reference ?? this.reference, + type: type ?? this.type, + createdAt: createdAt ?? this.createdAt, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (title.present) { + map['title'] = Variable(title.value); + } + if (description.present) { + map['body'] = Variable(description.value); + } + if (reference.present) { + map['reference'] = Variable(reference.value); + } + if (type.present) { + map['type'] = Variable(type.value); + } + if (createdAt.present) { + map['created_at'] = Variable(createdAt.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('MediaItemsCompanion(') + ..write('id: $id, ') + ..write('title: $title, ') + ..write('description: $description, ') + ..write('reference: $reference, ') + ..write('type: $type, ') + ..write('createdAt: $createdAt') + ..write(')')) + .toString(); + } +} + +class ObjectMediaItems extends Table + with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + ObjectMediaItems(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, false, + hasAutoIncrement: true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT')); + late final GeneratedColumn objectId = GeneratedColumn( + 'object_id', aliasedName, false, + type: DriftSqlType.int, requiredDuringInsert: true); + late final GeneratedColumn objectType = GeneratedColumn( + 'object_type', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn mediaId = GeneratedColumn( + 'media_id', aliasedName, false, + type: DriftSqlType.int, + requiredDuringInsert: true, + defaultConstraints: + GeneratedColumn.constraintIsAlways('REFERENCES media_items (id)')); + late final GeneratedColumn createdAt = GeneratedColumn( + 'created_at', aliasedName, false, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + defaultValue: Variable(DateTime.now())); + @override + List get $columns => + [id, objectId, objectType, mediaId, createdAt]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'object_media_items'; + @override + Set get $primaryKey => {id}; + @override + ObjectMediaItemsData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return ObjectMediaItemsData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id'])!, + objectId: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}object_id'])!, + objectType: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}object_type'])!, + mediaId: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}media_id'])!, + createdAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!, + ); + } + + @override + ObjectMediaItems createAlias(String alias) { + return ObjectMediaItems(attachedDatabase, alias); + } +} + +class ObjectMediaItemsData extends DataClass + implements Insertable { + final int id; + final int objectId; + final String objectType; + final int mediaId; + final DateTime createdAt; + const ObjectMediaItemsData( + {required this.id, + required this.objectId, + required this.objectType, + required this.mediaId, + required this.createdAt}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['object_id'] = Variable(objectId); + map['object_type'] = Variable(objectType); + map['media_id'] = Variable(mediaId); + map['created_at'] = Variable(createdAt); + return map; + } + + ObjectMediaItemsCompanion toCompanion(bool nullToAbsent) { + return ObjectMediaItemsCompanion( + id: Value(id), + objectId: Value(objectId), + objectType: Value(objectType), + mediaId: Value(mediaId), + createdAt: Value(createdAt), + ); + } + + factory ObjectMediaItemsData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return ObjectMediaItemsData( + id: serializer.fromJson(json['id']), + objectId: serializer.fromJson(json['objectId']), + objectType: serializer.fromJson(json['objectType']), + mediaId: serializer.fromJson(json['mediaId']), + createdAt: serializer.fromJson(json['createdAt']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'objectId': serializer.toJson(objectId), + 'objectType': serializer.toJson(objectType), + 'mediaId': serializer.toJson(mediaId), + 'createdAt': serializer.toJson(createdAt), + }; + } + + ObjectMediaItemsData copyWith( + {int? id, + int? objectId, + String? objectType, + int? mediaId, + DateTime? createdAt}) => + ObjectMediaItemsData( + id: id ?? this.id, + objectId: objectId ?? this.objectId, + objectType: objectType ?? this.objectType, + mediaId: mediaId ?? this.mediaId, + createdAt: createdAt ?? this.createdAt, + ); + ObjectMediaItemsData copyWithCompanion(ObjectMediaItemsCompanion data) { + return ObjectMediaItemsData( + id: data.id.present ? data.id.value : this.id, + objectId: data.objectId.present ? data.objectId.value : this.objectId, + objectType: + data.objectType.present ? data.objectType.value : this.objectType, + mediaId: data.mediaId.present ? data.mediaId.value : this.mediaId, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + ); + } + + @override + String toString() { + return (StringBuffer('ObjectMediaItemsData(') + ..write('id: $id, ') + ..write('objectId: $objectId, ') + ..write('objectType: $objectType, ') + ..write('mediaId: $mediaId, ') + ..write('createdAt: $createdAt') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(id, objectId, objectType, mediaId, createdAt); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is ObjectMediaItemsData && + other.id == this.id && + other.objectId == this.objectId && + other.objectType == this.objectType && + other.mediaId == this.mediaId && + other.createdAt == this.createdAt); +} + +class ObjectMediaItemsCompanion extends UpdateCompanion { + final Value id; + final Value objectId; + final Value objectType; + final Value mediaId; + final Value createdAt; + const ObjectMediaItemsCompanion({ + this.id = const Value.absent(), + this.objectId = const Value.absent(), + this.objectType = const Value.absent(), + this.mediaId = const Value.absent(), + this.createdAt = const Value.absent(), + }); + ObjectMediaItemsCompanion.insert({ + this.id = const Value.absent(), + required int objectId, + required String objectType, + required int mediaId, + this.createdAt = const Value.absent(), + }) : objectId = Value(objectId), + objectType = Value(objectType), + mediaId = Value(mediaId); + static Insertable custom({ + Expression? id, + Expression? objectId, + Expression? objectType, + Expression? mediaId, + Expression? createdAt, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (objectId != null) 'object_id': objectId, + if (objectType != null) 'object_type': objectType, + if (mediaId != null) 'media_id': mediaId, + if (createdAt != null) 'created_at': createdAt, + }); + } + + ObjectMediaItemsCompanion copyWith( + {Value? id, + Value? objectId, + Value? objectType, + Value? mediaId, + Value? createdAt}) { + return ObjectMediaItemsCompanion( + id: id ?? this.id, + objectId: objectId ?? this.objectId, + objectType: objectType ?? this.objectType, + mediaId: mediaId ?? this.mediaId, + createdAt: createdAt ?? this.createdAt, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (objectId.present) { + map['object_id'] = Variable(objectId.value); + } + if (objectType.present) { + map['object_type'] = Variable(objectType.value); + } + if (mediaId.present) { + map['media_id'] = Variable(mediaId.value); + } + if (createdAt.present) { + map['created_at'] = Variable(createdAt.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('ObjectMediaItemsCompanion(') + ..write('id: $id, ') + ..write('objectId: $objectId, ') + ..write('objectType: $objectType, ') + ..write('mediaId: $mediaId, ') + ..write('createdAt: $createdAt') + ..write(')')) + .toString(); + } +} + +class DatabaseAtV2 extends GeneratedDatabase { + DatabaseAtV2(QueryExecutor e) : super(e); + late final Sessions sessions = Sessions(this); + late final Activities activities = Activities(this); + late final SessionActivities sessionActivities = SessionActivities(this); + late final Actions actions = Actions(this); + late final ActivityActions activityActions = ActivityActions(this); + late final MediaItems mediaItems = MediaItems(this); + late final ObjectMediaItems objectMediaItems = ObjectMediaItems(this); + @override + Iterable> get allTables => + allSchemaEntities.whereType>(); + @override + List get allSchemaEntities => [ + sessions, + activities, + sessionActivities, + actions, + activityActions, + mediaItems, + objectMediaItems + ]; + @override + int get schemaVersion => 2; +} diff --git a/test/drift/sendtrain/migration_test.dart b/test/drift/sendtrain/migration_test.dart new file mode 100644 index 0000000..fca1e4f --- /dev/null +++ b/test/drift/sendtrain/migration_test.dart @@ -0,0 +1,104 @@ +// dart format width=80 +// ignore_for_file: unused_local_variable, unused_import +import 'package:drift/drift.dart'; +import 'package:drift_dev/api/migrations_native.dart'; +import 'package:sendtrain/database/database.dart'; +import 'package:test/test.dart'; +import 'generated/schema.dart'; + +import 'generated/schema_v1.dart' as v1; +import 'generated/schema_v2.dart' as v2; + +void main() { + driftRuntimeOptions.dontWarnAboutMultipleDatabases = true; + late SchemaVerifier verifier; + + setUpAll(() { + verifier = SchemaVerifier(GeneratedHelper()); + }); + + group('simple database migrations', () { + // These simple tests verify all possible schema updates with a simple (no + // data) migration. This is a quick way to ensure that written database + // migrations properly alter the schema. + final versions = GeneratedHelper.versions; + for (final (i, fromVersion) in versions.indexed) { + group('from $fromVersion', () { + for (final toVersion in versions.skip(i + 1)) { + test('to $toVersion', () async { + final schema = await verifier.schemaAt(fromVersion); + final db = AppDatabase(schema.newConnection()); + await verifier.migrateAndValidate(db, toVersion); + await db.close(); + }); + } + }); + } + }); + + // The following template shows how to write tests ensuring your migrations + // preserve existing data. + // Testing this can be useful for migrations that change existing columns + // (e.g. by alterating their type or constraints). Migrations that only add + // tables or columns typically don't need these advanced tests. For more + // information, see https://drift.simonbinder.eu/migrations/tests/#verifying-data-integrity + // TODO: This generated template shows how these tests could be written. Adopt + // it to your own needs when testing migrations with data integrity. + test("migration from v1 to v2 does not corrupt data", () async { + // Add data to insert into the old database, and the expected rows after the + // migration. + // TODO: Fill these lists + final oldSessionsData = []; + final expectedNewSessionsData = []; + + final oldActivitiesData = []; + final expectedNewActivitiesData = []; + + final oldSessionActivitiesData = []; + final expectedNewSessionActivitiesData = []; + + final oldActionsData = []; + final expectedNewActionsData = []; + + final oldActivityActionsData = []; + final expectedNewActivityActionsData = []; + + final oldMediaItemsData = []; + final expectedNewMediaItemsData = []; + + final oldObjectMediaItemsData = []; + final expectedNewObjectMediaItemsData = []; + + await verifier.testWithDataIntegrity( + oldVersion: 1, + newVersion: 2, + createOld: v1.DatabaseAtV1.new, + createNew: v2.DatabaseAtV2.new, + openTestedDatabase: AppDatabase.new, + createItems: (batch, oldDb) { + batch.insertAll(oldDb.sessions, oldSessionsData); + batch.insertAll(oldDb.activities, oldActivitiesData); + batch.insertAll(oldDb.sessionActivities, oldSessionActivitiesData); + batch.insertAll(oldDb.actions, oldActionsData); + batch.insertAll(oldDb.activityActions, oldActivityActionsData); + batch.insertAll(oldDb.mediaItems, oldMediaItemsData); + batch.insertAll(oldDb.objectMediaItems, oldObjectMediaItemsData); + }, + validateItems: (newDb) async { + expect( + expectedNewSessionsData, await newDb.select(newDb.sessions).get()); + expect(expectedNewActivitiesData, + await newDb.select(newDb.activities).get()); + expect(expectedNewSessionActivitiesData, + await newDb.select(newDb.sessionActivities).get()); + expect(expectedNewActionsData, await newDb.select(newDb.actions).get()); + expect(expectedNewActivityActionsData, + await newDb.select(newDb.activityActions).get()); + expect(expectedNewMediaItemsData, + await newDb.select(newDb.mediaItems).get()); + expect(expectedNewObjectMediaItemsData, + await newDb.select(newDb.objectMediaItems).get()); + }, + ); + }); +} -- 2.47.2 From 3153bf13f91b6c1225cc0df87056972beaaffe9a Mon Sep 17 00:00:00 2001 From: Joshua Burman Date: Fri, 20 Dec 2024 21:07:05 -0500 Subject: [PATCH 4/9] db seed fix, cleanup --- lib/database/database.dart | 56 +++---- lib/database/seed.dart | 50 +++--- lib/widgets/session_view_achievements.dart | 10 +- lib/widgets/session_view_media.dart | 11 +- test/drift/sendtrain/migration_test.dart | 184 ++++++++++----------- 5 files changed, 155 insertions(+), 156 deletions(-) diff --git a/lib/database/database.dart b/lib/database/database.dart index d2ce42e..b5b96fc 100644 --- a/lib/database/database.dart +++ b/lib/database/database.dart @@ -6,13 +6,7 @@ import 'package:sendtrain/database/seed.dart'; part 'database.g.dart'; - -enum SessionStatus { - pending, - started, - completed, - missed -} +enum SessionStatus { pending, started, completed, missed } class Sessions extends Table { IntColumn get id => integer().autoIncrement()(); @@ -20,7 +14,8 @@ class Sessions extends Table { TextColumn get content => text().named('body')(); TextColumn get status => textEnum()(); DateTimeColumn get date => dateTime().nullable()(); - DateTimeColumn get createdAt => dateTime().withDefault(Variable(DateTime.now()))(); + DateTimeColumn get createdAt => + dateTime().withDefault(Variable(DateTime.now()))(); } class SessionActivities extends Table { @@ -29,16 +24,11 @@ class SessionActivities extends Table { IntColumn get activityId => integer().references(Activities, #id)(); TextColumn get results => text().nullable()(); TextColumn get achievements => text().nullable()(); - DateTimeColumn get createdAt => dateTime().withDefault(Variable(DateTime.now()))(); + DateTimeColumn get createdAt => + dateTime().withDefault(Variable(DateTime.now()))(); } -enum ActivityCategories { - fundamentals, - conditioning, - advanced, - custom, - pro -} +enum ActivityCategories { fundamentals, conditioning, advanced, custom, pro } enum ActivityType { strength, @@ -59,14 +49,16 @@ class Activities extends Table { TextColumn get type => textEnum()(); TextColumn get description => text().named('body')(); TextColumn get category => textEnum()(); - DateTimeColumn get createdAt => dateTime().withDefault(Variable(DateTime.now()))(); + DateTimeColumn get createdAt => + dateTime().withDefault(Variable(DateTime.now()))(); } class ActivityActions extends Table { IntColumn get id => integer().autoIncrement()(); IntColumn get activityId => integer().references(Activities, #id)(); IntColumn get actionId => integer().references(Actions, #id)(); - DateTimeColumn get createdAt => dateTime().withDefault(Variable(DateTime.now()))(); + DateTimeColumn get createdAt => + dateTime().withDefault(Variable(DateTime.now()))(); } class Actions extends Table { @@ -74,7 +66,8 @@ class Actions extends Table { TextColumn get title => text().withLength(min: 3, max: 32)(); TextColumn get description => text().named('body')(); TextColumn get set => text()(); - DateTimeColumn get createdAt => dateTime().withDefault(Variable(DateTime.now()))(); + DateTimeColumn get createdAt => + dateTime().withDefault(Variable(DateTime.now()))(); } enum ObjectType { @@ -82,25 +75,26 @@ enum ObjectType { activities, sessions, } + class ObjectMediaItems extends Table { IntColumn get id => integer().autoIncrement()(); IntColumn get objectId => integer()(); TextColumn get objectType => textEnum()(); IntColumn get mediaId => integer().references(MediaItems, #id)(); - DateTimeColumn get createdAt => dateTime().withDefault(Variable(DateTime.now()))(); + DateTimeColumn get createdAt => + dateTime().withDefault(Variable(DateTime.now()))(); } -enum MediaType { - youtube, - image -} +enum MediaType { youtube, image } + class MediaItems extends Table { IntColumn get id => integer().autoIncrement()(); TextColumn get title => text().withLength(min: 3, max: 32)(); TextColumn get description => text().named('body')(); TextColumn get reference => text().withLength(min: 3, max: 256)(); TextColumn get type => textEnum()(); - DateTimeColumn get createdAt => dateTime().withDefault(Variable(DateTime.now()))(); + DateTimeColumn get createdAt => + dateTime().withDefault(Variable(DateTime.now()))(); } @DriftDatabase(tables: [ @@ -116,7 +110,6 @@ class MediaItems extends Table { ActivitiesDao, MediaItems ]) - class AppDatabase extends _$AppDatabase { // After generating code, this class needs to define a `schemaVersion` getter // and a constructor telling drift where the database should be stored. @@ -130,9 +123,14 @@ class AppDatabase extends _$AppDatabase { MigrationStrategy get migration { return MigrationStrategy( onCreate: (m) async { - await m.createAll(); // create all tables - await seedDb(); // seed the tables - } + await m.createAll().then((r) async { + await seedDb(this); + }); // create all tablesables + }, + beforeOpen: (details) async { + /// Enable foreign_keys + await customStatement('PRAGMA foreign_keys = ON'); + }, ); } diff --git a/lib/database/seed.dart b/lib/database/seed.dart index 27355b0..d612489 100644 --- a/lib/database/seed.dart +++ b/lib/database/seed.dart @@ -3,9 +3,7 @@ import 'dart:math'; import 'package:drift/drift.dart'; import 'package:sendtrain/database/database.dart'; -Future seedDb() async { - final database = AppDatabase(); - +Future seedDb(AppDatabase database) async { // seed data setup final List sessionValues = [ [ @@ -51,30 +49,29 @@ Future seedDb() async { if (i == 0) status = SessionStatus.started; if (i == 1) status = SessionStatus.pending; - final sessionValue = - sessionValues[random.nextInt(sessionValues.length)]; - database + final sessionValue = sessionValues[random.nextInt(sessionValues.length)]; + await database .into(database.sessions) .insert(SessionsCompanion.insert( title: sessionValue[0], content: sessionValue[1], status: status, date: Value(DateTime.now()))) - .then((sessionId) { + .then((sessionId) async { // activities things for (int j = 0; j < random.nextInt(totalActivities); j++) { - database + await database .into(database.activities) .insert(ActivitiesCompanion.insert( title: "test activity $j", type: ActivityType .values[random.nextInt(ActivityType.values.length)], description: "test training activity $j", - category: ActivityCategories.values[ - random.nextInt(ActivityCategories.values.length)])) - .then((activityId) { + category: ActivityCategories + .values[random.nextInt(ActivityCategories.values.length)])) + .then((activityId) async { // session activity relationships - database + await database .into(database.sessionActivities) .insert(SessionActivitiesCompanion.insert( sessionId: sessionId, @@ -85,30 +82,29 @@ Future seedDb() async { // actions for (int k = 0; k < random.nextInt(totalActions); k++) { - database + await database .into(database.actions) .insert(ActionsCompanion.insert( title: 'test action $k', description: 'test action description $k', set: '')) - .then((actionId) { + .then((actionId) async { // add activity action association - database.into(database.activityActions).insert( + await database.into(database.activityActions).insert( ActivityActionsCompanion.insert( activityId: activityId, actionId: actionId)); for (int l = 0; l < random.nextInt(totalMedia); l++) { - final mediaItem = - mediaItems[random.nextInt(mediaItems.length)]; - database + final mediaItem = mediaItems[random.nextInt(mediaItems.length)]; + await database .into(database.mediaItems) .insert(MediaItemsCompanion.insert( title: 'media title $l', description: 'media description $l', reference: mediaItem[0], type: mediaItem[1])) - .then((mediaId) { - database.into(database.objectMediaItems).insert( + .then((mediaId) async { + await database.into(database.objectMediaItems).insert( ObjectMediaItemsCompanion.insert( objectId: actionId, mediaId: mediaId, @@ -120,15 +116,15 @@ Future seedDb() async { for (int l = 0; l < random.nextInt(totalMedia); l++) { final mediaItem = mediaItems[random.nextInt(mediaItems.length)]; - database + await database .into(database.mediaItems) .insert(MediaItemsCompanion.insert( title: 'media title $l', description: 'media description $l', reference: mediaItem[0], type: mediaItem[1])) - .then((mediaId) { - database.into(database.objectMediaItems).insert( + .then((mediaId) async { + await database.into(database.objectMediaItems).insert( ObjectMediaItemsCompanion.insert( objectId: activityId, mediaId: mediaId, @@ -140,15 +136,15 @@ Future seedDb() async { for (int l = 0; l < random.nextInt(totalMedia); l++) { final mediaItem = mediaItems[random.nextInt(mediaItems.length)]; - database + await database .into(database.mediaItems) .insert(MediaItemsCompanion.insert( title: 'media title $l', description: 'media description $l', reference: mediaItem[0], type: mediaItem[1])) - .then((mediaId) { - database.into(database.objectMediaItems).insert( + .then((mediaId) async { + await database.into(database.objectMediaItems).insert( ObjectMediaItemsCompanion.insert( objectId: sessionId, mediaId: mediaId, @@ -157,4 +153,4 @@ Future seedDb() async { } }); } -} \ No newline at end of file +} diff --git a/lib/widgets/session_view_achievements.dart b/lib/widgets/session_view_achievements.dart index 5c85357..b830f04 100644 --- a/lib/widgets/session_view_achievements.dart +++ b/lib/widgets/session_view_achievements.dart @@ -26,12 +26,12 @@ class SessionViewAchievements extends StatelessWidget { @override Widget build(BuildContext context) { return FutureBuilder>( - future: SessionActivitiesDao(Provider.of(context)).sessionActivitiesBySessionId(session.id), + future: SessionActivitiesDao(Provider.of(context)) + .sessionActivitiesBySessionId(session.id), builder: (context, snapshot) { if (snapshot.hasData) { final sessionActivities = snapshot.data!; final achievements = getAchievements(sessionActivities); - // database.close(); return Column( children: [ @@ -58,8 +58,10 @@ class SessionViewAchievements extends StatelessWidget { ], ); } else { - return Padding(padding: EdgeInsets.all(15), child:CircularProgressIndicator()); + return Padding( + padding: EdgeInsets.all(15), + child: CircularProgressIndicator()); } }); } -} \ No newline at end of file +} diff --git a/lib/widgets/session_view_media.dart b/lib/widgets/session_view_media.dart index 54b373c..c9267f5 100644 --- a/lib/widgets/session_view_media.dart +++ b/lib/widgets/session_view_media.dart @@ -12,11 +12,12 @@ class SessionViewMedia extends StatelessWidget { @override Widget build(BuildContext context) { return FutureBuilder>( - future: MediaItemsDao(Provider.of(context)).mediaItemsFromSession(session), + future: MediaItemsDao(Provider.of(context)) + .mediaItemsFromSession(session), builder: (context, snapshot) { if (snapshot.hasData) { final mediaItems = snapshot.data!; - // database.close(); + List mediaCards = List.generate( mediaItems.length, (i) => MediaCard(media: mediaItems[i])); @@ -35,8 +36,10 @@ class SessionViewMedia extends StatelessWidget { ], ); } else { - return Padding(padding: EdgeInsets.all(15), child:CircularProgressIndicator()); + return Padding( + padding: EdgeInsets.all(15), + child: CircularProgressIndicator()); } }); } -} \ No newline at end of file +} diff --git a/test/drift/sendtrain/migration_test.dart b/test/drift/sendtrain/migration_test.dart index fca1e4f..b0cc049 100644 --- a/test/drift/sendtrain/migration_test.dart +++ b/test/drift/sendtrain/migration_test.dart @@ -1,104 +1,104 @@ -// dart format width=80 -// ignore_for_file: unused_local_variable, unused_import -import 'package:drift/drift.dart'; -import 'package:drift_dev/api/migrations_native.dart'; -import 'package:sendtrain/database/database.dart'; -import 'package:test/test.dart'; -import 'generated/schema.dart'; +// // dart format width=80 +// // ignore_for_file: unused_local_variable, unused_import +// import 'package:drift/drift.dart'; +// import 'package:drift_dev/api/migrations_native.dart'; +// import 'package:sendtrain/database/database.dart'; +// import 'package:test/test.dart'; +// import 'generated/schema.dart'; -import 'generated/schema_v1.dart' as v1; -import 'generated/schema_v2.dart' as v2; +// import 'generated/schema_v1.dart' as v1; +// import 'generated/schema_v2.dart' as v2; -void main() { - driftRuntimeOptions.dontWarnAboutMultipleDatabases = true; - late SchemaVerifier verifier; +// void main() { +// driftRuntimeOptions.dontWarnAboutMultipleDatabases = true; +// late SchemaVerifier verifier; - setUpAll(() { - verifier = SchemaVerifier(GeneratedHelper()); - }); +// setUpAll(() { +// verifier = SchemaVerifier(GeneratedHelper()); +// }); - group('simple database migrations', () { - // These simple tests verify all possible schema updates with a simple (no - // data) migration. This is a quick way to ensure that written database - // migrations properly alter the schema. - final versions = GeneratedHelper.versions; - for (final (i, fromVersion) in versions.indexed) { - group('from $fromVersion', () { - for (final toVersion in versions.skip(i + 1)) { - test('to $toVersion', () async { - final schema = await verifier.schemaAt(fromVersion); - final db = AppDatabase(schema.newConnection()); - await verifier.migrateAndValidate(db, toVersion); - await db.close(); - }); - } - }); - } - }); +// group('simple database migrations', () { +// // These simple tests verify all possible schema updates with a simple (no +// // data) migration. This is a quick way to ensure that written database +// // migrations properly alter the schema. +// final versions = GeneratedHelper.versions; +// for (final (i, fromVersion) in versions.indexed) { +// group('from $fromVersion', () { +// for (final toVersion in versions.skip(i + 1)) { +// test('to $toVersion', () async { +// final schema = await verifier.schemaAt(fromVersion); +// final db = AppDatabase(schema.newConnection()); +// await verifier.migrateAndValidate(db, toVersion); +// await db.close(); +// }); +// } +// }); +// } +// }); - // The following template shows how to write tests ensuring your migrations - // preserve existing data. - // Testing this can be useful for migrations that change existing columns - // (e.g. by alterating their type or constraints). Migrations that only add - // tables or columns typically don't need these advanced tests. For more - // information, see https://drift.simonbinder.eu/migrations/tests/#verifying-data-integrity - // TODO: This generated template shows how these tests could be written. Adopt - // it to your own needs when testing migrations with data integrity. - test("migration from v1 to v2 does not corrupt data", () async { - // Add data to insert into the old database, and the expected rows after the - // migration. - // TODO: Fill these lists - final oldSessionsData = []; - final expectedNewSessionsData = []; +// // The following template shows how to write tests ensuring your migrations +// // preserve existing data. +// // Testing this can be useful for migrations that change existing columns +// // (e.g. by alterating their type or constraints). Migrations that only add +// // tables or columns typically don't need these advanced tests. For more +// // information, see https://drift.simonbinder.eu/migrations/tests/#verifying-data-integrity +// // TODO: This generated template shows how these tests could be written. Adopt +// // it to your own needs when testing migrations with data integrity. +// test("migration from v1 to v2 does not corrupt data", () async { +// // Add data to insert into the old database, and the expected rows after the +// // migration. +// // TODO: Fill these lists +// final oldSessionsData = []; +// final expectedNewSessionsData = []; - final oldActivitiesData = []; - final expectedNewActivitiesData = []; +// final oldActivitiesData = []; +// final expectedNewActivitiesData = []; - final oldSessionActivitiesData = []; - final expectedNewSessionActivitiesData = []; +// final oldSessionActivitiesData = []; +// final expectedNewSessionActivitiesData = []; - final oldActionsData = []; - final expectedNewActionsData = []; +// final oldActionsData = []; +// final expectedNewActionsData = []; - final oldActivityActionsData = []; - final expectedNewActivityActionsData = []; +// final oldActivityActionsData = []; +// final expectedNewActivityActionsData = []; - final oldMediaItemsData = []; - final expectedNewMediaItemsData = []; +// final oldMediaItemsData = []; +// final expectedNewMediaItemsData = []; - final oldObjectMediaItemsData = []; - final expectedNewObjectMediaItemsData = []; +// final oldObjectMediaItemsData = []; +// final expectedNewObjectMediaItemsData = []; - await verifier.testWithDataIntegrity( - oldVersion: 1, - newVersion: 2, - createOld: v1.DatabaseAtV1.new, - createNew: v2.DatabaseAtV2.new, - openTestedDatabase: AppDatabase.new, - createItems: (batch, oldDb) { - batch.insertAll(oldDb.sessions, oldSessionsData); - batch.insertAll(oldDb.activities, oldActivitiesData); - batch.insertAll(oldDb.sessionActivities, oldSessionActivitiesData); - batch.insertAll(oldDb.actions, oldActionsData); - batch.insertAll(oldDb.activityActions, oldActivityActionsData); - batch.insertAll(oldDb.mediaItems, oldMediaItemsData); - batch.insertAll(oldDb.objectMediaItems, oldObjectMediaItemsData); - }, - validateItems: (newDb) async { - expect( - expectedNewSessionsData, await newDb.select(newDb.sessions).get()); - expect(expectedNewActivitiesData, - await newDb.select(newDb.activities).get()); - expect(expectedNewSessionActivitiesData, - await newDb.select(newDb.sessionActivities).get()); - expect(expectedNewActionsData, await newDb.select(newDb.actions).get()); - expect(expectedNewActivityActionsData, - await newDb.select(newDb.activityActions).get()); - expect(expectedNewMediaItemsData, - await newDb.select(newDb.mediaItems).get()); - expect(expectedNewObjectMediaItemsData, - await newDb.select(newDb.objectMediaItems).get()); - }, - ); - }); -} +// await verifier.testWithDataIntegrity( +// oldVersion: 1, +// newVersion: 2, +// createOld: v1.DatabaseAtV1.new, +// createNew: v2.DatabaseAtV2.new, +// openTestedDatabase: AppDatabase.new, +// createItems: (batch, oldDb) { +// batch.insertAll(oldDb.sessions, oldSessionsData); +// batch.insertAll(oldDb.activities, oldActivitiesData); +// batch.insertAll(oldDb.sessionActivities, oldSessionActivitiesData); +// batch.insertAll(oldDb.actions, oldActionsData); +// batch.insertAll(oldDb.activityActions, oldActivityActionsData); +// batch.insertAll(oldDb.mediaItems, oldMediaItemsData); +// batch.insertAll(oldDb.objectMediaItems, oldObjectMediaItemsData); +// }, +// validateItems: (newDb) async { +// expect( +// expectedNewSessionsData, await newDb.select(newDb.sessions).get()); +// expect(expectedNewActivitiesData, +// await newDb.select(newDb.activities).get()); +// expect(expectedNewSessionActivitiesData, +// await newDb.select(newDb.sessionActivities).get()); +// expect(expectedNewActionsData, await newDb.select(newDb.actions).get()); +// expect(expectedNewActivityActionsData, +// await newDb.select(newDb.activityActions).get()); +// expect(expectedNewMediaItemsData, +// await newDb.select(newDb.mediaItems).get()); +// expect(expectedNewObjectMediaItemsData, +// await newDb.select(newDb.objectMediaItems).get()); +// }, +// ); +// }); +// } -- 2.47.2 From 1234a300e15b5e4c773c25bb7883440407c7353d Mon Sep 17 00:00:00 2001 From: Joshua Burman Date: Sat, 21 Dec 2024 17:51:24 -0500 Subject: [PATCH 5/9] small refactor, better dao thigns --- lib/daos/activities_dao.dart | 4 +- lib/daos/media_items_dao.dart | 26 ++- lib/daos/session_activities_dao.dart | 6 +- lib/daos/sessions_dao.dart | 4 +- lib/models/activity_timer_model.dart | 3 +- lib/widgets/activity_card.dart | 192 +++++++++++---------- lib/widgets/activity_view.dart | 95 ++-------- lib/widgets/session_view_achievements.dart | 2 +- lib/widgets/session_view_media.dart | 2 +- 9 files changed, 152 insertions(+), 182 deletions(-) diff --git a/lib/daos/activities_dao.dart b/lib/daos/activities_dao.dart index 3a50042..b11bd78 100644 --- a/lib/daos/activities_dao.dart +++ b/lib/daos/activities_dao.dart @@ -11,8 +11,8 @@ class ActivitiesDao extends DatabaseAccessor with _$ActivitiesDaoMi return await select(activities).get(); } - Future> find(int id) async { - return await (select(activities)..where((activity) => activity.id.equals(id) )).get(); + Future find(int id) async { + return await (select(activities)..where((activity) => activity.id.equals(id) )).getSingle(); } Future> sessionActivities(int id) async { diff --git a/lib/daos/media_items_dao.dart b/lib/daos/media_items_dao.dart index 2f2fced..4e204f5 100644 --- a/lib/daos/media_items_dao.dart +++ b/lib/daos/media_items_dao.dart @@ -11,11 +11,31 @@ class MediaItemsDao extends DatabaseAccessor with _$MediaItemsDaoMi return await select(mediaItems).get(); } - Future> find(int id) async { - return await (select(mediaItems)..where((mediaItem) => mediaItem.id.equals(id) )).get(); + Future find(int id) async { + return await (select(mediaItems)..where((mediaItem) => mediaItem.id.equals(id) )).getSingle(); } - Future> mediaItemsFromSession(Session session) async { + Future> fromActivity(Activity activity) async { + final result = select(db.objectMediaItems).join( + [ + innerJoin( + db.mediaItems, + db.mediaItems.id.equalsExp(db.objectMediaItems.mediaId), + ), + ], + ) + ..where( + db.objectMediaItems.objectType.equals(ObjectType.activities.name)) + ..where(db.objectMediaItems.objectId.equals(activity.id)); + + final mediaItems = (await result.get()) + .map((e) => e.readTable(db.mediaItems)) + .toList(); + + return mediaItems; + } + + Future> fromSession(Session session) async { final result = select(db.objectMediaItems).join( [ innerJoin( diff --git a/lib/daos/session_activities_dao.dart b/lib/daos/session_activities_dao.dart index bb4a0c6..9c645ae 100644 --- a/lib/daos/session_activities_dao.dart +++ b/lib/daos/session_activities_dao.dart @@ -11,11 +11,11 @@ class SessionActivitiesDao extends DatabaseAccessor with _$SessionA return await select(sessionActivities).get(); } - Future> find(int id) async { - return await (select(sessionActivities)..where((sessionActivity) => sessionActivity.id.equals(id) )).get(); + Future find(int id) async { + return await (select(sessionActivities)..where((sessionActivity) => sessionActivity.id.equals(id) )).getSingle(); } - Future> sessionActivitiesBySessionId(int id) async { + Future> fromSessionId(int id) async { final result = db.managers.sessionActivities .filter((sessionActivity) => sessionActivity.sessionId.id(id)); diff --git a/lib/daos/sessions_dao.dart b/lib/daos/sessions_dao.dart index bb7aee5..a54a702 100644 --- a/lib/daos/sessions_dao.dart +++ b/lib/daos/sessions_dao.dart @@ -11,7 +11,7 @@ class SessionsDao extends DatabaseAccessor with _$SessionsDaoMixin return await select(sessions).get(); } - Future> find(int id) async { - return await (select(sessions)..where((session) => session.id.equals(id) )).get(); + Future find(int id) async { + return await (select(sessions)..where((session) => session.id.equals(id) )).getSingle(); } } \ No newline at end of file diff --git a/lib/models/activity_timer_model.dart b/lib/models/activity_timer_model.dart index 24e5d11..771155c 100644 --- a/lib/models/activity_timer_model.dart +++ b/lib/models/activity_timer_model.dart @@ -30,12 +30,13 @@ class ActivityTimerModel with ChangeNotifier { double get progress => _progress; int get totalTime => _totalTime; - void setup(ActivityModel activityModel) { + void setup(ActivityModel activityModel, Activity activity) { if (_activityModel == null || activityModel.id != _activityModel?.id) { _periodicTimer?.cancel(); _progress = 0; _isc = null; _activityModel = activityModel; + _activity = activity; _sets = activityModel.actions[0].items(); _currentActionNum = 0; _currentSetNum = 0; diff --git a/lib/widgets/activity_card.dart b/lib/widgets/activity_card.dart index 4a5adc2..f474c85 100644 --- a/lib/widgets/activity_card.dart +++ b/lib/widgets/activity_card.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:sendtrain/classes/media.dart'; +import 'package:sendtrain/daos/media_items_dao.dart'; import 'package:sendtrain/database/database.dart'; import 'package:sendtrain/models/activity_model.dart'; import 'package:sendtrain/models/activity_timer_model.dart'; @@ -30,97 +30,113 @@ class ActivityCardState extends State { final ActivityTimerModel atm = Provider.of(context, listen: false); - return Card( - color: atm.activity?.id == widget.activity.id - ? Theme.of(context).colorScheme.primaryContainer - : Theme.of(context).colorScheme.surfaceContainerLow, - clipBehavior: Clip.hardEdge, - child: InkWell( - onTap: () => showGeneralDialog( - barrierColor: Colors.black.withOpacity(0.5), - transitionDuration: const Duration(milliseconds: 220), - transitionBuilder: (BuildContext context, - Animation animation, - Animation secondaryAnimation, - Widget child) { - Animation custom = Tween( - begin: const Offset(0.0, 1.0), - end: const Offset(0.0, 0.0)) - .animate(animation); - return SlideTransition( - position: custom, - child: Dialog.fullscreen( - child: ActivityView(activity: widget.activity))); - }, - barrierDismissible: true, - barrierLabel: '', - context: context, - pageBuilder: (context, animation1, animation2) { - return Container(); - }), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - ListTile( - leading: Padding( - padding: const EdgeInsets.fromLTRB(0, 0, 0, 0), - child: Container( - padding: EdgeInsets.only(top: 5, bottom: 5), - width: 60, - decoration: BoxDecoration( - image: DecorationImage( - fit: BoxFit.cover, - image: findMediaByType( - widget.activity.actions[0].media, 'image')), - // color: Colors.blue, - borderRadius: - const BorderRadius.all(Radius.elliptical(10, 10)), - ), - )), - title: Consumer( - builder: (context, atm, child) { - if (atm.activity?.id == widget.activity.id) { - return Text( - maxLines: 1, - "${widget.data.title} (${formattedTime(atm.totalTime)})"); - } else { - return Text(maxLines: 1, widget.data.title); - } - }, - ), - subtitle: Text(maxLines: 2, widget.data.description), - trailing: IconButton( - visualDensity: VisualDensity.compact, - icon: Icon(Icons.close_rounded), - onPressed: () { - showAdaptiveDialog( - context: context, - builder: (BuildContext context) => AlertDialog( - title: const Text('Activity Removal'), - content: const Text('Would you like to permanently remove this activity from the current session?'), - actions: [ - TextButton( - onPressed: () => Navigator.pop(context, 'Cancel'), - child: const Text('Cancel'), - ), - TextButton( - onPressed: () => Navigator.pop(context, 'OK'), - child: const Text('OK'), - ), - ], - ), - ); - }, + return FutureBuilder>( + future: MediaItemsDao(Provider.of(context)) + .fromActivity(widget.data), + builder: (context, snapshot) { + if (snapshot.hasData) { + List mediaItems = snapshot.data!; + + return Card( + color: atm.activity?.id == widget.activity.id + ? Theme.of(context).colorScheme.primaryContainer + : Theme.of(context).colorScheme.surfaceContainerLow, + clipBehavior: Clip.hardEdge, + child: InkWell( + onTap: () => showGeneralDialog( + barrierColor: Colors.black.withOpacity(0.5), + transitionDuration: const Duration(milliseconds: 220), + transitionBuilder: (BuildContext context, + Animation animation, + Animation secondaryAnimation, + Widget child) { + Animation custom = Tween( + begin: const Offset(0.0, 1.0), + end: const Offset(0.0, 0.0)) + .animate(animation); + return SlideTransition( + position: custom, + child: Dialog.fullscreen( + child: ActivityView( + activityModel: widget.activity, + activity: widget.data))); + }, + barrierDismissible: true, + barrierLabel: '', + context: context, + pageBuilder: (context, animation1, animation2) { + return Container(); + }), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + ListTile( + leading: Padding( + padding: const EdgeInsets.fromLTRB(0, 0, 0, 0), + child: Container( + padding: EdgeInsets.only(top: 5, bottom: 5), + width: 60, + decoration: BoxDecoration( + image: DecorationImage( + fit: BoxFit.cover, + image: + findMediaByType(mediaItems, 'image')), + // color: Colors.blue, + borderRadius: const BorderRadius.all( + Radius.elliptical(10, 10)), + ), + )), + title: Consumer( + builder: (context, atm, child) { + if (atm.activity?.id == widget.activity.id) { + return Text( + maxLines: 1, + "${widget.data.title} (${formattedTime(atm.totalTime)})"); + } else { + return Text(maxLines: 1, widget.data.title); + } + }, + ), + subtitle: Text(maxLines: 2, widget.data.description), + trailing: IconButton( + visualDensity: VisualDensity.compact, + icon: Icon(Icons.close_rounded), + onPressed: () { + showAdaptiveDialog( + context: context, + builder: (BuildContext context) => AlertDialog( + title: const Text('Activity Removal'), + content: const Text( + 'Would you like to permanently remove this activity from the current session?'), + actions: [ + TextButton( + onPressed: () => + Navigator.pop(context, 'Cancel'), + child: const Text('Cancel'), + ), + TextButton( + onPressed: () => + Navigator.pop(context, 'OK'), + child: const Text('OK'), + ), + ], + ), + ); + }, + )), + ], )), - ], - )), - ); + ); + } else { + return CircularProgressIndicator(); + } + }); } - ImageProvider findMediaByType(List? media, String type) { - var found = media?.where((m) => m.type == 'image'); + ImageProvider findMediaByType(List media, String type) { + Iterable? found = media.where((m) => m.type == MediaType.image); - if (found != null) { + if (found.isNotEmpty) { return NetworkImage(found.first.reference); } else { // Element is not found diff --git a/lib/widgets/activity_view.dart b/lib/widgets/activity_view.dart index 0c01a08..eeff698 100644 --- a/lib/widgets/activity_view.dart +++ b/lib/widgets/activity_view.dart @@ -1,16 +1,18 @@ import 'package:flutter/material.dart'; import 'package:flutter_expandable_fab/flutter_expandable_fab.dart'; import 'package:provider/provider.dart'; -import 'package:sendtrain/classes/activity_action.dart'; -import 'package:sendtrain/classes/media.dart'; +import 'package:sendtrain/database/database.dart'; import 'package:sendtrain/models/activity_model.dart'; import 'package:sendtrain/models/activity_timer_model.dart'; import 'package:sendtrain/widgets/activity_action_view.dart'; -import 'package:sendtrain/widgets/media_card.dart'; +import 'package:sendtrain/widgets/activity_view_categories.dart'; +import 'package:sendtrain/widgets/activity_view_media.dart'; class ActivityView extends StatefulWidget { - const ActivityView({super.key, required this.activity}); - final ActivityModel activity; + const ActivityView( + {super.key, required this.activityModel, required this.activity}); + final ActivityModel activityModel; + final Activity activity; @override State createState() => _ActivityViewState(); @@ -19,11 +21,12 @@ class ActivityView extends StatefulWidget { class _ActivityViewState extends State { @override Widget build(BuildContext context) { - ActivityModel activity = widget.activity; + final ActivityModel activityModel = widget.activityModel; + final Activity activity = widget.activity; ActivityTimerModel atm = Provider.of(context, listen: false); - atm.setup(activity); + atm.setup(activityModel, activity); return Scaffold( floatingActionButtonLocation: ExpandableFab.location, @@ -63,15 +66,15 @@ class _ActivityViewState extends State { maxLines: 1, style: const TextStyle( fontSize: 25, fontWeight: FontWeight.bold), - activity.title)), - ActivityViewCategories(categories: activity.categories), + activityModel.title)), + ActivityViewCategories(categories: activityModel.categories), Padding( padding: const EdgeInsets.only( top: 0, bottom: 20, left: 15, right: 15), child: Text( textAlign: TextAlign.left, style: const TextStyle(fontSize: 15), - activity.description)), + activityModel.description)), ActivityViewMedia(activity: activity), const Padding( padding: EdgeInsets.fromLTRB(15, 30, 0, 10), @@ -139,77 +142,7 @@ class _ActivityViewState extends State { semanticsLabel: 'Activity Progress', ); })), - ActivityActionView(action: activity.actions[0]), + ActivityActionView(action: activityModel.actions[0]), ])); } } - -class ActivityViewCategories extends StatelessWidget { - const ActivityViewCategories({super.key, this.categories}); - - final List? categories; - - @override - Widget build(BuildContext context) { - return Column( - children: [ - Padding( - padding: const EdgeInsets.only(bottom: 10), - child: SizedBox( - height: 40, - child: ListView.builder( - shrinkWrap: true, - scrollDirection: Axis.horizontal, - padding: const EdgeInsets.fromLTRB(10, 0, 10, 0), - itemCount: categories?.length, - itemBuilder: (BuildContext context, int index) { - return Padding( - padding: const EdgeInsets.only(right: 5), - child: ActionChip( - visualDensity: VisualDensity.compact, - avatar: const Icon(Icons.check_circle_outline), - label: Text(maxLines: 1, '${categories?[index]}'), - onPressed: () {}, - )); - }, - ))), - ], - ); - } -} - -class ActivityViewMedia extends StatelessWidget { - const ActivityViewMedia({super.key, this.activity}); - - final ActivityModel? activity; - - @override - Widget build(BuildContext context) { - List media = []; - - for (ActivityAction action in activity!.actions) { - if (action.media!.isNotEmpty) { - media.addAll(action.media as Iterable); - } - } - - return Text("media!"); - // List mediaCards = - // List.generate(media.length, (i) => MediaCard(media: media[i])); - - // return Column( - // children: [ - // SizedBox( - // width: double.infinity, - // height: 100, - // child: GridView.count( - // padding: const EdgeInsets.fromLTRB(15, 0, 0, 0), - // scrollDirection: Axis.horizontal, - // crossAxisSpacing: 5, - // mainAxisSpacing: 5, - // crossAxisCount: 1, - // children: mediaCards)) - // ], - // ); - } -} diff --git a/lib/widgets/session_view_achievements.dart b/lib/widgets/session_view_achievements.dart index b830f04..cde1cfa 100644 --- a/lib/widgets/session_view_achievements.dart +++ b/lib/widgets/session_view_achievements.dart @@ -27,7 +27,7 @@ class SessionViewAchievements extends StatelessWidget { Widget build(BuildContext context) { return FutureBuilder>( future: SessionActivitiesDao(Provider.of(context)) - .sessionActivitiesBySessionId(session.id), + .fromSessionId(session.id), builder: (context, snapshot) { if (snapshot.hasData) { final sessionActivities = snapshot.data!; diff --git a/lib/widgets/session_view_media.dart b/lib/widgets/session_view_media.dart index c9267f5..8e614ad 100644 --- a/lib/widgets/session_view_media.dart +++ b/lib/widgets/session_view_media.dart @@ -13,7 +13,7 @@ class SessionViewMedia extends StatelessWidget { Widget build(BuildContext context) { return FutureBuilder>( future: MediaItemsDao(Provider.of(context)) - .mediaItemsFromSession(session), + .fromSession(session), builder: (context, snapshot) { if (snapshot.hasData) { final mediaItems = snapshot.data!; -- 2.47.2 From fb0b73ecafde5371172aec4e539e436277f415a4 Mon Sep 17 00:00:00 2001 From: Joshua Burman Date: Sat, 21 Dec 2024 17:51:56 -0500 Subject: [PATCH 6/9] dry-ing up activity view things --- lib/widgets/activity_view_categories.dart | 35 ++++++++++++++++ lib/widgets/activity_view_media.dart | 51 +++++++++++++++++++++++ 2 files changed, 86 insertions(+) create mode 100644 lib/widgets/activity_view_categories.dart create mode 100644 lib/widgets/activity_view_media.dart diff --git a/lib/widgets/activity_view_categories.dart b/lib/widgets/activity_view_categories.dart new file mode 100644 index 0000000..7bfb744 --- /dev/null +++ b/lib/widgets/activity_view_categories.dart @@ -0,0 +1,35 @@ +import 'package:flutter/material.dart'; + +class ActivityViewCategories extends StatelessWidget { + const ActivityViewCategories({super.key, this.categories}); + + final List? categories; + + @override + Widget build(BuildContext context) { + return Column( + children: [ + Padding( + padding: const EdgeInsets.only(bottom: 10), + child: SizedBox( + height: 40, + child: ListView.builder( + shrinkWrap: true, + scrollDirection: Axis.horizontal, + padding: const EdgeInsets.fromLTRB(10, 0, 10, 0), + itemCount: categories?.length, + itemBuilder: (BuildContext context, int index) { + return Padding( + padding: const EdgeInsets.only(right: 5), + child: ActionChip( + visualDensity: VisualDensity.compact, + avatar: const Icon(Icons.check_circle_outline), + label: Text(maxLines: 1, '${categories?[index]}'), + onPressed: () {}, + )); + }, + ))), + ], + ); + } +} \ No newline at end of file diff --git a/lib/widgets/activity_view_media.dart b/lib/widgets/activity_view_media.dart new file mode 100644 index 0000000..1d6fcad --- /dev/null +++ b/lib/widgets/activity_view_media.dart @@ -0,0 +1,51 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:sendtrain/daos/media_items_dao.dart'; +import 'package:sendtrain/database/database.dart'; +import 'package:sendtrain/widgets/media_card.dart'; + +class ActivityViewMedia extends StatelessWidget { + const ActivityViewMedia({super.key, required this.activity}); + + final Activity activity; + + @override + Widget build(BuildContext context) { + return FutureBuilder>( + future: MediaItemsDao(Provider.of(context)).fromActivity(activity), + builder: (context, snapshot) { + if (snapshot.hasData) { + List mediaItems = snapshot.data!; + List mediaCards = []; + + for (int i = 0; i < mediaItems.length; i++) { + mediaCards.add(MediaCard(media: mediaItems[i])); + } + + return Column( + children: [ + SizedBox( + width: double.infinity, + height: 100, + child: GridView.count( + padding: const EdgeInsets.fromLTRB(15, 0, 0, 0), + scrollDirection: Axis.horizontal, + crossAxisSpacing: 5, + mainAxisSpacing: 5, + crossAxisCount: 1, + children: mediaCards)) + ], + ); + } else { + return Container( + alignment: Alignment.center, + child: SizedBox( + height: 50.0, + width: 50.0, + child: CircularProgressIndicator(), + )); + } + } + ); + } +} \ No newline at end of file -- 2.47.2 From ffd696053a32dbd9f46918f985760fb93450e688 Mon Sep 17 00:00:00 2001 From: Joshua Burman Date: Mon, 23 Dec 2024 23:46:34 -0500 Subject: [PATCH 7/9] Activity category and type widgets --- lib/widgets/activity_view.dart | 19 +++++++-- lib/widgets/activity_view_categories.dart | 48 ++++++++++------------- lib/widgets/activity_view_types.dart | 29 ++++++++++++++ 3 files changed, 65 insertions(+), 31 deletions(-) create mode 100644 lib/widgets/activity_view_types.dart diff --git a/lib/widgets/activity_view.dart b/lib/widgets/activity_view.dart index eeff698..6d13c3a 100644 --- a/lib/widgets/activity_view.dart +++ b/lib/widgets/activity_view.dart @@ -7,6 +7,7 @@ import 'package:sendtrain/models/activity_timer_model.dart'; import 'package:sendtrain/widgets/activity_action_view.dart'; import 'package:sendtrain/widgets/activity_view_categories.dart'; import 'package:sendtrain/widgets/activity_view_media.dart'; +import 'package:sendtrain/widgets/activity_view_types.dart'; class ActivityView extends StatefulWidget { const ActivityView( @@ -66,15 +67,25 @@ class _ActivityViewState extends State { maxLines: 1, style: const TextStyle( fontSize: 25, fontWeight: FontWeight.bold), - activityModel.title)), - ActivityViewCategories(categories: activityModel.categories), + activity.title)), + Padding( + padding: const EdgeInsets.fromLTRB(10, 0, 0, 10), + child: Flex(direction: Axis.horizontal, children: [ + ActivityViewCategories(categories: [activity.category]), + ActivityViewTypes(types: [activity.type]) + ])), Padding( padding: const EdgeInsets.only( - top: 0, bottom: 20, left: 15, right: 15), + top: 0, bottom: 10, left: 15, right: 15), child: Text( textAlign: TextAlign.left, style: const TextStyle(fontSize: 15), - activityModel.description)), + activity.description)), + const Padding( + padding: EdgeInsets.fromLTRB(15, 20, 0, 10), + child: Text( + style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold), + 'Media:')), ActivityViewMedia(activity: activity), const Padding( padding: EdgeInsets.fromLTRB(15, 30, 0, 10), diff --git a/lib/widgets/activity_view_categories.dart b/lib/widgets/activity_view_categories.dart index 7bfb744..9df2113 100644 --- a/lib/widgets/activity_view_categories.dart +++ b/lib/widgets/activity_view_categories.dart @@ -1,35 +1,29 @@ import 'package:flutter/material.dart'; +import 'package:sendtrain/database/database.dart'; class ActivityViewCategories extends StatelessWidget { - const ActivityViewCategories({super.key, this.categories}); + const ActivityViewCategories({super.key, required this.categories}); - final List? categories; + final List categories; @override Widget build(BuildContext context) { - return Column( - children: [ - Padding( - padding: const EdgeInsets.only(bottom: 10), - child: SizedBox( - height: 40, - child: ListView.builder( - shrinkWrap: true, - scrollDirection: Axis.horizontal, - padding: const EdgeInsets.fromLTRB(10, 0, 10, 0), - itemCount: categories?.length, - itemBuilder: (BuildContext context, int index) { - return Padding( - padding: const EdgeInsets.only(right: 5), - child: ActionChip( - visualDensity: VisualDensity.compact, - avatar: const Icon(Icons.check_circle_outline), - label: Text(maxLines: 1, '${categories?[index]}'), - onPressed: () {}, - )); - }, - ))), - ], - ); + return SizedBox( + height: 40, + child: ListView.builder( + shrinkWrap: true, + scrollDirection: Axis.horizontal, + padding: const EdgeInsets.only(right: 10), + itemCount: categories.length, + itemBuilder: (BuildContext context, int index) { + return ActionChip( + visualDensity: VisualDensity.compact, + avatar: const Icon(Icons.category_rounded), + label: Text(maxLines: 1, categories[index].name), + tooltip: "Activity Category", + onPressed: () {}, + ); + }, + )); } -} \ No newline at end of file +} diff --git a/lib/widgets/activity_view_types.dart b/lib/widgets/activity_view_types.dart new file mode 100644 index 0000000..a13816c --- /dev/null +++ b/lib/widgets/activity_view_types.dart @@ -0,0 +1,29 @@ +import 'package:flutter/material.dart'; +import 'package:sendtrain/database/database.dart'; + +class ActivityViewTypes extends StatelessWidget { + const ActivityViewTypes({super.key, required this.types}); + + final List types; + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 40, + child: ListView.builder( + shrinkWrap: true, + scrollDirection: Axis.horizontal, + padding: const EdgeInsets.only(right: 10), + itemCount: types.length, + itemBuilder: (BuildContext context, int index) { + return ActionChip( + visualDensity: VisualDensity.compact, + avatar: const Icon(Icons.fitness_center_rounded), + label: Text(maxLines: 1, types[index].name), + tooltip: "Activity Type", + onPressed: () {}, + ); + }, + )); + } +} -- 2.47.2 From c6030f8ac53aec6d5d9c80c435f4aed3c100d58f Mon Sep 17 00:00:00 2001 From: Joshua Burman Date: Tue, 24 Dec 2024 14:41:39 -0500 Subject: [PATCH 8/9] seed update, action prep, titleization --- lib/daos/actions_dao.dart | 35 + lib/daos/actions_dao.g.dart | 8 + lib/daos/activity_actions_dao.dart | 30 + lib/daos/activity_actions_dao.g.dart | 10 + lib/database/database.dart | 97 +- lib/database/database.g.dart | 131 +- lib/database/database.steps.dart | 351 +++ .../sendtrain/drift_schema_v3.json | 1 + .../sendtrain/drift_schema_v4.json | 1 + lib/database/seed.dart | 45 +- lib/extensions/string_extensions.dart | 84 + lib/models/activity_timer_model.dart | 4 +- lib/widgets/activity_action_view.dart | 3 +- lib/widgets/activity_card.dart | 20 +- lib/widgets/activity_view.dart | 292 +-- lib/widgets/activity_view_categories.dart | 3 +- lib/widgets/activity_view_types.dart | 3 +- lib/widgets/session_card.dart | 5 +- lib/widgets/session_view.dart | 3 +- lib/widgets/session_view_achievements.dart | 3 +- test/drift/sendtrain/generated/schema.dart | 8 +- test/drift/sendtrain/generated/schema_v3.dart | 1977 +++++++++++++++++ test/drift/sendtrain/generated/schema_v4.dart | 1977 +++++++++++++++++ 23 files changed, 4881 insertions(+), 210 deletions(-) create mode 100644 lib/daos/actions_dao.dart create mode 100644 lib/daos/actions_dao.g.dart create mode 100644 lib/daos/activity_actions_dao.dart create mode 100644 lib/daos/activity_actions_dao.g.dart create mode 100644 lib/database/drift_schemas/sendtrain/drift_schema_v3.json create mode 100644 lib/database/drift_schemas/sendtrain/drift_schema_v4.json create mode 100644 lib/extensions/string_extensions.dart create mode 100644 test/drift/sendtrain/generated/schema_v3.dart create mode 100644 test/drift/sendtrain/generated/schema_v4.dart diff --git a/lib/daos/actions_dao.dart b/lib/daos/actions_dao.dart new file mode 100644 index 0000000..0911766 --- /dev/null +++ b/lib/daos/actions_dao.dart @@ -0,0 +1,35 @@ +import 'package:drift/drift.dart'; +import 'package:sendtrain/database/database.dart'; + +part 'actions_dao.g.dart'; + +@DriftAccessor(tables: [Actions]) +class ActionsDao extends DatabaseAccessor with _$ActionsDaoMixin { + ActionsDao(super.db); + + Future> all() async { + return await select(actions).get(); + } + + Future find(int id) async { + return await (select(actions)..where((action) => action.id.equals(id) )).getSingle(); + } + + Future> fromActivity(Activity activity) async { + final result = select(db.activityActions).join( + [ + innerJoin( + db.actions, + db.actions.id.equalsExp(db.activityActions.actionId), + ), + ], + ) + ..where(db.activityActions.activityId.equals(activity.id)); + + final actions = (await result.get()) + .map((e) => e.readTable(db.actions)) + .toList(); + + return actions; + } +} diff --git a/lib/daos/actions_dao.g.dart b/lib/daos/actions_dao.g.dart new file mode 100644 index 0000000..a898075 --- /dev/null +++ b/lib/daos/actions_dao.g.dart @@ -0,0 +1,8 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'actions_dao.dart'; + +// ignore_for_file: type=lint +mixin _$ActionsDaoMixin on DatabaseAccessor { + $ActionsTable get actions => attachedDatabase.actions; +} diff --git a/lib/daos/activity_actions_dao.dart b/lib/daos/activity_actions_dao.dart new file mode 100644 index 0000000..98788bc --- /dev/null +++ b/lib/daos/activity_actions_dao.dart @@ -0,0 +1,30 @@ +import 'package:drift/drift.dart'; +import 'package:sendtrain/database/database.dart'; + +part 'activity_actions_dao.g.dart'; + +@DriftAccessor(tables: [ActivityActions]) +class ActivityActionsDao extends DatabaseAccessor with _$ActivityActionsDaoMixin { + ActivityActionsDao(super.db); + + Future> all() => select(activityActions).get(); + Stream> watch() => select(activityActions).watch(); + Future insert(ActivityAction activityAction) => into(activityActions).insert(activityAction); + Future replace(ActivityAction activityAction) => update(activityActions).replace(activityAction); + Future remove(ActivityAction activityAction) => delete(activityActions).delete(activityAction); + + // Future> all() async { + // return await select(activityActions).get(); + // } + + Future find(int id) async { + return await (select(activityActions)..where((activityAction) => activityAction.id.equals(id) )).getSingle(); + } + + Future> fromActivityId(int id) async { + final result = db.managers.activityActions + .filter((activityAction) => activityAction.activityId.id(id)); + + return result.get(); + } +} \ No newline at end of file diff --git a/lib/daos/activity_actions_dao.g.dart b/lib/daos/activity_actions_dao.g.dart new file mode 100644 index 0000000..2dba712 --- /dev/null +++ b/lib/daos/activity_actions_dao.g.dart @@ -0,0 +1,10 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'activity_actions_dao.dart'; + +// ignore_for_file: type=lint +mixin _$ActivityActionsDaoMixin on DatabaseAccessor { + $ActivitiesTable get activities => attachedDatabase.activities; + $ActionsTable get actions => attachedDatabase.actions; + $ActivityActionsTable get activityActions => attachedDatabase.activityActions; +} diff --git a/lib/database/database.dart b/lib/database/database.dart index b5b96fc..1fd84b2 100644 --- a/lib/database/database.dart +++ b/lib/database/database.dart @@ -1,11 +1,62 @@ import 'package:drift/drift.dart'; import 'package:drift_flutter/drift_flutter.dart'; +import 'package:sendtrain/daos/actions_dao.dart'; import 'package:sendtrain/daos/activities_dao.dart'; +import 'package:sendtrain/daos/activity_actions_dao.dart'; +import 'package:sendtrain/daos/media_items_dao.dart'; +import 'package:sendtrain/daos/session_activities_dao.dart'; import 'package:sendtrain/daos/sessions_dao.dart'; import 'package:sendtrain/database/seed.dart'; part 'database.g.dart'; +@DriftDatabase(tables: [ + Sessions, + SessionActivities, + Activities, + ActivityActions, + Actions, + ObjectMediaItems, + MediaItems +], daos: [ + SessionsDao, + ActivitiesDao, + MediaItemsDao, + SessionActivitiesDao, + ActivityActionsDao, + ActionsDao +]) +class AppDatabase extends _$AppDatabase { + // After generating code, this class needs to define a `schemaVersion` getter + // and a constructor telling drift where the database should be stored. + // These are described in the getting started guide: https://drift.simonbinder.eu/setup/ + AppDatabase() : super(_openConnection()); + + @override + int get schemaVersion => 4; + + @override + MigrationStrategy get migration { + return MigrationStrategy( + onCreate: (m) async { + await m.createAll().then((r) async { + await seedDb(this); + }); // create all tables + }, + beforeOpen: (details) async { + /// Enable foreign_keys + await customStatement('PRAGMA foreign_keys = ON'); + }, + ); + } + + static QueryExecutor _openConnection() { + // `driftDatabase` from `package:drift_flutter` stores the database in + // `getApplicationDocumentsDirectory()`. + return driftDatabase(name: 'sendtrain'); + } +} + enum SessionStatus { pending, started, completed, missed } class Sessions extends Table { @@ -22,6 +73,7 @@ class SessionActivities extends Table { IntColumn get id => integer().autoIncrement()(); IntColumn get sessionId => integer().references(Sessions, #id)(); IntColumn get activityId => integer().references(Activities, #id)(); + IntColumn get position => integer()(); TextColumn get results => text().nullable()(); TextColumn get achievements => text().nullable()(); DateTimeColumn get createdAt => @@ -57,6 +109,7 @@ class ActivityActions extends Table { IntColumn get id => integer().autoIncrement()(); IntColumn get activityId => integer().references(Activities, #id)(); IntColumn get actionId => integer().references(Actions, #id)(); + IntColumn get position => integer()(); DateTimeColumn get createdAt => dateTime().withDefault(Variable(DateTime.now()))(); } @@ -96,47 +149,3 @@ class MediaItems extends Table { DateTimeColumn get createdAt => dateTime().withDefault(Variable(DateTime.now()))(); } - -@DriftDatabase(tables: [ - Sessions, - SessionActivities, - Activities, - ActivityActions, - Actions, - ObjectMediaItems, - MediaItems -], daos: [ - SessionsDao, - ActivitiesDao, - MediaItems -]) -class AppDatabase extends _$AppDatabase { - // After generating code, this class needs to define a `schemaVersion` getter - // and a constructor telling drift where the database should be stored. - // These are described in the getting started guide: https://drift.simonbinder.eu/setup/ - AppDatabase() : super(_openConnection()); - - @override - int get schemaVersion => 2; - - @override - MigrationStrategy get migration { - return MigrationStrategy( - onCreate: (m) async { - await m.createAll().then((r) async { - await seedDb(this); - }); // create all tablesables - }, - beforeOpen: (details) async { - /// Enable foreign_keys - await customStatement('PRAGMA foreign_keys = ON'); - }, - ); - } - - static QueryExecutor _openConnection() { - // `driftDatabase` from `package:drift_flutter` stores the database in - // `getApplicationDocumentsDirectory()`. - return driftDatabase(name: 'sendtrain'); - } -} diff --git a/lib/database/database.g.dart b/lib/database/database.g.dart index d254f27..f37c71e 100644 --- a/lib/database/database.g.dart +++ b/lib/database/database.g.dart @@ -725,6 +725,12 @@ class $SessionActivitiesTable extends SessionActivities requiredDuringInsert: true, defaultConstraints: GeneratedColumn.constraintIsAlways('REFERENCES activities (id)')); + static const VerificationMeta _positionMeta = + const VerificationMeta('position'); + @override + late final GeneratedColumn position = GeneratedColumn( + 'position', aliasedName, false, + type: DriftSqlType.int, requiredDuringInsert: true); static const VerificationMeta _resultsMeta = const VerificationMeta('results'); @override @@ -747,7 +753,7 @@ class $SessionActivitiesTable extends SessionActivities defaultValue: Variable(DateTime.now())); @override List get $columns => - [id, sessionId, activityId, results, achievements, createdAt]; + [id, sessionId, activityId, position, results, achievements, createdAt]; @override String get aliasedName => _alias ?? actualTableName; @override @@ -775,6 +781,12 @@ class $SessionActivitiesTable extends SessionActivities } else if (isInserting) { context.missing(_activityIdMeta); } + if (data.containsKey('position')) { + context.handle(_positionMeta, + position.isAcceptableOrUnknown(data['position']!, _positionMeta)); + } else if (isInserting) { + context.missing(_positionMeta); + } if (data.containsKey('results')) { context.handle(_resultsMeta, results.isAcceptableOrUnknown(data['results']!, _resultsMeta)); @@ -804,6 +816,8 @@ class $SessionActivitiesTable extends SessionActivities .read(DriftSqlType.int, data['${effectivePrefix}session_id'])!, activityId: attachedDatabase.typeMapping .read(DriftSqlType.int, data['${effectivePrefix}activity_id'])!, + position: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}position'])!, results: attachedDatabase.typeMapping .read(DriftSqlType.string, data['${effectivePrefix}results']), achievements: attachedDatabase.typeMapping @@ -823,6 +837,7 @@ class SessionActivity extends DataClass implements Insertable { final int id; final int sessionId; final int activityId; + final int position; final String? results; final String? achievements; final DateTime createdAt; @@ -830,6 +845,7 @@ class SessionActivity extends DataClass implements Insertable { {required this.id, required this.sessionId, required this.activityId, + required this.position, this.results, this.achievements, required this.createdAt}); @@ -839,6 +855,7 @@ class SessionActivity extends DataClass implements Insertable { map['id'] = Variable(id); map['session_id'] = Variable(sessionId); map['activity_id'] = Variable(activityId); + map['position'] = Variable(position); if (!nullToAbsent || results != null) { map['results'] = Variable(results); } @@ -854,6 +871,7 @@ class SessionActivity extends DataClass implements Insertable { id: Value(id), sessionId: Value(sessionId), activityId: Value(activityId), + position: Value(position), results: results == null && nullToAbsent ? const Value.absent() : Value(results), @@ -871,6 +889,7 @@ class SessionActivity extends DataClass implements Insertable { id: serializer.fromJson(json['id']), sessionId: serializer.fromJson(json['sessionId']), activityId: serializer.fromJson(json['activityId']), + position: serializer.fromJson(json['position']), results: serializer.fromJson(json['results']), achievements: serializer.fromJson(json['achievements']), createdAt: serializer.fromJson(json['createdAt']), @@ -883,6 +902,7 @@ class SessionActivity extends DataClass implements Insertable { 'id': serializer.toJson(id), 'sessionId': serializer.toJson(sessionId), 'activityId': serializer.toJson(activityId), + 'position': serializer.toJson(position), 'results': serializer.toJson(results), 'achievements': serializer.toJson(achievements), 'createdAt': serializer.toJson(createdAt), @@ -893,6 +913,7 @@ class SessionActivity extends DataClass implements Insertable { {int? id, int? sessionId, int? activityId, + int? position, Value results = const Value.absent(), Value achievements = const Value.absent(), DateTime? createdAt}) => @@ -900,6 +921,7 @@ class SessionActivity extends DataClass implements Insertable { id: id ?? this.id, sessionId: sessionId ?? this.sessionId, activityId: activityId ?? this.activityId, + position: position ?? this.position, results: results.present ? results.value : this.results, achievements: achievements.present ? achievements.value : this.achievements, @@ -911,6 +933,7 @@ class SessionActivity extends DataClass implements Insertable { sessionId: data.sessionId.present ? data.sessionId.value : this.sessionId, activityId: data.activityId.present ? data.activityId.value : this.activityId, + position: data.position.present ? data.position.value : this.position, results: data.results.present ? data.results.value : this.results, achievements: data.achievements.present ? data.achievements.value @@ -925,6 +948,7 @@ class SessionActivity extends DataClass implements Insertable { ..write('id: $id, ') ..write('sessionId: $sessionId, ') ..write('activityId: $activityId, ') + ..write('position: $position, ') ..write('results: $results, ') ..write('achievements: $achievements, ') ..write('createdAt: $createdAt') @@ -933,8 +957,8 @@ class SessionActivity extends DataClass implements Insertable { } @override - int get hashCode => - Object.hash(id, sessionId, activityId, results, achievements, createdAt); + int get hashCode => Object.hash( + id, sessionId, activityId, position, results, achievements, createdAt); @override bool operator ==(Object other) => identical(this, other) || @@ -942,6 +966,7 @@ class SessionActivity extends DataClass implements Insertable { other.id == this.id && other.sessionId == this.sessionId && other.activityId == this.activityId && + other.position == this.position && other.results == this.results && other.achievements == this.achievements && other.createdAt == this.createdAt); @@ -951,6 +976,7 @@ class SessionActivitiesCompanion extends UpdateCompanion { final Value id; final Value sessionId; final Value activityId; + final Value position; final Value results; final Value achievements; final Value createdAt; @@ -958,6 +984,7 @@ class SessionActivitiesCompanion extends UpdateCompanion { this.id = const Value.absent(), this.sessionId = const Value.absent(), this.activityId = const Value.absent(), + this.position = const Value.absent(), this.results = const Value.absent(), this.achievements = const Value.absent(), this.createdAt = const Value.absent(), @@ -966,15 +993,18 @@ class SessionActivitiesCompanion extends UpdateCompanion { this.id = const Value.absent(), required int sessionId, required int activityId, + required int position, this.results = const Value.absent(), this.achievements = const Value.absent(), this.createdAt = const Value.absent(), }) : sessionId = Value(sessionId), - activityId = Value(activityId); + activityId = Value(activityId), + position = Value(position); static Insertable custom({ Expression? id, Expression? sessionId, Expression? activityId, + Expression? position, Expression? results, Expression? achievements, Expression? createdAt, @@ -983,6 +1013,7 @@ class SessionActivitiesCompanion extends UpdateCompanion { if (id != null) 'id': id, if (sessionId != null) 'session_id': sessionId, if (activityId != null) 'activity_id': activityId, + if (position != null) 'position': position, if (results != null) 'results': results, if (achievements != null) 'achievements': achievements, if (createdAt != null) 'created_at': createdAt, @@ -993,6 +1024,7 @@ class SessionActivitiesCompanion extends UpdateCompanion { {Value? id, Value? sessionId, Value? activityId, + Value? position, Value? results, Value? achievements, Value? createdAt}) { @@ -1000,6 +1032,7 @@ class SessionActivitiesCompanion extends UpdateCompanion { id: id ?? this.id, sessionId: sessionId ?? this.sessionId, activityId: activityId ?? this.activityId, + position: position ?? this.position, results: results ?? this.results, achievements: achievements ?? this.achievements, createdAt: createdAt ?? this.createdAt, @@ -1018,6 +1051,9 @@ class SessionActivitiesCompanion extends UpdateCompanion { if (activityId.present) { map['activity_id'] = Variable(activityId.value); } + if (position.present) { + map['position'] = Variable(position.value); + } if (results.present) { map['results'] = Variable(results.value); } @@ -1036,6 +1072,7 @@ class SessionActivitiesCompanion extends UpdateCompanion { ..write('id: $id, ') ..write('sessionId: $sessionId, ') ..write('activityId: $activityId, ') + ..write('position: $position, ') ..write('results: $results, ') ..write('achievements: $achievements, ') ..write('createdAt: $createdAt') @@ -1376,6 +1413,12 @@ class $ActivityActionsTable extends ActivityActions requiredDuringInsert: true, defaultConstraints: GeneratedColumn.constraintIsAlways('REFERENCES actions (id)')); + static const VerificationMeta _positionMeta = + const VerificationMeta('position'); + @override + late final GeneratedColumn position = GeneratedColumn( + 'position', aliasedName, false, + type: DriftSqlType.int, requiredDuringInsert: true); static const VerificationMeta _createdAtMeta = const VerificationMeta('createdAt'); @override @@ -1385,7 +1428,8 @@ class $ActivityActionsTable extends ActivityActions requiredDuringInsert: false, defaultValue: Variable(DateTime.now())); @override - List get $columns => [id, activityId, actionId, createdAt]; + List get $columns => + [id, activityId, actionId, position, createdAt]; @override String get aliasedName => _alias ?? actualTableName; @override @@ -1413,6 +1457,12 @@ class $ActivityActionsTable extends ActivityActions } else if (isInserting) { context.missing(_actionIdMeta); } + if (data.containsKey('position')) { + context.handle(_positionMeta, + position.isAcceptableOrUnknown(data['position']!, _positionMeta)); + } else if (isInserting) { + context.missing(_positionMeta); + } if (data.containsKey('created_at')) { context.handle(_createdAtMeta, createdAt.isAcceptableOrUnknown(data['created_at']!, _createdAtMeta)); @@ -1432,6 +1482,8 @@ class $ActivityActionsTable extends ActivityActions .read(DriftSqlType.int, data['${effectivePrefix}activity_id'])!, actionId: attachedDatabase.typeMapping .read(DriftSqlType.int, data['${effectivePrefix}action_id'])!, + position: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}position'])!, createdAt: attachedDatabase.typeMapping .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!, ); @@ -1447,11 +1499,13 @@ class ActivityAction extends DataClass implements Insertable { final int id; final int activityId; final int actionId; + final int position; final DateTime createdAt; const ActivityAction( {required this.id, required this.activityId, required this.actionId, + required this.position, required this.createdAt}); @override Map toColumns(bool nullToAbsent) { @@ -1459,6 +1513,7 @@ class ActivityAction extends DataClass implements Insertable { map['id'] = Variable(id); map['activity_id'] = Variable(activityId); map['action_id'] = Variable(actionId); + map['position'] = Variable(position); map['created_at'] = Variable(createdAt); return map; } @@ -1468,6 +1523,7 @@ class ActivityAction extends DataClass implements Insertable { id: Value(id), activityId: Value(activityId), actionId: Value(actionId), + position: Value(position), createdAt: Value(createdAt), ); } @@ -1479,6 +1535,7 @@ class ActivityAction extends DataClass implements Insertable { id: serializer.fromJson(json['id']), activityId: serializer.fromJson(json['activityId']), actionId: serializer.fromJson(json['actionId']), + position: serializer.fromJson(json['position']), createdAt: serializer.fromJson(json['createdAt']), ); } @@ -1489,16 +1546,22 @@ class ActivityAction extends DataClass implements Insertable { 'id': serializer.toJson(id), 'activityId': serializer.toJson(activityId), 'actionId': serializer.toJson(actionId), + 'position': serializer.toJson(position), 'createdAt': serializer.toJson(createdAt), }; } ActivityAction copyWith( - {int? id, int? activityId, int? actionId, DateTime? createdAt}) => + {int? id, + int? activityId, + int? actionId, + int? position, + DateTime? createdAt}) => ActivityAction( id: id ?? this.id, activityId: activityId ?? this.activityId, actionId: actionId ?? this.actionId, + position: position ?? this.position, createdAt: createdAt ?? this.createdAt, ); ActivityAction copyWithCompanion(ActivityActionsCompanion data) { @@ -1507,6 +1570,7 @@ class ActivityAction extends DataClass implements Insertable { activityId: data.activityId.present ? data.activityId.value : this.activityId, actionId: data.actionId.present ? data.actionId.value : this.actionId, + position: data.position.present ? data.position.value : this.position, createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, ); } @@ -1517,13 +1581,15 @@ class ActivityAction extends DataClass implements Insertable { ..write('id: $id, ') ..write('activityId: $activityId, ') ..write('actionId: $actionId, ') + ..write('position: $position, ') ..write('createdAt: $createdAt') ..write(')')) .toString(); } @override - int get hashCode => Object.hash(id, activityId, actionId, createdAt); + int get hashCode => + Object.hash(id, activityId, actionId, position, createdAt); @override bool operator ==(Object other) => identical(this, other) || @@ -1531,6 +1597,7 @@ class ActivityAction extends DataClass implements Insertable { other.id == this.id && other.activityId == this.activityId && other.actionId == this.actionId && + other.position == this.position && other.createdAt == this.createdAt); } @@ -1538,30 +1605,36 @@ class ActivityActionsCompanion extends UpdateCompanion { final Value id; final Value activityId; final Value actionId; + final Value position; final Value createdAt; const ActivityActionsCompanion({ this.id = const Value.absent(), this.activityId = const Value.absent(), this.actionId = const Value.absent(), + this.position = const Value.absent(), this.createdAt = const Value.absent(), }); ActivityActionsCompanion.insert({ this.id = const Value.absent(), required int activityId, required int actionId, + required int position, this.createdAt = const Value.absent(), }) : activityId = Value(activityId), - actionId = Value(actionId); + actionId = Value(actionId), + position = Value(position); static Insertable custom({ Expression? id, Expression? activityId, Expression? actionId, + Expression? position, Expression? createdAt, }) { return RawValuesInsertable({ if (id != null) 'id': id, if (activityId != null) 'activity_id': activityId, if (actionId != null) 'action_id': actionId, + if (position != null) 'position': position, if (createdAt != null) 'created_at': createdAt, }); } @@ -1570,11 +1643,13 @@ class ActivityActionsCompanion extends UpdateCompanion { {Value? id, Value? activityId, Value? actionId, + Value? position, Value? createdAt}) { return ActivityActionsCompanion( id: id ?? this.id, activityId: activityId ?? this.activityId, actionId: actionId ?? this.actionId, + position: position ?? this.position, createdAt: createdAt ?? this.createdAt, ); } @@ -1591,6 +1666,9 @@ class ActivityActionsCompanion extends UpdateCompanion { if (actionId.present) { map['action_id'] = Variable(actionId.value); } + if (position.present) { + map['position'] = Variable(position.value); + } if (createdAt.present) { map['created_at'] = Variable(createdAt.value); } @@ -1603,6 +1681,7 @@ class ActivityActionsCompanion extends UpdateCompanion { ..write('id: $id, ') ..write('activityId: $activityId, ') ..write('actionId: $actionId, ') + ..write('position: $position, ') ..write('createdAt: $createdAt') ..write(')')) .toString(); @@ -2279,6 +2358,12 @@ abstract class _$AppDatabase extends GeneratedDatabase { $ObjectMediaItemsTable(this); late final SessionsDao sessionsDao = SessionsDao(this as AppDatabase); late final ActivitiesDao activitiesDao = ActivitiesDao(this as AppDatabase); + late final MediaItemsDao mediaItemsDao = MediaItemsDao(this as AppDatabase); + late final SessionActivitiesDao sessionActivitiesDao = + SessionActivitiesDao(this as AppDatabase); + late final ActivityActionsDao activityActionsDao = + ActivityActionsDao(this as AppDatabase); + late final ActionsDao actionsDao = ActionsDao(this as AppDatabase); @override Iterable> get allTables => allSchemaEntities.whereType>(); @@ -2910,6 +2995,7 @@ typedef $$SessionActivitiesTableCreateCompanionBuilder Value id, required int sessionId, required int activityId, + required int position, Value results, Value achievements, Value createdAt, @@ -2919,6 +3005,7 @@ typedef $$SessionActivitiesTableUpdateCompanionBuilder Value id, Value sessionId, Value activityId, + Value position, Value results, Value achievements, Value createdAt, @@ -2968,6 +3055,9 @@ class $$SessionActivitiesTableFilterComposer ColumnFilters get id => $composableBuilder( column: $table.id, builder: (column) => ColumnFilters(column)); + ColumnFilters get position => $composableBuilder( + column: $table.position, builder: (column) => ColumnFilters(column)); + ColumnFilters get results => $composableBuilder( column: $table.results, builder: (column) => ColumnFilters(column)); @@ -3030,6 +3120,9 @@ class $$SessionActivitiesTableOrderingComposer ColumnOrderings get id => $composableBuilder( column: $table.id, builder: (column) => ColumnOrderings(column)); + ColumnOrderings get position => $composableBuilder( + column: $table.position, builder: (column) => ColumnOrderings(column)); + ColumnOrderings get results => $composableBuilder( column: $table.results, builder: (column) => ColumnOrderings(column)); @@ -3093,6 +3186,9 @@ class $$SessionActivitiesTableAnnotationComposer GeneratedColumn get id => $composableBuilder(column: $table.id, builder: (column) => column); + GeneratedColumn get position => + $composableBuilder(column: $table.position, builder: (column) => column); + GeneratedColumn get results => $composableBuilder(column: $table.results, builder: (column) => column); @@ -3171,6 +3267,7 @@ class $$SessionActivitiesTableTableManager extends RootTableManager< Value id = const Value.absent(), Value sessionId = const Value.absent(), Value activityId = const Value.absent(), + Value position = const Value.absent(), Value results = const Value.absent(), Value achievements = const Value.absent(), Value createdAt = const Value.absent(), @@ -3179,6 +3276,7 @@ class $$SessionActivitiesTableTableManager extends RootTableManager< id: id, sessionId: sessionId, activityId: activityId, + position: position, results: results, achievements: achievements, createdAt: createdAt, @@ -3187,6 +3285,7 @@ class $$SessionActivitiesTableTableManager extends RootTableManager< Value id = const Value.absent(), required int sessionId, required int activityId, + required int position, Value results = const Value.absent(), Value achievements = const Value.absent(), Value createdAt = const Value.absent(), @@ -3195,6 +3294,7 @@ class $$SessionActivitiesTableTableManager extends RootTableManager< id: id, sessionId: sessionId, activityId: activityId, + position: position, results: results, achievements: achievements, createdAt: createdAt, @@ -3520,6 +3620,7 @@ typedef $$ActivityActionsTableCreateCompanionBuilder = ActivityActionsCompanion Value id, required int activityId, required int actionId, + required int position, Value createdAt, }); typedef $$ActivityActionsTableUpdateCompanionBuilder = ActivityActionsCompanion @@ -3527,6 +3628,7 @@ typedef $$ActivityActionsTableUpdateCompanionBuilder = ActivityActionsCompanion Value id, Value activityId, Value actionId, + Value position, Value createdAt, }); @@ -3574,6 +3676,9 @@ class $$ActivityActionsTableFilterComposer ColumnFilters get id => $composableBuilder( column: $table.id, builder: (column) => ColumnFilters(column)); + ColumnFilters get position => $composableBuilder( + column: $table.position, builder: (column) => ColumnFilters(column)); + ColumnFilters get createdAt => $composableBuilder( column: $table.createdAt, builder: (column) => ColumnFilters(column)); @@ -3630,6 +3735,9 @@ class $$ActivityActionsTableOrderingComposer ColumnOrderings get id => $composableBuilder( column: $table.id, builder: (column) => ColumnOrderings(column)); + ColumnOrderings get position => $composableBuilder( + column: $table.position, builder: (column) => ColumnOrderings(column)); + ColumnOrderings get createdAt => $composableBuilder( column: $table.createdAt, builder: (column) => ColumnOrderings(column)); @@ -3686,6 +3794,9 @@ class $$ActivityActionsTableAnnotationComposer GeneratedColumn get id => $composableBuilder(column: $table.id, builder: (column) => column); + GeneratedColumn get position => + $composableBuilder(column: $table.position, builder: (column) => column); + GeneratedColumn get createdAt => $composableBuilder(column: $table.createdAt, builder: (column) => column); @@ -3757,24 +3868,28 @@ class $$ActivityActionsTableTableManager extends RootTableManager< Value id = const Value.absent(), Value activityId = const Value.absent(), Value actionId = const Value.absent(), + Value position = const Value.absent(), Value createdAt = const Value.absent(), }) => ActivityActionsCompanion( id: id, activityId: activityId, actionId: actionId, + position: position, createdAt: createdAt, ), createCompanionCallback: ({ Value id = const Value.absent(), required int activityId, required int actionId, + required int position, Value createdAt = const Value.absent(), }) => ActivityActionsCompanion.insert( id: id, activityId: activityId, actionId: actionId, + position: position, createdAt: createdAt, ), withReferenceMapper: (p0) => p0 diff --git a/lib/database/database.steps.dart b/lib/database/database.steps.dart index 3728e64..1b4e105 100644 --- a/lib/database/database.steps.dart +++ b/lib/database/database.steps.dart @@ -312,8 +312,345 @@ i1.GeneratedColumn _column_17(String aliasedName) => type: i1.DriftSqlType.int, defaultConstraints: i1.GeneratedColumn.constraintIsAlways( 'REFERENCES media_items (id)')); + +final class Schema3 extends i0.VersionedSchema { + Schema3({required super.database}) : super(version: 3); + @override + late final List entities = [ + sessions, + activities, + sessionActivities, + actions, + activityActions, + mediaItems, + objectMediaItems, + ]; + late final Shape0 sessions = Shape0( + source: i0.VersionedTable( + entityName: 'sessions', + withoutRowId: false, + isStrict: false, + tableConstraints: [], + columns: [ + _column_0, + _column_1, + _column_2, + _column_3, + _column_4, + _column_5, + ], + attachedDatabase: database, + ), + alias: null); + late final Shape1 activities = Shape1( + source: i0.VersionedTable( + entityName: 'activities', + withoutRowId: false, + isStrict: false, + tableConstraints: [], + columns: [ + _column_0, + _column_1, + _column_6, + _column_2, + _column_7, + _column_5, + ], + attachedDatabase: database, + ), + alias: null); + late final Shape7 sessionActivities = Shape7( + source: i0.VersionedTable( + entityName: 'session_activities', + withoutRowId: false, + isStrict: false, + tableConstraints: [], + columns: [ + _column_0, + _column_8, + _column_9, + _column_18, + _column_10, + _column_11, + _column_5, + ], + attachedDatabase: database, + ), + alias: null); + late final Shape3 actions = Shape3( + source: i0.VersionedTable( + entityName: 'actions', + withoutRowId: false, + isStrict: false, + tableConstraints: [], + columns: [ + _column_0, + _column_1, + _column_2, + _column_12, + _column_5, + ], + attachedDatabase: database, + ), + alias: null); + late final Shape8 activityActions = Shape8( + source: i0.VersionedTable( + entityName: 'activity_actions', + withoutRowId: false, + isStrict: false, + tableConstraints: [], + columns: [ + _column_0, + _column_9, + _column_13, + _column_18, + _column_5, + ], + attachedDatabase: database, + ), + alias: null); + late final Shape5 mediaItems = Shape5( + source: i0.VersionedTable( + entityName: 'media_items', + withoutRowId: false, + isStrict: false, + tableConstraints: [], + columns: [ + _column_0, + _column_1, + _column_2, + _column_14, + _column_6, + _column_5, + ], + attachedDatabase: database, + ), + alias: null); + late final Shape6 objectMediaItems = Shape6( + source: i0.VersionedTable( + entityName: 'object_media_items', + withoutRowId: false, + isStrict: false, + tableConstraints: [], + columns: [ + _column_0, + _column_15, + _column_16, + _column_17, + _column_5, + ], + attachedDatabase: database, + ), + alias: null); +} + +class Shape7 extends i0.VersionedTable { + Shape7({required super.source, required super.alias}) : super.aliased(); + i1.GeneratedColumn get id => + columnsByName['id']! as i1.GeneratedColumn; + i1.GeneratedColumn get sessionId => + columnsByName['session_id']! as i1.GeneratedColumn; + i1.GeneratedColumn get activityId => + columnsByName['activity_id']! as i1.GeneratedColumn; + i1.GeneratedColumn get postition => + columnsByName['postition']! as i1.GeneratedColumn; + i1.GeneratedColumn get results => + columnsByName['results']! as i1.GeneratedColumn; + i1.GeneratedColumn get achievements => + columnsByName['achievements']! as i1.GeneratedColumn; + i1.GeneratedColumn get createdAt => + columnsByName['created_at']! as i1.GeneratedColumn; +} + +i1.GeneratedColumn _column_18(String aliasedName) => + i1.GeneratedColumn('postition', aliasedName, false, + type: i1.DriftSqlType.int); + +class Shape8 extends i0.VersionedTable { + Shape8({required super.source, required super.alias}) : super.aliased(); + i1.GeneratedColumn get id => + columnsByName['id']! as i1.GeneratedColumn; + i1.GeneratedColumn get activityId => + columnsByName['activity_id']! as i1.GeneratedColumn; + i1.GeneratedColumn get actionId => + columnsByName['action_id']! as i1.GeneratedColumn; + i1.GeneratedColumn get postition => + columnsByName['postition']! as i1.GeneratedColumn; + i1.GeneratedColumn get createdAt => + columnsByName['created_at']! as i1.GeneratedColumn; +} + +final class Schema4 extends i0.VersionedSchema { + Schema4({required super.database}) : super(version: 4); + @override + late final List entities = [ + sessions, + activities, + sessionActivities, + actions, + activityActions, + mediaItems, + objectMediaItems, + ]; + late final Shape0 sessions = Shape0( + source: i0.VersionedTable( + entityName: 'sessions', + withoutRowId: false, + isStrict: false, + tableConstraints: [], + columns: [ + _column_0, + _column_1, + _column_2, + _column_3, + _column_4, + _column_5, + ], + attachedDatabase: database, + ), + alias: null); + late final Shape1 activities = Shape1( + source: i0.VersionedTable( + entityName: 'activities', + withoutRowId: false, + isStrict: false, + tableConstraints: [], + columns: [ + _column_0, + _column_1, + _column_6, + _column_2, + _column_7, + _column_5, + ], + attachedDatabase: database, + ), + alias: null); + late final Shape9 sessionActivities = Shape9( + source: i0.VersionedTable( + entityName: 'session_activities', + withoutRowId: false, + isStrict: false, + tableConstraints: [], + columns: [ + _column_0, + _column_8, + _column_9, + _column_19, + _column_10, + _column_11, + _column_5, + ], + attachedDatabase: database, + ), + alias: null); + late final Shape3 actions = Shape3( + source: i0.VersionedTable( + entityName: 'actions', + withoutRowId: false, + isStrict: false, + tableConstraints: [], + columns: [ + _column_0, + _column_1, + _column_2, + _column_12, + _column_5, + ], + attachedDatabase: database, + ), + alias: null); + late final Shape10 activityActions = Shape10( + source: i0.VersionedTable( + entityName: 'activity_actions', + withoutRowId: false, + isStrict: false, + tableConstraints: [], + columns: [ + _column_0, + _column_9, + _column_13, + _column_19, + _column_5, + ], + attachedDatabase: database, + ), + alias: null); + late final Shape5 mediaItems = Shape5( + source: i0.VersionedTable( + entityName: 'media_items', + withoutRowId: false, + isStrict: false, + tableConstraints: [], + columns: [ + _column_0, + _column_1, + _column_2, + _column_14, + _column_6, + _column_5, + ], + attachedDatabase: database, + ), + alias: null); + late final Shape6 objectMediaItems = Shape6( + source: i0.VersionedTable( + entityName: 'object_media_items', + withoutRowId: false, + isStrict: false, + tableConstraints: [], + columns: [ + _column_0, + _column_15, + _column_16, + _column_17, + _column_5, + ], + attachedDatabase: database, + ), + alias: null); +} + +class Shape9 extends i0.VersionedTable { + Shape9({required super.source, required super.alias}) : super.aliased(); + i1.GeneratedColumn get id => + columnsByName['id']! as i1.GeneratedColumn; + i1.GeneratedColumn get sessionId => + columnsByName['session_id']! as i1.GeneratedColumn; + i1.GeneratedColumn get activityId => + columnsByName['activity_id']! as i1.GeneratedColumn; + i1.GeneratedColumn get position => + columnsByName['position']! as i1.GeneratedColumn; + i1.GeneratedColumn get results => + columnsByName['results']! as i1.GeneratedColumn; + i1.GeneratedColumn get achievements => + columnsByName['achievements']! as i1.GeneratedColumn; + i1.GeneratedColumn get createdAt => + columnsByName['created_at']! as i1.GeneratedColumn; +} + +i1.GeneratedColumn _column_19(String aliasedName) => + i1.GeneratedColumn('position', aliasedName, false, + type: i1.DriftSqlType.int); + +class Shape10 extends i0.VersionedTable { + Shape10({required super.source, required super.alias}) : super.aliased(); + i1.GeneratedColumn get id => + columnsByName['id']! as i1.GeneratedColumn; + i1.GeneratedColumn get activityId => + columnsByName['activity_id']! as i1.GeneratedColumn; + i1.GeneratedColumn get actionId => + columnsByName['action_id']! as i1.GeneratedColumn; + i1.GeneratedColumn get position => + columnsByName['position']! as i1.GeneratedColumn; + i1.GeneratedColumn get createdAt => + columnsByName['created_at']! as i1.GeneratedColumn; +} + i0.MigrationStepWithVersion migrationSteps({ required Future Function(i1.Migrator m, Schema2 schema) from1To2, + required Future Function(i1.Migrator m, Schema3 schema) from2To3, + required Future Function(i1.Migrator m, Schema4 schema) from3To4, }) { return (currentVersion, database) async { switch (currentVersion) { @@ -322,6 +659,16 @@ i0.MigrationStepWithVersion migrationSteps({ final migrator = i1.Migrator(database, schema); await from1To2(migrator, schema); return 2; + case 2: + final schema = Schema3(database: database); + final migrator = i1.Migrator(database, schema); + await from2To3(migrator, schema); + return 3; + case 3: + final schema = Schema4(database: database); + final migrator = i1.Migrator(database, schema); + await from3To4(migrator, schema); + return 4; default: throw ArgumentError.value('Unknown migration from $currentVersion'); } @@ -330,8 +677,12 @@ i0.MigrationStepWithVersion migrationSteps({ i1.OnUpgrade stepByStep({ required Future Function(i1.Migrator m, Schema2 schema) from1To2, + required Future Function(i1.Migrator m, Schema3 schema) from2To3, + required Future Function(i1.Migrator m, Schema4 schema) from3To4, }) => i0.VersionedSchema.stepByStepHelper( step: migrationSteps( from1To2: from1To2, + from2To3: from2To3, + from3To4: from3To4, )); diff --git a/lib/database/drift_schemas/sendtrain/drift_schema_v3.json b/lib/database/drift_schemas/sendtrain/drift_schema_v3.json new file mode 100644 index 0000000..5149882 --- /dev/null +++ b/lib/database/drift_schemas/sendtrain/drift_schema_v3.json @@ -0,0 +1 @@ +{"_meta":{"description":"This file contains a serialized version of schema entities for drift.","version":"1.2.0"},"options":{"store_date_time_values_as_text":false},"entities":[{"id":0,"references":[],"type":"table","data":{"name":"sessions","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"title","getter_name":"title","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[{"allowed-lengths":{"min":3,"max":32}}]},{"name":"body","getter_name":"content","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"status","getter_name":"status","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(SessionStatus.values)","dart_type_name":"SessionStatus"}},{"name":"date","getter_name":"date","moor_type":"dateTime","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"Variable(DateTime.now())","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":1,"references":[],"type":"table","data":{"name":"activities","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"title","getter_name":"title","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[{"allowed-lengths":{"min":3,"max":32}}]},{"name":"type","getter_name":"type","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(ActivityType.values)","dart_type_name":"ActivityType"}},{"name":"body","getter_name":"description","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"category","getter_name":"category","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(ActivityCategories.values)","dart_type_name":"ActivityCategories"}},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"Variable(DateTime.now())","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":2,"references":[0,1],"type":"table","data":{"name":"session_activities","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"session_id","getter_name":"sessionId","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES sessions (id)","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES sessions (id)"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]},{"name":"activity_id","getter_name":"activityId","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES activities (id)","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES activities (id)"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]},{"name":"postition","getter_name":"postition","moor_type":"int","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"results","getter_name":"results","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"achievements","getter_name":"achievements","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"Variable(DateTime.now())","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":3,"references":[],"type":"table","data":{"name":"actions","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"title","getter_name":"title","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[{"allowed-lengths":{"min":3,"max":32}}]},{"name":"body","getter_name":"description","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"set","getter_name":"set","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"Variable(DateTime.now())","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":4,"references":[1,3],"type":"table","data":{"name":"activity_actions","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"activity_id","getter_name":"activityId","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES activities (id)","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES activities (id)"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]},{"name":"action_id","getter_name":"actionId","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES actions (id)","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES actions (id)"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]},{"name":"postition","getter_name":"postition","moor_type":"int","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"Variable(DateTime.now())","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":5,"references":[],"type":"table","data":{"name":"media_items","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"title","getter_name":"title","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[{"allowed-lengths":{"min":3,"max":32}}]},{"name":"body","getter_name":"description","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"reference","getter_name":"reference","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[{"allowed-lengths":{"min":3,"max":256}}]},{"name":"type","getter_name":"type","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(MediaType.values)","dart_type_name":"MediaType"}},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"Variable(DateTime.now())","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":6,"references":[5],"type":"table","data":{"name":"object_media_items","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"object_id","getter_name":"objectId","moor_type":"int","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"object_type","getter_name":"objectType","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(ObjectType.values)","dart_type_name":"ObjectType"}},{"name":"media_id","getter_name":"mediaId","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES media_items (id)","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES media_items (id)"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"Variable(DateTime.now())","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}}]} \ No newline at end of file diff --git a/lib/database/drift_schemas/sendtrain/drift_schema_v4.json b/lib/database/drift_schemas/sendtrain/drift_schema_v4.json new file mode 100644 index 0000000..231adcb --- /dev/null +++ b/lib/database/drift_schemas/sendtrain/drift_schema_v4.json @@ -0,0 +1 @@ +{"_meta":{"description":"This file contains a serialized version of schema entities for drift.","version":"1.2.0"},"options":{"store_date_time_values_as_text":false},"entities":[{"id":0,"references":[],"type":"table","data":{"name":"sessions","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"title","getter_name":"title","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[{"allowed-lengths":{"min":3,"max":32}}]},{"name":"body","getter_name":"content","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"status","getter_name":"status","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(SessionStatus.values)","dart_type_name":"SessionStatus"}},{"name":"date","getter_name":"date","moor_type":"dateTime","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"Variable(DateTime.now())","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":1,"references":[],"type":"table","data":{"name":"activities","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"title","getter_name":"title","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[{"allowed-lengths":{"min":3,"max":32}}]},{"name":"type","getter_name":"type","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(ActivityType.values)","dart_type_name":"ActivityType"}},{"name":"body","getter_name":"description","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"category","getter_name":"category","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(ActivityCategories.values)","dart_type_name":"ActivityCategories"}},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"Variable(DateTime.now())","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":2,"references":[0,1],"type":"table","data":{"name":"session_activities","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"session_id","getter_name":"sessionId","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES sessions (id)","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES sessions (id)"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]},{"name":"activity_id","getter_name":"activityId","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES activities (id)","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES activities (id)"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]},{"name":"position","getter_name":"position","moor_type":"int","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"results","getter_name":"results","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"achievements","getter_name":"achievements","moor_type":"string","nullable":true,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"Variable(DateTime.now())","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":3,"references":[],"type":"table","data":{"name":"actions","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"title","getter_name":"title","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[{"allowed-lengths":{"min":3,"max":32}}]},{"name":"body","getter_name":"description","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"set","getter_name":"set","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"Variable(DateTime.now())","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":4,"references":[1,3],"type":"table","data":{"name":"activity_actions","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"activity_id","getter_name":"activityId","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES activities (id)","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES activities (id)"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]},{"name":"action_id","getter_name":"actionId","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES actions (id)","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES actions (id)"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]},{"name":"position","getter_name":"position","moor_type":"int","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"Variable(DateTime.now())","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":5,"references":[],"type":"table","data":{"name":"media_items","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"title","getter_name":"title","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[{"allowed-lengths":{"min":3,"max":32}}]},{"name":"body","getter_name":"description","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"reference","getter_name":"reference","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[{"allowed-lengths":{"min":3,"max":256}}]},{"name":"type","getter_name":"type","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(MediaType.values)","dart_type_name":"MediaType"}},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"Variable(DateTime.now())","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}},{"id":6,"references":[5],"type":"table","data":{"name":"object_media_items","was_declared_in_moor":false,"columns":[{"name":"id","getter_name":"id","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"PRIMARY KEY AUTOINCREMENT","dialectAwareDefaultConstraints":{"sqlite":"PRIMARY KEY AUTOINCREMENT"},"default_dart":null,"default_client_dart":null,"dsl_features":["auto-increment"]},{"name":"object_id","getter_name":"objectId","moor_type":"int","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[]},{"name":"object_type","getter_name":"objectType","moor_type":"string","nullable":false,"customConstraints":null,"default_dart":null,"default_client_dart":null,"dsl_features":[],"type_converter":{"dart_expr":"const EnumNameConverter(ObjectType.values)","dart_type_name":"ObjectType"}},{"name":"media_id","getter_name":"mediaId","moor_type":"int","nullable":false,"customConstraints":null,"defaultConstraints":"REFERENCES media_items (id)","dialectAwareDefaultConstraints":{"sqlite":"REFERENCES media_items (id)"},"default_dart":null,"default_client_dart":null,"dsl_features":["unknown"]},{"name":"created_at","getter_name":"createdAt","moor_type":"dateTime","nullable":false,"customConstraints":null,"default_dart":"Variable(DateTime.now())","default_client_dart":null,"dsl_features":[]}],"is_virtual":false,"without_rowid":false,"constraints":[]}}]} \ No newline at end of file diff --git a/lib/database/seed.dart b/lib/database/seed.dart index d612489..7bd739f 100644 --- a/lib/database/seed.dart +++ b/lib/database/seed.dart @@ -36,6 +36,11 @@ Future seedDb(AppDatabase database) async { ['BgheYcxhrsw', MediaType.youtube] ]; + final List actionTypes = [ + "[[{\"actionID\": 0, \"name\": \"1, 3, 5\", \"type\": \"repititions\", \"amount\": 1, \"weight\": 0}, {\"actionID\": 1, \"name\": \"Rest\", \"type\": \"seconds\", \"amount\": 300}], [{\"actionID\": 2, \"name\": \"1, 3, 5\", \"type\": \"repititions\", \"amount\": 1, \"weight\": 0}, {\"actionID\": 3, \"name\": \"Rest\", \"type\": \"seconds\", \"amount\": 300}], [{\"actionID\": 4, \"name\": \"1, 3, 5\", \"type\": \"repititions\", \"amount\": 1, \"weight\": 0}, {\"actionID\": 5, \"name\": \"Rest\", \"type\": \"seconds\", \"amount\": 300}]]", + "[[{\"actionID\": 0, \"name\": \"Long Pulls\", \"type\": \"seconds\", \"amount\": 5, \"weight\": 80}, {\"actionID\": 1, \"name\": \"Rest\", \"type\": \"seconds\", \"amount\": 5}, {\"actionID\": 2, \"name\": \"Long Pulls\", \"type\": \"seconds\", \"amount\": 5, \"weights\": 80}, {\"actionID\": 3, \"name\": \"Rest\", \"type\": \"seconds\", \"amount\": 300}], [{\"actionID\": 4, \"name\": \"Long Pulls\", \"type\": \"seconds\", \"amount\": 5, \"weight\": 80}, {\"actionID\": 5, \"name\": \"Rest\", \"type\": \"seconds\", \"amount\": 5}, {\"actionID\": 6, \"name\": \"Long Pulls\", \"type\": \"seconds\", \"amount\": 5, \"weights\": 80}, {\"actionID\": 7, \"name\": \"Rest\", \"type\": \"seconds\", \"amount\": 300}], [{\"actionID\": 8, \"name\": \"Long Pulls\", \"type\": \"seconds\", \"amount\": 5, \"weight\": 80}, {\"actionID\": 9, \"name\": \"Rest\", \"type\": \"seconds\", \"amount\": 5}, {\"actionID\": 10, \"name\": \"Long Pulls\", \"type\": \"seconds\", \"amount\": 5, \"weights\": 80}, {\"actionID\": 11, \"name\": \"Rest\", \"type\": \"seconds\", \"amount\": 300}], [{\"actionID\": 12, \"name\": \"Long Pulls\", \"type\": \"seconds\", \"amount\": 5, \"weight\": 80}, {\"actionID\": 13, \"name\": \"Rest\", \"type\": \"seconds\", \"amount\": 5}, {\"actionID\": 14, \"name\": \"Long Pulls\", \"type\": \"seconds\", \"amount\": 5, \"weights\": 80}, {\"actionID\": 15, \"name\": \"Rest\", \"type\": \"seconds\", \"amount\": 300}], [{\"actionID\": 16, \"name\": \"Long Pulls\", \"type\": \"seconds\", \"amount\": 5, \"weight\": 80}, {\"actionID\": 17, \"name\": \"Rest\", \"type\": \"seconds\", \"amount\": 5}, {\"actionID\": 18, \"name\": \"Long Pulls\", \"type\": \"seconds\", \"amount\": 5, \"weights\": 80}, {\"actionID\": 19, \"name\": \"Rest\", \"type\": \"seconds\", \"amount\": 300}]]" + ]; + final int totalSessions = 15; final int totalActivities = 6; final int totalActions = 5; @@ -59,14 +64,15 @@ Future seedDb(AppDatabase database) async { date: Value(DateTime.now()))) .then((sessionId) async { // activities things - for (int j = 0; j < random.nextInt(totalActivities); j++) { + for (int j = 0; j <= random.nextInt(totalActivities); j++) { await database .into(database.activities) .insert(ActivitiesCompanion.insert( - title: "test activity $j", + title: "Test activity $j", type: ActivityType .values[random.nextInt(ActivityType.values.length)], - description: "test training activity $j", + description: + "$j Beta pully beta beta pinch one arm crimpy. Futuristic pinch, dyno dynamic drop knee climb. Climbing ondra slopey onsight beta ondra power endurance.", category: ActivityCategories .values[random.nextInt(ActivityCategories.values.length)])) .then((activityId) async { @@ -76,31 +82,34 @@ Future seedDb(AppDatabase database) async { .insert(SessionActivitiesCompanion.insert( sessionId: sessionId, activityId: activityId, + position: j, results: Value("results json, will need to test"), achievements: Value("comma, seperated, items"), )); // actions - for (int k = 0; k < random.nextInt(totalActions); k++) { + for (int k = 0; k <= random.nextInt(totalActions); k++) { await database .into(database.actions) .insert(ActionsCompanion.insert( - title: 'test action $k', - description: 'test action description $k', - set: '')) + title: 'Test action $k', + description: + '$k Beta pully beta beta pinch one arm crimpy. Futuristic pinch, dyno dynamic drop knee climb. Climbing ondra slopey onsight beta ondra power endurance.', + set: actionTypes[random.nextInt(actionTypes.length)])) .then((actionId) async { // add activity action association await database.into(database.activityActions).insert( ActivityActionsCompanion.insert( - activityId: activityId, actionId: actionId)); + activityId: activityId, actionId: actionId, position: k)); - for (int l = 0; l < random.nextInt(totalMedia); l++) { + for (int l = 0; l <= random.nextInt(totalMedia); l++) { final mediaItem = mediaItems[random.nextInt(mediaItems.length)]; await database .into(database.mediaItems) .insert(MediaItemsCompanion.insert( - title: 'media title $l', - description: 'media description $l', + title: 'Media title $l', + description: + 'Media description $l Beta pully beta beta pinch one arm crimpy. Futuristic pinch, dyno dynamic drop knee climb. Climbing ondra slopey onsight beta ondra power endurance.', reference: mediaItem[0], type: mediaItem[1])) .then((mediaId) async { @@ -114,13 +123,14 @@ Future seedDb(AppDatabase database) async { }); } - for (int l = 0; l < random.nextInt(totalMedia); l++) { + for (int m = 0; m <= random.nextInt(totalMedia); m++) { final mediaItem = mediaItems[random.nextInt(mediaItems.length)]; await database .into(database.mediaItems) .insert(MediaItemsCompanion.insert( - title: 'media title $l', - description: 'media description $l', + title: 'Media title $m', + description: + 'Media description $m Beta pully beta beta pinch one arm crimpy. Futuristic pinch, dyno dynamic drop knee climb. Climbing ondra slopey onsight beta ondra power endurance.', reference: mediaItem[0], type: mediaItem[1])) .then((mediaId) async { @@ -134,13 +144,14 @@ Future seedDb(AppDatabase database) async { }); } - for (int l = 0; l < random.nextInt(totalMedia); l++) { + for (int n = 0; n <= random.nextInt(totalMedia); n++) { final mediaItem = mediaItems[random.nextInt(mediaItems.length)]; await database .into(database.mediaItems) .insert(MediaItemsCompanion.insert( - title: 'media title $l', - description: 'media description $l', + title: 'Media title $n', + description: + 'Media description $n Beta pully beta beta pinch one arm crimpy. Futuristic pinch, dyno dynamic drop knee climb. Climbing ondra slopey onsight beta ondra power endurance.', reference: mediaItem[0], type: mediaItem[1])) .then((mediaId) async { diff --git a/lib/extensions/string_extensions.dart b/lib/extensions/string_extensions.dart new file mode 100644 index 0000000..5b2788d --- /dev/null +++ b/lib/extensions/string_extensions.dart @@ -0,0 +1,84 @@ +List exceptions = [ + 'a', + 'abaft', + 'about', + 'above', + 'afore', + 'after', + 'along', + 'amid', + 'among', + 'an', + 'apud', + 'as', + 'aside', + 'at', + 'atop', + 'below', + 'but', + 'by', + 'circa', + 'down', + 'for', + 'from', + 'given', + 'in', + 'into', + 'lest', + 'like', + 'mid', + 'midst', + 'minus', + 'near', + 'next', + 'of', + 'off', + 'on', + 'onto', + 'out', + 'over', + 'pace', + 'past', + 'per', + 'plus', + 'pro', + 'qua', + 'round', + 'sans', + 'save', + 'since', + 'than', + 'thru', + 'till', + 'times', + 'to', + 'under', + 'until', + 'unto', + 'up', + 'upon', + 'via', + 'vice', + 'with', + 'worth', + 'the","and', + 'nor', + 'or', + 'yet', + 'so' +]; + +extension TitleCase on String { + String toTitleCase() { + return toLowerCase().replaceAllMapped( + RegExp( + r'[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|\b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+'), + (Match match) { + + // if (exceptions.contains(match[0])) { + // return match[0]!; + // } + return "${match[0]![0].toUpperCase()}${match[0]!.substring(1).toLowerCase()}"; + }).replaceAll(RegExp(r'(_|-)+'), ' '); + } +} diff --git a/lib/models/activity_timer_model.dart b/lib/models/activity_timer_model.dart index 771155c..6f9d7a9 100644 --- a/lib/models/activity_timer_model.dart +++ b/lib/models/activity_timer_model.dart @@ -10,6 +10,7 @@ class ActivityTimerModel with ChangeNotifier { ActivityModel? _activityModel; Activity? _activity; List _sets = []; + List _actions = []; int _currentActionNum = 0; int _currentSetNum = 0; Timer? _periodicTimer; @@ -30,7 +31,7 @@ class ActivityTimerModel with ChangeNotifier { double get progress => _progress; int get totalTime => _totalTime; - void setup(ActivityModel activityModel, Activity activity) { + void setup(ActivityModel activityModel, Activity activity, List actions) { if (_activityModel == null || activityModel.id != _activityModel?.id) { _periodicTimer?.cancel(); _progress = 0; @@ -38,6 +39,7 @@ class ActivityTimerModel with ChangeNotifier { _activityModel = activityModel; _activity = activity; _sets = activityModel.actions[0].items(); + _actions = actions; _currentActionNum = 0; _currentSetNum = 0; setActionCount(); diff --git a/lib/widgets/activity_action_view.dart b/lib/widgets/activity_action_view.dart index 591fbad..ca68591 100644 --- a/lib/widgets/activity_action_view.dart +++ b/lib/widgets/activity_action_view.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:scrollable_positioned_list/scrollable_positioned_list.dart'; import 'package:sendtrain/classes/activity_action.dart'; +import 'package:sendtrain/extensions/string_extensions.dart'; import 'package:sendtrain/models/activity_timer_model.dart'; class ActivityActionView extends StatefulWidget { @@ -74,7 +75,7 @@ class ActivityActionViewState extends State { : Theme.of(context).colorScheme.surfaceContainerLow, child: Text( textAlign: TextAlign.center, - '${setItem['name']}: ${setItem['amount']} ${setItem['type']}'))) + '${setItem['name']}: ${setItem['amount']} ${setItem['type']}'.toTitleCase()))) ]))); } diff --git a/lib/widgets/activity_card.dart b/lib/widgets/activity_card.dart index f474c85..839b152 100644 --- a/lib/widgets/activity_card.dart +++ b/lib/widgets/activity_card.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:sendtrain/daos/media_items_dao.dart'; import 'package:sendtrain/database/database.dart'; +import 'package:sendtrain/extensions/string_extensions.dart'; import 'package:sendtrain/models/activity_model.dart'; import 'package:sendtrain/models/activity_timer_model.dart'; import 'package:sendtrain/widgets/activity_view.dart'; @@ -71,19 +72,20 @@ class ActivityCardState extends State { mainAxisSize: MainAxisSize.min, children: [ ListTile( + // visualDensity: VisualDensity(horizontal: VisualDensity.maximumDensity), leading: Padding( padding: const EdgeInsets.fromLTRB(0, 0, 0, 0), child: Container( - padding: EdgeInsets.only(top: 5, bottom: 5), + // padding: EdgeInsets.only(top: 5, bottom: 5), width: 60, decoration: BoxDecoration( image: DecorationImage( - fit: BoxFit.cover, + fit: BoxFit.fill, image: findMediaByType(mediaItems, 'image')), // color: Colors.blue, borderRadius: const BorderRadius.all( - Radius.elliptical(10, 10)), + Radius.elliptical(8, 8)), ), )), title: Consumer( @@ -91,9 +93,9 @@ class ActivityCardState extends State { if (atm.activity?.id == widget.activity.id) { return Text( maxLines: 1, - "${widget.data.title} (${formattedTime(atm.totalTime)})"); + "${widget.data.title.toTitleCase()} (${formattedTime(atm.totalTime)})"); } else { - return Text(maxLines: 1, widget.data.title); + return Text(maxLines: 1, widget.data.title.toTitleCase()); } }, ), @@ -128,7 +130,13 @@ class ActivityCardState extends State { )), ); } else { - return CircularProgressIndicator(); + return Container( + alignment: Alignment.center, + child: SizedBox( + height: 50.0, + width: 50.0, + child: CircularProgressIndicator(), + )); } }); } diff --git a/lib/widgets/activity_view.dart b/lib/widgets/activity_view.dart index 6d13c3a..f00263a 100644 --- a/lib/widgets/activity_view.dart +++ b/lib/widgets/activity_view.dart @@ -1,7 +1,9 @@ import 'package:flutter/material.dart'; import 'package:flutter_expandable_fab/flutter_expandable_fab.dart'; import 'package:provider/provider.dart'; +import 'package:sendtrain/daos/actions_dao.dart'; import 'package:sendtrain/database/database.dart'; +import 'package:sendtrain/extensions/string_extensions.dart'; import 'package:sendtrain/models/activity_model.dart'; import 'package:sendtrain/models/activity_timer_model.dart'; import 'package:sendtrain/widgets/activity_action_view.dart'; @@ -27,133 +29,171 @@ class _ActivityViewState extends State { ActivityTimerModel atm = Provider.of(context, listen: false); - atm.setup(activityModel, activity); + return FutureBuilder( + future: ActionsDao(Provider.of(context)) + .fromActivity(activity), + builder: (context, snapshot) { + if (snapshot.hasData) { + List actions = snapshot.data!; + atm.setup(activityModel, activity, actions); - return Scaffold( - floatingActionButtonLocation: ExpandableFab.location, - floatingActionButton: ExpandableFab( - distance: 70, - type: ExpandableFabType.up, - overlayStyle: ExpandableFabOverlayStyle( - color: Colors.black.withOpacity(0.5), - blur: 10, - ), - children: [ - FloatingActionButton.extended( - icon: const Icon(Icons.history_outlined), - label: Text('Restart'), - onPressed: () {}, - ), - FloatingActionButton.extended( - icon: const Icon(Icons.done_all_outlined), - label: Text('Done'), - onPressed: () {}, - ), - FloatingActionButton.extended( - icon: const Icon(Icons.edit_outlined), - label: Text('Edit'), - onPressed: () {}, - ), - ]), - body: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ - AppBar( - centerTitle: true, - title: const Text('Activity', style: TextStyle(fontSize: 15)), - ), - Padding( - padding: const EdgeInsets.only( - left: 15, right: 20, top: 15, bottom: 10), - child: Text( - maxLines: 1, - style: const TextStyle( - fontSize: 25, fontWeight: FontWeight.bold), - activity.title)), - Padding( - padding: const EdgeInsets.fromLTRB(10, 0, 0, 10), - child: Flex(direction: Axis.horizontal, children: [ - ActivityViewCategories(categories: [activity.category]), - ActivityViewTypes(types: [activity.type]) - ])), - Padding( - padding: const EdgeInsets.only( - top: 0, bottom: 10, left: 15, right: 15), - child: Text( - textAlign: TextAlign.left, - style: const TextStyle(fontSize: 15), - activity.description)), - const Padding( - padding: EdgeInsets.fromLTRB(15, 20, 0, 10), - child: Text( - style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold), - 'Media:')), - ActivityViewMedia(activity: activity), - const Padding( - padding: EdgeInsets.fromLTRB(15, 30, 0, 10), - child: Text( - textAlign: TextAlign.left, - style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold), - 'Actions')), - Padding( - padding: const EdgeInsets.only(left: 10, right: 10), - child: Card( - clipBehavior: Clip.antiAlias, - shape: const RoundedRectangleBorder( - borderRadius: BorderRadius.only( - topLeft: Radius.circular(10), - topRight: Radius.circular(10)), - ), - color: Theme.of(context).colorScheme.onPrimary, - child: Row(children: [ - Ink( - width: 70, - color: Theme.of(context).colorScheme.primaryContainer, - child: Consumer( - builder: (context, atm, child) { - return IconButton( - alignment: AlignmentDirectional.center, - icon: atm.isActive - ? const Icon(Icons.pause_rounded) - : const Icon(Icons.play_arrow_rounded), - onPressed: () => - {atm.isActive ? atm.pause() : atm.start()}); - }, - )), - Expanded( - flex: 1, - child: Stack(alignment: Alignment.center, children: [ - Container( - alignment: Alignment.center, - child: Consumer( + return Scaffold( + floatingActionButtonLocation: ExpandableFab.location, + floatingActionButton: ExpandableFab( + distance: 70, + type: ExpandableFabType.up, + overlayStyle: ExpandableFabOverlayStyle( + color: Colors.black.withOpacity(0.5), + blur: 10, + ), + children: [ + FloatingActionButton.extended( + icon: const Icon(Icons.history_outlined), + label: Text('Restart'), + onPressed: () {}, + ), + FloatingActionButton.extended( + icon: const Icon(Icons.done_all_outlined), + label: Text('Done'), + onPressed: () {}, + ), + FloatingActionButton.extended( + icon: const Icon(Icons.edit_outlined), + label: Text('Edit'), + onPressed: () {}, + ), + ]), + body: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + AppBar( + titleSpacing: 0, + centerTitle: true, + title: const Text('Activity', + style: TextStyle(fontSize: 15)), + ), + Padding( + padding: const EdgeInsets.only( + left: 15, right: 20, top: 15, bottom: 10), + child: Text( + maxLines: 1, + style: const TextStyle( + fontSize: 25, fontWeight: FontWeight.bold), + activity.title.toTitleCase())), + Padding( + padding: const EdgeInsets.fromLTRB(10, 0, 0, 10), + child: Flex(direction: Axis.horizontal, children: [ + ActivityViewCategories( + categories: [activity.category]), + ActivityViewTypes(types: [activity.type]) + ])), + Padding( + padding: const EdgeInsets.only( + top: 0, bottom: 10, left: 15, right: 15), + child: Text( + textAlign: TextAlign.left, + style: const TextStyle(fontSize: 15), + activity.description)), + const Padding( + padding: EdgeInsets.fromLTRB(15, 20, 0, 10), + child: Text( + style: TextStyle( + fontSize: 20, fontWeight: FontWeight.bold), + 'Media:')), + ActivityViewMedia(activity: activity), + const Padding( + padding: EdgeInsets.fromLTRB(15, 30, 0, 10), + child: Text( + textAlign: TextAlign.left, + style: TextStyle( + fontSize: 20, fontWeight: FontWeight.bold), + 'Actions')), + Padding( + padding: const EdgeInsets.only(left: 10, right: 10), + child: Card( + clipBehavior: Clip.antiAlias, + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.only( + topLeft: Radius.circular(10), + topRight: Radius.circular(10)), + ), + color: Theme.of(context).colorScheme.onPrimary, + child: Row(children: [ + Ink( + width: 70, + color: Theme.of(context) + .colorScheme + .primaryContainer, + child: Consumer( + builder: (context, atm, child) { + return IconButton( + alignment: + AlignmentDirectional.center, + icon: atm.isActive + ? const Icon( + Icons.pause_rounded) + : const Icon( + Icons.play_arrow_rounded), + onPressed: () => { + atm.isActive + ? atm.pause() + : atm.start() + }); + }, + )), + Expanded( + flex: 1, + child: Stack( + alignment: Alignment.center, + children: [ + Container( + alignment: Alignment.center, + child: Consumer( + builder: (context, atm, child) { + return Text( + style: const TextStyle( + fontSize: 20), + textAlign: TextAlign.center, + '${atm.actionCount} ${atm.currentAction['type']}'.toTitleCase()); + }, + ), + ), + Container( + alignment: Alignment.centerRight, + padding: + EdgeInsets.only(right: 15), + child: + Consumer( + builder: (context, atm, + child) { + return Text( + style: const TextStyle( + fontSize: 12), + textAlign: TextAlign.right, + '${atm.currentAction['actionID'] + 1} of ${atm.totalActions()}'); + })), + ])), + ]))), + Padding( + padding: EdgeInsets.only(left: 14, right: 14), + child: Consumer( builder: (context, atm, child) { - return Text( - style: const TextStyle(fontSize: 20), - textAlign: TextAlign.center, - '${atm.actionCount} ${atm.currentAction['type']}'); - }, - ), - ), - Container( - alignment: Alignment.centerRight, - padding: EdgeInsets.only(right: 15), - child: Consumer( - builder: (context, atm, child) { - return Text( - style: const TextStyle(fontSize: 12), - textAlign: TextAlign.right, - '${atm.currentAction['actionID'] + 1} of ${atm.totalActions()}'); - })), - ])), - ]))), - Padding( - padding: EdgeInsets.only(left: 14, right: 14), - child: - Consumer(builder: (context, atm, child) { - return LinearProgressIndicator( - value: atm.progress, - semanticsLabel: 'Activity Progress', - ); - })), - ActivityActionView(action: activityModel.actions[0]), - ])); + return LinearProgressIndicator( + value: atm.progress, + semanticsLabel: 'Activity Progress', + ); + })), + ActivityActionView(action: activityModel.actions[0]), + ])); + } else { + return Container( + alignment: Alignment.center, + child: SizedBox( + height: 50.0, + width: 50.0, + child: CircularProgressIndicator(), + )); + } + }); } } diff --git a/lib/widgets/activity_view_categories.dart b/lib/widgets/activity_view_categories.dart index 9df2113..60ec09b 100644 --- a/lib/widgets/activity_view_categories.dart +++ b/lib/widgets/activity_view_categories.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:sendtrain/database/database.dart'; +import 'package:sendtrain/extensions/string_extensions.dart'; class ActivityViewCategories extends StatelessWidget { const ActivityViewCategories({super.key, required this.categories}); @@ -19,7 +20,7 @@ class ActivityViewCategories extends StatelessWidget { return ActionChip( visualDensity: VisualDensity.compact, avatar: const Icon(Icons.category_rounded), - label: Text(maxLines: 1, categories[index].name), + label: Text(maxLines: 1, categories[index].name.toTitleCase()), tooltip: "Activity Category", onPressed: () {}, ); diff --git a/lib/widgets/activity_view_types.dart b/lib/widgets/activity_view_types.dart index a13816c..0b434f1 100644 --- a/lib/widgets/activity_view_types.dart +++ b/lib/widgets/activity_view_types.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:sendtrain/database/database.dart'; +import 'package:sendtrain/extensions/string_extensions.dart'; class ActivityViewTypes extends StatelessWidget { const ActivityViewTypes({super.key, required this.types}); @@ -19,7 +20,7 @@ class ActivityViewTypes extends StatelessWidget { return ActionChip( visualDensity: VisualDensity.compact, avatar: const Icon(Icons.fitness_center_rounded), - label: Text(maxLines: 1, types[index].name), + label: Text(maxLines: 1, types[index].name.toTitleCase()), tooltip: "Activity Type", onPressed: () {}, ); diff --git a/lib/widgets/session_card.dart b/lib/widgets/session_card.dart index 4f452cb..0a0bbe7 100644 --- a/lib/widgets/session_card.dart +++ b/lib/widgets/session_card.dart @@ -4,6 +4,7 @@ import 'package:intl/date_symbol_data_local.dart'; import 'package:sendtrain/classes/activity_action.dart'; import 'package:sendtrain/classes/media.dart'; import 'package:sendtrain/database/database.dart' hide ActivityAction; +import 'package:sendtrain/extensions/string_extensions.dart'; import 'package:sendtrain/models/activity_model.dart'; import 'package:sendtrain/models/session_model.dart'; import 'package:sendtrain/widgets/session_view.dart'; @@ -217,7 +218,7 @@ class SessionCard extends StatelessWidget { BorderRadius.all(Radius.elliptical(10, 10)), ), )), - title: Text(maxLines: 1, session.title), + title: Text(maxLines: 1, session.title.toTitleCase()), subtitle: Text(maxLines: 1, dateFormat.format(session.date as DateTime)), trailing: IconButton( visualDensity: VisualDensity.compact, @@ -303,7 +304,7 @@ class SessionCard extends StatelessWidget { ListTile( title: Text( maxLines: 3, - session.title, + session.title.toTitleCase(), textAlign: TextAlign.center), subtitle: Text( maxLines: 1, diff --git a/lib/widgets/session_view.dart b/lib/widgets/session_view.dart index d2da679..1f8b407 100644 --- a/lib/widgets/session_view.dart +++ b/lib/widgets/session_view.dart @@ -6,6 +6,7 @@ import 'package:provider/provider.dart'; import 'package:sendtrain/daos/activities_dao.dart'; import 'package:sendtrain/database/database.dart'; +import 'package:sendtrain/extensions/string_extensions.dart'; import 'package:sendtrain/models/session_model.dart'; import 'package:sendtrain/widgets/session_view_achievements.dart'; import 'package:sendtrain/widgets/session_view_activities.dart'; @@ -69,7 +70,7 @@ class SessionView extends StatelessWidget { maxLines: 1, style: const TextStyle( fontSize: 25, fontWeight: FontWeight.bold), - session.title)), + session.title.toTitleCase())), SessionViewAchievements(session: session), Padding( padding: const EdgeInsets.only(left: 15, right: 15), diff --git a/lib/widgets/session_view_achievements.dart b/lib/widgets/session_view_achievements.dart index cde1cfa..ca4275a 100644 --- a/lib/widgets/session_view_achievements.dart +++ b/lib/widgets/session_view_achievements.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:sendtrain/daos/session_activities_dao.dart'; import 'package:sendtrain/database/database.dart'; +import 'package:sendtrain/extensions/string_extensions.dart'; class SessionViewAchievements extends StatelessWidget { const SessionViewAchievements({super.key, required this.session}); @@ -50,7 +51,7 @@ class SessionViewAchievements extends StatelessWidget { visualDensity: VisualDensity.compact, avatar: const Icon(Icons.check_circle_outline), - label: Text(maxLines: 1, achievements[index]), + label: Text(maxLines: 1, achievements[index].toTitleCase()), onPressed: () {}, )); }, diff --git a/test/drift/sendtrain/generated/schema.dart b/test/drift/sendtrain/generated/schema.dart index b2b7404..22131b1 100644 --- a/test/drift/sendtrain/generated/schema.dart +++ b/test/drift/sendtrain/generated/schema.dart @@ -5,6 +5,8 @@ import 'package:drift/drift.dart'; import 'package:drift/internal/migrations.dart'; import 'schema_v1.dart' as v1; import 'schema_v2.dart' as v2; +import 'schema_v3.dart' as v3; +import 'schema_v4.dart' as v4; class GeneratedHelper implements SchemaInstantiationHelper { @override @@ -14,10 +16,14 @@ class GeneratedHelper implements SchemaInstantiationHelper { return v1.DatabaseAtV1(db); case 2: return v2.DatabaseAtV2(db); + case 3: + return v3.DatabaseAtV3(db); + case 4: + return v4.DatabaseAtV4(db); default: throw MissingSchemaException(version, versions); } } - static const versions = const [1, 2]; + static const versions = const [1, 2, 3, 4]; } diff --git a/test/drift/sendtrain/generated/schema_v3.dart b/test/drift/sendtrain/generated/schema_v3.dart new file mode 100644 index 0000000..a5eda4f --- /dev/null +++ b/test/drift/sendtrain/generated/schema_v3.dart @@ -0,0 +1,1977 @@ +// dart format width=80 +// GENERATED CODE, DO NOT EDIT BY HAND. +// ignore_for_file: type=lint +import 'package:drift/drift.dart'; + +class Sessions extends Table with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + Sessions(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, false, + hasAutoIncrement: true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT')); + late final GeneratedColumn title = GeneratedColumn( + 'title', aliasedName, false, + additionalChecks: + GeneratedColumn.checkTextLength(minTextLength: 3, maxTextLength: 32), + type: DriftSqlType.string, + requiredDuringInsert: true); + late final GeneratedColumn content = GeneratedColumn( + 'body', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn status = GeneratedColumn( + 'status', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn date = GeneratedColumn( + 'date', aliasedName, true, + type: DriftSqlType.dateTime, requiredDuringInsert: false); + late final GeneratedColumn createdAt = GeneratedColumn( + 'created_at', aliasedName, false, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + defaultValue: Variable(DateTime.now())); + @override + List get $columns => + [id, title, content, status, date, createdAt]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'sessions'; + @override + Set get $primaryKey => {id}; + @override + SessionsData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return SessionsData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id'])!, + title: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}title'])!, + content: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}body'])!, + status: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}status'])!, + date: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}date']), + createdAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!, + ); + } + + @override + Sessions createAlias(String alias) { + return Sessions(attachedDatabase, alias); + } +} + +class SessionsData extends DataClass implements Insertable { + final int id; + final String title; + final String content; + final String status; + final DateTime? date; + final DateTime createdAt; + const SessionsData( + {required this.id, + required this.title, + required this.content, + required this.status, + this.date, + required this.createdAt}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['title'] = Variable(title); + map['body'] = Variable(content); + map['status'] = Variable(status); + if (!nullToAbsent || date != null) { + map['date'] = Variable(date); + } + map['created_at'] = Variable(createdAt); + return map; + } + + SessionsCompanion toCompanion(bool nullToAbsent) { + return SessionsCompanion( + id: Value(id), + title: Value(title), + content: Value(content), + status: Value(status), + date: date == null && nullToAbsent ? const Value.absent() : Value(date), + createdAt: Value(createdAt), + ); + } + + factory SessionsData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return SessionsData( + id: serializer.fromJson(json['id']), + title: serializer.fromJson(json['title']), + content: serializer.fromJson(json['content']), + status: serializer.fromJson(json['status']), + date: serializer.fromJson(json['date']), + createdAt: serializer.fromJson(json['createdAt']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'title': serializer.toJson(title), + 'content': serializer.toJson(content), + 'status': serializer.toJson(status), + 'date': serializer.toJson(date), + 'createdAt': serializer.toJson(createdAt), + }; + } + + SessionsData copyWith( + {int? id, + String? title, + String? content, + String? status, + Value date = const Value.absent(), + DateTime? createdAt}) => + SessionsData( + id: id ?? this.id, + title: title ?? this.title, + content: content ?? this.content, + status: status ?? this.status, + date: date.present ? date.value : this.date, + createdAt: createdAt ?? this.createdAt, + ); + SessionsData copyWithCompanion(SessionsCompanion data) { + return SessionsData( + id: data.id.present ? data.id.value : this.id, + title: data.title.present ? data.title.value : this.title, + content: data.content.present ? data.content.value : this.content, + status: data.status.present ? data.status.value : this.status, + date: data.date.present ? data.date.value : this.date, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + ); + } + + @override + String toString() { + return (StringBuffer('SessionsData(') + ..write('id: $id, ') + ..write('title: $title, ') + ..write('content: $content, ') + ..write('status: $status, ') + ..write('date: $date, ') + ..write('createdAt: $createdAt') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(id, title, content, status, date, createdAt); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is SessionsData && + other.id == this.id && + other.title == this.title && + other.content == this.content && + other.status == this.status && + other.date == this.date && + other.createdAt == this.createdAt); +} + +class SessionsCompanion extends UpdateCompanion { + final Value id; + final Value title; + final Value content; + final Value status; + final Value date; + final Value createdAt; + const SessionsCompanion({ + this.id = const Value.absent(), + this.title = const Value.absent(), + this.content = const Value.absent(), + this.status = const Value.absent(), + this.date = const Value.absent(), + this.createdAt = const Value.absent(), + }); + SessionsCompanion.insert({ + this.id = const Value.absent(), + required String title, + required String content, + required String status, + this.date = const Value.absent(), + this.createdAt = const Value.absent(), + }) : title = Value(title), + content = Value(content), + status = Value(status); + static Insertable custom({ + Expression? id, + Expression? title, + Expression? content, + Expression? status, + Expression? date, + Expression? createdAt, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (title != null) 'title': title, + if (content != null) 'body': content, + if (status != null) 'status': status, + if (date != null) 'date': date, + if (createdAt != null) 'created_at': createdAt, + }); + } + + SessionsCompanion copyWith( + {Value? id, + Value? title, + Value? content, + Value? status, + Value? date, + Value? createdAt}) { + return SessionsCompanion( + id: id ?? this.id, + title: title ?? this.title, + content: content ?? this.content, + status: status ?? this.status, + date: date ?? this.date, + createdAt: createdAt ?? this.createdAt, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (title.present) { + map['title'] = Variable(title.value); + } + if (content.present) { + map['body'] = Variable(content.value); + } + if (status.present) { + map['status'] = Variable(status.value); + } + if (date.present) { + map['date'] = Variable(date.value); + } + if (createdAt.present) { + map['created_at'] = Variable(createdAt.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('SessionsCompanion(') + ..write('id: $id, ') + ..write('title: $title, ') + ..write('content: $content, ') + ..write('status: $status, ') + ..write('date: $date, ') + ..write('createdAt: $createdAt') + ..write(')')) + .toString(); + } +} + +class Activities extends Table with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + Activities(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, false, + hasAutoIncrement: true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT')); + late final GeneratedColumn title = GeneratedColumn( + 'title', aliasedName, false, + additionalChecks: + GeneratedColumn.checkTextLength(minTextLength: 3, maxTextLength: 32), + type: DriftSqlType.string, + requiredDuringInsert: true); + late final GeneratedColumn type = GeneratedColumn( + 'type', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn description = GeneratedColumn( + 'body', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn category = GeneratedColumn( + 'category', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn createdAt = GeneratedColumn( + 'created_at', aliasedName, false, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + defaultValue: Variable(DateTime.now())); + @override + List get $columns => + [id, title, type, description, category, createdAt]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'activities'; + @override + Set get $primaryKey => {id}; + @override + ActivitiesData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return ActivitiesData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id'])!, + title: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}title'])!, + type: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}type'])!, + description: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}body'])!, + category: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}category'])!, + createdAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!, + ); + } + + @override + Activities createAlias(String alias) { + return Activities(attachedDatabase, alias); + } +} + +class ActivitiesData extends DataClass implements Insertable { + final int id; + final String title; + final String type; + final String description; + final String category; + final DateTime createdAt; + const ActivitiesData( + {required this.id, + required this.title, + required this.type, + required this.description, + required this.category, + required this.createdAt}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['title'] = Variable(title); + map['type'] = Variable(type); + map['body'] = Variable(description); + map['category'] = Variable(category); + map['created_at'] = Variable(createdAt); + return map; + } + + ActivitiesCompanion toCompanion(bool nullToAbsent) { + return ActivitiesCompanion( + id: Value(id), + title: Value(title), + type: Value(type), + description: Value(description), + category: Value(category), + createdAt: Value(createdAt), + ); + } + + factory ActivitiesData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return ActivitiesData( + id: serializer.fromJson(json['id']), + title: serializer.fromJson(json['title']), + type: serializer.fromJson(json['type']), + description: serializer.fromJson(json['description']), + category: serializer.fromJson(json['category']), + createdAt: serializer.fromJson(json['createdAt']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'title': serializer.toJson(title), + 'type': serializer.toJson(type), + 'description': serializer.toJson(description), + 'category': serializer.toJson(category), + 'createdAt': serializer.toJson(createdAt), + }; + } + + ActivitiesData copyWith( + {int? id, + String? title, + String? type, + String? description, + String? category, + DateTime? createdAt}) => + ActivitiesData( + id: id ?? this.id, + title: title ?? this.title, + type: type ?? this.type, + description: description ?? this.description, + category: category ?? this.category, + createdAt: createdAt ?? this.createdAt, + ); + ActivitiesData copyWithCompanion(ActivitiesCompanion data) { + return ActivitiesData( + id: data.id.present ? data.id.value : this.id, + title: data.title.present ? data.title.value : this.title, + type: data.type.present ? data.type.value : this.type, + description: + data.description.present ? data.description.value : this.description, + category: data.category.present ? data.category.value : this.category, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + ); + } + + @override + String toString() { + return (StringBuffer('ActivitiesData(') + ..write('id: $id, ') + ..write('title: $title, ') + ..write('type: $type, ') + ..write('description: $description, ') + ..write('category: $category, ') + ..write('createdAt: $createdAt') + ..write(')')) + .toString(); + } + + @override + int get hashCode => + Object.hash(id, title, type, description, category, createdAt); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is ActivitiesData && + other.id == this.id && + other.title == this.title && + other.type == this.type && + other.description == this.description && + other.category == this.category && + other.createdAt == this.createdAt); +} + +class ActivitiesCompanion extends UpdateCompanion { + final Value id; + final Value title; + final Value type; + final Value description; + final Value category; + final Value createdAt; + const ActivitiesCompanion({ + this.id = const Value.absent(), + this.title = const Value.absent(), + this.type = const Value.absent(), + this.description = const Value.absent(), + this.category = const Value.absent(), + this.createdAt = const Value.absent(), + }); + ActivitiesCompanion.insert({ + this.id = const Value.absent(), + required String title, + required String type, + required String description, + required String category, + this.createdAt = const Value.absent(), + }) : title = Value(title), + type = Value(type), + description = Value(description), + category = Value(category); + static Insertable custom({ + Expression? id, + Expression? title, + Expression? type, + Expression? description, + Expression? category, + Expression? createdAt, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (title != null) 'title': title, + if (type != null) 'type': type, + if (description != null) 'body': description, + if (category != null) 'category': category, + if (createdAt != null) 'created_at': createdAt, + }); + } + + ActivitiesCompanion copyWith( + {Value? id, + Value? title, + Value? type, + Value? description, + Value? category, + Value? createdAt}) { + return ActivitiesCompanion( + id: id ?? this.id, + title: title ?? this.title, + type: type ?? this.type, + description: description ?? this.description, + category: category ?? this.category, + createdAt: createdAt ?? this.createdAt, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (title.present) { + map['title'] = Variable(title.value); + } + if (type.present) { + map['type'] = Variable(type.value); + } + if (description.present) { + map['body'] = Variable(description.value); + } + if (category.present) { + map['category'] = Variable(category.value); + } + if (createdAt.present) { + map['created_at'] = Variable(createdAt.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('ActivitiesCompanion(') + ..write('id: $id, ') + ..write('title: $title, ') + ..write('type: $type, ') + ..write('description: $description, ') + ..write('category: $category, ') + ..write('createdAt: $createdAt') + ..write(')')) + .toString(); + } +} + +class SessionActivities extends Table + with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + SessionActivities(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, false, + hasAutoIncrement: true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT')); + late final GeneratedColumn sessionId = GeneratedColumn( + 'session_id', aliasedName, false, + type: DriftSqlType.int, + requiredDuringInsert: true, + defaultConstraints: + GeneratedColumn.constraintIsAlways('REFERENCES sessions (id)')); + late final GeneratedColumn activityId = GeneratedColumn( + 'activity_id', aliasedName, false, + type: DriftSqlType.int, + requiredDuringInsert: true, + defaultConstraints: + GeneratedColumn.constraintIsAlways('REFERENCES activities (id)')); + late final GeneratedColumn postition = GeneratedColumn( + 'postition', aliasedName, false, + type: DriftSqlType.int, requiredDuringInsert: true); + late final GeneratedColumn results = GeneratedColumn( + 'results', aliasedName, true, + type: DriftSqlType.string, requiredDuringInsert: false); + late final GeneratedColumn achievements = GeneratedColumn( + 'achievements', aliasedName, true, + type: DriftSqlType.string, requiredDuringInsert: false); + late final GeneratedColumn createdAt = GeneratedColumn( + 'created_at', aliasedName, false, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + defaultValue: Variable(DateTime.now())); + @override + List get $columns => + [id, sessionId, activityId, postition, results, achievements, createdAt]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'session_activities'; + @override + Set get $primaryKey => {id}; + @override + SessionActivitiesData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return SessionActivitiesData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id'])!, + sessionId: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}session_id'])!, + activityId: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}activity_id'])!, + postition: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}postition'])!, + results: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}results']), + achievements: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}achievements']), + createdAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!, + ); + } + + @override + SessionActivities createAlias(String alias) { + return SessionActivities(attachedDatabase, alias); + } +} + +class SessionActivitiesData extends DataClass + implements Insertable { + final int id; + final int sessionId; + final int activityId; + final int postition; + final String? results; + final String? achievements; + final DateTime createdAt; + const SessionActivitiesData( + {required this.id, + required this.sessionId, + required this.activityId, + required this.postition, + this.results, + this.achievements, + required this.createdAt}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['session_id'] = Variable(sessionId); + map['activity_id'] = Variable(activityId); + map['postition'] = Variable(postition); + if (!nullToAbsent || results != null) { + map['results'] = Variable(results); + } + if (!nullToAbsent || achievements != null) { + map['achievements'] = Variable(achievements); + } + map['created_at'] = Variable(createdAt); + return map; + } + + SessionActivitiesCompanion toCompanion(bool nullToAbsent) { + return SessionActivitiesCompanion( + id: Value(id), + sessionId: Value(sessionId), + activityId: Value(activityId), + postition: Value(postition), + results: results == null && nullToAbsent + ? const Value.absent() + : Value(results), + achievements: achievements == null && nullToAbsent + ? const Value.absent() + : Value(achievements), + createdAt: Value(createdAt), + ); + } + + factory SessionActivitiesData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return SessionActivitiesData( + id: serializer.fromJson(json['id']), + sessionId: serializer.fromJson(json['sessionId']), + activityId: serializer.fromJson(json['activityId']), + postition: serializer.fromJson(json['postition']), + results: serializer.fromJson(json['results']), + achievements: serializer.fromJson(json['achievements']), + createdAt: serializer.fromJson(json['createdAt']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'sessionId': serializer.toJson(sessionId), + 'activityId': serializer.toJson(activityId), + 'postition': serializer.toJson(postition), + 'results': serializer.toJson(results), + 'achievements': serializer.toJson(achievements), + 'createdAt': serializer.toJson(createdAt), + }; + } + + SessionActivitiesData copyWith( + {int? id, + int? sessionId, + int? activityId, + int? postition, + Value results = const Value.absent(), + Value achievements = const Value.absent(), + DateTime? createdAt}) => + SessionActivitiesData( + id: id ?? this.id, + sessionId: sessionId ?? this.sessionId, + activityId: activityId ?? this.activityId, + postition: postition ?? this.postition, + results: results.present ? results.value : this.results, + achievements: + achievements.present ? achievements.value : this.achievements, + createdAt: createdAt ?? this.createdAt, + ); + SessionActivitiesData copyWithCompanion(SessionActivitiesCompanion data) { + return SessionActivitiesData( + id: data.id.present ? data.id.value : this.id, + sessionId: data.sessionId.present ? data.sessionId.value : this.sessionId, + activityId: + data.activityId.present ? data.activityId.value : this.activityId, + postition: data.postition.present ? data.postition.value : this.postition, + results: data.results.present ? data.results.value : this.results, + achievements: data.achievements.present + ? data.achievements.value + : this.achievements, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + ); + } + + @override + String toString() { + return (StringBuffer('SessionActivitiesData(') + ..write('id: $id, ') + ..write('sessionId: $sessionId, ') + ..write('activityId: $activityId, ') + ..write('postition: $postition, ') + ..write('results: $results, ') + ..write('achievements: $achievements, ') + ..write('createdAt: $createdAt') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash( + id, sessionId, activityId, postition, results, achievements, createdAt); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is SessionActivitiesData && + other.id == this.id && + other.sessionId == this.sessionId && + other.activityId == this.activityId && + other.postition == this.postition && + other.results == this.results && + other.achievements == this.achievements && + other.createdAt == this.createdAt); +} + +class SessionActivitiesCompanion + extends UpdateCompanion { + final Value id; + final Value sessionId; + final Value activityId; + final Value postition; + final Value results; + final Value achievements; + final Value createdAt; + const SessionActivitiesCompanion({ + this.id = const Value.absent(), + this.sessionId = const Value.absent(), + this.activityId = const Value.absent(), + this.postition = const Value.absent(), + this.results = const Value.absent(), + this.achievements = const Value.absent(), + this.createdAt = const Value.absent(), + }); + SessionActivitiesCompanion.insert({ + this.id = const Value.absent(), + required int sessionId, + required int activityId, + required int postition, + this.results = const Value.absent(), + this.achievements = const Value.absent(), + this.createdAt = const Value.absent(), + }) : sessionId = Value(sessionId), + activityId = Value(activityId), + postition = Value(postition); + static Insertable custom({ + Expression? id, + Expression? sessionId, + Expression? activityId, + Expression? postition, + Expression? results, + Expression? achievements, + Expression? createdAt, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (sessionId != null) 'session_id': sessionId, + if (activityId != null) 'activity_id': activityId, + if (postition != null) 'postition': postition, + if (results != null) 'results': results, + if (achievements != null) 'achievements': achievements, + if (createdAt != null) 'created_at': createdAt, + }); + } + + SessionActivitiesCompanion copyWith( + {Value? id, + Value? sessionId, + Value? activityId, + Value? postition, + Value? results, + Value? achievements, + Value? createdAt}) { + return SessionActivitiesCompanion( + id: id ?? this.id, + sessionId: sessionId ?? this.sessionId, + activityId: activityId ?? this.activityId, + postition: postition ?? this.postition, + results: results ?? this.results, + achievements: achievements ?? this.achievements, + createdAt: createdAt ?? this.createdAt, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (sessionId.present) { + map['session_id'] = Variable(sessionId.value); + } + if (activityId.present) { + map['activity_id'] = Variable(activityId.value); + } + if (postition.present) { + map['postition'] = Variable(postition.value); + } + if (results.present) { + map['results'] = Variable(results.value); + } + if (achievements.present) { + map['achievements'] = Variable(achievements.value); + } + if (createdAt.present) { + map['created_at'] = Variable(createdAt.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('SessionActivitiesCompanion(') + ..write('id: $id, ') + ..write('sessionId: $sessionId, ') + ..write('activityId: $activityId, ') + ..write('postition: $postition, ') + ..write('results: $results, ') + ..write('achievements: $achievements, ') + ..write('createdAt: $createdAt') + ..write(')')) + .toString(); + } +} + +class Actions extends Table with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + Actions(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, false, + hasAutoIncrement: true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT')); + late final GeneratedColumn title = GeneratedColumn( + 'title', aliasedName, false, + additionalChecks: + GeneratedColumn.checkTextLength(minTextLength: 3, maxTextLength: 32), + type: DriftSqlType.string, + requiredDuringInsert: true); + late final GeneratedColumn description = GeneratedColumn( + 'body', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn set = GeneratedColumn( + 'set', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn createdAt = GeneratedColumn( + 'created_at', aliasedName, false, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + defaultValue: Variable(DateTime.now())); + @override + List get $columns => + [id, title, description, set, createdAt]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'actions'; + @override + Set get $primaryKey => {id}; + @override + ActionsData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return ActionsData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id'])!, + title: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}title'])!, + description: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}body'])!, + set: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}set'])!, + createdAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!, + ); + } + + @override + Actions createAlias(String alias) { + return Actions(attachedDatabase, alias); + } +} + +class ActionsData extends DataClass implements Insertable { + final int id; + final String title; + final String description; + final String set; + final DateTime createdAt; + const ActionsData( + {required this.id, + required this.title, + required this.description, + required this.set, + required this.createdAt}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['title'] = Variable(title); + map['body'] = Variable(description); + map['set'] = Variable(set); + map['created_at'] = Variable(createdAt); + return map; + } + + ActionsCompanion toCompanion(bool nullToAbsent) { + return ActionsCompanion( + id: Value(id), + title: Value(title), + description: Value(description), + set: Value(set), + createdAt: Value(createdAt), + ); + } + + factory ActionsData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return ActionsData( + id: serializer.fromJson(json['id']), + title: serializer.fromJson(json['title']), + description: serializer.fromJson(json['description']), + set: serializer.fromJson(json['set']), + createdAt: serializer.fromJson(json['createdAt']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'title': serializer.toJson(title), + 'description': serializer.toJson(description), + 'set': serializer.toJson(set), + 'createdAt': serializer.toJson(createdAt), + }; + } + + ActionsData copyWith( + {int? id, + String? title, + String? description, + String? set, + DateTime? createdAt}) => + ActionsData( + id: id ?? this.id, + title: title ?? this.title, + description: description ?? this.description, + set: set ?? this.set, + createdAt: createdAt ?? this.createdAt, + ); + ActionsData copyWithCompanion(ActionsCompanion data) { + return ActionsData( + id: data.id.present ? data.id.value : this.id, + title: data.title.present ? data.title.value : this.title, + description: + data.description.present ? data.description.value : this.description, + set: data.set.present ? data.set.value : this.set, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + ); + } + + @override + String toString() { + return (StringBuffer('ActionsData(') + ..write('id: $id, ') + ..write('title: $title, ') + ..write('description: $description, ') + ..write('set: $set, ') + ..write('createdAt: $createdAt') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(id, title, description, set, createdAt); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is ActionsData && + other.id == this.id && + other.title == this.title && + other.description == this.description && + other.set == this.set && + other.createdAt == this.createdAt); +} + +class ActionsCompanion extends UpdateCompanion { + final Value id; + final Value title; + final Value description; + final Value set; + final Value createdAt; + const ActionsCompanion({ + this.id = const Value.absent(), + this.title = const Value.absent(), + this.description = const Value.absent(), + this.set = const Value.absent(), + this.createdAt = const Value.absent(), + }); + ActionsCompanion.insert({ + this.id = const Value.absent(), + required String title, + required String description, + required String set, + this.createdAt = const Value.absent(), + }) : title = Value(title), + description = Value(description), + set = Value(set); + static Insertable custom({ + Expression? id, + Expression? title, + Expression? description, + Expression? set, + Expression? createdAt, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (title != null) 'title': title, + if (description != null) 'body': description, + if (set != null) 'set': set, + if (createdAt != null) 'created_at': createdAt, + }); + } + + ActionsCompanion copyWith( + {Value? id, + Value? title, + Value? description, + Value? set, + Value? createdAt}) { + return ActionsCompanion( + id: id ?? this.id, + title: title ?? this.title, + description: description ?? this.description, + set: set ?? this.set, + createdAt: createdAt ?? this.createdAt, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (title.present) { + map['title'] = Variable(title.value); + } + if (description.present) { + map['body'] = Variable(description.value); + } + if (set.present) { + map['set'] = Variable(set.value); + } + if (createdAt.present) { + map['created_at'] = Variable(createdAt.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('ActionsCompanion(') + ..write('id: $id, ') + ..write('title: $title, ') + ..write('description: $description, ') + ..write('set: $set, ') + ..write('createdAt: $createdAt') + ..write(')')) + .toString(); + } +} + +class ActivityActions extends Table + with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + ActivityActions(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, false, + hasAutoIncrement: true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT')); + late final GeneratedColumn activityId = GeneratedColumn( + 'activity_id', aliasedName, false, + type: DriftSqlType.int, + requiredDuringInsert: true, + defaultConstraints: + GeneratedColumn.constraintIsAlways('REFERENCES activities (id)')); + late final GeneratedColumn actionId = GeneratedColumn( + 'action_id', aliasedName, false, + type: DriftSqlType.int, + requiredDuringInsert: true, + defaultConstraints: + GeneratedColumn.constraintIsAlways('REFERENCES actions (id)')); + late final GeneratedColumn postition = GeneratedColumn( + 'postition', aliasedName, false, + type: DriftSqlType.int, requiredDuringInsert: true); + late final GeneratedColumn createdAt = GeneratedColumn( + 'created_at', aliasedName, false, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + defaultValue: Variable(DateTime.now())); + @override + List get $columns => + [id, activityId, actionId, postition, createdAt]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'activity_actions'; + @override + Set get $primaryKey => {id}; + @override + ActivityActionsData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return ActivityActionsData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id'])!, + activityId: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}activity_id'])!, + actionId: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}action_id'])!, + postition: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}postition'])!, + createdAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!, + ); + } + + @override + ActivityActions createAlias(String alias) { + return ActivityActions(attachedDatabase, alias); + } +} + +class ActivityActionsData extends DataClass + implements Insertable { + final int id; + final int activityId; + final int actionId; + final int postition; + final DateTime createdAt; + const ActivityActionsData( + {required this.id, + required this.activityId, + required this.actionId, + required this.postition, + required this.createdAt}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['activity_id'] = Variable(activityId); + map['action_id'] = Variable(actionId); + map['postition'] = Variable(postition); + map['created_at'] = Variable(createdAt); + return map; + } + + ActivityActionsCompanion toCompanion(bool nullToAbsent) { + return ActivityActionsCompanion( + id: Value(id), + activityId: Value(activityId), + actionId: Value(actionId), + postition: Value(postition), + createdAt: Value(createdAt), + ); + } + + factory ActivityActionsData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return ActivityActionsData( + id: serializer.fromJson(json['id']), + activityId: serializer.fromJson(json['activityId']), + actionId: serializer.fromJson(json['actionId']), + postition: serializer.fromJson(json['postition']), + createdAt: serializer.fromJson(json['createdAt']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'activityId': serializer.toJson(activityId), + 'actionId': serializer.toJson(actionId), + 'postition': serializer.toJson(postition), + 'createdAt': serializer.toJson(createdAt), + }; + } + + ActivityActionsData copyWith( + {int? id, + int? activityId, + int? actionId, + int? postition, + DateTime? createdAt}) => + ActivityActionsData( + id: id ?? this.id, + activityId: activityId ?? this.activityId, + actionId: actionId ?? this.actionId, + postition: postition ?? this.postition, + createdAt: createdAt ?? this.createdAt, + ); + ActivityActionsData copyWithCompanion(ActivityActionsCompanion data) { + return ActivityActionsData( + id: data.id.present ? data.id.value : this.id, + activityId: + data.activityId.present ? data.activityId.value : this.activityId, + actionId: data.actionId.present ? data.actionId.value : this.actionId, + postition: data.postition.present ? data.postition.value : this.postition, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + ); + } + + @override + String toString() { + return (StringBuffer('ActivityActionsData(') + ..write('id: $id, ') + ..write('activityId: $activityId, ') + ..write('actionId: $actionId, ') + ..write('postition: $postition, ') + ..write('createdAt: $createdAt') + ..write(')')) + .toString(); + } + + @override + int get hashCode => + Object.hash(id, activityId, actionId, postition, createdAt); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is ActivityActionsData && + other.id == this.id && + other.activityId == this.activityId && + other.actionId == this.actionId && + other.postition == this.postition && + other.createdAt == this.createdAt); +} + +class ActivityActionsCompanion extends UpdateCompanion { + final Value id; + final Value activityId; + final Value actionId; + final Value postition; + final Value createdAt; + const ActivityActionsCompanion({ + this.id = const Value.absent(), + this.activityId = const Value.absent(), + this.actionId = const Value.absent(), + this.postition = const Value.absent(), + this.createdAt = const Value.absent(), + }); + ActivityActionsCompanion.insert({ + this.id = const Value.absent(), + required int activityId, + required int actionId, + required int postition, + this.createdAt = const Value.absent(), + }) : activityId = Value(activityId), + actionId = Value(actionId), + postition = Value(postition); + static Insertable custom({ + Expression? id, + Expression? activityId, + Expression? actionId, + Expression? postition, + Expression? createdAt, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (activityId != null) 'activity_id': activityId, + if (actionId != null) 'action_id': actionId, + if (postition != null) 'postition': postition, + if (createdAt != null) 'created_at': createdAt, + }); + } + + ActivityActionsCompanion copyWith( + {Value? id, + Value? activityId, + Value? actionId, + Value? postition, + Value? createdAt}) { + return ActivityActionsCompanion( + id: id ?? this.id, + activityId: activityId ?? this.activityId, + actionId: actionId ?? this.actionId, + postition: postition ?? this.postition, + createdAt: createdAt ?? this.createdAt, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (activityId.present) { + map['activity_id'] = Variable(activityId.value); + } + if (actionId.present) { + map['action_id'] = Variable(actionId.value); + } + if (postition.present) { + map['postition'] = Variable(postition.value); + } + if (createdAt.present) { + map['created_at'] = Variable(createdAt.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('ActivityActionsCompanion(') + ..write('id: $id, ') + ..write('activityId: $activityId, ') + ..write('actionId: $actionId, ') + ..write('postition: $postition, ') + ..write('createdAt: $createdAt') + ..write(')')) + .toString(); + } +} + +class MediaItems extends Table with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + MediaItems(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, false, + hasAutoIncrement: true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT')); + late final GeneratedColumn title = GeneratedColumn( + 'title', aliasedName, false, + additionalChecks: + GeneratedColumn.checkTextLength(minTextLength: 3, maxTextLength: 32), + type: DriftSqlType.string, + requiredDuringInsert: true); + late final GeneratedColumn description = GeneratedColumn( + 'body', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn reference = GeneratedColumn( + 'reference', aliasedName, false, + additionalChecks: + GeneratedColumn.checkTextLength(minTextLength: 3, maxTextLength: 256), + type: DriftSqlType.string, + requiredDuringInsert: true); + late final GeneratedColumn type = GeneratedColumn( + 'type', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn createdAt = GeneratedColumn( + 'created_at', aliasedName, false, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + defaultValue: Variable(DateTime.now())); + @override + List get $columns => + [id, title, description, reference, type, createdAt]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'media_items'; + @override + Set get $primaryKey => {id}; + @override + MediaItemsData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return MediaItemsData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id'])!, + title: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}title'])!, + description: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}body'])!, + reference: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}reference'])!, + type: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}type'])!, + createdAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!, + ); + } + + @override + MediaItems createAlias(String alias) { + return MediaItems(attachedDatabase, alias); + } +} + +class MediaItemsData extends DataClass implements Insertable { + final int id; + final String title; + final String description; + final String reference; + final String type; + final DateTime createdAt; + const MediaItemsData( + {required this.id, + required this.title, + required this.description, + required this.reference, + required this.type, + required this.createdAt}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['title'] = Variable(title); + map['body'] = Variable(description); + map['reference'] = Variable(reference); + map['type'] = Variable(type); + map['created_at'] = Variable(createdAt); + return map; + } + + MediaItemsCompanion toCompanion(bool nullToAbsent) { + return MediaItemsCompanion( + id: Value(id), + title: Value(title), + description: Value(description), + reference: Value(reference), + type: Value(type), + createdAt: Value(createdAt), + ); + } + + factory MediaItemsData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return MediaItemsData( + id: serializer.fromJson(json['id']), + title: serializer.fromJson(json['title']), + description: serializer.fromJson(json['description']), + reference: serializer.fromJson(json['reference']), + type: serializer.fromJson(json['type']), + createdAt: serializer.fromJson(json['createdAt']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'title': serializer.toJson(title), + 'description': serializer.toJson(description), + 'reference': serializer.toJson(reference), + 'type': serializer.toJson(type), + 'createdAt': serializer.toJson(createdAt), + }; + } + + MediaItemsData copyWith( + {int? id, + String? title, + String? description, + String? reference, + String? type, + DateTime? createdAt}) => + MediaItemsData( + id: id ?? this.id, + title: title ?? this.title, + description: description ?? this.description, + reference: reference ?? this.reference, + type: type ?? this.type, + createdAt: createdAt ?? this.createdAt, + ); + MediaItemsData copyWithCompanion(MediaItemsCompanion data) { + return MediaItemsData( + id: data.id.present ? data.id.value : this.id, + title: data.title.present ? data.title.value : this.title, + description: + data.description.present ? data.description.value : this.description, + reference: data.reference.present ? data.reference.value : this.reference, + type: data.type.present ? data.type.value : this.type, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + ); + } + + @override + String toString() { + return (StringBuffer('MediaItemsData(') + ..write('id: $id, ') + ..write('title: $title, ') + ..write('description: $description, ') + ..write('reference: $reference, ') + ..write('type: $type, ') + ..write('createdAt: $createdAt') + ..write(')')) + .toString(); + } + + @override + int get hashCode => + Object.hash(id, title, description, reference, type, createdAt); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is MediaItemsData && + other.id == this.id && + other.title == this.title && + other.description == this.description && + other.reference == this.reference && + other.type == this.type && + other.createdAt == this.createdAt); +} + +class MediaItemsCompanion extends UpdateCompanion { + final Value id; + final Value title; + final Value description; + final Value reference; + final Value type; + final Value createdAt; + const MediaItemsCompanion({ + this.id = const Value.absent(), + this.title = const Value.absent(), + this.description = const Value.absent(), + this.reference = const Value.absent(), + this.type = const Value.absent(), + this.createdAt = const Value.absent(), + }); + MediaItemsCompanion.insert({ + this.id = const Value.absent(), + required String title, + required String description, + required String reference, + required String type, + this.createdAt = const Value.absent(), + }) : title = Value(title), + description = Value(description), + reference = Value(reference), + type = Value(type); + static Insertable custom({ + Expression? id, + Expression? title, + Expression? description, + Expression? reference, + Expression? type, + Expression? createdAt, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (title != null) 'title': title, + if (description != null) 'body': description, + if (reference != null) 'reference': reference, + if (type != null) 'type': type, + if (createdAt != null) 'created_at': createdAt, + }); + } + + MediaItemsCompanion copyWith( + {Value? id, + Value? title, + Value? description, + Value? reference, + Value? type, + Value? createdAt}) { + return MediaItemsCompanion( + id: id ?? this.id, + title: title ?? this.title, + description: description ?? this.description, + reference: reference ?? this.reference, + type: type ?? this.type, + createdAt: createdAt ?? this.createdAt, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (title.present) { + map['title'] = Variable(title.value); + } + if (description.present) { + map['body'] = Variable(description.value); + } + if (reference.present) { + map['reference'] = Variable(reference.value); + } + if (type.present) { + map['type'] = Variable(type.value); + } + if (createdAt.present) { + map['created_at'] = Variable(createdAt.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('MediaItemsCompanion(') + ..write('id: $id, ') + ..write('title: $title, ') + ..write('description: $description, ') + ..write('reference: $reference, ') + ..write('type: $type, ') + ..write('createdAt: $createdAt') + ..write(')')) + .toString(); + } +} + +class ObjectMediaItems extends Table + with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + ObjectMediaItems(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, false, + hasAutoIncrement: true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT')); + late final GeneratedColumn objectId = GeneratedColumn( + 'object_id', aliasedName, false, + type: DriftSqlType.int, requiredDuringInsert: true); + late final GeneratedColumn objectType = GeneratedColumn( + 'object_type', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn mediaId = GeneratedColumn( + 'media_id', aliasedName, false, + type: DriftSqlType.int, + requiredDuringInsert: true, + defaultConstraints: + GeneratedColumn.constraintIsAlways('REFERENCES media_items (id)')); + late final GeneratedColumn createdAt = GeneratedColumn( + 'created_at', aliasedName, false, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + defaultValue: Variable(DateTime.now())); + @override + List get $columns => + [id, objectId, objectType, mediaId, createdAt]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'object_media_items'; + @override + Set get $primaryKey => {id}; + @override + ObjectMediaItemsData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return ObjectMediaItemsData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id'])!, + objectId: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}object_id'])!, + objectType: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}object_type'])!, + mediaId: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}media_id'])!, + createdAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!, + ); + } + + @override + ObjectMediaItems createAlias(String alias) { + return ObjectMediaItems(attachedDatabase, alias); + } +} + +class ObjectMediaItemsData extends DataClass + implements Insertable { + final int id; + final int objectId; + final String objectType; + final int mediaId; + final DateTime createdAt; + const ObjectMediaItemsData( + {required this.id, + required this.objectId, + required this.objectType, + required this.mediaId, + required this.createdAt}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['object_id'] = Variable(objectId); + map['object_type'] = Variable(objectType); + map['media_id'] = Variable(mediaId); + map['created_at'] = Variable(createdAt); + return map; + } + + ObjectMediaItemsCompanion toCompanion(bool nullToAbsent) { + return ObjectMediaItemsCompanion( + id: Value(id), + objectId: Value(objectId), + objectType: Value(objectType), + mediaId: Value(mediaId), + createdAt: Value(createdAt), + ); + } + + factory ObjectMediaItemsData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return ObjectMediaItemsData( + id: serializer.fromJson(json['id']), + objectId: serializer.fromJson(json['objectId']), + objectType: serializer.fromJson(json['objectType']), + mediaId: serializer.fromJson(json['mediaId']), + createdAt: serializer.fromJson(json['createdAt']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'objectId': serializer.toJson(objectId), + 'objectType': serializer.toJson(objectType), + 'mediaId': serializer.toJson(mediaId), + 'createdAt': serializer.toJson(createdAt), + }; + } + + ObjectMediaItemsData copyWith( + {int? id, + int? objectId, + String? objectType, + int? mediaId, + DateTime? createdAt}) => + ObjectMediaItemsData( + id: id ?? this.id, + objectId: objectId ?? this.objectId, + objectType: objectType ?? this.objectType, + mediaId: mediaId ?? this.mediaId, + createdAt: createdAt ?? this.createdAt, + ); + ObjectMediaItemsData copyWithCompanion(ObjectMediaItemsCompanion data) { + return ObjectMediaItemsData( + id: data.id.present ? data.id.value : this.id, + objectId: data.objectId.present ? data.objectId.value : this.objectId, + objectType: + data.objectType.present ? data.objectType.value : this.objectType, + mediaId: data.mediaId.present ? data.mediaId.value : this.mediaId, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + ); + } + + @override + String toString() { + return (StringBuffer('ObjectMediaItemsData(') + ..write('id: $id, ') + ..write('objectId: $objectId, ') + ..write('objectType: $objectType, ') + ..write('mediaId: $mediaId, ') + ..write('createdAt: $createdAt') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(id, objectId, objectType, mediaId, createdAt); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is ObjectMediaItemsData && + other.id == this.id && + other.objectId == this.objectId && + other.objectType == this.objectType && + other.mediaId == this.mediaId && + other.createdAt == this.createdAt); +} + +class ObjectMediaItemsCompanion extends UpdateCompanion { + final Value id; + final Value objectId; + final Value objectType; + final Value mediaId; + final Value createdAt; + const ObjectMediaItemsCompanion({ + this.id = const Value.absent(), + this.objectId = const Value.absent(), + this.objectType = const Value.absent(), + this.mediaId = const Value.absent(), + this.createdAt = const Value.absent(), + }); + ObjectMediaItemsCompanion.insert({ + this.id = const Value.absent(), + required int objectId, + required String objectType, + required int mediaId, + this.createdAt = const Value.absent(), + }) : objectId = Value(objectId), + objectType = Value(objectType), + mediaId = Value(mediaId); + static Insertable custom({ + Expression? id, + Expression? objectId, + Expression? objectType, + Expression? mediaId, + Expression? createdAt, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (objectId != null) 'object_id': objectId, + if (objectType != null) 'object_type': objectType, + if (mediaId != null) 'media_id': mediaId, + if (createdAt != null) 'created_at': createdAt, + }); + } + + ObjectMediaItemsCompanion copyWith( + {Value? id, + Value? objectId, + Value? objectType, + Value? mediaId, + Value? createdAt}) { + return ObjectMediaItemsCompanion( + id: id ?? this.id, + objectId: objectId ?? this.objectId, + objectType: objectType ?? this.objectType, + mediaId: mediaId ?? this.mediaId, + createdAt: createdAt ?? this.createdAt, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (objectId.present) { + map['object_id'] = Variable(objectId.value); + } + if (objectType.present) { + map['object_type'] = Variable(objectType.value); + } + if (mediaId.present) { + map['media_id'] = Variable(mediaId.value); + } + if (createdAt.present) { + map['created_at'] = Variable(createdAt.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('ObjectMediaItemsCompanion(') + ..write('id: $id, ') + ..write('objectId: $objectId, ') + ..write('objectType: $objectType, ') + ..write('mediaId: $mediaId, ') + ..write('createdAt: $createdAt') + ..write(')')) + .toString(); + } +} + +class DatabaseAtV3 extends GeneratedDatabase { + DatabaseAtV3(QueryExecutor e) : super(e); + late final Sessions sessions = Sessions(this); + late final Activities activities = Activities(this); + late final SessionActivities sessionActivities = SessionActivities(this); + late final Actions actions = Actions(this); + late final ActivityActions activityActions = ActivityActions(this); + late final MediaItems mediaItems = MediaItems(this); + late final ObjectMediaItems objectMediaItems = ObjectMediaItems(this); + @override + Iterable> get allTables => + allSchemaEntities.whereType>(); + @override + List get allSchemaEntities => [ + sessions, + activities, + sessionActivities, + actions, + activityActions, + mediaItems, + objectMediaItems + ]; + @override + int get schemaVersion => 3; +} diff --git a/test/drift/sendtrain/generated/schema_v4.dart b/test/drift/sendtrain/generated/schema_v4.dart new file mode 100644 index 0000000..f28bf33 --- /dev/null +++ b/test/drift/sendtrain/generated/schema_v4.dart @@ -0,0 +1,1977 @@ +// dart format width=80 +// GENERATED CODE, DO NOT EDIT BY HAND. +// ignore_for_file: type=lint +import 'package:drift/drift.dart'; + +class Sessions extends Table with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + Sessions(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, false, + hasAutoIncrement: true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT')); + late final GeneratedColumn title = GeneratedColumn( + 'title', aliasedName, false, + additionalChecks: + GeneratedColumn.checkTextLength(minTextLength: 3, maxTextLength: 32), + type: DriftSqlType.string, + requiredDuringInsert: true); + late final GeneratedColumn content = GeneratedColumn( + 'body', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn status = GeneratedColumn( + 'status', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn date = GeneratedColumn( + 'date', aliasedName, true, + type: DriftSqlType.dateTime, requiredDuringInsert: false); + late final GeneratedColumn createdAt = GeneratedColumn( + 'created_at', aliasedName, false, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + defaultValue: Variable(DateTime.now())); + @override + List get $columns => + [id, title, content, status, date, createdAt]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'sessions'; + @override + Set get $primaryKey => {id}; + @override + SessionsData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return SessionsData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id'])!, + title: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}title'])!, + content: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}body'])!, + status: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}status'])!, + date: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}date']), + createdAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!, + ); + } + + @override + Sessions createAlias(String alias) { + return Sessions(attachedDatabase, alias); + } +} + +class SessionsData extends DataClass implements Insertable { + final int id; + final String title; + final String content; + final String status; + final DateTime? date; + final DateTime createdAt; + const SessionsData( + {required this.id, + required this.title, + required this.content, + required this.status, + this.date, + required this.createdAt}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['title'] = Variable(title); + map['body'] = Variable(content); + map['status'] = Variable(status); + if (!nullToAbsent || date != null) { + map['date'] = Variable(date); + } + map['created_at'] = Variable(createdAt); + return map; + } + + SessionsCompanion toCompanion(bool nullToAbsent) { + return SessionsCompanion( + id: Value(id), + title: Value(title), + content: Value(content), + status: Value(status), + date: date == null && nullToAbsent ? const Value.absent() : Value(date), + createdAt: Value(createdAt), + ); + } + + factory SessionsData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return SessionsData( + id: serializer.fromJson(json['id']), + title: serializer.fromJson(json['title']), + content: serializer.fromJson(json['content']), + status: serializer.fromJson(json['status']), + date: serializer.fromJson(json['date']), + createdAt: serializer.fromJson(json['createdAt']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'title': serializer.toJson(title), + 'content': serializer.toJson(content), + 'status': serializer.toJson(status), + 'date': serializer.toJson(date), + 'createdAt': serializer.toJson(createdAt), + }; + } + + SessionsData copyWith( + {int? id, + String? title, + String? content, + String? status, + Value date = const Value.absent(), + DateTime? createdAt}) => + SessionsData( + id: id ?? this.id, + title: title ?? this.title, + content: content ?? this.content, + status: status ?? this.status, + date: date.present ? date.value : this.date, + createdAt: createdAt ?? this.createdAt, + ); + SessionsData copyWithCompanion(SessionsCompanion data) { + return SessionsData( + id: data.id.present ? data.id.value : this.id, + title: data.title.present ? data.title.value : this.title, + content: data.content.present ? data.content.value : this.content, + status: data.status.present ? data.status.value : this.status, + date: data.date.present ? data.date.value : this.date, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + ); + } + + @override + String toString() { + return (StringBuffer('SessionsData(') + ..write('id: $id, ') + ..write('title: $title, ') + ..write('content: $content, ') + ..write('status: $status, ') + ..write('date: $date, ') + ..write('createdAt: $createdAt') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(id, title, content, status, date, createdAt); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is SessionsData && + other.id == this.id && + other.title == this.title && + other.content == this.content && + other.status == this.status && + other.date == this.date && + other.createdAt == this.createdAt); +} + +class SessionsCompanion extends UpdateCompanion { + final Value id; + final Value title; + final Value content; + final Value status; + final Value date; + final Value createdAt; + const SessionsCompanion({ + this.id = const Value.absent(), + this.title = const Value.absent(), + this.content = const Value.absent(), + this.status = const Value.absent(), + this.date = const Value.absent(), + this.createdAt = const Value.absent(), + }); + SessionsCompanion.insert({ + this.id = const Value.absent(), + required String title, + required String content, + required String status, + this.date = const Value.absent(), + this.createdAt = const Value.absent(), + }) : title = Value(title), + content = Value(content), + status = Value(status); + static Insertable custom({ + Expression? id, + Expression? title, + Expression? content, + Expression? status, + Expression? date, + Expression? createdAt, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (title != null) 'title': title, + if (content != null) 'body': content, + if (status != null) 'status': status, + if (date != null) 'date': date, + if (createdAt != null) 'created_at': createdAt, + }); + } + + SessionsCompanion copyWith( + {Value? id, + Value? title, + Value? content, + Value? status, + Value? date, + Value? createdAt}) { + return SessionsCompanion( + id: id ?? this.id, + title: title ?? this.title, + content: content ?? this.content, + status: status ?? this.status, + date: date ?? this.date, + createdAt: createdAt ?? this.createdAt, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (title.present) { + map['title'] = Variable(title.value); + } + if (content.present) { + map['body'] = Variable(content.value); + } + if (status.present) { + map['status'] = Variable(status.value); + } + if (date.present) { + map['date'] = Variable(date.value); + } + if (createdAt.present) { + map['created_at'] = Variable(createdAt.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('SessionsCompanion(') + ..write('id: $id, ') + ..write('title: $title, ') + ..write('content: $content, ') + ..write('status: $status, ') + ..write('date: $date, ') + ..write('createdAt: $createdAt') + ..write(')')) + .toString(); + } +} + +class Activities extends Table with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + Activities(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, false, + hasAutoIncrement: true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT')); + late final GeneratedColumn title = GeneratedColumn( + 'title', aliasedName, false, + additionalChecks: + GeneratedColumn.checkTextLength(minTextLength: 3, maxTextLength: 32), + type: DriftSqlType.string, + requiredDuringInsert: true); + late final GeneratedColumn type = GeneratedColumn( + 'type', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn description = GeneratedColumn( + 'body', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn category = GeneratedColumn( + 'category', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn createdAt = GeneratedColumn( + 'created_at', aliasedName, false, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + defaultValue: Variable(DateTime.now())); + @override + List get $columns => + [id, title, type, description, category, createdAt]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'activities'; + @override + Set get $primaryKey => {id}; + @override + ActivitiesData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return ActivitiesData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id'])!, + title: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}title'])!, + type: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}type'])!, + description: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}body'])!, + category: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}category'])!, + createdAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!, + ); + } + + @override + Activities createAlias(String alias) { + return Activities(attachedDatabase, alias); + } +} + +class ActivitiesData extends DataClass implements Insertable { + final int id; + final String title; + final String type; + final String description; + final String category; + final DateTime createdAt; + const ActivitiesData( + {required this.id, + required this.title, + required this.type, + required this.description, + required this.category, + required this.createdAt}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['title'] = Variable(title); + map['type'] = Variable(type); + map['body'] = Variable(description); + map['category'] = Variable(category); + map['created_at'] = Variable(createdAt); + return map; + } + + ActivitiesCompanion toCompanion(bool nullToAbsent) { + return ActivitiesCompanion( + id: Value(id), + title: Value(title), + type: Value(type), + description: Value(description), + category: Value(category), + createdAt: Value(createdAt), + ); + } + + factory ActivitiesData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return ActivitiesData( + id: serializer.fromJson(json['id']), + title: serializer.fromJson(json['title']), + type: serializer.fromJson(json['type']), + description: serializer.fromJson(json['description']), + category: serializer.fromJson(json['category']), + createdAt: serializer.fromJson(json['createdAt']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'title': serializer.toJson(title), + 'type': serializer.toJson(type), + 'description': serializer.toJson(description), + 'category': serializer.toJson(category), + 'createdAt': serializer.toJson(createdAt), + }; + } + + ActivitiesData copyWith( + {int? id, + String? title, + String? type, + String? description, + String? category, + DateTime? createdAt}) => + ActivitiesData( + id: id ?? this.id, + title: title ?? this.title, + type: type ?? this.type, + description: description ?? this.description, + category: category ?? this.category, + createdAt: createdAt ?? this.createdAt, + ); + ActivitiesData copyWithCompanion(ActivitiesCompanion data) { + return ActivitiesData( + id: data.id.present ? data.id.value : this.id, + title: data.title.present ? data.title.value : this.title, + type: data.type.present ? data.type.value : this.type, + description: + data.description.present ? data.description.value : this.description, + category: data.category.present ? data.category.value : this.category, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + ); + } + + @override + String toString() { + return (StringBuffer('ActivitiesData(') + ..write('id: $id, ') + ..write('title: $title, ') + ..write('type: $type, ') + ..write('description: $description, ') + ..write('category: $category, ') + ..write('createdAt: $createdAt') + ..write(')')) + .toString(); + } + + @override + int get hashCode => + Object.hash(id, title, type, description, category, createdAt); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is ActivitiesData && + other.id == this.id && + other.title == this.title && + other.type == this.type && + other.description == this.description && + other.category == this.category && + other.createdAt == this.createdAt); +} + +class ActivitiesCompanion extends UpdateCompanion { + final Value id; + final Value title; + final Value type; + final Value description; + final Value category; + final Value createdAt; + const ActivitiesCompanion({ + this.id = const Value.absent(), + this.title = const Value.absent(), + this.type = const Value.absent(), + this.description = const Value.absent(), + this.category = const Value.absent(), + this.createdAt = const Value.absent(), + }); + ActivitiesCompanion.insert({ + this.id = const Value.absent(), + required String title, + required String type, + required String description, + required String category, + this.createdAt = const Value.absent(), + }) : title = Value(title), + type = Value(type), + description = Value(description), + category = Value(category); + static Insertable custom({ + Expression? id, + Expression? title, + Expression? type, + Expression? description, + Expression? category, + Expression? createdAt, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (title != null) 'title': title, + if (type != null) 'type': type, + if (description != null) 'body': description, + if (category != null) 'category': category, + if (createdAt != null) 'created_at': createdAt, + }); + } + + ActivitiesCompanion copyWith( + {Value? id, + Value? title, + Value? type, + Value? description, + Value? category, + Value? createdAt}) { + return ActivitiesCompanion( + id: id ?? this.id, + title: title ?? this.title, + type: type ?? this.type, + description: description ?? this.description, + category: category ?? this.category, + createdAt: createdAt ?? this.createdAt, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (title.present) { + map['title'] = Variable(title.value); + } + if (type.present) { + map['type'] = Variable(type.value); + } + if (description.present) { + map['body'] = Variable(description.value); + } + if (category.present) { + map['category'] = Variable(category.value); + } + if (createdAt.present) { + map['created_at'] = Variable(createdAt.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('ActivitiesCompanion(') + ..write('id: $id, ') + ..write('title: $title, ') + ..write('type: $type, ') + ..write('description: $description, ') + ..write('category: $category, ') + ..write('createdAt: $createdAt') + ..write(')')) + .toString(); + } +} + +class SessionActivities extends Table + with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + SessionActivities(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, false, + hasAutoIncrement: true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT')); + late final GeneratedColumn sessionId = GeneratedColumn( + 'session_id', aliasedName, false, + type: DriftSqlType.int, + requiredDuringInsert: true, + defaultConstraints: + GeneratedColumn.constraintIsAlways('REFERENCES sessions (id)')); + late final GeneratedColumn activityId = GeneratedColumn( + 'activity_id', aliasedName, false, + type: DriftSqlType.int, + requiredDuringInsert: true, + defaultConstraints: + GeneratedColumn.constraintIsAlways('REFERENCES activities (id)')); + late final GeneratedColumn position = GeneratedColumn( + 'position', aliasedName, false, + type: DriftSqlType.int, requiredDuringInsert: true); + late final GeneratedColumn results = GeneratedColumn( + 'results', aliasedName, true, + type: DriftSqlType.string, requiredDuringInsert: false); + late final GeneratedColumn achievements = GeneratedColumn( + 'achievements', aliasedName, true, + type: DriftSqlType.string, requiredDuringInsert: false); + late final GeneratedColumn createdAt = GeneratedColumn( + 'created_at', aliasedName, false, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + defaultValue: Variable(DateTime.now())); + @override + List get $columns => + [id, sessionId, activityId, position, results, achievements, createdAt]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'session_activities'; + @override + Set get $primaryKey => {id}; + @override + SessionActivitiesData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return SessionActivitiesData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id'])!, + sessionId: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}session_id'])!, + activityId: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}activity_id'])!, + position: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}position'])!, + results: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}results']), + achievements: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}achievements']), + createdAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!, + ); + } + + @override + SessionActivities createAlias(String alias) { + return SessionActivities(attachedDatabase, alias); + } +} + +class SessionActivitiesData extends DataClass + implements Insertable { + final int id; + final int sessionId; + final int activityId; + final int position; + final String? results; + final String? achievements; + final DateTime createdAt; + const SessionActivitiesData( + {required this.id, + required this.sessionId, + required this.activityId, + required this.position, + this.results, + this.achievements, + required this.createdAt}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['session_id'] = Variable(sessionId); + map['activity_id'] = Variable(activityId); + map['position'] = Variable(position); + if (!nullToAbsent || results != null) { + map['results'] = Variable(results); + } + if (!nullToAbsent || achievements != null) { + map['achievements'] = Variable(achievements); + } + map['created_at'] = Variable(createdAt); + return map; + } + + SessionActivitiesCompanion toCompanion(bool nullToAbsent) { + return SessionActivitiesCompanion( + id: Value(id), + sessionId: Value(sessionId), + activityId: Value(activityId), + position: Value(position), + results: results == null && nullToAbsent + ? const Value.absent() + : Value(results), + achievements: achievements == null && nullToAbsent + ? const Value.absent() + : Value(achievements), + createdAt: Value(createdAt), + ); + } + + factory SessionActivitiesData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return SessionActivitiesData( + id: serializer.fromJson(json['id']), + sessionId: serializer.fromJson(json['sessionId']), + activityId: serializer.fromJson(json['activityId']), + position: serializer.fromJson(json['position']), + results: serializer.fromJson(json['results']), + achievements: serializer.fromJson(json['achievements']), + createdAt: serializer.fromJson(json['createdAt']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'sessionId': serializer.toJson(sessionId), + 'activityId': serializer.toJson(activityId), + 'position': serializer.toJson(position), + 'results': serializer.toJson(results), + 'achievements': serializer.toJson(achievements), + 'createdAt': serializer.toJson(createdAt), + }; + } + + SessionActivitiesData copyWith( + {int? id, + int? sessionId, + int? activityId, + int? position, + Value results = const Value.absent(), + Value achievements = const Value.absent(), + DateTime? createdAt}) => + SessionActivitiesData( + id: id ?? this.id, + sessionId: sessionId ?? this.sessionId, + activityId: activityId ?? this.activityId, + position: position ?? this.position, + results: results.present ? results.value : this.results, + achievements: + achievements.present ? achievements.value : this.achievements, + createdAt: createdAt ?? this.createdAt, + ); + SessionActivitiesData copyWithCompanion(SessionActivitiesCompanion data) { + return SessionActivitiesData( + id: data.id.present ? data.id.value : this.id, + sessionId: data.sessionId.present ? data.sessionId.value : this.sessionId, + activityId: + data.activityId.present ? data.activityId.value : this.activityId, + position: data.position.present ? data.position.value : this.position, + results: data.results.present ? data.results.value : this.results, + achievements: data.achievements.present + ? data.achievements.value + : this.achievements, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + ); + } + + @override + String toString() { + return (StringBuffer('SessionActivitiesData(') + ..write('id: $id, ') + ..write('sessionId: $sessionId, ') + ..write('activityId: $activityId, ') + ..write('position: $position, ') + ..write('results: $results, ') + ..write('achievements: $achievements, ') + ..write('createdAt: $createdAt') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash( + id, sessionId, activityId, position, results, achievements, createdAt); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is SessionActivitiesData && + other.id == this.id && + other.sessionId == this.sessionId && + other.activityId == this.activityId && + other.position == this.position && + other.results == this.results && + other.achievements == this.achievements && + other.createdAt == this.createdAt); +} + +class SessionActivitiesCompanion + extends UpdateCompanion { + final Value id; + final Value sessionId; + final Value activityId; + final Value position; + final Value results; + final Value achievements; + final Value createdAt; + const SessionActivitiesCompanion({ + this.id = const Value.absent(), + this.sessionId = const Value.absent(), + this.activityId = const Value.absent(), + this.position = const Value.absent(), + this.results = const Value.absent(), + this.achievements = const Value.absent(), + this.createdAt = const Value.absent(), + }); + SessionActivitiesCompanion.insert({ + this.id = const Value.absent(), + required int sessionId, + required int activityId, + required int position, + this.results = const Value.absent(), + this.achievements = const Value.absent(), + this.createdAt = const Value.absent(), + }) : sessionId = Value(sessionId), + activityId = Value(activityId), + position = Value(position); + static Insertable custom({ + Expression? id, + Expression? sessionId, + Expression? activityId, + Expression? position, + Expression? results, + Expression? achievements, + Expression? createdAt, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (sessionId != null) 'session_id': sessionId, + if (activityId != null) 'activity_id': activityId, + if (position != null) 'position': position, + if (results != null) 'results': results, + if (achievements != null) 'achievements': achievements, + if (createdAt != null) 'created_at': createdAt, + }); + } + + SessionActivitiesCompanion copyWith( + {Value? id, + Value? sessionId, + Value? activityId, + Value? position, + Value? results, + Value? achievements, + Value? createdAt}) { + return SessionActivitiesCompanion( + id: id ?? this.id, + sessionId: sessionId ?? this.sessionId, + activityId: activityId ?? this.activityId, + position: position ?? this.position, + results: results ?? this.results, + achievements: achievements ?? this.achievements, + createdAt: createdAt ?? this.createdAt, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (sessionId.present) { + map['session_id'] = Variable(sessionId.value); + } + if (activityId.present) { + map['activity_id'] = Variable(activityId.value); + } + if (position.present) { + map['position'] = Variable(position.value); + } + if (results.present) { + map['results'] = Variable(results.value); + } + if (achievements.present) { + map['achievements'] = Variable(achievements.value); + } + if (createdAt.present) { + map['created_at'] = Variable(createdAt.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('SessionActivitiesCompanion(') + ..write('id: $id, ') + ..write('sessionId: $sessionId, ') + ..write('activityId: $activityId, ') + ..write('position: $position, ') + ..write('results: $results, ') + ..write('achievements: $achievements, ') + ..write('createdAt: $createdAt') + ..write(')')) + .toString(); + } +} + +class Actions extends Table with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + Actions(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, false, + hasAutoIncrement: true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT')); + late final GeneratedColumn title = GeneratedColumn( + 'title', aliasedName, false, + additionalChecks: + GeneratedColumn.checkTextLength(minTextLength: 3, maxTextLength: 32), + type: DriftSqlType.string, + requiredDuringInsert: true); + late final GeneratedColumn description = GeneratedColumn( + 'body', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn set = GeneratedColumn( + 'set', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn createdAt = GeneratedColumn( + 'created_at', aliasedName, false, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + defaultValue: Variable(DateTime.now())); + @override + List get $columns => + [id, title, description, set, createdAt]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'actions'; + @override + Set get $primaryKey => {id}; + @override + ActionsData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return ActionsData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id'])!, + title: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}title'])!, + description: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}body'])!, + set: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}set'])!, + createdAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!, + ); + } + + @override + Actions createAlias(String alias) { + return Actions(attachedDatabase, alias); + } +} + +class ActionsData extends DataClass implements Insertable { + final int id; + final String title; + final String description; + final String set; + final DateTime createdAt; + const ActionsData( + {required this.id, + required this.title, + required this.description, + required this.set, + required this.createdAt}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['title'] = Variable(title); + map['body'] = Variable(description); + map['set'] = Variable(set); + map['created_at'] = Variable(createdAt); + return map; + } + + ActionsCompanion toCompanion(bool nullToAbsent) { + return ActionsCompanion( + id: Value(id), + title: Value(title), + description: Value(description), + set: Value(set), + createdAt: Value(createdAt), + ); + } + + factory ActionsData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return ActionsData( + id: serializer.fromJson(json['id']), + title: serializer.fromJson(json['title']), + description: serializer.fromJson(json['description']), + set: serializer.fromJson(json['set']), + createdAt: serializer.fromJson(json['createdAt']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'title': serializer.toJson(title), + 'description': serializer.toJson(description), + 'set': serializer.toJson(set), + 'createdAt': serializer.toJson(createdAt), + }; + } + + ActionsData copyWith( + {int? id, + String? title, + String? description, + String? set, + DateTime? createdAt}) => + ActionsData( + id: id ?? this.id, + title: title ?? this.title, + description: description ?? this.description, + set: set ?? this.set, + createdAt: createdAt ?? this.createdAt, + ); + ActionsData copyWithCompanion(ActionsCompanion data) { + return ActionsData( + id: data.id.present ? data.id.value : this.id, + title: data.title.present ? data.title.value : this.title, + description: + data.description.present ? data.description.value : this.description, + set: data.set.present ? data.set.value : this.set, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + ); + } + + @override + String toString() { + return (StringBuffer('ActionsData(') + ..write('id: $id, ') + ..write('title: $title, ') + ..write('description: $description, ') + ..write('set: $set, ') + ..write('createdAt: $createdAt') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(id, title, description, set, createdAt); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is ActionsData && + other.id == this.id && + other.title == this.title && + other.description == this.description && + other.set == this.set && + other.createdAt == this.createdAt); +} + +class ActionsCompanion extends UpdateCompanion { + final Value id; + final Value title; + final Value description; + final Value set; + final Value createdAt; + const ActionsCompanion({ + this.id = const Value.absent(), + this.title = const Value.absent(), + this.description = const Value.absent(), + this.set = const Value.absent(), + this.createdAt = const Value.absent(), + }); + ActionsCompanion.insert({ + this.id = const Value.absent(), + required String title, + required String description, + required String set, + this.createdAt = const Value.absent(), + }) : title = Value(title), + description = Value(description), + set = Value(set); + static Insertable custom({ + Expression? id, + Expression? title, + Expression? description, + Expression? set, + Expression? createdAt, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (title != null) 'title': title, + if (description != null) 'body': description, + if (set != null) 'set': set, + if (createdAt != null) 'created_at': createdAt, + }); + } + + ActionsCompanion copyWith( + {Value? id, + Value? title, + Value? description, + Value? set, + Value? createdAt}) { + return ActionsCompanion( + id: id ?? this.id, + title: title ?? this.title, + description: description ?? this.description, + set: set ?? this.set, + createdAt: createdAt ?? this.createdAt, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (title.present) { + map['title'] = Variable(title.value); + } + if (description.present) { + map['body'] = Variable(description.value); + } + if (set.present) { + map['set'] = Variable(set.value); + } + if (createdAt.present) { + map['created_at'] = Variable(createdAt.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('ActionsCompanion(') + ..write('id: $id, ') + ..write('title: $title, ') + ..write('description: $description, ') + ..write('set: $set, ') + ..write('createdAt: $createdAt') + ..write(')')) + .toString(); + } +} + +class ActivityActions extends Table + with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + ActivityActions(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, false, + hasAutoIncrement: true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT')); + late final GeneratedColumn activityId = GeneratedColumn( + 'activity_id', aliasedName, false, + type: DriftSqlType.int, + requiredDuringInsert: true, + defaultConstraints: + GeneratedColumn.constraintIsAlways('REFERENCES activities (id)')); + late final GeneratedColumn actionId = GeneratedColumn( + 'action_id', aliasedName, false, + type: DriftSqlType.int, + requiredDuringInsert: true, + defaultConstraints: + GeneratedColumn.constraintIsAlways('REFERENCES actions (id)')); + late final GeneratedColumn position = GeneratedColumn( + 'position', aliasedName, false, + type: DriftSqlType.int, requiredDuringInsert: true); + late final GeneratedColumn createdAt = GeneratedColumn( + 'created_at', aliasedName, false, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + defaultValue: Variable(DateTime.now())); + @override + List get $columns => + [id, activityId, actionId, position, createdAt]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'activity_actions'; + @override + Set get $primaryKey => {id}; + @override + ActivityActionsData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return ActivityActionsData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id'])!, + activityId: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}activity_id'])!, + actionId: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}action_id'])!, + position: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}position'])!, + createdAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!, + ); + } + + @override + ActivityActions createAlias(String alias) { + return ActivityActions(attachedDatabase, alias); + } +} + +class ActivityActionsData extends DataClass + implements Insertable { + final int id; + final int activityId; + final int actionId; + final int position; + final DateTime createdAt; + const ActivityActionsData( + {required this.id, + required this.activityId, + required this.actionId, + required this.position, + required this.createdAt}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['activity_id'] = Variable(activityId); + map['action_id'] = Variable(actionId); + map['position'] = Variable(position); + map['created_at'] = Variable(createdAt); + return map; + } + + ActivityActionsCompanion toCompanion(bool nullToAbsent) { + return ActivityActionsCompanion( + id: Value(id), + activityId: Value(activityId), + actionId: Value(actionId), + position: Value(position), + createdAt: Value(createdAt), + ); + } + + factory ActivityActionsData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return ActivityActionsData( + id: serializer.fromJson(json['id']), + activityId: serializer.fromJson(json['activityId']), + actionId: serializer.fromJson(json['actionId']), + position: serializer.fromJson(json['position']), + createdAt: serializer.fromJson(json['createdAt']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'activityId': serializer.toJson(activityId), + 'actionId': serializer.toJson(actionId), + 'position': serializer.toJson(position), + 'createdAt': serializer.toJson(createdAt), + }; + } + + ActivityActionsData copyWith( + {int? id, + int? activityId, + int? actionId, + int? position, + DateTime? createdAt}) => + ActivityActionsData( + id: id ?? this.id, + activityId: activityId ?? this.activityId, + actionId: actionId ?? this.actionId, + position: position ?? this.position, + createdAt: createdAt ?? this.createdAt, + ); + ActivityActionsData copyWithCompanion(ActivityActionsCompanion data) { + return ActivityActionsData( + id: data.id.present ? data.id.value : this.id, + activityId: + data.activityId.present ? data.activityId.value : this.activityId, + actionId: data.actionId.present ? data.actionId.value : this.actionId, + position: data.position.present ? data.position.value : this.position, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + ); + } + + @override + String toString() { + return (StringBuffer('ActivityActionsData(') + ..write('id: $id, ') + ..write('activityId: $activityId, ') + ..write('actionId: $actionId, ') + ..write('position: $position, ') + ..write('createdAt: $createdAt') + ..write(')')) + .toString(); + } + + @override + int get hashCode => + Object.hash(id, activityId, actionId, position, createdAt); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is ActivityActionsData && + other.id == this.id && + other.activityId == this.activityId && + other.actionId == this.actionId && + other.position == this.position && + other.createdAt == this.createdAt); +} + +class ActivityActionsCompanion extends UpdateCompanion { + final Value id; + final Value activityId; + final Value actionId; + final Value position; + final Value createdAt; + const ActivityActionsCompanion({ + this.id = const Value.absent(), + this.activityId = const Value.absent(), + this.actionId = const Value.absent(), + this.position = const Value.absent(), + this.createdAt = const Value.absent(), + }); + ActivityActionsCompanion.insert({ + this.id = const Value.absent(), + required int activityId, + required int actionId, + required int position, + this.createdAt = const Value.absent(), + }) : activityId = Value(activityId), + actionId = Value(actionId), + position = Value(position); + static Insertable custom({ + Expression? id, + Expression? activityId, + Expression? actionId, + Expression? position, + Expression? createdAt, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (activityId != null) 'activity_id': activityId, + if (actionId != null) 'action_id': actionId, + if (position != null) 'position': position, + if (createdAt != null) 'created_at': createdAt, + }); + } + + ActivityActionsCompanion copyWith( + {Value? id, + Value? activityId, + Value? actionId, + Value? position, + Value? createdAt}) { + return ActivityActionsCompanion( + id: id ?? this.id, + activityId: activityId ?? this.activityId, + actionId: actionId ?? this.actionId, + position: position ?? this.position, + createdAt: createdAt ?? this.createdAt, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (activityId.present) { + map['activity_id'] = Variable(activityId.value); + } + if (actionId.present) { + map['action_id'] = Variable(actionId.value); + } + if (position.present) { + map['position'] = Variable(position.value); + } + if (createdAt.present) { + map['created_at'] = Variable(createdAt.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('ActivityActionsCompanion(') + ..write('id: $id, ') + ..write('activityId: $activityId, ') + ..write('actionId: $actionId, ') + ..write('position: $position, ') + ..write('createdAt: $createdAt') + ..write(')')) + .toString(); + } +} + +class MediaItems extends Table with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + MediaItems(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, false, + hasAutoIncrement: true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT')); + late final GeneratedColumn title = GeneratedColumn( + 'title', aliasedName, false, + additionalChecks: + GeneratedColumn.checkTextLength(minTextLength: 3, maxTextLength: 32), + type: DriftSqlType.string, + requiredDuringInsert: true); + late final GeneratedColumn description = GeneratedColumn( + 'body', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn reference = GeneratedColumn( + 'reference', aliasedName, false, + additionalChecks: + GeneratedColumn.checkTextLength(minTextLength: 3, maxTextLength: 256), + type: DriftSqlType.string, + requiredDuringInsert: true); + late final GeneratedColumn type = GeneratedColumn( + 'type', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn createdAt = GeneratedColumn( + 'created_at', aliasedName, false, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + defaultValue: Variable(DateTime.now())); + @override + List get $columns => + [id, title, description, reference, type, createdAt]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'media_items'; + @override + Set get $primaryKey => {id}; + @override + MediaItemsData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return MediaItemsData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id'])!, + title: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}title'])!, + description: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}body'])!, + reference: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}reference'])!, + type: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}type'])!, + createdAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!, + ); + } + + @override + MediaItems createAlias(String alias) { + return MediaItems(attachedDatabase, alias); + } +} + +class MediaItemsData extends DataClass implements Insertable { + final int id; + final String title; + final String description; + final String reference; + final String type; + final DateTime createdAt; + const MediaItemsData( + {required this.id, + required this.title, + required this.description, + required this.reference, + required this.type, + required this.createdAt}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['title'] = Variable(title); + map['body'] = Variable(description); + map['reference'] = Variable(reference); + map['type'] = Variable(type); + map['created_at'] = Variable(createdAt); + return map; + } + + MediaItemsCompanion toCompanion(bool nullToAbsent) { + return MediaItemsCompanion( + id: Value(id), + title: Value(title), + description: Value(description), + reference: Value(reference), + type: Value(type), + createdAt: Value(createdAt), + ); + } + + factory MediaItemsData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return MediaItemsData( + id: serializer.fromJson(json['id']), + title: serializer.fromJson(json['title']), + description: serializer.fromJson(json['description']), + reference: serializer.fromJson(json['reference']), + type: serializer.fromJson(json['type']), + createdAt: serializer.fromJson(json['createdAt']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'title': serializer.toJson(title), + 'description': serializer.toJson(description), + 'reference': serializer.toJson(reference), + 'type': serializer.toJson(type), + 'createdAt': serializer.toJson(createdAt), + }; + } + + MediaItemsData copyWith( + {int? id, + String? title, + String? description, + String? reference, + String? type, + DateTime? createdAt}) => + MediaItemsData( + id: id ?? this.id, + title: title ?? this.title, + description: description ?? this.description, + reference: reference ?? this.reference, + type: type ?? this.type, + createdAt: createdAt ?? this.createdAt, + ); + MediaItemsData copyWithCompanion(MediaItemsCompanion data) { + return MediaItemsData( + id: data.id.present ? data.id.value : this.id, + title: data.title.present ? data.title.value : this.title, + description: + data.description.present ? data.description.value : this.description, + reference: data.reference.present ? data.reference.value : this.reference, + type: data.type.present ? data.type.value : this.type, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + ); + } + + @override + String toString() { + return (StringBuffer('MediaItemsData(') + ..write('id: $id, ') + ..write('title: $title, ') + ..write('description: $description, ') + ..write('reference: $reference, ') + ..write('type: $type, ') + ..write('createdAt: $createdAt') + ..write(')')) + .toString(); + } + + @override + int get hashCode => + Object.hash(id, title, description, reference, type, createdAt); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is MediaItemsData && + other.id == this.id && + other.title == this.title && + other.description == this.description && + other.reference == this.reference && + other.type == this.type && + other.createdAt == this.createdAt); +} + +class MediaItemsCompanion extends UpdateCompanion { + final Value id; + final Value title; + final Value description; + final Value reference; + final Value type; + final Value createdAt; + const MediaItemsCompanion({ + this.id = const Value.absent(), + this.title = const Value.absent(), + this.description = const Value.absent(), + this.reference = const Value.absent(), + this.type = const Value.absent(), + this.createdAt = const Value.absent(), + }); + MediaItemsCompanion.insert({ + this.id = const Value.absent(), + required String title, + required String description, + required String reference, + required String type, + this.createdAt = const Value.absent(), + }) : title = Value(title), + description = Value(description), + reference = Value(reference), + type = Value(type); + static Insertable custom({ + Expression? id, + Expression? title, + Expression? description, + Expression? reference, + Expression? type, + Expression? createdAt, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (title != null) 'title': title, + if (description != null) 'body': description, + if (reference != null) 'reference': reference, + if (type != null) 'type': type, + if (createdAt != null) 'created_at': createdAt, + }); + } + + MediaItemsCompanion copyWith( + {Value? id, + Value? title, + Value? description, + Value? reference, + Value? type, + Value? createdAt}) { + return MediaItemsCompanion( + id: id ?? this.id, + title: title ?? this.title, + description: description ?? this.description, + reference: reference ?? this.reference, + type: type ?? this.type, + createdAt: createdAt ?? this.createdAt, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (title.present) { + map['title'] = Variable(title.value); + } + if (description.present) { + map['body'] = Variable(description.value); + } + if (reference.present) { + map['reference'] = Variable(reference.value); + } + if (type.present) { + map['type'] = Variable(type.value); + } + if (createdAt.present) { + map['created_at'] = Variable(createdAt.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('MediaItemsCompanion(') + ..write('id: $id, ') + ..write('title: $title, ') + ..write('description: $description, ') + ..write('reference: $reference, ') + ..write('type: $type, ') + ..write('createdAt: $createdAt') + ..write(')')) + .toString(); + } +} + +class ObjectMediaItems extends Table + with TableInfo { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + ObjectMediaItems(this.attachedDatabase, [this._alias]); + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, false, + hasAutoIncrement: true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT')); + late final GeneratedColumn objectId = GeneratedColumn( + 'object_id', aliasedName, false, + type: DriftSqlType.int, requiredDuringInsert: true); + late final GeneratedColumn objectType = GeneratedColumn( + 'object_type', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + late final GeneratedColumn mediaId = GeneratedColumn( + 'media_id', aliasedName, false, + type: DriftSqlType.int, + requiredDuringInsert: true, + defaultConstraints: + GeneratedColumn.constraintIsAlways('REFERENCES media_items (id)')); + late final GeneratedColumn createdAt = GeneratedColumn( + 'created_at', aliasedName, false, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + defaultValue: Variable(DateTime.now())); + @override + List get $columns => + [id, objectId, objectType, mediaId, createdAt]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'object_media_items'; + @override + Set get $primaryKey => {id}; + @override + ObjectMediaItemsData map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return ObjectMediaItemsData( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id'])!, + objectId: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}object_id'])!, + objectType: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}object_type'])!, + mediaId: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}media_id'])!, + createdAt: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}created_at'])!, + ); + } + + @override + ObjectMediaItems createAlias(String alias) { + return ObjectMediaItems(attachedDatabase, alias); + } +} + +class ObjectMediaItemsData extends DataClass + implements Insertable { + final int id; + final int objectId; + final String objectType; + final int mediaId; + final DateTime createdAt; + const ObjectMediaItemsData( + {required this.id, + required this.objectId, + required this.objectType, + required this.mediaId, + required this.createdAt}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['object_id'] = Variable(objectId); + map['object_type'] = Variable(objectType); + map['media_id'] = Variable(mediaId); + map['created_at'] = Variable(createdAt); + return map; + } + + ObjectMediaItemsCompanion toCompanion(bool nullToAbsent) { + return ObjectMediaItemsCompanion( + id: Value(id), + objectId: Value(objectId), + objectType: Value(objectType), + mediaId: Value(mediaId), + createdAt: Value(createdAt), + ); + } + + factory ObjectMediaItemsData.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return ObjectMediaItemsData( + id: serializer.fromJson(json['id']), + objectId: serializer.fromJson(json['objectId']), + objectType: serializer.fromJson(json['objectType']), + mediaId: serializer.fromJson(json['mediaId']), + createdAt: serializer.fromJson(json['createdAt']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'objectId': serializer.toJson(objectId), + 'objectType': serializer.toJson(objectType), + 'mediaId': serializer.toJson(mediaId), + 'createdAt': serializer.toJson(createdAt), + }; + } + + ObjectMediaItemsData copyWith( + {int? id, + int? objectId, + String? objectType, + int? mediaId, + DateTime? createdAt}) => + ObjectMediaItemsData( + id: id ?? this.id, + objectId: objectId ?? this.objectId, + objectType: objectType ?? this.objectType, + mediaId: mediaId ?? this.mediaId, + createdAt: createdAt ?? this.createdAt, + ); + ObjectMediaItemsData copyWithCompanion(ObjectMediaItemsCompanion data) { + return ObjectMediaItemsData( + id: data.id.present ? data.id.value : this.id, + objectId: data.objectId.present ? data.objectId.value : this.objectId, + objectType: + data.objectType.present ? data.objectType.value : this.objectType, + mediaId: data.mediaId.present ? data.mediaId.value : this.mediaId, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + ); + } + + @override + String toString() { + return (StringBuffer('ObjectMediaItemsData(') + ..write('id: $id, ') + ..write('objectId: $objectId, ') + ..write('objectType: $objectType, ') + ..write('mediaId: $mediaId, ') + ..write('createdAt: $createdAt') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(id, objectId, objectType, mediaId, createdAt); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is ObjectMediaItemsData && + other.id == this.id && + other.objectId == this.objectId && + other.objectType == this.objectType && + other.mediaId == this.mediaId && + other.createdAt == this.createdAt); +} + +class ObjectMediaItemsCompanion extends UpdateCompanion { + final Value id; + final Value objectId; + final Value objectType; + final Value mediaId; + final Value createdAt; + const ObjectMediaItemsCompanion({ + this.id = const Value.absent(), + this.objectId = const Value.absent(), + this.objectType = const Value.absent(), + this.mediaId = const Value.absent(), + this.createdAt = const Value.absent(), + }); + ObjectMediaItemsCompanion.insert({ + this.id = const Value.absent(), + required int objectId, + required String objectType, + required int mediaId, + this.createdAt = const Value.absent(), + }) : objectId = Value(objectId), + objectType = Value(objectType), + mediaId = Value(mediaId); + static Insertable custom({ + Expression? id, + Expression? objectId, + Expression? objectType, + Expression? mediaId, + Expression? createdAt, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (objectId != null) 'object_id': objectId, + if (objectType != null) 'object_type': objectType, + if (mediaId != null) 'media_id': mediaId, + if (createdAt != null) 'created_at': createdAt, + }); + } + + ObjectMediaItemsCompanion copyWith( + {Value? id, + Value? objectId, + Value? objectType, + Value? mediaId, + Value? createdAt}) { + return ObjectMediaItemsCompanion( + id: id ?? this.id, + objectId: objectId ?? this.objectId, + objectType: objectType ?? this.objectType, + mediaId: mediaId ?? this.mediaId, + createdAt: createdAt ?? this.createdAt, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (objectId.present) { + map['object_id'] = Variable(objectId.value); + } + if (objectType.present) { + map['object_type'] = Variable(objectType.value); + } + if (mediaId.present) { + map['media_id'] = Variable(mediaId.value); + } + if (createdAt.present) { + map['created_at'] = Variable(createdAt.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('ObjectMediaItemsCompanion(') + ..write('id: $id, ') + ..write('objectId: $objectId, ') + ..write('objectType: $objectType, ') + ..write('mediaId: $mediaId, ') + ..write('createdAt: $createdAt') + ..write(')')) + .toString(); + } +} + +class DatabaseAtV4 extends GeneratedDatabase { + DatabaseAtV4(QueryExecutor e) : super(e); + late final Sessions sessions = Sessions(this); + late final Activities activities = Activities(this); + late final SessionActivities sessionActivities = SessionActivities(this); + late final Actions actions = Actions(this); + late final ActivityActions activityActions = ActivityActions(this); + late final MediaItems mediaItems = MediaItems(this); + late final ObjectMediaItems objectMediaItems = ObjectMediaItems(this); + @override + Iterable> get allTables => + allSchemaEntities.whereType>(); + @override + List get allSchemaEntities => [ + sessions, + activities, + sessionActivities, + actions, + activityActions, + mediaItems, + objectMediaItems + ]; + @override + int get schemaVersion => 4; +} -- 2.47.2 From 604b099010bf3d03710dcb02801d8296af93cae1 Mon Sep 17 00:00:00 2001 From: Joshua Burman Date: Tue, 24 Dec 2024 16:58:50 -0500 Subject: [PATCH 9/9] converted to activity from activity model finally --- lib/models/activity_timer_model.dart | 12 +- lib/widgets/activity_action_view.dart | 13 +- lib/widgets/activity_card.dart | 18 +-- lib/widgets/activity_view.dart | 9 +- lib/widgets/session_card.dart | 157 +---------------------- lib/widgets/session_view.dart | 6 +- lib/widgets/session_view_activities.dart | 13 +- 7 files changed, 30 insertions(+), 198 deletions(-) diff --git a/lib/models/activity_timer_model.dart b/lib/models/activity_timer_model.dart index 6f9d7a9..3baaf88 100644 --- a/lib/models/activity_timer_model.dart +++ b/lib/models/activity_timer_model.dart @@ -1,13 +1,12 @@ import 'dart:async'; +import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:scrollable_positioned_list/scrollable_positioned_list.dart'; import 'package:sendtrain/database/database.dart'; -import 'package:sendtrain/models/activity_model.dart'; class ActivityTimerModel with ChangeNotifier { int _actionCounter = 0; - ActivityModel? _activityModel; Activity? _activity; List _sets = []; List _actions = []; @@ -23,7 +22,6 @@ class ActivityTimerModel with ChangeNotifier { dynamic get currentAction => currentSet[_currentActionNum]; int get currentSetNum => _currentSetNum; dynamic get currentSet => _sets[_currentSetNum]; - ActivityModel? get activityModel => _activityModel; Activity? get activity => _activity; List get sets => _sets; Timer? get periodicTimer => _periodicTimer; @@ -31,14 +29,14 @@ class ActivityTimerModel with ChangeNotifier { double get progress => _progress; int get totalTime => _totalTime; - void setup(ActivityModel activityModel, Activity activity, List actions) { - if (_activityModel == null || activityModel.id != _activityModel?.id) { + void setup(Activity activity, List actions) { + if (_activity == null || activity.id != _activity?.id) { _periodicTimer?.cancel(); _progress = 0; _isc = null; - _activityModel = activityModel; _activity = activity; - _sets = activityModel.actions[0].items(); + // only one action for now + _sets = json.decode(actions[0].set); _actions = actions; _currentActionNum = 0; _currentSetNum = 0; diff --git a/lib/widgets/activity_action_view.dart b/lib/widgets/activity_action_view.dart index ca68591..73d965d 100644 --- a/lib/widgets/activity_action_view.dart +++ b/lib/widgets/activity_action_view.dart @@ -1,13 +1,14 @@ +import 'dart:convert'; + import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:scrollable_positioned_list/scrollable_positioned_list.dart'; -import 'package:sendtrain/classes/activity_action.dart'; import 'package:sendtrain/extensions/string_extensions.dart'; import 'package:sendtrain/models/activity_timer_model.dart'; class ActivityActionView extends StatefulWidget { - const ActivityActionView({super.key, required this.action}); - final ActivityAction action; + const ActivityActionView({super.key, required this.actions}); + final List actions; @override State createState() => ActivityActionViewState(); @@ -26,7 +27,7 @@ class ActivityActionViewState extends State { Widget build(BuildContext context) { ActivityTimerModel atm = Provider.of(context, listen: true); - List>> sets = atm.activityModel!.actions[0].items(); + List sets = json.decode(widget.actions[0].set); // we need to set the scroll controller // so we can update the selected item position @@ -35,14 +36,14 @@ class ActivityActionViewState extends State { return Expanded( child: ScrollablePositionedList.builder( padding: const EdgeInsets.fromLTRB(10, 0, 10, 20), - itemCount: widget.action.activityActionSet.total, + itemCount: sets.length, itemScrollController: itemScrollController, scrollOffsetController: scrollOffsetController, itemPositionsListener: itemPositionsListener, scrollOffsetListener: scrollOffsetListener, itemBuilder: (BuildContext context, int setNum) { List content = []; - List> set = sets[setNum]; + List set = sets[setNum]; for (int actionNum = 0; actionNum < set.length; actionNum++) { Map setItem = set[actionNum]; diff --git a/lib/widgets/activity_card.dart b/lib/widgets/activity_card.dart index 839b152..e94d00c 100644 --- a/lib/widgets/activity_card.dart +++ b/lib/widgets/activity_card.dart @@ -3,15 +3,13 @@ import 'package:provider/provider.dart'; import 'package:sendtrain/daos/media_items_dao.dart'; import 'package:sendtrain/database/database.dart'; import 'package:sendtrain/extensions/string_extensions.dart'; -import 'package:sendtrain/models/activity_model.dart'; import 'package:sendtrain/models/activity_timer_model.dart'; import 'package:sendtrain/widgets/activity_view.dart'; class ActivityCard extends StatefulWidget { - final ActivityModel activity; - final Activity data; + final Activity activity; - const ActivityCard({super.key, required this.activity, required this.data}); + const ActivityCard({super.key, required this.activity}); @override State createState() => ActivityCardState(); @@ -33,7 +31,7 @@ class ActivityCardState extends State { return FutureBuilder>( future: MediaItemsDao(Provider.of(context)) - .fromActivity(widget.data), + .fromActivity(widget.activity), builder: (context, snapshot) { if (snapshot.hasData) { List mediaItems = snapshot.data!; @@ -58,9 +56,7 @@ class ActivityCardState extends State { return SlideTransition( position: custom, child: Dialog.fullscreen( - child: ActivityView( - activityModel: widget.activity, - activity: widget.data))); + child: ActivityView(activity: widget.activity))); }, barrierDismissible: true, barrierLabel: '', @@ -93,13 +89,13 @@ class ActivityCardState extends State { if (atm.activity?.id == widget.activity.id) { return Text( maxLines: 1, - "${widget.data.title.toTitleCase()} (${formattedTime(atm.totalTime)})"); + "${widget.activity.title.toTitleCase()} (${formattedTime(atm.totalTime)})"); } else { - return Text(maxLines: 1, widget.data.title.toTitleCase()); + return Text(maxLines: 1, widget.activity.title.toTitleCase()); } }, ), - subtitle: Text(maxLines: 2, widget.data.description), + subtitle: Text(maxLines: 2, widget.activity.description), trailing: IconButton( visualDensity: VisualDensity.compact, icon: Icon(Icons.close_rounded), diff --git a/lib/widgets/activity_view.dart b/lib/widgets/activity_view.dart index f00263a..d430a35 100644 --- a/lib/widgets/activity_view.dart +++ b/lib/widgets/activity_view.dart @@ -4,7 +4,6 @@ import 'package:provider/provider.dart'; import 'package:sendtrain/daos/actions_dao.dart'; import 'package:sendtrain/database/database.dart'; import 'package:sendtrain/extensions/string_extensions.dart'; -import 'package:sendtrain/models/activity_model.dart'; import 'package:sendtrain/models/activity_timer_model.dart'; import 'package:sendtrain/widgets/activity_action_view.dart'; import 'package:sendtrain/widgets/activity_view_categories.dart'; @@ -13,8 +12,7 @@ import 'package:sendtrain/widgets/activity_view_types.dart'; class ActivityView extends StatefulWidget { const ActivityView( - {super.key, required this.activityModel, required this.activity}); - final ActivityModel activityModel; + {super.key, required this.activity}); final Activity activity; @override @@ -24,7 +22,6 @@ class ActivityView extends StatefulWidget { class _ActivityViewState extends State { @override Widget build(BuildContext context) { - final ActivityModel activityModel = widget.activityModel; final Activity activity = widget.activity; ActivityTimerModel atm = Provider.of(context, listen: false); @@ -35,7 +32,7 @@ class _ActivityViewState extends State { builder: (context, snapshot) { if (snapshot.hasData) { List actions = snapshot.data!; - atm.setup(activityModel, activity, actions); + atm.setup(activity, actions); return Scaffold( floatingActionButtonLocation: ExpandableFab.location, @@ -183,7 +180,7 @@ class _ActivityViewState extends State { semanticsLabel: 'Activity Progress', ); })), - ActivityActionView(action: activityModel.actions[0]), + ActivityActionView(actions: actions), ])); } else { return Container( diff --git a/lib/widgets/session_card.dart b/lib/widgets/session_card.dart index 0a0bbe7..297efd9 100644 --- a/lib/widgets/session_card.dart +++ b/lib/widgets/session_card.dart @@ -1,12 +1,8 @@ import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:intl/date_symbol_data_local.dart'; -import 'package:sendtrain/classes/activity_action.dart'; -import 'package:sendtrain/classes/media.dart'; import 'package:sendtrain/database/database.dart' hide ActivityAction; import 'package:sendtrain/extensions/string_extensions.dart'; -import 'package:sendtrain/models/activity_model.dart'; -import 'package:sendtrain/models/session_model.dart'; import 'package:sendtrain/widgets/session_view.dart'; class SessionCard extends StatelessWidget { @@ -23,155 +19,6 @@ class SessionCard extends StatelessWidget { ? Theme.of(context).colorScheme.primaryContainer : Theme.of(context).colorScheme.surfaceContainerLow; - // place holder until we can retrieve real data - final data = SessionModel( - id: 1, - title: "Projecting @ Climbers Rock", - content: - "Beta pully beta beta pinch one arm crimpy. Futuristic pinch, dyno dynamic drop knee climb. Climbing ondra slopey onsight beta ondra power endurance.", - date: DateTime.now(), - activities: [ - ActivityModel( - id: 1, - title: 'Campus Board', - type: 'fundamental', - categories: ['strength', 'power'], - description: - "Campus board session, focusing on explosiveness and contact strength.", - actions: [ - ActivityAction( - id: 1, - title: '1, 3, 5', - description: - 'Move between the first, third, and fifth rungs, alternating hands. Rest and alternate sides, to start', - media: [ - Media( - id: 1, - reference: - 'https://www.climbing.com/wp-content/uploads/2022/06/campus-board-e1655470701154.jpeg', - type: 'image', - description: 'Campus board movement'), - Media( - id: 1, - reference: '7ACyeOP-Hxo', - type: 'youtube', - description: 'How to campus board') - ], - activityActionSet: Set( - type: 'drop_set', - total: 3, - rest: 300000, - reps: Reps( - type: 'repititions', - tempo: [0], - amounts: [1, 1, 1], - weights: [0], - rest: 20000))), - ], - resources: ['https://www.youtube.com/watch?v=bLz0xp1PEm4']), - ActivityModel( - id: 2, - title: 'Projecting', - type: 'fundamental', - categories: ['technique', 'conditioning'], - description: - "Session focused on attempting a climb at or beyond your perceived limit.", - actions: [ - ActivityAction( - id: 1, - title: 'Attempt Climb', - description: - 'Attempt your selected climb, if you fall off early in the climb, attempt again. 1 repitition equals roughly doing all the moves, not necessarily in 1 attempt.', - media: [ - Media( - id: 1, - reference: - 'https://www.climbing.com/wp-content/uploads/2022/07/Fixed-44.jpg', - type: 'image', - description: 'Projecting a climb'), - Media( - id: 1, - reference: 'BgheYcxhrsw', - type: 'youtube', - description: 'How to project climbs') - ], - activityActionSet: Set( - type: 'standard', - total: 10, - rest: 300000, - reps: Reps( - type: 'repititions', - tempo: [0], - amounts: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], - weights: [0], - rest: 0))), - ], - resources: ['https://www.youtube.com/watch?v=dyAvbUvY_PU']), - ActivityModel( - id: 3, - title: 'Long Block Pulls', - type: 'Hypertrophy', - categories: ['Strength', 'Power'], - description: - "Block pull on a edge of a specific size and time to induce a hypertrophic effect on the formarms.", - actions: [ - ActivityAction( - id: 1, - title: 'Long Pulls', - description: - 'Select your desired weight to pull, add it to the block. You should aim for an effort level of 8-9 when reaching the end of the set time, going to failure will result in significantly extended recovery time.', - media: [ - Media( - id: 1, - reference: - 'https://trailandcrag.com/sites/default/files/inline-images/05-min_3.jpg', - type: 'image', - description: 'Block pull example'), - Media( - id: 1, - reference: 'sZVAEy9UmoY', - type: 'youtube', - description: - 'Principals of Grip gains, and related protocols') - ], - activityActionSet: Set( - type: 'alternating', - total: 5, - rest: 5000, - reps: Reps( - type: 'seconds', - tempo: [0], - amounts: [5, 5, 5, 5, 5], - weights: [80, 80, 80, 80, 80], - rest: 5000))), - ], - resources: ['https://www.youtube.com/watch?v=dyAvbUvY_PU']), - ], - achievements: [ - 'got 1 3 5 first time!', - 'no pain in elbow', - 'life is pain', - 'new PR for pullups' - ], - media: [ - Media( - id: 1, - reference: 'TwS8ycTY5cc', - type: 'youtube', - description: 'Attempting crux move'), - Media( - id: 1, - reference: - 'https://static.wixstatic.com/media/c83481_1dd473ad49524ae5a95d993ba10e0a50~mv2.jpg/v1/fill/w_640,h_426,al_c,q_80,usm_0.66_1.00_0.01,enc_auto/c83481_1dd473ad49524ae5a95d993ba10e0a50~mv2.jpg', - type: 'image', - description: 'Struggling on deadpoints'), - Media( - id: 1, - reference: 'TwS8ycTY5cc', - type: 'youtube', - description: 'Attempting crux move') - ]); - if (type == 0) { return Card( color: color, @@ -192,7 +39,7 @@ class SessionCard extends StatelessWidget { .animate(animation); return SlideTransition( position: custom, - child: Dialog.fullscreen(child: SessionView(data: data, session: session))); + child: Dialog.fullscreen(child: SessionView(session: session))); }, barrierDismissible: true, barrierLabel: '', @@ -277,7 +124,7 @@ class SessionCard extends StatelessWidget { return SlideTransition( position: custom, child: - Dialog.fullscreen(child: SessionView(data: data, session: session))); + Dialog.fullscreen(child: SessionView(session: session))); }, barrierDismissible: true, barrierLabel: '', diff --git a/lib/widgets/session_view.dart b/lib/widgets/session_view.dart index 1f8b407..b71e327 100644 --- a/lib/widgets/session_view.dart +++ b/lib/widgets/session_view.dart @@ -7,15 +7,13 @@ import 'package:sendtrain/daos/activities_dao.dart'; import 'package:sendtrain/database/database.dart'; import 'package:sendtrain/extensions/string_extensions.dart'; -import 'package:sendtrain/models/session_model.dart'; import 'package:sendtrain/widgets/session_view_achievements.dart'; import 'package:sendtrain/widgets/session_view_activities.dart'; import 'package:sendtrain/widgets/session_view_media.dart'; class SessionView extends StatelessWidget { - const SessionView({super.key, required this.data, required this.session}); + const SessionView({super.key, required this.session}); - final SessionModel data; final Session session; @override @@ -91,7 +89,7 @@ class SessionView extends StatelessWidget { fontSize: 20, fontWeight: FontWeight.bold), 'Activites:')), SessionViewActivities( - activities: data.activities, data: activities), + activities: activities), ], )); } else { diff --git a/lib/widgets/session_view_activities.dart b/lib/widgets/session_view_activities.dart index 57c12da..48a2607 100644 --- a/lib/widgets/session_view_activities.dart +++ b/lib/widgets/session_view_activities.dart @@ -1,15 +1,11 @@ -import 'dart:math'; - import 'package:flutter/material.dart'; import 'package:sendtrain/database/database.dart'; -import 'package:sendtrain/models/activity_model.dart'; import 'package:sendtrain/widgets/activity_card.dart'; class SessionViewActivities extends StatelessWidget { - const SessionViewActivities({super.key, this.activities, required this.data}); + const SessionViewActivities({super.key, required this.activities }); - final List? activities; - final List data; + final List activities; @override Widget build(BuildContext context) { @@ -17,11 +13,10 @@ class SessionViewActivities extends StatelessWidget { child: ListView.builder( // shrinkWrap: true, padding: const EdgeInsets.fromLTRB(10, 0, 10, 0), - itemCount: data.length, + itemCount: activities.length, itemBuilder: (BuildContext context, int index) { return ActivityCard( - activity: activities![Random().nextInt(activities!.length)], - data: data[index]); + activity: activities[index]); }, )); } -- 2.47.2