MVP #141

Merged
flixcoo merged 705 commits from development into main 2026-01-09 12:55:50 +00:00
19 changed files with 1295 additions and 1565 deletions
Showing only changes of commit 4503574443 - Show all commits

View File

@@ -0,0 +1,42 @@
import 'package:drift/drift.dart';
import 'package:game_tracker/data/db/database.dart';
import 'package:game_tracker/data/db/tables/group_table.dart';
import 'package:game_tracker/data/dto/group.dart';
part 'group_dao.g.dart';
@DriftAccessor(tables: [GroupTable])
class GroupDao extends DatabaseAccessor<AppDatabase> with _$GroupDaoMixin {
GroupDao(super.db);
Future<List<Group>> getAllGroups() async {
final query = select(groupTable);
final result = await query.get();
return result
.map((row) => Group(id: row.id, name: row.name, members: []))
.toList();
}
Future<Group> getGroupById(String id) async {
final query = select(groupTable)..where((g) => g.id.equals(id));
final result = await query.getSingle();
// todo: Get group members
return Group(id: result.id, name: result.name, members: []);
}
Future<void> addGroup(String id, String name) async {
await into(group).insert(GroupCompanion.insert(id: id, name: name));
}
Future<void> deleteGroup(String id) async {
await (delete(group)..where((g) => g.id.equals(id))).go();
}
Future<void> updateGroupname(String id, String newName) async {
await (update(group)..where((g) => g.id.equals(id))).write(
GroupCompanion(name: Value(newName)),
);
}
}

View File

@@ -0,0 +1,8 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'group_dao.dart';
// ignore_for_file: type=lint
mixin _$GroupDaoMixin on DatabaseAccessor<AppDatabase> {
$GroupTableTable get groupTable => attachedDatabase.groupTable;
}

View File

