Skip to content
Open
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
82 changes: 82 additions & 0 deletions lib/features/balance/data/balance_repository.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
import 'package:drift/drift.dart';
import 'package:zplit/core/database/app_database.dart';
import 'package:zplit/core/database/daos/balances_dao.dart';
import 'package:zplit/core/database/tables/balances_table.dart';
import 'package:zplit/features/balance/domain/models/balance_model.dart';
import 'package:zplit/features/balance/domain/repositories/balance_repository.dart';

class BalanceRepositoryImpl implements BalanceRepository {
final BalancesDao _balancesDao;

BalanceRepositoryImpl({required BalancesDao balancesDao})
: _balancesDao = balancesDao;

BalanceModel _toModel(BalancesTableData d) => BalanceModel(
userPublicKey: d.userPublicKey,
netAmount: d.netAmount,
currency: d.currency,
signed: d.signed,
updatedAt: d.updatedAt,
);

@override
Future<List<BalanceModel>> getAllBalances() async {
final rows = await _balancesDao.getAll();
return rows.map(_toModel).toList();
}

@override
Future<List<BalanceModel>> getBalancesForUser(String userPublicKey) async {
final all = await _balancesDao.getAll();
return all
.where((b) => b.userPublicKey == userPublicKey)
.map(_toModel)
.toList();
}

@override
Future<BalanceModel?> getBalanceForUserAndCurrency(
String userPublicKey,
String currency,
) async {
final row = await _balancesDao.getByPublicKeyAndCurrency(
userPublicKey,
currency,
);
return row == null ? null : _toModel(row);
}

@override
Future<List<BalanceModel>> getPositiveBalances() async {
final all = await _balancesDao.getAll();
return all.where((b) => b.netAmount > 0).map(_toModel).toList();
}

@override
Future<List<BalanceModel>> getNegativeBalances() async {
final all = await _balancesDao.getAll();
return all.where((b) => b.netAmount < 0).map(_toModel).toList();
}

@override
Future<void> upsertBalance({
required String userPublicKey,
required int netAmount,
required String currency,
String? signed,
}) {
return _balancesDao.upsert(
BalancesTableCompanion(
userPublicKey: Value(userPublicKey),
netAmount: Value(netAmount),
currency: Value(currency),
signed: Value(signed),
),
);
}

@override
Future<int> deleteByPublicKey(String userPublicKey) {
return _balancesDao.deleteBalances(userPublicKey);
}
}
15 changes: 15 additions & 0 deletions lib/features/balance/domain/models/balance_model.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
class BalanceModel {
final String userPublicKey;
final int netAmount;
final String currency;
final String? signed;
final DateTime updatedAt;

const BalanceModel({
required this.userPublicKey,
required this.netAmount,
required this.currency,
this.signed,
required this.updatedAt,
});
}
19 changes: 19 additions & 0 deletions lib/features/balance/domain/repositories/balance_repository.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import 'package:zplit/features/balance/domain/models/balance_model.dart';

abstract class BalanceRepository {
Future<List<BalanceModel>> getAllBalances();
Future<List<BalanceModel>> getBalancesForUser(String userPublicKey);
Future<BalanceModel?> getBalanceForUserAndCurrency(
String userPublicKey,
String currency,
);
Future<List<BalanceModel>> getPositiveBalances();
Future<List<BalanceModel>> getNegativeBalances();
Future<void> upsertBalance({
required String userPublicKey,
required int netAmount,
required String currency,
String? signed,
});
Future<int> deleteByPublicKey(String userPublicKey);
}
106 changes: 106 additions & 0 deletions lib/features/balance/presentation/balance_bloc.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:zplit/features/balance/domain/repositories/balance_repository.dart';
import 'package:zplit/features/balance/presentation/balance_event.dart';
import 'package:zplit/features/balance/presentation/balance_state.dart';

