From 69abd6e04858cb5f32840d91608e9867146754f9 Mon Sep 17 00:00:00 2001 From: hawkbee1 Date: Tue, 16 Apr 2024 07:14:00 +0000 Subject: [PATCH] start understanding riverpod: emergency commit, more a backup than a version (docker desktop crashes) --- .../lib/src/protocol/protocol.dart | 14 + .../lib/src/protocol/troop_db.dart | 34 +- .../lib/src/protocol/troop_type.dart | 29 + .../lib/player/active_game_player_troops.dart | 23 + .../player/active_game_player_troops.g.dart | 177 ++ .../lib/player/create_player.dart | 21 + bluevsred_flutter/test/game_player_test.dart | 31 +- .../lib/src/generated/protocol.dart | 24 +- .../lib/src/generated/troop_db.dart | 63 +- .../lib/src/generated/troop_type.dart | 29 + bluevsred_server/lib/src/models/troop_db.yaml | 3 +- .../lib/src/models/troop_type.yaml | 4 + .../20240412073903562/definition.json | 1435 +++++++++++++++++ .../20240412073903562/definition.sql | 316 ++++ .../20240412073903562/definition_project.json | 231 +++ .../20240412073903562/migration.json | 248 +++ .../20240412073903562/migration.sql | 71 + .../20240412092530655/definition.json | 1435 +++++++++++++++++ .../20240412092530655/definition.sql | 316 ++++ .../20240412092530655/definition_project.json | 231 +++ .../20240412092530655/migration.json | 5 + .../20240412092530655/migration.sql | 21 + .../migrations/migration_registry.txt | 2 + bluevsred_server/pubspec.yaml | 2 +- .../repair-migration/20240412074114893.sql | 29 + .../build/unit_test_assets/NOTICES.Z | Bin 83749 -> 83757 bytes bluevsred_shared/lib/bluesvsred_shared.dart | 1 + bluevsred_shared/lib/src/battle/battle.dart | 5 - .../lib/src/battle/battle.freezed.dart | 21 +- bluevsred_shared/lib/src/battle/battle.g.dart | 33 - .../lib/src/troops/game_player_troops.dart | 12 + .../troops/game_player_troops.freezed.dart | 143 ++ bluevsred_shared/lib/src/troops/troop.dart | 29 +- .../lib/src/troops/troop.freezed.dart | 169 +- bluevsred_shared/lib/src/troops/troop.g.dart | 21 - bluevsred_shared/pubspec.yaml | 4 +- .../test/action_points_lifecycle_test.dart | 5 +- .../test/game_global_description_test.dart | 11 +- 38 files changed, 4955 insertions(+), 293 deletions(-) create mode 100644 bluevsred_client/lib/src/protocol/troop_type.dart create mode 100644 bluevsred_flutter/lib/player/active_game_player_troops.dart create mode 100644 bluevsred_flutter/lib/player/active_game_player_troops.g.dart create mode 100644 bluevsred_flutter/lib/player/create_player.dart create mode 100644 bluevsred_server/lib/src/generated/troop_type.dart create mode 100644 bluevsred_server/lib/src/models/troop_type.yaml create mode 100644 bluevsred_server/migrations/20240412073903562/definition.json create mode 100644 bluevsred_server/migrations/20240412073903562/definition.sql create mode 100644 bluevsred_server/migrations/20240412073903562/definition_project.json create mode 100644 bluevsred_server/migrations/20240412073903562/migration.json create mode 100644 bluevsred_server/migrations/20240412073903562/migration.sql create mode 100644 bluevsred_server/migrations/20240412092530655/definition.json create mode 100644 bluevsred_server/migrations/20240412092530655/definition.sql create mode 100644 bluevsred_server/migrations/20240412092530655/definition_project.json create mode 100644 bluevsred_server/migrations/20240412092530655/migration.json create mode 100644 bluevsred_server/migrations/20240412092530655/migration.sql create mode 100644 bluevsred_server/repair-migration/20240412074114893.sql delete mode 100644 bluevsred_shared/lib/src/battle/battle.g.dart create mode 100644 bluevsred_shared/lib/src/troops/game_player_troops.dart create mode 100644 bluevsred_shared/lib/src/troops/game_player_troops.freezed.dart delete mode 100644 bluevsred_shared/lib/src/troops/troop.g.dart diff --git a/bluevsred_client/lib/src/protocol/protocol.dart b/bluevsred_client/lib/src/protocol/protocol.dart index e3bdd29..31bfbb4 100644 --- a/bluevsred_client/lib/src/protocol/protocol.dart +++ b/bluevsred_client/lib/src/protocol/protocol.dart @@ -15,11 +15,13 @@ import 'battle_map_db.dart' as _i3; import 'game_player_db.dart' as _i4; import 'team_db.dart' as _i5; import 'troop_db.dart' as _i6; +import 'troop_type.dart' as _i7; export 'battle_db.dart'; export 'battle_map_db.dart'; export 'game_player_db.dart'; export 'team_db.dart'; export 'troop_db.dart'; +export 'troop_type.dart'; export 'client.dart'; class Protocol extends _i1.SerializationManager { @@ -55,6 +57,9 @@ class Protocol extends _i1.SerializationManager { if (t == _i6.TroopDb) { return _i6.TroopDb.fromJson(data, this) as T; } + if (t == _i7.TroopType) { + return _i7.TroopType.fromJson(data) as T; + } if (t == _i1.getType<_i2.BattleDb?>()) { return (data != null ? _i2.BattleDb.fromJson(data, this) : null) as T; } @@ -70,6 +75,9 @@ class Protocol extends _i1.SerializationManager { if (t == _i1.getType<_i6.TroopDb?>()) { return (data != null ? _i6.TroopDb.fromJson(data, this) : null) as T; } + if (t == _i1.getType<_i7.TroopType?>()) { + return (data != null ? _i7.TroopType.fromJson(data) : null) as T; + } return super.deserialize(data, t); } @@ -90,6 +98,9 @@ class Protocol extends _i1.SerializationManager { if (data is _i6.TroopDb) { return 'TroopDb'; } + if (data is _i7.TroopType) { + return 'TroopType'; + } return super.getClassNameForObject(data); } @@ -110,6 +121,9 @@ class Protocol extends _i1.SerializationManager { if (data['className'] == 'TroopDb') { return deserialize<_i6.TroopDb>(data['data']); } + if (data['className'] == 'TroopType') { + return deserialize<_i7.TroopType>(data['data']); + } return super.deserializeByClassName(data); } } diff --git a/bluevsred_client/lib/src/protocol/troop_db.dart b/bluevsred_client/lib/src/protocol/troop_db.dart index 86b878b..8dc4790 100644 --- a/bluevsred_client/lib/src/protocol/troop_db.dart +++ b/bluevsred_client/lib/src/protocol/troop_db.dart @@ -9,16 +9,19 @@ // ignore_for_file: no_leading_underscores_for_library_prefixes import 'package:serverpod_client/serverpod_client.dart' as _i1; +import 'protocol.dart' as _i2; abstract class TroopDb extends _i1.SerializableEntity { TroopDb._({ this.id, - required this.path, + required this.troopType, + required this.actionPoints, }); factory TroopDb({ int? id, - required String path, + required _i2.TroopType troopType, + required double actionPoints, }) = _TroopDbImpl; factory TroopDb.fromJson( @@ -27,7 +30,10 @@ abstract class TroopDb extends _i1.SerializableEntity { ) { return TroopDb( id: serializationManager.deserialize(jsonSerialization['id']), - path: serializationManager.deserialize(jsonSerialization['path']), + troopType: serializationManager + .deserialize<_i2.TroopType>(jsonSerialization['troopType']), + actionPoints: serializationManager + .deserialize(jsonSerialization['actionPoints']), ); } @@ -36,17 +42,21 @@ abstract class TroopDb extends _i1.SerializableEntity { /// the id will be null. int? id; - String path; + _i2.TroopType troopType; + + double actionPoints; TroopDb copyWith({ int? id, - String? path, + _i2.TroopType? troopType, + double? actionPoints, }); @override Map toJson() { return { if (id != null) 'id': id, - 'path': path, + 'troopType': troopType.toJson(), + 'actionPoints': actionPoints, }; } } @@ -56,20 +66,24 @@ class _Undefined {} class _TroopDbImpl extends TroopDb { _TroopDbImpl({ int? id, - required String path, + required _i2.TroopType troopType, + required double actionPoints, }) : super._( id: id, - path: path, + troopType: troopType, + actionPoints: actionPoints, ); @override TroopDb copyWith({ Object? id = _Undefined, - String? path, + _i2.TroopType? troopType, + double? actionPoints, }) { return TroopDb( id: id is int? ? id : this.id, - path: path ?? this.path, + troopType: troopType ?? this.troopType, + actionPoints: actionPoints ?? this.actionPoints, ); } } diff --git a/bluevsred_client/lib/src/protocol/troop_type.dart b/bluevsred_client/lib/src/protocol/troop_type.dart new file mode 100644 index 0000000..8ccc67c --- /dev/null +++ b/bluevsred_client/lib/src/protocol/troop_type.dart @@ -0,0 +1,29 @@ +/* AUTOMATICALLY GENERATED CODE DO NOT MODIFY */ +/* To generate run: "serverpod generate" */ + +// ignore_for_file: library_private_types_in_public_api +// ignore_for_file: public_member_api_docs +// ignore_for_file: implementation_imports +// ignore_for_file: use_super_parameters +// ignore_for_file: type_literal_in_constant_pattern + +// ignore_for_file: no_leading_underscores_for_library_prefixes +import 'package:serverpod_client/serverpod_client.dart' as _i1; + +enum TroopType with _i1.SerializableEntity { + commander; + + static TroopType? fromJson(String name) { + switch (name) { + case 'commander': + return commander; + default: + return null; + } + } + + @override + String toJson() => name; + @override + String toString() => toJson(); +} diff --git a/bluevsred_flutter/lib/player/active_game_player_troops.dart b/bluevsred_flutter/lib/player/active_game_player_troops.dart new file mode 100644 index 0000000..4075db1 --- /dev/null +++ b/bluevsred_flutter/lib/player/active_game_player_troops.dart @@ -0,0 +1,23 @@ +import 'package:bluevsred_shared/bluesvsred_shared.dart'; +import 'package:riverpod_annotation/riverpod_annotation.dart'; + +part 'active_game_player_troops.g.dart'; + +@riverpod +class ActiveGamePlayerTroops extends _$ActiveGamePlayerTroops { + // ActiveGamePlayerTroops._(); + @override + Future> build({required Set troops}) async { + return troops; + } + + void addTroops({required List newTroops}) { + this. + state + if (state.value != null) { + state.value!.addAll(newTroops); + } else { + state.value => newTroops; + } + } +} diff --git a/bluevsred_flutter/lib/player/active_game_player_troops.g.dart b/bluevsred_flutter/lib/player/active_game_player_troops.g.dart new file mode 100644 index 0000000..33cfc92 --- /dev/null +++ b/bluevsred_flutter/lib/player/active_game_player_troops.g.dart @@ -0,0 +1,177 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'active_game_player_troops.dart'; + +// ************************************************************************** +// RiverpodGenerator +// ************************************************************************** + +String _$activeGamePlayerTroopsHash() => + r'73b3049bb702ded10d600c481202a379d91f04d1'; + +/// Copied from Dart SDK +class _SystemHash { + _SystemHash._(); + + static int combine(int hash, int value) { + // ignore: parameter_assignments + hash = 0x1fffffff & (hash + value); + // ignore: parameter_assignments + hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10)); + return hash ^ (hash >> 6); + } + + static int finish(int hash) { + // ignore: parameter_assignments + hash = 0x1fffffff & (hash + ((0x03ffffff & hash) << 3)); + // ignore: parameter_assignments + hash = hash ^ (hash >> 11); + return 0x1fffffff & (hash + ((0x00003fff & hash) << 15)); + } +} + +abstract class _$ActiveGamePlayerTroops + extends BuildlessAutoDisposeAsyncNotifier> { + late final Set troops; + + FutureOr> build({ + required Set troops, + }); +} + +/// See also [ActiveGamePlayerTroops]. +@ProviderFor(ActiveGamePlayerTroops) +const activeGamePlayerTroopsProvider = ActiveGamePlayerTroopsFamily(); + +/// See also [ActiveGamePlayerTroops]. +class ActiveGamePlayerTroopsFamily extends Family>> { + /// See also [ActiveGamePlayerTroops]. + const ActiveGamePlayerTroopsFamily(); + + /// See also [ActiveGamePlayerTroops]. + ActiveGamePlayerTroopsProvider call({ + required Set troops, + }) { + return ActiveGamePlayerTroopsProvider( + troops: troops, + ); + } + + @override + ActiveGamePlayerTroopsProvider getProviderOverride( + covariant ActiveGamePlayerTroopsProvider provider, + ) { + return call( + troops: provider.troops, + ); + } + + static const Iterable? _dependencies = null; + + @override + Iterable? get dependencies => _dependencies; + + static const Iterable? _allTransitiveDependencies = null; + + @override + Iterable? get allTransitiveDependencies => + _allTransitiveDependencies; + + @override + String? get name => r'activeGamePlayerTroopsProvider'; +} + +/// See also [ActiveGamePlayerTroops]. +class ActiveGamePlayerTroopsProvider + extends AutoDisposeAsyncNotifierProviderImpl> { + /// See also [ActiveGamePlayerTroops]. + ActiveGamePlayerTroopsProvider({ + required Set troops, + }) : this._internal( + () => ActiveGamePlayerTroops()..troops = troops, + from: activeGamePlayerTroopsProvider, + name: r'activeGamePlayerTroopsProvider', + debugGetCreateSourceHash: + const bool.fromEnvironment('dart.vm.product') + ? null + : _$activeGamePlayerTroopsHash, + dependencies: ActiveGamePlayerTroopsFamily._dependencies, + allTransitiveDependencies: + ActiveGamePlayerTroopsFamily._allTransitiveDependencies, + troops: troops, + ); + + ActiveGamePlayerTroopsProvider._internal( + super._createNotifier, { + required super.name, + required super.dependencies, + required super.allTransitiveDependencies, + required super.debugGetCreateSourceHash, + required super.from, + required this.troops, + }) : super.internal(); + + final Set troops; + + @override + FutureOr> runNotifierBuild( + covariant ActiveGamePlayerTroops notifier, + ) { + return notifier.build( + troops: troops, + ); + } + + @override + Override overrideWith(ActiveGamePlayerTroops Function() create) { + return ProviderOverride( + origin: this, + override: ActiveGamePlayerTroopsProvider._internal( + () => create()..troops = troops, + from: from, + name: null, + dependencies: null, + allTransitiveDependencies: null, + debugGetCreateSourceHash: null, + troops: troops, + ), + ); + } + + @override + AutoDisposeAsyncNotifierProviderElement> + createElement() { + return _ActiveGamePlayerTroopsProviderElement(this); + } + + @override + bool operator ==(Object other) { + return other is ActiveGamePlayerTroopsProvider && other.troops == troops; + } + + @override + int get hashCode { + var hash = _SystemHash.combine(0, runtimeType.hashCode); + hash = _SystemHash.combine(hash, troops.hashCode); + + return _SystemHash.finish(hash); + } +} + +mixin ActiveGamePlayerTroopsRef + on AutoDisposeAsyncNotifierProviderRef> { + /// The parameter `troops` of this provider. + Set get troops; +} + +class _ActiveGamePlayerTroopsProviderElement + extends AutoDisposeAsyncNotifierProviderElement> with ActiveGamePlayerTroopsRef { + _ActiveGamePlayerTroopsProviderElement(super.provider); + + @override + Set get troops => (origin as ActiveGamePlayerTroopsProvider).troops; +} +// ignore_for_file: type=lint +// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member diff --git a/bluevsred_flutter/lib/player/create_player.dart b/bluevsred_flutter/lib/player/create_player.dart new file mode 100644 index 0000000..0667cd0 --- /dev/null +++ b/bluevsred_flutter/lib/player/create_player.dart @@ -0,0 +1,21 @@ +import 'package:bluevsred_client/bluevsred_client.dart'; +import 'package:bluevsred_flutter/player/active_game_player_troops.dart'; +import 'package:bluevsred_shared/bluesvsred_shared.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; + +import 'active_game_player.dart'; + +Future createGamePlayer( + {required String gamePlayerName, + required ProviderContainer container}) async { + final gamePlayerProvider = activeGamePlayerProvider(gamePlayerName); + // container.listen(gamePlayerProvider, (previous, next) {}); + final troopsProvider = activeGamePlayerTroopsProvider(troops: const {}); + // container.listen(troopsProvider, (previous, next) {}); + + container.read(troopsProvider).value!.addTroops(newTroops: [ + Troop( + troopDb: TroopDb(troopType: TroopType.commander, actionPoints: 10), + gamePlayer: container.read(gamePlayerProvider).value!), + ]); +} diff --git a/bluevsred_flutter/test/game_player_test.dart b/bluevsred_flutter/test/game_player_test.dart index 5d692ef..ba2eb93 100644 --- a/bluevsred_flutter/test/game_player_test.dart +++ b/bluevsred_flutter/test/game_player_test.dart @@ -1,5 +1,9 @@ // import 'package:bluevsred_shared/src/game_player/game_player.dart'; +import 'package:bluevsred_client/bluevsred_client.dart'; import 'package:bluevsred_flutter/player/active_game_player.dart'; +import 'package:bluevsred_flutter/player/active_game_player_troops.dart'; +import 'package:bluevsred_flutter/player/create_player.dart'; +import 'package:bluevsred_shared/bluesvsred_shared.dart'; import 'package:test/test.dart'; import 'provider_container.dart'; @@ -9,20 +13,27 @@ void main() { test('When a player is created its name begin by given string ', () async { final container = createContainer(); const expectedName = 'given name'; - var state = container.read(activeGamePlayerProvider(expectedName).notifier); + var state = + container.read(activeGamePlayerProvider(expectedName).notifier); expect((await state.future).name, equals(expectedName)); }); - test('when game player is created, he gets a commander troop', () { - // Here comes the need of state management system - bool isPlayerInTheList = false; - - /// check player is not in inital list - expect(isPlayerInTheList, equals(false)); + test('when game player is created, he gets a commander troop', () async { + final container = createContainer(); + const expectedName = 'given name'; + final troopsProvider = activeGamePlayerTroopsProvider(troops: {}); + container.listen(troopsProvider, (previous, next) {}); + expectLater(container.read(troopsProvider.future), completion({})); - /// Add new player to the list - isPlayerInTheList = true; - expect(isPlayerInTheList, equals(true)); + createGamePlayer(gamePlayerName: expectedName, container: container); + expectLater( + container.read(troopsProvider.future), + completion({ + Troop( + troopDb: + TroopDb(troopType: TroopType.commander, actionPoints: 10), + gamePlayer: GamePlayer(name: expectedName)) + })); }); // test('when game player is created, his first commander is created', () { diff --git a/bluevsred_server/lib/src/generated/protocol.dart b/bluevsred_server/lib/src/generated/protocol.dart index 0ef7221..8b5997f 100644 --- a/bluevsred_server/lib/src/generated/protocol.dart +++ b/bluevsred_server/lib/src/generated/protocol.dart @@ -16,11 +16,13 @@ import 'battle_map_db.dart' as _i4; import 'game_player_db.dart' as _i5; import 'team_db.dart' as _i6; import 'troop_db.dart' as _i7; +import 'troop_type.dart' as _i8; export 'battle_db.dart'; export 'battle_map_db.dart'; export 'game_player_db.dart'; export 'team_db.dart'; export 'troop_db.dart'; +export 'troop_type.dart'; class Protocol extends _i1.SerializationManagerServer { Protocol._(); @@ -222,10 +224,16 @@ class Protocol extends _i1.SerializationManagerServer { columnDefault: 'nextval(\'troop_id_seq\'::regclass)', ), _i2.ColumnDefinition( - name: 'path', + name: 'troopType', columnType: _i2.ColumnType.text, isNullable: false, - dartType: 'String', + dartType: 'protocol:TroopType', + ), + _i2.ColumnDefinition( + name: 'actionPoints', + columnType: _i2.ColumnType.doublePrecision, + isNullable: false, + dartType: 'double', ), ], foreignKeys: [], @@ -273,6 +281,9 @@ class Protocol extends _i1.SerializationManagerServer { if (t == _i7.TroopDb) { return _i7.TroopDb.fromJson(data, this) as T; } + if (t == _i8.TroopType) { + return _i8.TroopType.fromJson(data) as T; + } if (t == _i1.getType<_i3.BattleDb?>()) { return (data != null ? _i3.BattleDb.fromJson(data, this) : null) as T; } @@ -288,6 +299,9 @@ class Protocol extends _i1.SerializationManagerServer { if (t == _i1.getType<_i7.TroopDb?>()) { return (data != null ? _i7.TroopDb.fromJson(data, this) : null) as T; } + if (t == _i1.getType<_i8.TroopType?>()) { + return (data != null ? _i8.TroopType.fromJson(data) : null) as T; + } try { return _i2.Protocol().deserialize(data, t); } catch (_) {} @@ -311,6 +325,9 @@ class Protocol extends _i1.SerializationManagerServer { if (data is _i7.TroopDb) { return 'TroopDb'; } + if (data is _i8.TroopType) { + return 'TroopType'; + } return super.getClassNameForObject(data); } @@ -331,6 +348,9 @@ class Protocol extends _i1.SerializationManagerServer { if (data['className'] == 'TroopDb') { return deserialize<_i7.TroopDb>(data['data']); } + if (data['className'] == 'TroopType') { + return deserialize<_i8.TroopType>(data['data']); + } return super.deserializeByClassName(data); } diff --git a/bluevsred_server/lib/src/generated/troop_db.dart b/bluevsred_server/lib/src/generated/troop_db.dart index d8b0b5b..fe50afe 100644 --- a/bluevsred_server/lib/src/generated/troop_db.dart +++ b/bluevsred_server/lib/src/generated/troop_db.dart @@ -9,16 +9,19 @@ // ignore_for_file: no_leading_underscores_for_library_prefixes import 'package:serverpod/serverpod.dart' as _i1; +import 'protocol.dart' as _i2; abstract class TroopDb extends _i1.TableRow { TroopDb._({ int? id, - required this.path, + required this.troopType, + required this.actionPoints, }) : super(id); factory TroopDb({ int? id, - required String path, + required _i2.TroopType troopType, + required double actionPoints, }) = _TroopDbImpl; factory TroopDb.fromJson( @@ -27,7 +30,10 @@ abstract class TroopDb extends _i1.TableRow { ) { return TroopDb( id: serializationManager.deserialize(jsonSerialization['id']), - path: serializationManager.deserialize(jsonSerialization['path']), + troopType: serializationManager + .deserialize<_i2.TroopType>(jsonSerialization['troopType']), + actionPoints: serializationManager + .deserialize(jsonSerialization['actionPoints']), ); } @@ -35,20 +41,24 @@ abstract class TroopDb extends _i1.TableRow { static const db = TroopDbRepository._(); - String path; + _i2.TroopType troopType; + + double actionPoints; @override _i1.Table get table => t; TroopDb copyWith({ int? id, - String? path, + _i2.TroopType? troopType, + double? actionPoints, }); @override Map toJson() { return { if (id != null) 'id': id, - 'path': path, + 'troopType': troopType.toJson(), + 'actionPoints': actionPoints, }; } @@ -57,7 +67,8 @@ abstract class TroopDb extends _i1.TableRow { Map toJsonForDatabase() { return { 'id': id, - 'path': path, + 'troopType': troopType, + 'actionPoints': actionPoints, }; } @@ -65,7 +76,8 @@ abstract class TroopDb extends _i1.TableRow { Map allToJson() { return { if (id != null) 'id': id, - 'path': path, + 'troopType': troopType.toJson(), + 'actionPoints': actionPoints, }; } @@ -79,8 +91,11 @@ abstract class TroopDb extends _i1.TableRow { case 'id': id = value; return; - case 'path': - path = value; + case 'troopType': + troopType = value; + return; + case 'actionPoints': + actionPoints = value; return; default: throw UnimplementedError(); @@ -234,38 +249,50 @@ class _Undefined {} class _TroopDbImpl extends TroopDb { _TroopDbImpl({ int? id, - required String path, + required _i2.TroopType troopType, + required double actionPoints, }) : super._( id: id, - path: path, + troopType: troopType, + actionPoints: actionPoints, ); @override TroopDb copyWith({ Object? id = _Undefined, - String? path, + _i2.TroopType? troopType, + double? actionPoints, }) { return TroopDb( id: id is int? ? id : this.id, - path: path ?? this.path, + troopType: troopType ?? this.troopType, + actionPoints: actionPoints ?? this.actionPoints, ); } } class TroopDbTable extends _i1.Table { TroopDbTable({super.tableRelation}) : super(tableName: 'troop') { - path = _i1.ColumnString( - 'path', + troopType = _i1.ColumnEnum( + 'troopType', + this, + _i1.EnumSerialization.byName, + ); + actionPoints = _i1.ColumnDouble( + 'actionPoints', this, ); } - late final _i1.ColumnString path; + late final _i1.ColumnEnum<_i2.TroopType> troopType; + + late final _i1.ColumnDouble actionPoints; @override List<_i1.Column> get columns => [ id, - path, + troopType, + actionPoints, ]; } diff --git a/bluevsred_server/lib/src/generated/troop_type.dart b/bluevsred_server/lib/src/generated/troop_type.dart new file mode 100644 index 0000000..46b5c2e --- /dev/null +++ b/bluevsred_server/lib/src/generated/troop_type.dart @@ -0,0 +1,29 @@ +/* AUTOMATICALLY GENERATED CODE DO NOT MODIFY */ +/* To generate run: "serverpod generate" */ + +// ignore_for_file: library_private_types_in_public_api +// ignore_for_file: public_member_api_docs +// ignore_for_file: implementation_imports +// ignore_for_file: use_super_parameters +// ignore_for_file: type_literal_in_constant_pattern + +// ignore_for_file: no_leading_underscores_for_library_prefixes +import 'package:serverpod/serverpod.dart' as _i1; + +enum TroopType with _i1.SerializableEntity { + commander; + + static TroopType? fromJson(String name) { + switch (name) { + case 'commander': + return commander; + default: + return null; + } + } + + @override + String toJson() => name; + @override + String toString() => toJson(); +} diff --git a/bluevsred_server/lib/src/models/troop_db.yaml b/bluevsred_server/lib/src/models/troop_db.yaml index 802d842..5a28730 100644 --- a/bluevsred_server/lib/src/models/troop_db.yaml +++ b/bluevsred_server/lib/src/models/troop_db.yaml @@ -1,4 +1,5 @@ class: TroopDb table: troop fields: - path: String \ No newline at end of file + troopType: TroopType + actionPoints: double \ No newline at end of file diff --git a/bluevsred_server/lib/src/models/troop_type.yaml b/bluevsred_server/lib/src/models/troop_type.yaml new file mode 100644 index 0000000..78032f3 --- /dev/null +++ b/bluevsred_server/lib/src/models/troop_type.yaml @@ -0,0 +1,4 @@ +enum: TroopType +serialized: byName +values: + - commander \ No newline at end of file diff --git a/bluevsred_server/migrations/20240412073903562/definition.json b/bluevsred_server/migrations/20240412073903562/definition.json new file mode 100644 index 0000000..ce75112 --- /dev/null +++ b/bluevsred_server/migrations/20240412073903562/definition.json @@ -0,0 +1,1435 @@ +{ + "moduleName": "bluevsred", + "tables": [ + { + "name": "battle", + "dartName": "BattleDb", + "module": "bluevsred", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 2, + "isNullable": false, + "columnDefault": "nextval('battle_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "creationDate", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "startDate", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "maxActionPoints", + "columnType": 3, + "isNullable": false, + "dartType": "double" + }, + { + "name": "actionPointsRecoveryRate", + "columnType": 3, + "isNullable": false, + "dartType": "double" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "battle_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + }, + { + "name": "player", + "dartName": "GamePlayerDb", + "module": "bluevsred", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 2, + "isNullable": false, + "columnDefault": "nextval('player_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "name", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "player_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + }, + { + "name": "talle_map", + "dartName": "BattleMapDb", + "module": "bluevsred", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 2, + "isNullable": false, + "columnDefault": "nextval('talle_map_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "path", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "talle_map_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + }, + { + "name": "team", + "dartName": "TeamDb", + "module": "bluevsred", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 2, + "isNullable": false, + "columnDefault": "nextval('team_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "name", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "colorCode", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "team_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + }, + { + "name": "troop", + "dartName": "TroopDb", + "module": "bluevsred", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 2, + "isNullable": false, + "columnDefault": "nextval('troop_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "path", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "troopType", + "columnType": 0, + "isNullable": false, + "dartType": "protocol:TroopType" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "troop_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + }, + { + "name": "serverpod_auth_key", + "dartName": "AuthKey", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 2, + "isNullable": false, + "columnDefault": "nextval('serverpod_auth_key_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 2, + "isNullable": false, + "dartType": "int" + }, + { + "name": "hash", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "scopeNames", + "columnType": 8, + "isNullable": false, + "dartType": "List" + }, + { + "name": "method", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_auth_key_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_auth_key_userId_idx", + "elements": [ + { + "type": 0, + "definition": "userId" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_cloud_storage", + "dartName": "CloudStorageEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 2, + "isNullable": false, + "columnDefault": "nextval('serverpod_cloud_storage_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "storageId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "path", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "addedTime", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "expiration", + "columnType": 4, + "isNullable": true, + "dartType": "DateTime?" + }, + { + "name": "byteData", + "columnType": 5, + "isNullable": false, + "dartType": "dart:typed_data:ByteData" + }, + { + "name": "verified", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_cloud_storage_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_cloud_storage_path_idx", + "elements": [ + { + "type": 0, + "definition": "storageId" + }, + { + "type": 0, + "definition": "path" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + }, + { + "indexName": "serverpod_cloud_storage_expiration", + "elements": [ + { + "type": 0, + "definition": "expiration" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_cloud_storage_direct_upload", + "dartName": "CloudStorageDirectUploadEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 2, + "isNullable": false, + "columnDefault": "nextval('serverpod_cloud_storage_direct_upload_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "storageId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "path", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "expiration", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "authKey", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_cloud_storage_direct_upload_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_cloud_storage_direct_upload_storage_path", + "elements": [ + { + "type": 0, + "definition": "storageId" + }, + { + "type": 0, + "definition": "path" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_future_call", + "dartName": "FutureCallEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 2, + "isNullable": false, + "columnDefault": "nextval('serverpod_future_call_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "name", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "time", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "serializedObject", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "serverId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "identifier", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_future_call_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_future_call_time_idx", + "elements": [ + { + "type": 0, + "definition": "time" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + }, + { + "indexName": "serverpod_future_call_serverId_idx", + "elements": [ + { + "type": 0, + "definition": "serverId" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + }, + { + "indexName": "serverpod_future_call_identifier_idx", + "elements": [ + { + "type": 0, + "definition": "identifier" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_health_connection_info", + "dartName": "ServerHealthConnectionInfo", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 2, + "isNullable": false, + "columnDefault": "nextval('serverpod_health_connection_info_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "serverId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "timestamp", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "active", + "columnType": 2, + "isNullable": false, + "dartType": "int" + }, + { + "name": "closing", + "columnType": 2, + "isNullable": false, + "dartType": "int" + }, + { + "name": "idle", + "columnType": 2, + "isNullable": false, + "dartType": "int" + }, + { + "name": "granularity", + "columnType": 2, + "isNullable": false, + "dartType": "int" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_health_connection_info_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_health_connection_info_timestamp_idx", + "elements": [ + { + "type": 0, + "definition": "timestamp" + }, + { + "type": 0, + "definition": "serverId" + }, + { + "type": 0, + "definition": "granularity" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_health_metric", + "dartName": "ServerHealthMetric", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 2, + "isNullable": false, + "columnDefault": "nextval('serverpod_health_metric_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "name", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "serverId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "timestamp", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "isHealthy", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + }, + { + "name": "value", + "columnType": 3, + "isNullable": false, + "dartType": "double" + }, + { + "name": "granularity", + "columnType": 2, + "isNullable": false, + "dartType": "int" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_health_metric_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_health_metric_timestamp_idx", + "elements": [ + { + "type": 0, + "definition": "timestamp" + }, + { + "type": 0, + "definition": "serverId" + }, + { + "type": 0, + "definition": "name" + }, + { + "type": 0, + "definition": "granularity" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_log", + "dartName": "LogEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 2, + "isNullable": false, + "columnDefault": "nextval('serverpod_log_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "sessionLogId", + "columnType": 2, + "isNullable": false, + "dartType": "int" + }, + { + "name": "messageId", + "columnType": 2, + "isNullable": true, + "dartType": "int?" + }, + { + "name": "reference", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "serverId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "time", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "logLevel", + "columnType": 2, + "isNullable": false, + "dartType": "protocol:LogLevel" + }, + { + "name": "message", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "error", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "stackTrace", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "order", + "columnType": 2, + "isNullable": false, + "dartType": "int" + } + ], + "foreignKeys": [ + { + "constraintName": "serverpod_log_fk_0", + "columns": [ + "sessionLogId" + ], + "referenceTable": "serverpod_session_log", + "referenceTableSchema": "public", + "referenceColumns": [ + "id" + ], + "onUpdate": 3, + "onDelete": 4 + } + ], + "indexes": [ + { + "indexName": "serverpod_log_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_log_sessionLogId_idx", + "elements": [ + { + "type": 0, + "definition": "sessionLogId" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_message_log", + "dartName": "MessageLogEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 2, + "isNullable": false, + "columnDefault": "nextval('serverpod_message_log_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "sessionLogId", + "columnType": 2, + "isNullable": false, + "dartType": "int" + }, + { + "name": "serverId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "messageId", + "columnType": 2, + "isNullable": false, + "dartType": "int" + }, + { + "name": "endpoint", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "messageName", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "duration", + "columnType": 3, + "isNullable": false, + "dartType": "double" + }, + { + "name": "error", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "stackTrace", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "slow", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + }, + { + "name": "order", + "columnType": 2, + "isNullable": false, + "dartType": "int" + } + ], + "foreignKeys": [ + { + "constraintName": "serverpod_message_log_fk_0", + "columns": [ + "sessionLogId" + ], + "referenceTable": "serverpod_session_log", + "referenceTableSchema": "public", + "referenceColumns": [ + "id" + ], + "onUpdate": 3, + "onDelete": 4 + } + ], + "indexes": [ + { + "indexName": "serverpod_message_log_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + }, + { + "name": "serverpod_method", + "dartName": "MethodInfo", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 2, + "isNullable": false, + "columnDefault": "nextval('serverpod_method_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "endpoint", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "method", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_method_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_method_endpoint_method_idx", + "elements": [ + { + "type": 0, + "definition": "endpoint" + }, + { + "type": 0, + "definition": "method" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_migrations", + "dartName": "DatabaseMigrationVersion", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 2, + "isNullable": false, + "columnDefault": "nextval('serverpod_migrations_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "module", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "version", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "timestamp", + "columnType": 4, + "isNullable": true, + "dartType": "DateTime?" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_migrations_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_migrations_ids", + "elements": [ + { + "type": 0, + "definition": "module" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_query_log", + "dartName": "QueryLogEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 2, + "isNullable": false, + "columnDefault": "nextval('serverpod_query_log_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "serverId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "sessionLogId", + "columnType": 2, + "isNullable": false, + "dartType": "int" + }, + { + "name": "messageId", + "columnType": 2, + "isNullable": true, + "dartType": "int?" + }, + { + "name": "query", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "duration", + "columnType": 3, + "isNullable": false, + "dartType": "double" + }, + { + "name": "numRows", + "columnType": 2, + "isNullable": true, + "dartType": "int?" + }, + { + "name": "error", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "stackTrace", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "slow", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + }, + { + "name": "order", + "columnType": 2, + "isNullable": false, + "dartType": "int" + } + ], + "foreignKeys": [ + { + "constraintName": "serverpod_query_log_fk_0", + "columns": [ + "sessionLogId" + ], + "referenceTable": "serverpod_session_log", + "referenceTableSchema": "public", + "referenceColumns": [ + "id" + ], + "onUpdate": 3, + "onDelete": 4 + } + ], + "indexes": [ + { + "indexName": "serverpod_query_log_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_query_log_sessionLogId_idx", + "elements": [ + { + "type": 0, + "definition": "sessionLogId" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_readwrite_test", + "dartName": "ReadWriteTestEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 2, + "isNullable": false, + "columnDefault": "nextval('serverpod_readwrite_test_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "number", + "columnType": 2, + "isNullable": false, + "dartType": "int" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_readwrite_test_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + }, + { + "name": "serverpod_runtime_settings", + "dartName": "RuntimeSettings", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 2, + "isNullable": false, + "columnDefault": "nextval('serverpod_runtime_settings_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "logSettings", + "columnType": 8, + "isNullable": false, + "dartType": "protocol:LogSettings" + }, + { + "name": "logSettingsOverrides", + "columnType": 8, + "isNullable": false, + "dartType": "List" + }, + { + "name": "logServiceCalls", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + }, + { + "name": "logMalformedCalls", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_runtime_settings_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + }, + { + "name": "serverpod_session_log", + "dartName": "SessionLogEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 2, + "isNullable": false, + "columnDefault": "nextval('serverpod_session_log_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "serverId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "time", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "module", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "endpoint", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "method", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "duration", + "columnType": 3, + "isNullable": true, + "dartType": "double?" + }, + { + "name": "numQueries", + "columnType": 2, + "isNullable": true, + "dartType": "int?" + }, + { + "name": "slow", + "columnType": 1, + "isNullable": true, + "dartType": "bool?" + }, + { + "name": "error", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "stackTrace", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "authenticatedUserId", + "columnType": 2, + "isNullable": true, + "dartType": "int?" + }, + { + "name": "isOpen", + "columnType": 1, + "isNullable": true, + "dartType": "bool?" + }, + { + "name": "touched", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_session_log_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_session_log_serverid_idx", + "elements": [ + { + "type": 0, + "definition": "serverId" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + }, + { + "indexName": "serverpod_session_log_touched_idx", + "elements": [ + { + "type": 0, + "definition": "touched" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + }, + { + "indexName": "serverpod_session_log_isopen_idx", + "elements": [ + { + "type": 0, + "definition": "isOpen" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + } + ], + "installedModules": [ + { + "module": "bluevsred", + "version": "20240412073903562" + }, + { + "module": "serverpod", + "version": "20240115074235544" + } + ], + "migrationApiVersion": 1 +} \ No newline at end of file diff --git a/bluevsred_server/migrations/20240412073903562/definition.sql b/bluevsred_server/migrations/20240412073903562/definition.sql new file mode 100644 index 0000000..a1ac1e6 --- /dev/null +++ b/bluevsred_server/migrations/20240412073903562/definition.sql @@ -0,0 +1,316 @@ +BEGIN; + +-- +-- Class BattleDb as table battle +-- +CREATE TABLE "battle" ( + "id" serial PRIMARY KEY, + "creationDate" timestamp without time zone NOT NULL, + "startDate" timestamp without time zone NOT NULL, + "maxActionPoints" double precision NOT NULL, + "actionPointsRecoveryRate" double precision NOT NULL +); + +-- +-- Class GamePlayerDb as table player +-- +CREATE TABLE "player" ( + "id" serial PRIMARY KEY, + "name" text NOT NULL +); + +-- +-- Class BattleMapDb as table talle_map +-- +CREATE TABLE "talle_map" ( + "id" serial PRIMARY KEY, + "path" text NOT NULL +); + +-- +-- Class TeamDb as table team +-- +CREATE TABLE "team" ( + "id" serial PRIMARY KEY, + "name" text NOT NULL, + "colorCode" text NOT NULL +); + +-- +-- Class TroopDb as table troop +-- +CREATE TABLE "troop" ( + "id" serial PRIMARY KEY, + "path" text NOT NULL, + "troopType" text NOT NULL +); + +-- +-- Class AuthKey as table serverpod_auth_key +-- +CREATE TABLE "serverpod_auth_key" ( + "id" serial PRIMARY KEY, + "userId" integer NOT NULL, + "hash" text NOT NULL, + "scopeNames" json NOT NULL, + "method" text NOT NULL +); + +-- Indexes +CREATE INDEX "serverpod_auth_key_userId_idx" ON "serverpod_auth_key" USING btree ("userId"); + +-- +-- Class CloudStorageEntry as table serverpod_cloud_storage +-- +CREATE TABLE "serverpod_cloud_storage" ( + "id" serial PRIMARY KEY, + "storageId" text NOT NULL, + "path" text NOT NULL, + "addedTime" timestamp without time zone NOT NULL, + "expiration" timestamp without time zone, + "byteData" bytea NOT NULL, + "verified" boolean NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_cloud_storage_path_idx" ON "serverpod_cloud_storage" USING btree ("storageId", "path"); +CREATE INDEX "serverpod_cloud_storage_expiration" ON "serverpod_cloud_storage" USING btree ("expiration"); + +-- +-- Class CloudStorageDirectUploadEntry as table serverpod_cloud_storage_direct_upload +-- +CREATE TABLE "serverpod_cloud_storage_direct_upload" ( + "id" serial PRIMARY KEY, + "storageId" text NOT NULL, + "path" text NOT NULL, + "expiration" timestamp without time zone NOT NULL, + "authKey" text NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_cloud_storage_direct_upload_storage_path" ON "serverpod_cloud_storage_direct_upload" USING btree ("storageId", "path"); + +-- +-- Class FutureCallEntry as table serverpod_future_call +-- +CREATE TABLE "serverpod_future_call" ( + "id" serial PRIMARY KEY, + "name" text NOT NULL, + "time" timestamp without time zone NOT NULL, + "serializedObject" text, + "serverId" text NOT NULL, + "identifier" text +); + +-- Indexes +CREATE INDEX "serverpod_future_call_time_idx" ON "serverpod_future_call" USING btree ("time"); +CREATE INDEX "serverpod_future_call_serverId_idx" ON "serverpod_future_call" USING btree ("serverId"); +CREATE INDEX "serverpod_future_call_identifier_idx" ON "serverpod_future_call" USING btree ("identifier"); + +-- +-- Class ServerHealthConnectionInfo as table serverpod_health_connection_info +-- +CREATE TABLE "serverpod_health_connection_info" ( + "id" serial PRIMARY KEY, + "serverId" text NOT NULL, + "timestamp" timestamp without time zone NOT NULL, + "active" integer NOT NULL, + "closing" integer NOT NULL, + "idle" integer NOT NULL, + "granularity" integer NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_health_connection_info_timestamp_idx" ON "serverpod_health_connection_info" USING btree ("timestamp", "serverId", "granularity"); + +-- +-- Class ServerHealthMetric as table serverpod_health_metric +-- +CREATE TABLE "serverpod_health_metric" ( + "id" serial PRIMARY KEY, + "name" text NOT NULL, + "serverId" text NOT NULL, + "timestamp" timestamp without time zone NOT NULL, + "isHealthy" boolean NOT NULL, + "value" double precision NOT NULL, + "granularity" integer NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_health_metric_timestamp_idx" ON "serverpod_health_metric" USING btree ("timestamp", "serverId", "name", "granularity"); + +-- +-- Class LogEntry as table serverpod_log +-- +CREATE TABLE "serverpod_log" ( + "id" serial PRIMARY KEY, + "sessionLogId" integer NOT NULL, + "messageId" integer, + "reference" text, + "serverId" text NOT NULL, + "time" timestamp without time zone NOT NULL, + "logLevel" integer NOT NULL, + "message" text NOT NULL, + "error" text, + "stackTrace" text, + "order" integer NOT NULL +); + +-- Indexes +CREATE INDEX "serverpod_log_sessionLogId_idx" ON "serverpod_log" USING btree ("sessionLogId"); + +-- +-- Class MessageLogEntry as table serverpod_message_log +-- +CREATE TABLE "serverpod_message_log" ( + "id" serial PRIMARY KEY, + "sessionLogId" integer NOT NULL, + "serverId" text NOT NULL, + "messageId" integer NOT NULL, + "endpoint" text NOT NULL, + "messageName" text NOT NULL, + "duration" double precision NOT NULL, + "error" text, + "stackTrace" text, + "slow" boolean NOT NULL, + "order" integer NOT NULL +); + +-- +-- Class MethodInfo as table serverpod_method +-- +CREATE TABLE "serverpod_method" ( + "id" serial PRIMARY KEY, + "endpoint" text NOT NULL, + "method" text NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_method_endpoint_method_idx" ON "serverpod_method" USING btree ("endpoint", "method"); + +-- +-- Class DatabaseMigrationVersion as table serverpod_migrations +-- +CREATE TABLE "serverpod_migrations" ( + "id" serial PRIMARY KEY, + "module" text NOT NULL, + "version" text NOT NULL, + "timestamp" timestamp without time zone +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_migrations_ids" ON "serverpod_migrations" USING btree ("module"); + +-- +-- Class QueryLogEntry as table serverpod_query_log +-- +CREATE TABLE "serverpod_query_log" ( + "id" serial PRIMARY KEY, + "serverId" text NOT NULL, + "sessionLogId" integer NOT NULL, + "messageId" integer, + "query" text NOT NULL, + "duration" double precision NOT NULL, + "numRows" integer, + "error" text, + "stackTrace" text, + "slow" boolean NOT NULL, + "order" integer NOT NULL +); + +-- Indexes +CREATE INDEX "serverpod_query_log_sessionLogId_idx" ON "serverpod_query_log" USING btree ("sessionLogId"); + +-- +-- Class ReadWriteTestEntry as table serverpod_readwrite_test +-- +CREATE TABLE "serverpod_readwrite_test" ( + "id" serial PRIMARY KEY, + "number" integer NOT NULL +); + +-- +-- Class RuntimeSettings as table serverpod_runtime_settings +-- +CREATE TABLE "serverpod_runtime_settings" ( + "id" serial PRIMARY KEY, + "logSettings" json NOT NULL, + "logSettingsOverrides" json NOT NULL, + "logServiceCalls" boolean NOT NULL, + "logMalformedCalls" boolean NOT NULL +); + +-- +-- Class SessionLogEntry as table serverpod_session_log +-- +CREATE TABLE "serverpod_session_log" ( + "id" serial PRIMARY KEY, + "serverId" text NOT NULL, + "time" timestamp without time zone NOT NULL, + "module" text, + "endpoint" text, + "method" text, + "duration" double precision, + "numQueries" integer, + "slow" boolean, + "error" text, + "stackTrace" text, + "authenticatedUserId" integer, + "isOpen" boolean, + "touched" timestamp without time zone NOT NULL +); + +-- Indexes +CREATE INDEX "serverpod_session_log_serverid_idx" ON "serverpod_session_log" USING btree ("serverId"); +CREATE INDEX "serverpod_session_log_touched_idx" ON "serverpod_session_log" USING btree ("touched"); +CREATE INDEX "serverpod_session_log_isopen_idx" ON "serverpod_session_log" USING btree ("isOpen"); + +-- +-- Foreign relations for "serverpod_log" table +-- +ALTER TABLE ONLY "serverpod_log" + ADD CONSTRAINT "serverpod_log_fk_0" + FOREIGN KEY("sessionLogId") + REFERENCES "serverpod_session_log"("id") + ON DELETE CASCADE + ON UPDATE NO ACTION; + +-- +-- Foreign relations for "serverpod_message_log" table +-- +ALTER TABLE ONLY "serverpod_message_log" + ADD CONSTRAINT "serverpod_message_log_fk_0" + FOREIGN KEY("sessionLogId") + REFERENCES "serverpod_session_log"("id") + ON DELETE CASCADE + ON UPDATE NO ACTION; + +-- +-- Foreign relations for "serverpod_query_log" table +-- +ALTER TABLE ONLY "serverpod_query_log" + ADD CONSTRAINT "serverpod_query_log_fk_0" + FOREIGN KEY("sessionLogId") + REFERENCES "serverpod_session_log"("id") + ON DELETE CASCADE + ON UPDATE NO ACTION; + + +-- +-- MIGRATION VERSION FOR bluevsred +-- +INSERT INTO "serverpod_migrations" ("module", "version", "timestamp") + VALUES ('bluevsred', '20240412073903562', now()) + ON CONFLICT ("module") + DO UPDATE SET "version" = '20240412073903562', "timestamp" = now(); + +-- +-- MIGRATION VERSION FOR serverpod +-- +INSERT INTO "serverpod_migrations" ("module", "version", "timestamp") + VALUES ('serverpod', '20240115074235544', now()) + ON CONFLICT ("module") + DO UPDATE SET "version" = '20240115074235544', "timestamp" = now(); + + +COMMIT; diff --git a/bluevsred_server/migrations/20240412073903562/definition_project.json b/bluevsred_server/migrations/20240412073903562/definition_project.json new file mode 100644 index 0000000..04f419a --- /dev/null +++ b/bluevsred_server/migrations/20240412073903562/definition_project.json @@ -0,0 +1,231 @@ +{ + "moduleName": "bluevsred", + "tables": [ + { + "name": "battle", + "dartName": "BattleDb", + "module": "bluevsred", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 2, + "isNullable": false, + "columnDefault": "nextval('battle_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "creationDate", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "startDate", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "maxActionPoints", + "columnType": 3, + "isNullable": false, + "dartType": "double" + }, + { + "name": "actionPointsRecoveryRate", + "columnType": 3, + "isNullable": false, + "dartType": "double" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "battle_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + }, + { + "name": "player", + "dartName": "GamePlayerDb", + "module": "bluevsred", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 2, + "isNullable": false, + "columnDefault": "nextval('player_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "name", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "player_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + }, + { + "name": "talle_map", + "dartName": "BattleMapDb", + "module": "bluevsred", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 2, + "isNullable": false, + "columnDefault": "nextval('talle_map_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "path", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "talle_map_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + }, + { + "name": "team", + "dartName": "TeamDb", + "module": "bluevsred", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 2, + "isNullable": false, + "columnDefault": "nextval('team_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "name", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "colorCode", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "team_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + }, + { + "name": "troop", + "dartName": "TroopDb", + "module": "bluevsred", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 2, + "isNullable": false, + "columnDefault": "nextval('troop_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "path", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "troopType", + "columnType": 0, + "isNullable": false, + "dartType": "protocol:TroopType" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "troop_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + } + ], + "installedModules": [ + { + "module": "serverpod", + "version": "20240115074235544" + }, + { + "module": "bluevsred", + "version": "20240403080154821" + } + ], + "migrationApiVersion": 1 +} \ No newline at end of file diff --git a/bluevsred_server/migrations/20240412073903562/migration.json b/bluevsred_server/migrations/20240412073903562/migration.json new file mode 100644 index 0000000..7e9ecc5 --- /dev/null +++ b/bluevsred_server/migrations/20240412073903562/migration.json @@ -0,0 +1,248 @@ +{ + "actions": [ + { + "type": "deleteTable", + "deleteTable": "example" + }, + { + "type": "createTable", + "createTable": { + "name": "battle", + "dartName": "BattleDb", + "module": "bluevsred", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 2, + "isNullable": false, + "columnDefault": "nextval('battle_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "creationDate", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "startDate", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "maxActionPoints", + "columnType": 3, + "isNullable": false, + "dartType": "double" + }, + { + "name": "actionPointsRecoveryRate", + "columnType": 3, + "isNullable": false, + "dartType": "double" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "battle_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + } + }, + { + "type": "createTable", + "createTable": { + "name": "player", + "dartName": "GamePlayerDb", + "module": "bluevsred", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 2, + "isNullable": false, + "columnDefault": "nextval('player_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "name", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "player_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + } + }, + { + "type": "createTable", + "createTable": { + "name": "talle_map", + "dartName": "BattleMapDb", + "module": "bluevsred", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 2, + "isNullable": false, + "columnDefault": "nextval('talle_map_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "path", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "talle_map_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + } + }, + { + "type": "createTable", + "createTable": { + "name": "team", + "dartName": "TeamDb", + "module": "bluevsred", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 2, + "isNullable": false, + "columnDefault": "nextval('team_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "name", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "colorCode", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "team_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + } + }, + { + "type": "createTable", + "createTable": { + "name": "troop", + "dartName": "TroopDb", + "module": "bluevsred", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 2, + "isNullable": false, + "columnDefault": "nextval('troop_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "path", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "troopType", + "columnType": 0, + "isNullable": false, + "dartType": "protocol:TroopType" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "troop_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + } + } + ], + "warnings": [ + { + "type": "tableDropped", + "message": "Table \"example\" will be dropped.", + "table": "example", + "columns": [], + "destrucive": true + } + ], + "migrationApiVersion": 1 +} \ No newline at end of file diff --git a/bluevsred_server/migrations/20240412073903562/migration.sql b/bluevsred_server/migrations/20240412073903562/migration.sql new file mode 100644 index 0000000..c98b7ed --- /dev/null +++ b/bluevsred_server/migrations/20240412073903562/migration.sql @@ -0,0 +1,71 @@ +BEGIN; + +-- +-- ACTION DROP TABLE +-- +DROP TABLE "example" CASCADE; + +-- +-- ACTION CREATE TABLE +-- +CREATE TABLE "battle" ( + "id" serial PRIMARY KEY, + "creationDate" timestamp without time zone NOT NULL, + "startDate" timestamp without time zone NOT NULL, + "maxActionPoints" double precision NOT NULL, + "actionPointsRecoveryRate" double precision NOT NULL +); + +-- +-- ACTION CREATE TABLE +-- +CREATE TABLE "player" ( + "id" serial PRIMARY KEY, + "name" text NOT NULL +); + +-- +-- ACTION CREATE TABLE +-- +CREATE TABLE "talle_map" ( + "id" serial PRIMARY KEY, + "path" text NOT NULL +); + +-- +-- ACTION CREATE TABLE +-- +CREATE TABLE "team" ( + "id" serial PRIMARY KEY, + "name" text NOT NULL, + "colorCode" text NOT NULL +); + +-- +-- ACTION CREATE TABLE +-- +CREATE TABLE "troop" ( + "id" serial PRIMARY KEY, + "path" text NOT NULL, + "troopType" text NOT NULL +); + + +-- +-- MIGRATION VERSION FOR bluevsred +-- +INSERT INTO "serverpod_migrations" ("module", "version", "timestamp") + VALUES ('bluevsred', '20240412073903562', now()) + ON CONFLICT ("module") + DO UPDATE SET "version" = '20240412073903562', "timestamp" = now(); + +-- +-- MIGRATION VERSION FOR serverpod +-- +INSERT INTO "serverpod_migrations" ("module", "version", "timestamp") + VALUES ('serverpod', '20240115074235544', now()) + ON CONFLICT ("module") + DO UPDATE SET "version" = '20240115074235544', "timestamp" = now(); + + +COMMIT; diff --git a/bluevsred_server/migrations/20240412092530655/definition.json b/bluevsred_server/migrations/20240412092530655/definition.json new file mode 100644 index 0000000..e112041 --- /dev/null +++ b/bluevsred_server/migrations/20240412092530655/definition.json @@ -0,0 +1,1435 @@ +{ + "moduleName": "bluevsred", + "tables": [ + { + "name": "battle", + "dartName": "BattleDb", + "module": "bluevsred", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 2, + "isNullable": false, + "columnDefault": "nextval('battle_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "creationDate", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "startDate", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "maxActionPoints", + "columnType": 3, + "isNullable": false, + "dartType": "double" + }, + { + "name": "actionPointsRecoveryRate", + "columnType": 3, + "isNullable": false, + "dartType": "double" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "battle_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + }, + { + "name": "player", + "dartName": "GamePlayerDb", + "module": "bluevsred", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 2, + "isNullable": false, + "columnDefault": "nextval('player_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "name", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "player_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + }, + { + "name": "talle_map", + "dartName": "BattleMapDb", + "module": "bluevsred", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 2, + "isNullable": false, + "columnDefault": "nextval('talle_map_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "path", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "talle_map_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + }, + { + "name": "team", + "dartName": "TeamDb", + "module": "bluevsred", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 2, + "isNullable": false, + "columnDefault": "nextval('team_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "name", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "colorCode", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "team_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + }, + { + "name": "troop", + "dartName": "TroopDb", + "module": "bluevsred", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 2, + "isNullable": false, + "columnDefault": "nextval('troop_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "path", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "troopType", + "columnType": 0, + "isNullable": false, + "dartType": "protocol:TroopType" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "troop_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + }, + { + "name": "serverpod_auth_key", + "dartName": "AuthKey", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 2, + "isNullable": false, + "columnDefault": "nextval('serverpod_auth_key_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "userId", + "columnType": 2, + "isNullable": false, + "dartType": "int" + }, + { + "name": "hash", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "scopeNames", + "columnType": 8, + "isNullable": false, + "dartType": "List" + }, + { + "name": "method", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_auth_key_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_auth_key_userId_idx", + "elements": [ + { + "type": 0, + "definition": "userId" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_cloud_storage", + "dartName": "CloudStorageEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 2, + "isNullable": false, + "columnDefault": "nextval('serverpod_cloud_storage_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "storageId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "path", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "addedTime", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "expiration", + "columnType": 4, + "isNullable": true, + "dartType": "DateTime?" + }, + { + "name": "byteData", + "columnType": 5, + "isNullable": false, + "dartType": "dart:typed_data:ByteData" + }, + { + "name": "verified", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_cloud_storage_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_cloud_storage_path_idx", + "elements": [ + { + "type": 0, + "definition": "storageId" + }, + { + "type": 0, + "definition": "path" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + }, + { + "indexName": "serverpod_cloud_storage_expiration", + "elements": [ + { + "type": 0, + "definition": "expiration" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_cloud_storage_direct_upload", + "dartName": "CloudStorageDirectUploadEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 2, + "isNullable": false, + "columnDefault": "nextval('serverpod_cloud_storage_direct_upload_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "storageId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "path", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "expiration", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "authKey", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_cloud_storage_direct_upload_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_cloud_storage_direct_upload_storage_path", + "elements": [ + { + "type": 0, + "definition": "storageId" + }, + { + "type": 0, + "definition": "path" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_future_call", + "dartName": "FutureCallEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 2, + "isNullable": false, + "columnDefault": "nextval('serverpod_future_call_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "name", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "time", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "serializedObject", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "serverId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "identifier", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_future_call_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_future_call_time_idx", + "elements": [ + { + "type": 0, + "definition": "time" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + }, + { + "indexName": "serverpod_future_call_serverId_idx", + "elements": [ + { + "type": 0, + "definition": "serverId" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + }, + { + "indexName": "serverpod_future_call_identifier_idx", + "elements": [ + { + "type": 0, + "definition": "identifier" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_health_connection_info", + "dartName": "ServerHealthConnectionInfo", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 2, + "isNullable": false, + "columnDefault": "nextval('serverpod_health_connection_info_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "serverId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "timestamp", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "active", + "columnType": 2, + "isNullable": false, + "dartType": "int" + }, + { + "name": "closing", + "columnType": 2, + "isNullable": false, + "dartType": "int" + }, + { + "name": "idle", + "columnType": 2, + "isNullable": false, + "dartType": "int" + }, + { + "name": "granularity", + "columnType": 2, + "isNullable": false, + "dartType": "int" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_health_connection_info_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_health_connection_info_timestamp_idx", + "elements": [ + { + "type": 0, + "definition": "timestamp" + }, + { + "type": 0, + "definition": "serverId" + }, + { + "type": 0, + "definition": "granularity" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_health_metric", + "dartName": "ServerHealthMetric", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 2, + "isNullable": false, + "columnDefault": "nextval('serverpod_health_metric_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "name", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "serverId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "timestamp", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "isHealthy", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + }, + { + "name": "value", + "columnType": 3, + "isNullable": false, + "dartType": "double" + }, + { + "name": "granularity", + "columnType": 2, + "isNullable": false, + "dartType": "int" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_health_metric_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_health_metric_timestamp_idx", + "elements": [ + { + "type": 0, + "definition": "timestamp" + }, + { + "type": 0, + "definition": "serverId" + }, + { + "type": 0, + "definition": "name" + }, + { + "type": 0, + "definition": "granularity" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_log", + "dartName": "LogEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 2, + "isNullable": false, + "columnDefault": "nextval('serverpod_log_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "sessionLogId", + "columnType": 2, + "isNullable": false, + "dartType": "int" + }, + { + "name": "messageId", + "columnType": 2, + "isNullable": true, + "dartType": "int?" + }, + { + "name": "reference", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "serverId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "time", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "logLevel", + "columnType": 2, + "isNullable": false, + "dartType": "protocol:LogLevel" + }, + { + "name": "message", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "error", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "stackTrace", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "order", + "columnType": 2, + "isNullable": false, + "dartType": "int" + } + ], + "foreignKeys": [ + { + "constraintName": "serverpod_log_fk_0", + "columns": [ + "sessionLogId" + ], + "referenceTable": "serverpod_session_log", + "referenceTableSchema": "public", + "referenceColumns": [ + "id" + ], + "onUpdate": 3, + "onDelete": 4 + } + ], + "indexes": [ + { + "indexName": "serverpod_log_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_log_sessionLogId_idx", + "elements": [ + { + "type": 0, + "definition": "sessionLogId" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_message_log", + "dartName": "MessageLogEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 2, + "isNullable": false, + "columnDefault": "nextval('serverpod_message_log_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "sessionLogId", + "columnType": 2, + "isNullable": false, + "dartType": "int" + }, + { + "name": "serverId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "messageId", + "columnType": 2, + "isNullable": false, + "dartType": "int" + }, + { + "name": "endpoint", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "messageName", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "duration", + "columnType": 3, + "isNullable": false, + "dartType": "double" + }, + { + "name": "error", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "stackTrace", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "slow", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + }, + { + "name": "order", + "columnType": 2, + "isNullable": false, + "dartType": "int" + } + ], + "foreignKeys": [ + { + "constraintName": "serverpod_message_log_fk_0", + "columns": [ + "sessionLogId" + ], + "referenceTable": "serverpod_session_log", + "referenceTableSchema": "public", + "referenceColumns": [ + "id" + ], + "onUpdate": 3, + "onDelete": 4 + } + ], + "indexes": [ + { + "indexName": "serverpod_message_log_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + }, + { + "name": "serverpod_method", + "dartName": "MethodInfo", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 2, + "isNullable": false, + "columnDefault": "nextval('serverpod_method_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "endpoint", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "method", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_method_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_method_endpoint_method_idx", + "elements": [ + { + "type": 0, + "definition": "endpoint" + }, + { + "type": 0, + "definition": "method" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_migrations", + "dartName": "DatabaseMigrationVersion", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 2, + "isNullable": false, + "columnDefault": "nextval('serverpod_migrations_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "module", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "version", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "timestamp", + "columnType": 4, + "isNullable": true, + "dartType": "DateTime?" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_migrations_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_migrations_ids", + "elements": [ + { + "type": 0, + "definition": "module" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_query_log", + "dartName": "QueryLogEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 2, + "isNullable": false, + "columnDefault": "nextval('serverpod_query_log_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "serverId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "sessionLogId", + "columnType": 2, + "isNullable": false, + "dartType": "int" + }, + { + "name": "messageId", + "columnType": 2, + "isNullable": true, + "dartType": "int?" + }, + { + "name": "query", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "duration", + "columnType": 3, + "isNullable": false, + "dartType": "double" + }, + { + "name": "numRows", + "columnType": 2, + "isNullable": true, + "dartType": "int?" + }, + { + "name": "error", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "stackTrace", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "slow", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + }, + { + "name": "order", + "columnType": 2, + "isNullable": false, + "dartType": "int" + } + ], + "foreignKeys": [ + { + "constraintName": "serverpod_query_log_fk_0", + "columns": [ + "sessionLogId" + ], + "referenceTable": "serverpod_session_log", + "referenceTableSchema": "public", + "referenceColumns": [ + "id" + ], + "onUpdate": 3, + "onDelete": 4 + } + ], + "indexes": [ + { + "indexName": "serverpod_query_log_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_query_log_sessionLogId_idx", + "elements": [ + { + "type": 0, + "definition": "sessionLogId" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + }, + { + "name": "serverpod_readwrite_test", + "dartName": "ReadWriteTestEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 2, + "isNullable": false, + "columnDefault": "nextval('serverpod_readwrite_test_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "number", + "columnType": 2, + "isNullable": false, + "dartType": "int" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_readwrite_test_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + }, + { + "name": "serverpod_runtime_settings", + "dartName": "RuntimeSettings", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 2, + "isNullable": false, + "columnDefault": "nextval('serverpod_runtime_settings_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "logSettings", + "columnType": 8, + "isNullable": false, + "dartType": "protocol:LogSettings" + }, + { + "name": "logSettingsOverrides", + "columnType": 8, + "isNullable": false, + "dartType": "List" + }, + { + "name": "logServiceCalls", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + }, + { + "name": "logMalformedCalls", + "columnType": 1, + "isNullable": false, + "dartType": "bool" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_runtime_settings_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + }, + { + "name": "serverpod_session_log", + "dartName": "SessionLogEntry", + "module": "serverpod", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 2, + "isNullable": false, + "columnDefault": "nextval('serverpod_session_log_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "serverId", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "time", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "module", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "endpoint", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "method", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "duration", + "columnType": 3, + "isNullable": true, + "dartType": "double?" + }, + { + "name": "numQueries", + "columnType": 2, + "isNullable": true, + "dartType": "int?" + }, + { + "name": "slow", + "columnType": 1, + "isNullable": true, + "dartType": "bool?" + }, + { + "name": "error", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "stackTrace", + "columnType": 0, + "isNullable": true, + "dartType": "String?" + }, + { + "name": "authenticatedUserId", + "columnType": 2, + "isNullable": true, + "dartType": "int?" + }, + { + "name": "isOpen", + "columnType": 1, + "isNullable": true, + "dartType": "bool?" + }, + { + "name": "touched", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "serverpod_session_log_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + }, + { + "indexName": "serverpod_session_log_serverid_idx", + "elements": [ + { + "type": 0, + "definition": "serverId" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + }, + { + "indexName": "serverpod_session_log_touched_idx", + "elements": [ + { + "type": 0, + "definition": "touched" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + }, + { + "indexName": "serverpod_session_log_isopen_idx", + "elements": [ + { + "type": 0, + "definition": "isOpen" + } + ], + "type": "btree", + "isUnique": false, + "isPrimary": false + } + ], + "managed": true + } + ], + "installedModules": [ + { + "module": "bluevsred", + "version": "20240412092530655" + }, + { + "module": "serverpod", + "version": "20240115074235544" + } + ], + "migrationApiVersion": 1 +} \ No newline at end of file diff --git a/bluevsred_server/migrations/20240412092530655/definition.sql b/bluevsred_server/migrations/20240412092530655/definition.sql new file mode 100644 index 0000000..98e1d25 --- /dev/null +++ b/bluevsred_server/migrations/20240412092530655/definition.sql @@ -0,0 +1,316 @@ +BEGIN; + +-- +-- Class BattleDb as table battle +-- +CREATE TABLE "battle" ( + "id" serial PRIMARY KEY, + "creationDate" timestamp without time zone NOT NULL, + "startDate" timestamp without time zone NOT NULL, + "maxActionPoints" double precision NOT NULL, + "actionPointsRecoveryRate" double precision NOT NULL +); + +-- +-- Class GamePlayerDb as table player +-- +CREATE TABLE "player" ( + "id" serial PRIMARY KEY, + "name" text NOT NULL +); + +-- +-- Class BattleMapDb as table talle_map +-- +CREATE TABLE "talle_map" ( + "id" serial PRIMARY KEY, + "path" text NOT NULL +); + +-- +-- Class TeamDb as table team +-- +CREATE TABLE "team" ( + "id" serial PRIMARY KEY, + "name" text NOT NULL, + "colorCode" text NOT NULL +); + +-- +-- Class TroopDb as table troop +-- +CREATE TABLE "troop" ( + "id" serial PRIMARY KEY, + "path" text NOT NULL, + "troopType" text NOT NULL +); + +-- +-- Class AuthKey as table serverpod_auth_key +-- +CREATE TABLE "serverpod_auth_key" ( + "id" serial PRIMARY KEY, + "userId" integer NOT NULL, + "hash" text NOT NULL, + "scopeNames" json NOT NULL, + "method" text NOT NULL +); + +-- Indexes +CREATE INDEX "serverpod_auth_key_userId_idx" ON "serverpod_auth_key" USING btree ("userId"); + +-- +-- Class CloudStorageEntry as table serverpod_cloud_storage +-- +CREATE TABLE "serverpod_cloud_storage" ( + "id" serial PRIMARY KEY, + "storageId" text NOT NULL, + "path" text NOT NULL, + "addedTime" timestamp without time zone NOT NULL, + "expiration" timestamp without time zone, + "byteData" bytea NOT NULL, + "verified" boolean NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_cloud_storage_path_idx" ON "serverpod_cloud_storage" USING btree ("storageId", "path"); +CREATE INDEX "serverpod_cloud_storage_expiration" ON "serverpod_cloud_storage" USING btree ("expiration"); + +-- +-- Class CloudStorageDirectUploadEntry as table serverpod_cloud_storage_direct_upload +-- +CREATE TABLE "serverpod_cloud_storage_direct_upload" ( + "id" serial PRIMARY KEY, + "storageId" text NOT NULL, + "path" text NOT NULL, + "expiration" timestamp without time zone NOT NULL, + "authKey" text NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_cloud_storage_direct_upload_storage_path" ON "serverpod_cloud_storage_direct_upload" USING btree ("storageId", "path"); + +-- +-- Class FutureCallEntry as table serverpod_future_call +-- +CREATE TABLE "serverpod_future_call" ( + "id" serial PRIMARY KEY, + "name" text NOT NULL, + "time" timestamp without time zone NOT NULL, + "serializedObject" text, + "serverId" text NOT NULL, + "identifier" text +); + +-- Indexes +CREATE INDEX "serverpod_future_call_time_idx" ON "serverpod_future_call" USING btree ("time"); +CREATE INDEX "serverpod_future_call_serverId_idx" ON "serverpod_future_call" USING btree ("serverId"); +CREATE INDEX "serverpod_future_call_identifier_idx" ON "serverpod_future_call" USING btree ("identifier"); + +-- +-- Class ServerHealthConnectionInfo as table serverpod_health_connection_info +-- +CREATE TABLE "serverpod_health_connection_info" ( + "id" serial PRIMARY KEY, + "serverId" text NOT NULL, + "timestamp" timestamp without time zone NOT NULL, + "active" integer NOT NULL, + "closing" integer NOT NULL, + "idle" integer NOT NULL, + "granularity" integer NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_health_connection_info_timestamp_idx" ON "serverpod_health_connection_info" USING btree ("timestamp", "serverId", "granularity"); + +-- +-- Class ServerHealthMetric as table serverpod_health_metric +-- +CREATE TABLE "serverpod_health_metric" ( + "id" serial PRIMARY KEY, + "name" text NOT NULL, + "serverId" text NOT NULL, + "timestamp" timestamp without time zone NOT NULL, + "isHealthy" boolean NOT NULL, + "value" double precision NOT NULL, + "granularity" integer NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_health_metric_timestamp_idx" ON "serverpod_health_metric" USING btree ("timestamp", "serverId", "name", "granularity"); + +-- +-- Class LogEntry as table serverpod_log +-- +CREATE TABLE "serverpod_log" ( + "id" serial PRIMARY KEY, + "sessionLogId" integer NOT NULL, + "messageId" integer, + "reference" text, + "serverId" text NOT NULL, + "time" timestamp without time zone NOT NULL, + "logLevel" integer NOT NULL, + "message" text NOT NULL, + "error" text, + "stackTrace" text, + "order" integer NOT NULL +); + +-- Indexes +CREATE INDEX "serverpod_log_sessionLogId_idx" ON "serverpod_log" USING btree ("sessionLogId"); + +-- +-- Class MessageLogEntry as table serverpod_message_log +-- +CREATE TABLE "serverpod_message_log" ( + "id" serial PRIMARY KEY, + "sessionLogId" integer NOT NULL, + "serverId" text NOT NULL, + "messageId" integer NOT NULL, + "endpoint" text NOT NULL, + "messageName" text NOT NULL, + "duration" double precision NOT NULL, + "error" text, + "stackTrace" text, + "slow" boolean NOT NULL, + "order" integer NOT NULL +); + +-- +-- Class MethodInfo as table serverpod_method +-- +CREATE TABLE "serverpod_method" ( + "id" serial PRIMARY KEY, + "endpoint" text NOT NULL, + "method" text NOT NULL +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_method_endpoint_method_idx" ON "serverpod_method" USING btree ("endpoint", "method"); + +-- +-- Class DatabaseMigrationVersion as table serverpod_migrations +-- +CREATE TABLE "serverpod_migrations" ( + "id" serial PRIMARY KEY, + "module" text NOT NULL, + "version" text NOT NULL, + "timestamp" timestamp without time zone +); + +-- Indexes +CREATE UNIQUE INDEX "serverpod_migrations_ids" ON "serverpod_migrations" USING btree ("module"); + +-- +-- Class QueryLogEntry as table serverpod_query_log +-- +CREATE TABLE "serverpod_query_log" ( + "id" serial PRIMARY KEY, + "serverId" text NOT NULL, + "sessionLogId" integer NOT NULL, + "messageId" integer, + "query" text NOT NULL, + "duration" double precision NOT NULL, + "numRows" integer, + "error" text, + "stackTrace" text, + "slow" boolean NOT NULL, + "order" integer NOT NULL +); + +-- Indexes +CREATE INDEX "serverpod_query_log_sessionLogId_idx" ON "serverpod_query_log" USING btree ("sessionLogId"); + +-- +-- Class ReadWriteTestEntry as table serverpod_readwrite_test +-- +CREATE TABLE "serverpod_readwrite_test" ( + "id" serial PRIMARY KEY, + "number" integer NOT NULL +); + +-- +-- Class RuntimeSettings as table serverpod_runtime_settings +-- +CREATE TABLE "serverpod_runtime_settings" ( + "id" serial PRIMARY KEY, + "logSettings" json NOT NULL, + "logSettingsOverrides" json NOT NULL, + "logServiceCalls" boolean NOT NULL, + "logMalformedCalls" boolean NOT NULL +); + +-- +-- Class SessionLogEntry as table serverpod_session_log +-- +CREATE TABLE "serverpod_session_log" ( + "id" serial PRIMARY KEY, + "serverId" text NOT NULL, + "time" timestamp without time zone NOT NULL, + "module" text, + "endpoint" text, + "method" text, + "duration" double precision, + "numQueries" integer, + "slow" boolean, + "error" text, + "stackTrace" text, + "authenticatedUserId" integer, + "isOpen" boolean, + "touched" timestamp without time zone NOT NULL +); + +-- Indexes +CREATE INDEX "serverpod_session_log_serverid_idx" ON "serverpod_session_log" USING btree ("serverId"); +CREATE INDEX "serverpod_session_log_touched_idx" ON "serverpod_session_log" USING btree ("touched"); +CREATE INDEX "serverpod_session_log_isopen_idx" ON "serverpod_session_log" USING btree ("isOpen"); + +-- +-- Foreign relations for "serverpod_log" table +-- +ALTER TABLE ONLY "serverpod_log" + ADD CONSTRAINT "serverpod_log_fk_0" + FOREIGN KEY("sessionLogId") + REFERENCES "serverpod_session_log"("id") + ON DELETE CASCADE + ON UPDATE NO ACTION; + +-- +-- Foreign relations for "serverpod_message_log" table +-- +ALTER TABLE ONLY "serverpod_message_log" + ADD CONSTRAINT "serverpod_message_log_fk_0" + FOREIGN KEY("sessionLogId") + REFERENCES "serverpod_session_log"("id") + ON DELETE CASCADE + ON UPDATE NO ACTION; + +-- +-- Foreign relations for "serverpod_query_log" table +-- +ALTER TABLE ONLY "serverpod_query_log" + ADD CONSTRAINT "serverpod_query_log_fk_0" + FOREIGN KEY("sessionLogId") + REFERENCES "serverpod_session_log"("id") + ON DELETE CASCADE + ON UPDATE NO ACTION; + + +-- +-- MIGRATION VERSION FOR bluevsred +-- +INSERT INTO "serverpod_migrations" ("module", "version", "timestamp") + VALUES ('bluevsred', '20240412092530655', now()) + ON CONFLICT ("module") + DO UPDATE SET "version" = '20240412092530655', "timestamp" = now(); + +-- +-- MIGRATION VERSION FOR serverpod +-- +INSERT INTO "serverpod_migrations" ("module", "version", "timestamp") + VALUES ('serverpod', '20240115074235544', now()) + ON CONFLICT ("module") + DO UPDATE SET "version" = '20240115074235544', "timestamp" = now(); + + +COMMIT; diff --git a/bluevsred_server/migrations/20240412092530655/definition_project.json b/bluevsred_server/migrations/20240412092530655/definition_project.json new file mode 100644 index 0000000..7c68241 --- /dev/null +++ b/bluevsred_server/migrations/20240412092530655/definition_project.json @@ -0,0 +1,231 @@ +{ + "moduleName": "bluevsred", + "tables": [ + { + "name": "battle", + "dartName": "BattleDb", + "module": "bluevsred", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 2, + "isNullable": false, + "columnDefault": "nextval('battle_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "creationDate", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "startDate", + "columnType": 4, + "isNullable": false, + "dartType": "DateTime" + }, + { + "name": "maxActionPoints", + "columnType": 3, + "isNullable": false, + "dartType": "double" + }, + { + "name": "actionPointsRecoveryRate", + "columnType": 3, + "isNullable": false, + "dartType": "double" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "battle_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + }, + { + "name": "player", + "dartName": "GamePlayerDb", + "module": "bluevsred", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 2, + "isNullable": false, + "columnDefault": "nextval('player_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "name", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "player_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + }, + { + "name": "talle_map", + "dartName": "BattleMapDb", + "module": "bluevsred", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 2, + "isNullable": false, + "columnDefault": "nextval('talle_map_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "path", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "talle_map_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + }, + { + "name": "team", + "dartName": "TeamDb", + "module": "bluevsred", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 2, + "isNullable": false, + "columnDefault": "nextval('team_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "name", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "colorCode", + "columnType": 0, + "isNullable": false, + "dartType": "String" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "team_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + }, + { + "name": "troop", + "dartName": "TroopDb", + "module": "bluevsred", + "schema": "public", + "columns": [ + { + "name": "id", + "columnType": 2, + "isNullable": false, + "columnDefault": "nextval('troop_id_seq'::regclass)", + "dartType": "int?" + }, + { + "name": "path", + "columnType": 0, + "isNullable": false, + "dartType": "String" + }, + { + "name": "troopType", + "columnType": 0, + "isNullable": false, + "dartType": "protocol:TroopType" + } + ], + "foreignKeys": [], + "indexes": [ + { + "indexName": "troop_pkey", + "elements": [ + { + "type": 0, + "definition": "id" + } + ], + "type": "btree", + "isUnique": true, + "isPrimary": true + } + ], + "managed": true + } + ], + "installedModules": [ + { + "module": "serverpod", + "version": "20240115074235544" + }, + { + "module": "bluevsred", + "version": "20240412073903562" + } + ], + "migrationApiVersion": 1 +} \ No newline at end of file diff --git a/bluevsred_server/migrations/20240412092530655/migration.json b/bluevsred_server/migrations/20240412092530655/migration.json new file mode 100644 index 0000000..056118b --- /dev/null +++ b/bluevsred_server/migrations/20240412092530655/migration.json @@ -0,0 +1,5 @@ +{ + "actions": [], + "warnings": [], + "migrationApiVersion": 1 +} \ No newline at end of file diff --git a/bluevsred_server/migrations/20240412092530655/migration.sql b/bluevsred_server/migrations/20240412092530655/migration.sql new file mode 100644 index 0000000..6711518 --- /dev/null +++ b/bluevsred_server/migrations/20240412092530655/migration.sql @@ -0,0 +1,21 @@ +BEGIN; + + +-- +-- MIGRATION VERSION FOR bluevsred +-- +INSERT INTO "serverpod_migrations" ("module", "version", "timestamp") + VALUES ('bluevsred', '20240412092530655', now()) + ON CONFLICT ("module") + DO UPDATE SET "version" = '20240412092530655', "timestamp" = now(); + +-- +-- MIGRATION VERSION FOR serverpod +-- +INSERT INTO "serverpod_migrations" ("module", "version", "timestamp") + VALUES ('serverpod', '20240115074235544', now()) + ON CONFLICT ("module") + DO UPDATE SET "version" = '20240115074235544', "timestamp" = now(); + + +COMMIT; diff --git a/bluevsred_server/migrations/migration_registry.txt b/bluevsred_server/migrations/migration_registry.txt index 403e90a..0280547 100644 --- a/bluevsred_server/migrations/migration_registry.txt +++ b/bluevsred_server/migrations/migration_registry.txt @@ -6,3 +6,5 @@ 20240328151045625 20240403080154821 +20240412073903562 +20240412092530655 diff --git a/bluevsred_server/pubspec.yaml b/bluevsred_server/pubspec.yaml index 7915500..40e62ac 100644 --- a/bluevsred_server/pubspec.yaml +++ b/bluevsred_server/pubspec.yaml @@ -10,7 +10,7 @@ dependencies: serverpod: 1.2.6 bluevsred_shared: path: ../bluevsred_shared - serverpod_serialization: ^1.2.6 + serverpod_serialization: 1.2.6 dev_dependencies: lints: ^3.0.0 diff --git a/bluevsred_server/repair-migration/20240412074114893.sql b/bluevsred_server/repair-migration/20240412074114893.sql new file mode 100644 index 0000000..c7283fe --- /dev/null +++ b/bluevsred_server/repair-migration/20240412074114893.sql @@ -0,0 +1,29 @@ +BEGIN; + + +-- +-- MIGRATION VERSION FOR bluevsred +-- +INSERT INTO "serverpod_migrations" ("module", "version", "timestamp") + VALUES ('bluevsred', '20240412073903562', now()) + ON CONFLICT ("module") + DO UPDATE SET "version" = '20240412073903562', "timestamp" = now(); + +-- +-- MIGRATION VERSION FOR serverpod +-- +INSERT INTO "serverpod_migrations" ("module", "version", "timestamp") + VALUES ('serverpod', '20240115074235544', now()) + ON CONFLICT ("module") + DO UPDATE SET "version" = '20240115074235544', "timestamp" = now(); + +-- +-- MIGRATION VERSION FOR _repair +-- +INSERT INTO "serverpod_migrations" ("module", "version", "timestamp") + VALUES ('_repair', '20240412074114893', now()) + ON CONFLICT ("module") + DO UPDATE SET "version" = '20240412074114893', "timestamp" = now(); + + +COMMIT; diff --git a/bluevsred_shared/build/unit_test_assets/NOTICES.Z b/bluevsred_shared/build/unit_test_assets/NOTICES.Z index 977bff55c87f4733eb30164300905a4274a226d8..6c4eb2ca7ea837c19354cd3763c3c5e5b7a1d4ff 100644 GIT binary patch literal 83757 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

Go&R1-pwiJr2ymC&3FMgVRP8}UJ1;5*g?3S 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�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 literal 83749 zcmcG#W0YmjlJH%&ZQHiHY#Uv+ZQHhO+qSxFyUW#Oyxn*1?f=X?^YuNywRU1hW<*Aw zz0S_eIQWqe0DnF}z(2b$9I(Y2=w5qs3fPEM)3O$VNF*Cbv`m93kP{dbMbW*FP-g~AdYCc((bCoL+ zhOfE4l%-W_#Dsnt-HYJKl@xDweC=wGOqQo~Qqdpr%=#=0DppivnYhm*?~BLo7fc-p zs*Gq*sc}RN#VI7;fA?LQV5T0P6KFA+g8x5Au_cN2~B;&?@kF~q35DR>(ge(ZLXwKg8HkNOPK$acH}i~edxD(x7_WUOCQ zP#J+7?v1WAvG97?UaNfPQqON&^Lw?PogX?ccZEFe3#r_p*L--F-9C;)J2+R@kFhaF zkNtFBo^}pRPj?^Vd-L_`8+;+$E2p8Cfw2u=de;#b|?t-avUf)`>N;N+ek z2jW+_KY#Y_Y;n8cN|*`Y;pBvUbhmnv+pUf33un{qkiqMXw|*36v)|ai9c_PZkBgmO zFKv$lKK?qt5x1Ij-4G-9D>t2&KFzzYWB4w zirulgzGgS2gyY9~h_yT2Lphr4+1%OiY2O)*F-z$56#K|V&XW09frEexX~hpeaQ(>U zeFip~4{f)?_l~m49R2wEz@rPmKe~F{xLjdq{v|~MB-L>LS@wk%3S+?G^L6)Zbba_C zq1VI5vq{Q{{}k)9wQ+|3Me_t7E1`ZJ`xd{t#kW=xlMfk(@($zM>*d=e#Q)Ch`36`7WVjikr27Q#^7?#1*m9?T-PQ{z)$AID{!^i~?s@LSGlPi^F-meS z*MC5?DbC?Kd2{>289vmSKBSm`yU{|3Xv5ub7?!Koee?^0mBJ~@3hu;_u;s)8;;{$* zlZv+KS>?pc+@aEyKfzbcJb1?T;`2kyKr`ijztr<-W_H#y!sgugS8*0?2|o+^#xEuhWz~<{RC>V4me~3j@GrJhK(!%6#8;#B3(q zcSph+yv)U$pJr#2?CKaW+NkN!(R>be%9*W-E*ylUPi+#Y+o0#ltJH>_tI4V2y)B%| z->8P&=koxQLl%QB@J--X46wmCPv0=!xt%3_c%@)cHsB$nSqCI`TUDTBaeOkT8M zGDe@QPI2G`J_GoMtX{nyynWRRdKGjYjA&MlT2?yFmd zY&0#J=Umj!`0HlqjgssuS@9qGf>s-6!6inNz%K`Hf>XdF2o1vUOn^txS^U7V8hpp% zOvD>aq+-u9#UWpB4;%!%TRTFmTx4QF@JWulLY_@K+fy!PP*?O(e{JfUOj^KtC9B6D zRg@q`vY@t@k-~_;l!g7Nk5^c1#6rW}3|YkigWF>x{o{==Z7bcr0hG<49S1>^y)*w8ma#dS`D3=G(_UNjg$|g{5Os1j8L1kS)w&dySzp{Z@&?LBRLRb&$YS|7xK=Xb37U zC6+=d&zz13wgtprgXM^F>J<*h9q5DX&>_NFXHU;^>;_nl0GkG8!kXNMq{n)fI1Qt{I(FgTv4pLn;$Dch~{wHv9Tu&PX z?6_dEroGgnBfYT>G`KM^VSXzpk{hB91mOr`aP?sCFSEYZVaV-pdo~tS6F3|>N;Hvj z)8MCmzu08aYkm^(M*hrX(JCgZ0i`_oiTHb%Xi)f}$c6!q9x8~K@=i>5KB;rQxVMJ5 z0{+f$_R`ZNI1~A)1N~$bQ1v6}qtesSyNnJ5Zv&b0=Nc{gSTP|)3e^1aks65rz+1o) zftOiVNW}x4V6xPixMJhsiZnVTBDMQyZV$-h6TAWxBwOSq+E;N-u=s`rT4ovuxemzg z)&Zb9@5)OdUe<6}oyV;;e0gfY?1;l)mF;sV<_y1JVV3+11$We+;fYD)>bv<#J31EC zz#kGi{f^u)Xhyk%WA0}=(Jt&_b5hMX1sUw8?jcrhWUr8M&LM^k=q^R;853Z{$JlHBCpfeJ*+QtIkUxoV_P#zWSKeX=W~jgW5$R5h2f5(x`I->9sG0W20GvCuGb z#9_NbFu+1;jv2L%P#wx2`#Km%0A=U4rhlvc$1-OeJ27{TrPX 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 json, - ) => - _$BattleFromJson(json); void addTroops({required List newTroops}) { troops!.addAll(newTroops); diff --git a/bluevsred_shared/lib/src/battle/battle.freezed.dart b/bluevsred_shared/lib/src/battle/battle.freezed.dart index 3558b5e..42814a6 100644 --- a/bluevsred_shared/lib/src/battle/battle.freezed.dart +++ b/bluevsred_shared/lib/src/battle/battle.freezed.dart @@ -14,10 +14,6 @@ T _$identity(T value) => value; final _privateConstructorUsedError = UnsupportedError( 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); -Battle _$BattleFromJson(Map json) { - return _Battle.fromJson(json); -} - /// @nodoc mixin _$Battle { DateTime get creationDate => throw _privateConstructorUsedError; @@ -83,7 +79,7 @@ mixin _$Battle { required TResult orElse(), }) => throw _privateConstructorUsedError; - Map toJson() => throw _privateConstructorUsedError; + @JsonKey(ignore: true) $BattleCopyWith get copyWith => throw _privateConstructorUsedError; } @@ -240,7 +236,7 @@ class __$$BattleImplCopyWithImpl<$Res> } /// @nodoc -@JsonSerializable() + class _$BattleImpl extends _Battle { _$BattleImpl( {required this.creationDate, @@ -252,9 +248,6 @@ class _$BattleImpl extends _Battle { this.teams}) : super._(); - factory _$BattleImpl.fromJson(Map json) => - _$$BattleImplFromJson(json); - @override final DateTime creationDate; @override @@ -295,7 +288,6 @@ class _$BattleImpl extends _Battle { const DeepCollectionEquality().equals(other.teams, teams)); } - @JsonKey(ignore: true) @override int get hashCode => Object.hash( runtimeType, @@ -395,13 +387,6 @@ class _$BattleImpl extends _Battle { } return orElse(); } - - @override - Map toJson() { - return _$$BattleImplToJson( - this, - ); - } } abstract class _Battle extends Battle { @@ -415,8 +400,6 @@ abstract class _Battle extends Battle { final Set? teams}) = _$BattleImpl; _Battle._() : super._(); - factory _Battle.fromJson(Map json) = _$BattleImpl.fromJson; - @override DateTime get creationDate; @override diff --git a/bluevsred_shared/lib/src/battle/battle.g.dart b/bluevsred_shared/lib/src/battle/battle.g.dart deleted file mode 100644 index 49fa773..0000000 --- a/bluevsred_shared/lib/src/battle/battle.g.dart +++ /dev/null @@ -1,33 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'battle.dart'; - -// ************************************************************************** -// JsonSerializableGenerator -// ************************************************************************** - -_$BattleImpl _$$BattleImplFromJson(Map json) => _$BattleImpl( - creationDate: DateTime.parse(json['creationDate'] as String), - battleMap: BattleMap.fromJson(json['battleMap'] as Map), - startDate: DateTime.parse(json['startDate'] as String), - maxActionPoints: (json['maxActionPoints'] as num).toDouble(), - actionPointsRecoveryRate: - (json['actionPointsRecoveryRate'] as num).toDouble(), - troops: (json['troops'] as List?) - ?.map((e) => Troop.fromJson(e as Map)) - .toSet(), - teams: (json['teams'] as List?) - ?.map((e) => Team.fromJson(e as Map)) - .toSet(), - ); - -Map _$$BattleImplToJson(_$BattleImpl instance) => - { - 'creationDate': instance.creationDate.toIso8601String(), - 'battleMap': instance.battleMap, - 'startDate': instance.startDate.toIso8601String(), - 'maxActionPoints': instance.maxActionPoints, - 'actionPointsRecoveryRate': instance.actionPointsRecoveryRate, - 'troops': instance.troops?.toList(), - 'teams': instance.teams?.toList(), - }; diff --git a/bluevsred_shared/lib/src/troops/game_player_troops.dart b/bluevsred_shared/lib/src/troops/game_player_troops.dart new file mode 100644 index 0000000..7468eaf --- /dev/null +++ b/bluevsred_shared/lib/src/troops/game_player_troops.dart @@ -0,0 +1,12 @@ +import 'package:bluevsred_shared/bluesvsred_shared.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'game_player_troops.freezed.dart'; + +@freezed +class GamePlayerTroops with _$GamePlayerTroops { + GamePlayerTroops._(); + factory GamePlayerTroops({required Set troops}) = _GamePlayerTroops; + + +} diff --git a/bluevsred_shared/lib/src/troops/game_player_troops.freezed.dart b/bluevsred_shared/lib/src/troops/game_player_troops.freezed.dart new file mode 100644 index 0000000..2078e23 --- /dev/null +++ b/bluevsred_shared/lib/src/troops/game_player_troops.freezed.dart @@ -0,0 +1,143 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'game_player_troops.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +/// @nodoc +mixin _$GamePlayerTroops { + Set get troops => throw _privateConstructorUsedError; + + @JsonKey(ignore: true) + $GamePlayerTroopsCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $GamePlayerTroopsCopyWith<$Res> { + factory $GamePlayerTroopsCopyWith( + GamePlayerTroops value, $Res Function(GamePlayerTroops) then) = + _$GamePlayerTroopsCopyWithImpl<$Res, GamePlayerTroops>; + @useResult + $Res call({Set troops}); +} + +/// @nodoc +class _$GamePlayerTroopsCopyWithImpl<$Res, $Val extends GamePlayerTroops> + implements $GamePlayerTroopsCopyWith<$Res> { + _$GamePlayerTroopsCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? troops = null, + }) { + return _then(_value.copyWith( + troops: null == troops + ? _value.troops + : troops // ignore: cast_nullable_to_non_nullable + as Set, + ) as $Val); + } +} + +/// @nodoc +abstract class _$$GamePlayerTroopsImplCopyWith<$Res> + implements $GamePlayerTroopsCopyWith<$Res> { + factory _$$GamePlayerTroopsImplCopyWith(_$GamePlayerTroopsImpl value, + $Res Function(_$GamePlayerTroopsImpl) then) = + __$$GamePlayerTroopsImplCopyWithImpl<$Res>; + @override + @useResult + $Res call({Set troops}); +} + +/// @nodoc +class __$$GamePlayerTroopsImplCopyWithImpl<$Res> + extends _$GamePlayerTroopsCopyWithImpl<$Res, _$GamePlayerTroopsImpl> + implements _$$GamePlayerTroopsImplCopyWith<$Res> { + __$$GamePlayerTroopsImplCopyWithImpl(_$GamePlayerTroopsImpl _value, + $Res Function(_$GamePlayerTroopsImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? troops = null, + }) { + return _then(_$GamePlayerTroopsImpl( + troops: null == troops + ? _value._troops + : troops // ignore: cast_nullable_to_non_nullable + as Set, + )); + } +} + +/// @nodoc + +class _$GamePlayerTroopsImpl extends _GamePlayerTroops { + _$GamePlayerTroopsImpl({required final Set troops}) + : _troops = troops, + super._(); + + final Set _troops; + @override + Set get troops { + if (_troops is EqualUnmodifiableSetView) return _troops; + // ignore: implicit_dynamic_type + return EqualUnmodifiableSetView(_troops); + } + + @override + String toString() { + return 'GamePlayerTroops(troops: $troops)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$GamePlayerTroopsImpl && + const DeepCollectionEquality().equals(other._troops, _troops)); + } + + @override + int get hashCode => + Object.hash(runtimeType, const DeepCollectionEquality().hash(_troops)); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$GamePlayerTroopsImplCopyWith<_$GamePlayerTroopsImpl> get copyWith => + __$$GamePlayerTroopsImplCopyWithImpl<_$GamePlayerTroopsImpl>( + this, _$identity); +} + +abstract class _GamePlayerTroops extends GamePlayerTroops { + factory _GamePlayerTroops({required final Set troops}) = + _$GamePlayerTroopsImpl; + _GamePlayerTroops._() : super._(); + + @override + Set get troops; + @override + @JsonKey(ignore: true) + _$$GamePlayerTroopsImplCopyWith<_$GamePlayerTroopsImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/bluevsred_shared/lib/src/troops/troop.dart b/bluevsred_shared/lib/src/troops/troop.dart index ab3b208..98d1d04 100644 --- a/bluevsred_shared/lib/src/troops/troop.dart +++ b/bluevsred_shared/lib/src/troops/troop.dart @@ -1,27 +1,16 @@ -import '../game_player/game_player.dart'; +import 'package:bluevsred_client/bluevsred_client.dart'; +import 'package:bluevsred_shared/bluesvsred_shared.dart'; import 'package:freezed_annotation/freezed_annotation.dart'; -import 'package:serverpod_serialization/serverpod_serialization.dart'; + +import '../game_player/game_player.dart'; part 'troop.freezed.dart'; -part 'troop.g.dart'; @freezed -abstract class Troop with _$Troop { +class Troop with _$Troop { Troop._(); - factory Troop.def( - {required String id, - required String path, - required GamePlayer gamePlayer}) = _Troop; - factory Troop({required GamePlayer gamePlayer}) => - _Troop(id: _uuid(), path: 'testing_troop.png', gamePlayer: gamePlayer); - factory Troop.fromJson(Map json, - ) => _$TroopFromJson(json); - - get actionPoints { - return 30; - } - static String _uuid() { - const generator = Uuid(); - return generator.v4(); - } + factory Troop({ + required TroopDb troopDb, + required GamePlayer gamePlayer, + }) = _Troop; } diff --git a/bluevsred_shared/lib/src/troops/troop.freezed.dart b/bluevsred_shared/lib/src/troops/troop.freezed.dart index 5007c95..a9fc4bf 100644 --- a/bluevsred_shared/lib/src/troops/troop.freezed.dart +++ b/bluevsred_shared/lib/src/troops/troop.freezed.dart @@ -14,49 +14,11 @@ T _$identity(T value) => value; final _privateConstructorUsedError = UnsupportedError( 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); -Troop _$TroopFromJson(Map json) { - return _Troop.fromJson(json); -} - /// @nodoc mixin _$Troop { - String get id => throw _privateConstructorUsedError; - String get path => throw _privateConstructorUsedError; + TroopDb get troopDb => throw _privateConstructorUsedError; GamePlayer get gamePlayer => throw _privateConstructorUsedError; - @optionalTypeArgs - TResult when({ - required TResult Function(String id, String path, GamePlayer gamePlayer) - def, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(String id, String path, GamePlayer gamePlayer)? def, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(String id, String path, GamePlayer gamePlayer)? def, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult map({ - required TResult Function(_Troop value) def, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(_Troop value)? def, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeMap({ - TResult Function(_Troop value)? def, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; - Map toJson() => throw _privateConstructorUsedError; + @JsonKey(ignore: true) $TroopCopyWith get copyWith => throw _privateConstructorUsedError; } @@ -66,7 +28,7 @@ abstract class $TroopCopyWith<$Res> { factory $TroopCopyWith(Troop value, $Res Function(Troop) then) = _$TroopCopyWithImpl<$Res, Troop>; @useResult - $Res call({String id, String path, GamePlayer gamePlayer}); + $Res call({TroopDb troopDb, GamePlayer gamePlayer}); $GamePlayerCopyWith<$Res> get gamePlayer; } @@ -84,19 +46,14 @@ class _$TroopCopyWithImpl<$Res, $Val extends Troop> @pragma('vm:prefer-inline') @override $Res call({ - Object? id = null, - Object? path = null, + Object? troopDb = null, Object? gamePlayer = null, }) { return _then(_value.copyWith( - id: null == id - ? _value.id - : id // ignore: cast_nullable_to_non_nullable - as String, - path: null == path - ? _value.path - : path // ignore: cast_nullable_to_non_nullable - as String, + troopDb: null == troopDb + ? _value.troopDb + : troopDb // ignore: cast_nullable_to_non_nullable + as TroopDb, gamePlayer: null == gamePlayer ? _value.gamePlayer : gamePlayer // ignore: cast_nullable_to_non_nullable @@ -120,7 +77,7 @@ abstract class _$$TroopImplCopyWith<$Res> implements $TroopCopyWith<$Res> { __$$TroopImplCopyWithImpl<$Res>; @override @useResult - $Res call({String id, String path, GamePlayer gamePlayer}); + $Res call({TroopDb troopDb, GamePlayer gamePlayer}); @override $GamePlayerCopyWith<$Res> get gamePlayer; @@ -137,19 +94,14 @@ class __$$TroopImplCopyWithImpl<$Res> @pragma('vm:prefer-inline') @override $Res call({ - Object? id = null, - Object? path = null, + Object? troopDb = null, Object? gamePlayer = null, }) { return _then(_$TroopImpl( - id: null == id - ? _value.id - : id // ignore: cast_nullable_to_non_nullable - as String, - path: null == path - ? _value.path - : path // ignore: cast_nullable_to_non_nullable - as String, + troopDb: null == troopDb + ? _value.troopDb + : troopDb // ignore: cast_nullable_to_non_nullable + as TroopDb, gamePlayer: null == gamePlayer ? _value.gamePlayer : gamePlayer // ignore: cast_nullable_to_non_nullable @@ -159,24 +111,18 @@ class __$$TroopImplCopyWithImpl<$Res> } /// @nodoc -@JsonSerializable() -class _$TroopImpl extends _Troop { - _$TroopImpl({required this.id, required this.path, required this.gamePlayer}) - : super._(); - factory _$TroopImpl.fromJson(Map json) => - _$$TroopImplFromJson(json); +class _$TroopImpl extends _Troop { + _$TroopImpl({required this.troopDb, required this.gamePlayer}) : super._(); @override - final String id; - @override - final String path; + final TroopDb troopDb; @override final GamePlayer gamePlayer; @override String toString() { - return 'Troop.def(id: $id, path: $path, gamePlayer: $gamePlayer)'; + return 'Troop(troopDb: $troopDb, gamePlayer: $gamePlayer)'; } @override @@ -184,100 +130,29 @@ class _$TroopImpl extends _Troop { return identical(this, other) || (other.runtimeType == runtimeType && other is _$TroopImpl && - (identical(other.id, id) || other.id == id) && - (identical(other.path, path) || other.path == path) && + (identical(other.troopDb, troopDb) || other.troopDb == troopDb) && (identical(other.gamePlayer, gamePlayer) || other.gamePlayer == gamePlayer)); } - @JsonKey(ignore: true) @override - int get hashCode => Object.hash(runtimeType, id, path, gamePlayer); + int get hashCode => Object.hash(runtimeType, troopDb, gamePlayer); @JsonKey(ignore: true) @override @pragma('vm:prefer-inline') _$$TroopImplCopyWith<_$TroopImpl> get copyWith => __$$TroopImplCopyWithImpl<_$TroopImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(String id, String path, GamePlayer gamePlayer) - def, - }) { - return def(id, path, gamePlayer); - } - - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(String id, String path, GamePlayer gamePlayer)? def, - }) { - return def?.call(id, path, gamePlayer); - } - - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(String id, String path, GamePlayer gamePlayer)? def, - required TResult orElse(), - }) { - if (def != null) { - return def(id, path, gamePlayer); - } - return orElse(); - } - - @override - @optionalTypeArgs - TResult map({ - required TResult Function(_Troop value) def, - }) { - return def(this); - } - - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(_Troop value)? def, - }) { - return def?.call(this); - } - - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(_Troop value)? def, - required TResult orElse(), - }) { - if (def != null) { - return def(this); - } - return orElse(); - } - - @override - Map toJson() { - return _$$TroopImplToJson( - this, - ); - } } abstract class _Troop extends Troop { factory _Troop( - {required final String id, - required final String path, + {required final TroopDb troopDb, required final GamePlayer gamePlayer}) = _$TroopImpl; _Troop._() : super._(); - factory _Troop.fromJson(Map json) = _$TroopImpl.fromJson; - - @override - String get id; @override - String get path; + TroopDb get troopDb; @override GamePlayer get gamePlayer; @override diff --git a/bluevsred_shared/lib/src/troops/troop.g.dart b/bluevsred_shared/lib/src/troops/troop.g.dart deleted file mode 100644 index 3218636..0000000 --- a/bluevsred_shared/lib/src/troops/troop.g.dart +++ /dev/null @@ -1,21 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'troop.dart'; - -// ************************************************************************** -// JsonSerializableGenerator -// ************************************************************************** - -_$TroopImpl _$$TroopImplFromJson(Map json) => _$TroopImpl( - id: json['id'] as String, - path: json['path'] as String, - gamePlayer: - GamePlayer.fromJson(json['gamePlayer'] as Map), - ); - -Map _$$TroopImplToJson(_$TroopImpl instance) => - { - 'id': instance.id, - 'path': instance.path, - 'gamePlayer': instance.gamePlayer, - }; diff --git a/bluevsred_shared/pubspec.yaml b/bluevsred_shared/pubspec.yaml index 8e4013f..5be6cfe 100644 --- a/bluevsred_shared/pubspec.yaml +++ b/bluevsred_shared/pubspec.yaml @@ -8,11 +8,13 @@ environment: # Add regular dependencies here. dependencies: - serverpod_serialization: ^1.2.6 + serverpod_serialization: 1.2.6 freezed_annotation: ^2.4.1 json_annotation: ^4.8.1 # path: ^1.8.0 uuid: ^4.3.3 + bluevsred_client: + path: ../bluevsred_client dev_dependencies: diff --git a/bluevsred_shared/test/action_points_lifecycle_test.dart b/bluevsred_shared/test/action_points_lifecycle_test.dart index 610e7fc..529444f 100644 --- a/bluevsred_shared/test/action_points_lifecycle_test.dart +++ b/bluevsred_shared/test/action_points_lifecycle_test.dart @@ -1,3 +1,4 @@ +import 'package:bluevsred_client/bluevsred_client.dart'; import 'package:bluevsred_shared/src/battle/battle.dart'; import 'package:bluevsred_shared/src/game_player/game_player.dart'; import 'package:bluevsred_shared/src/troops/troop.dart'; @@ -9,7 +10,7 @@ void main() { maxActionPoints: 30, actionPointsRecoveryRate: 1); final initialGamePlayer1 = GamePlayer(name: 'test player name'); - final initialTroop1 = Troop(gamePlayer: initialGamePlayer1); + final initialTroop1 = Troop(gamePlayer: initialGamePlayer1, troopDb: TroopDb(troopType: TroopType.commander, actionPoints: 10)); group('Action Points lifecycle', () { test( @@ -23,7 +24,7 @@ void main() { var isTestTroopFound = false; for (final battleTroop in battle.troops!) { if (battleTroop == testTroop) { - expect(battleTroop.actionPoints, equals(maxActionPoints)); + expect(battleTroop.troopDb.actionPoints, equals(maxActionPoints)); isTestTroopFound = true; return; } diff --git a/bluevsred_shared/test/game_global_description_test.dart b/bluevsred_shared/test/game_global_description_test.dart index b86ee32..32cb3ee 100644 --- a/bluevsred_shared/test/game_global_description_test.dart +++ b/bluevsred_shared/test/game_global_description_test.dart @@ -1,3 +1,4 @@ +import 'package:bluevsred_client/bluevsred_client.dart'; import 'package:bluevsred_shared/src/battle/battle.dart'; import 'package:bluevsred_shared/src/game_player/game_player.dart'; import 'package:bluevsred_shared/src/team/team.dart'; @@ -13,7 +14,9 @@ void main() { () { test('Troop added to a battle is in the list of troops', () { final gamePlayer = GamePlayer(name: 'test player name'); - final troop = Troop(gamePlayer: gamePlayer); + final troop = Troop( + gamePlayer: gamePlayer, + troopDb: TroopDb(troopType: TroopType.commander, actionPoints: 10)); final battle = Battle( startDate: DateTime.now().toUtc().add(const Duration(minutes: 1)), maxActionPoints: 30, @@ -23,7 +26,9 @@ void main() { }); test('Troop is added only once to a battle (already added)', () { final gamePlayer = GamePlayer(name: 'test player name'); - final troop = Troop(gamePlayer: gamePlayer); + final troop = Troop( + gamePlayer: gamePlayer, + troopDb: TroopDb(troopType: TroopType.commander, actionPoints: 10)); final battle = Battle( startDate: DateTime.now().toUtc().add(const Duration(minutes: 1)), maxActionPoints: 30, @@ -38,7 +43,7 @@ void main() { 'Troop is added only once to a battle (attempt to add same troop twice in the same list)', () { final gamePlayer = GamePlayer(name: 'test player name'); - final troop = Troop(gamePlayer: gamePlayer); + final troop = Troop(gamePlayer: gamePlayer, troopDb: TroopDb(troopType: TroopType.commander, actionPoints: 10)); final battle = Battle( startDate: DateTime.now().toUtc().add(const Duration(minutes: 1)), maxActionPoints: 30,