@@ -1,9 +1,16 @@
import 'package:game_tracker/data/database.dart';
import 'package:drift/drift.dart';
import 'package:game_tracker/data/db/database.dart';
import 'package:game_tracker/data/db/tables/player_table.dart';
import 'package:game_tracker/data/dto/player.dart';
extension UserMethods on AppDatabase {
Future<List<UserData>> getAllUsers() async {
return await select(user).get();
part 'player_dao.g.dart';
@DriftAccessor(tables: [PlayerTable])
class PlayerDao extends DatabaseAccessor<AppDatabase> with _$PlayerDaoMixin {
PlayerDao(super.db);
Future<List<Player>> getAllUsers() async {
return await select(UserTable).get();
}
Future<UserData> getUserById(String id) async {
@@ -11,9 +18,7 @@ extension UserMethods on AppDatabase {
}
Future<void> addUser(String id, String name) async {
await into(user).insert(
UserCompanion.insert(id: id, name: name),
);
await into(user).insert(UserCompanion.insert(id: id, name: name));
}
Future<void> deleteUser(String id) async {

View File

@@ -0,0 +1,8 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'player_dao.dart';
// ignore_for_file: type=lint
mixin _$PlayerDaoMixin on DatabaseAccessor<AppDatabase> {
$PlayerTableTable get playerTable => attachedDatabase.playerTable;
}

View File

@@ -0,0 +1,40 @@
import 'package:drift/drift.dart';
import 'package:game_tracker/data/db/database.dart';
import 'package:game_tracker/data/db/tables/player_group_table.dart';
part 'player_group_dao.g.dart';
@DriftAccessor(tables: [PlayerGroupTable])
class PlayerGroupDao extends DatabaseAccessor<AppDatabase>
with _$PlayerGroupDaoMixin {
PlayerGroupDao(super.db);
Future<List<UserGroupData>> getAllUsersAndGroups() async {
return await select(userGroup).get();
}
Future<List<UserGroupData>> getUsersGroups(String userId) async {
return await (select(
userGroup,
)..where((uG) => uG.userId.equals(userId))).get();
}
Future<List<UserGroupData>> getGroupsUsers(String groupId) async {
return await (select(
userGroup,
)..where((uG) => uG.groupId.equals(groupId))).get();
}
Future<void> addUserToGroup(String userId, String groupId) async {
await into(
userGroup,
).insert(UserGroupCompanion.insert(userId: userId, groupId: groupId));
}
Future<void> removeUserFromGroup(String userId, String groupId) async {
await (delete(
userGroup,
)..where((uG) => uG.userId.equals(userId) & uG.groupId.equals(groupId)))
.go();
}
}

View File

@@ -0,0 +1,9 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'player_group_dao.dart';
// ignore_for_file: type=lint
mixin _$PlayerGroupDaoMixin on DatabaseAccessor<AppDatabase> {
$PlayerGroupTableTable get playerGroupTable =>
attachedDatabase.playerGroupTable;
}

View File

@@ -1,46 +0,0 @@
import 'package:drift/drift.dart';
import 'package:drift_flutter/drift_flutter.dart';
import 'package:path_provider/path_provider.dart';
part 'database.g.dart';
class User extends Table {
TextColumn get id => text()();
TextColumn get name => text()();
@override
Set<Column<Object>> get primaryKey => {id};
}
class Group extends Table {
TextColumn get id => text()();
TextColumn get name => text()();
@override
Set<Column<Object>> get primaryKey => {id};
}
class UserGroup extends Table {
TextColumn get userId => text().references(User, #id)();
TextColumn get groupId => text().references(Group, #id)();
@override
Set<Column<Object>> get primaryKey => {userId, groupId};
}
@DriftDatabase(tables: [User, Group, UserGroup])
class AppDatabase extends _$AppDatabase {
AppDatabase([QueryExecutor? executor]) : super(executor ?? _openConnection());
@override
int get schemaVersion => 1;
static QueryExecutor _openConnection() {
return driftDatabase(
name: 'gametracker_db',
native: const DriftNativeOptions(
databaseDirectory: getApplicationSupportDirectory,
),
);
}
}

File diff suppressed because it is too large Load Diff

31
lib/data/db/database.dart Normal file
View File

@@ -0,0 +1,31 @@
import 'package:drift/drift.dart';
import 'package:drift_flutter/drift_flutter.dart';
import 'package:game_tracker/data/dao/group_dao.dart';
import 'package:game_tracker/data/dao/player_dao.dart';
import 'package:game_tracker/data/dao/player_group_dao.dart';
import 'package:game_tracker/data/db/tables/group_table.dart';
import 'package:game_tracker/data/db/tables/player_group_table.dart';
import 'package:game_tracker/data/db/tables/player_table.dart';
import 'package:path_provider/path_provider.dart';
part 'database.g.dart';
@DriftDatabase(
tables: [PlayerTable, GroupTable, PlayerGroupTable],
daos: [GroupDao, PlayerDao, PlayerGroupDao],
)
class AppDatabase extends _$AppDatabase {
AppDatabase([QueryExecutor? executor]) : super(executor ?? _openConnection());
@override
int get schemaVersion => 1;
static QueryExecutor _openConnection() {
return driftDatabase(
name: 'gametracker_db',
native: const DriftNativeOptions(
databaseDirectory: getApplicationSupportDirectory,
),
);
}
}

1092
lib/data/db/database.g.dart Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,9 @@
import 'package:drift/drift.dart';
class GroupTable extends Table {
TextColumn get id => text()();
TextColumn get name => text()();
@override
Set<Column<Object>> get primaryKey => {id};
}

View File

@@ -0,0 +1,11 @@
import 'package:drift/drift.dart';
import 'package:game_tracker/data/methods/db/tables/group_table.dart';
import 'package:game_tracker/data/methods/db/tables/user_table.dart';
class PlayerGroupTable extends Table {
TextColumn get userId => text().references(UserTable, #id)();
TextColumn get groupId => text().references(GroupTable, #id)();
@override
Set<Column<Object>> get primaryKey => {userId, groupId};
}

View File

@@ -0,0 +1,9 @@
import 'package:drift/drift.dart';
class PlayerTable extends Table {
TextColumn get id => text()();
TextColumn get name => text()();
@override
Set<Column<Object>> get primaryKey => {id};
}

6
lib/data/dto/game.dart Normal file
View File

@@ -0,0 +1,6 @@
class Game {
final String id;
final String name;
Game({required this.id, required this.name});
}

9
lib/data/dto/group.dart Normal file
View File

@@ -0,0 +1,9 @@
import 'package:game_tracker/data/methods/dto/player.dart';
class Group {
final String id;
final String name;
final List<Player> members;
Group({required this.id, required this.name, required this.members});
}

6
lib/data/dto/player.dart Normal file
View File

@@ -0,0 +1,6 @@
class Player {
final String id;
final String username;
Player({required this.id, required this.username});
}

View File

@@ -1,28 +0,0 @@
import 'package:game_tracker/data/database.dart';
import 'package:drift/drift.dart';
extension GroupMethods on AppDatabase {
Future<List<GroupData>> getAllGroups() async {
return await select(group).get();
}
Future<GroupData> getGroupById(String id) async {
return await (select(group)..where((g) => g.id.equals(id))).getSingle();
}
Future<void> addGroup(String id, String name) async {
await into(group).insert(
GroupCompanion.insert(id: id, name: name),
);
}
Future<void> deleteGroup(String id) async {
await (delete(group)..where((g) => g.id.equals(id))).go();
}
Future<void> updateGroupname(String id, String newName) async {
await (update(group)..where((g) => g.id.equals(id))).write(
GroupCompanion(name: Value(newName)),
);
}
}

View File

@@ -1,26 +0,0 @@
import 'package:game_tracker/data/database.dart';
import 'package:drift/drift.dart';
extension UserGroupMethods on AppDatabase {
Future<List<UserGroupData>> getAllUsersAndGroups() async {
return await select(userGroup).get();
}
Future<List<UserGroupData>> getUsersGroups(String userId) async {
return await (select(userGroup)..where((uG) => uG.userId.equals(userId))).get();
}
Future<List<UserGroupData>> getGroupsUsers(String groupId) async {
return await (select(userGroup)..where((uG) => uG.groupId.equals(groupId))).get();
}
Future<void> addUserToGroup(String userId, String groupId) async {
await into(userGroup).insert(
UserGroupCompanion.insert(userId: userId, groupId: groupId),
);
}
Future<void> removeUserFromGroup(String userId, String groupId) async {
await (delete(userGroup)..where((uG) => uG.userId.equals(userId) & uG.groupId.equals(groupId))).go();
}
}

View File

@@ -1,7 +1,7 @@
import 'package:flutter/material.dart';
import 'package:game_tracker/presentation/views/main_menu/custom_navigation_bar.dart';
import 'package:game_tracker/core/custom_theme.dart';
import 'package:game_tracker/data/database.dart';
import 'package:game_tracker/presentation/views/main_menu/custom_navigation_bardb/database.dart';
import 'package:provider/provider.dart';
void main() {