class BalanceBloc extends Bloc<BalanceEvent, BalanceState> {
final BalanceRepository _balanceRepository;

BalanceBloc({required BalanceRepository balanceRepository})
: _balanceRepository = balanceRepository,
super(BalanceInitial()) {
on<LoadAllBalances>(_onLoadAllBalances);
on<LoadBalancesForUser>(_onLoadBalancesForUser);
on<LoadPositiveBalances>(_onLoadPositiveBalances);
on<LoadNegativeBalances>(_onLoadNegativeBalances);
on<UpsertBalance>(_onUpsertBalance);
on<DeleteBalance>(_onDeleteBalance);
}

Future<void> _onLoadAllBalances(
LoadAllBalances event,
Emitter<BalanceState> emit,
) async {
emit(BalanceLoading());
try {
final balances = await _balanceRepository.getAllBalances();
emit(BalanceLoaded(balances));
} catch (e) {
emit(BalanceError(e.toString()));
}
}

Future<void> _onLoadBalancesForUser(
LoadBalancesForUser event,
Emitter<BalanceState> emit,
) async {
emit(BalanceLoading());
try {
final balances = await _balanceRepository.getBalancesForUser(
event.userPublicKey,
);
emit(BalanceLoaded(balances));
} catch (e) {
emit(BalanceError(e.toString()));
}
}

Future<void> _onLoadPositiveBalances(
LoadPositiveBalances event,
Emitter<BalanceState> emit,
) async {
emit(BalanceLoading());
try {
final balances = await _balanceRepository.getPositiveBalances();
emit(BalanceLoaded(balances));
} catch (e) {
emit(BalanceError(e.toString()));
}
}

Future<void> _onLoadNegativeBalances(
LoadNegativeBalances event,
Emitter<BalanceState> emit,
) async {
emit(BalanceLoading());
try {
final balances = await _balanceRepository.getNegativeBalances();
emit(BalanceLoaded(balances));
} catch (e) {
emit(BalanceError(e.toString()));
}
}

Future<void> _onUpsertBalance(
UpsertBalance event,
Emitter<BalanceState> emit,
) async {
emit(BalanceLoading());
try {
await _balanceRepository.upsertBalance(
userPublicKey: event.userPublicKey,
netAmount: event.netAmount,
currency: event.currency,
signed: event.signed,
);
final balances = await _balanceRepository.getAllBalances();
emit(BalanceLoaded(balances));
} catch (e) {
emit(BalanceError(e.toString()));
}
}

Future<void> _onDeleteBalance(
DeleteBalance event,
Emitter<BalanceState> emit,
) async {
emit(BalanceLoading());
try {
await _balanceRepository.deleteByPublicKey(event.userPublicKey);
final balances = await _balanceRepository.getAllBalances();
emit(BalanceLoaded(balances));
} catch (e) {
emit(BalanceError(e.toString()));
}
}
}
31 changes: 31 additions & 0 deletions lib/features/balance/presentation/balance_event.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
abstract class BalanceEvent {}

class LoadAllBalances extends BalanceEvent {}

class LoadBalancesForUser extends BalanceEvent {
final String userPublicKey;
LoadBalancesForUser(this.userPublicKey);
}

class LoadPositiveBalances extends BalanceEvent {}

class LoadNegativeBalances extends BalanceEvent {}

class UpsertBalance extends BalanceEvent {
final String userPublicKey;
final int netAmount;
final String currency;
final String? signed;

UpsertBalance({
required this.userPublicKey,
required this.netAmount,
required this.currency,
this.signed,
});
}

class DeleteBalance extends BalanceEvent {
final String userPublicKey;
DeleteBalance(this.userPublicKey);
}
17 changes: 17 additions & 0 deletions lib/features/balance/presentation/balance_state.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import 'package:zplit/features/balance/domain/models/balance_model.dart';

abstract class BalanceState {}

class BalanceInitial extends BalanceState {}

class BalanceLoading extends BalanceState {}

class BalanceLoaded extends BalanceState {
final List<BalanceModel> balances;
BalanceLoaded(this.balances);
}

class BalanceError extends BalanceState {
final String message;
BalanceError(this.message);
}
53 changes: 53 additions & 0 deletions lib/features/group/data/group_repository.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
import 'package:drift/drift.dart';
import 'package:zplit/core/database/app_database.dart';
import 'package:zplit/core/database/daos/groups_dao.dart';

import 'package:zplit/features/group/domain/models/group_model.dart';
import 'package:zplit/features/group/domain/repositories/group_repository.dart';

class GroupRepositoryImpl implements GroupRepository {
final GroupsDao _groupsDao;

GroupRepositoryImpl({required GroupsDao groupsDao}) : _groupsDao = groupsDao;

GroupModel _toModel(GroupsTableData d) => GroupModel(
id: d.id,
name: d.name,
description: d.description,
users: d.users.isEmpty
? []
: d.users.split(',').map((e) => e.trim()).toList(),
);

@override
Future<List<GroupModel>> getAllGroups() async {
final rows = await _groupsDao.getAll();
return rows.map(_toModel).toList();
}

@override
Future<GroupModel?> getGroupById(String id) async {
final row = await _groupsDao.getById(id);
return row == null ? null : _toModel(row);
}

@override
Future<void> upsertGroup({
required String name,
String? description,
List<String> users = const [],
}) {
return _groupsDao.upsert(
GroupsTableCompanion(
name: Value(name),
description: Value(description),
users: Value(users.join(',')),
),
);
}

@override
Future<int> deleteGroup(String id) {
return _groupsDao.deleteGroup(id);
}
}
13 changes: 13 additions & 0 deletions lib/features/group/domain/models/group_model.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
class GroupModel {
final String id;
final String name;
final String? description;
final List<String> users;

const GroupModel({
required this.id,
required this.name,
this.description,
required this.users,
});
}
12 changes: 12 additions & 0 deletions lib/features/group/domain/repositories/group_repository.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import 'package:zplit/features/group/domain/models/group_model.dart';

abstract class GroupRepository {
Future<List<GroupModel>> getAllGroups();
Future<GroupModel?> getGroupById(String id);
Future<void> upsertGroup({
required String name,
String? description,
List<String> users,
});
Future<int> deleteGroup(String id);
}
Loading