Skip to content
Open
Show file tree
Hide file tree
Changes from all 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/data/balance/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/domain/models/balance/balance_model.dart';
import 'package:zplit/domain/repositories/balance/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);
}
}
53 changes: 53 additions & 0 deletions lib/data/group/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/domain/models/group/group_model.dart';
import 'package:zplit/domain/repositories/group/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);
}
}
140 changes: 140 additions & 0 deletions lib/data/transactions/transaction_repository.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
import 'package:uuid/uuid.dart';
import 'package:drift/drift.dart';
import 'package:zplit/core/database/app_database.dart';
import 'package:zplit/core/database/daos/transactions_dao.dart';
import 'package:zplit/core/database/daos/balances_dao.dart';
import 'package:zplit/core/database/tables/transactions_table.dart';
import 'package:zplit/domain/models/transaction/transaction_model.dart';
import 'package:zplit/domain/repositories/transaction/transaction_repository.dart';

const _uuid = Uuid();

class TransactionRepositoryImpl implements TransactionRepository {
final TransactionsDao _transactionsDao;
final BalancesDao _balancesDao;

TransactionRepositoryImpl({
required TransactionsDao transactionsDao,
required BalancesDao balancesDao,
}) : _transactionsDao = transactionsDao,
_balancesDao = balancesDao;

TransactionModel _toModel(TransactionsTableData d) => TransactionModel(
id: d.id,
fromUserPublicKey: d.fromUserPublicKey,
toUserPublicKey: d.toUserPublicKey,
amount: d.amount,
currency: d.currency,
status: d.status,
description: d.description,
tag: d.tag,
createdAt: d.createdAt,
senderSignature: d.senderSignature,
receiverSignature: d.receiverSignature,
);

@override
Future<List<TransactionModel>> getAllTransactions() async {
final rows = await _transactionsDao.getAll();
return rows.map(_toModel).toList();
}

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

@override
Future<void> createTransaction({
required String fromUserPublicKey,
required String toUserPublicKey,
required BigInt amount,
required String currency,
String? description,
String? tag,
}) {
return _transactionsDao.insert(
TransactionsTableCompanion.insert(
id: _uuid.v4(),
fromUserPublicKey: fromUserPublicKey,
toUserPublicKey: toUserPublicKey,
amount: amount,
currency: currency,
status: TransactionStatus.unsigned,
description: Value(description),
tag: Value(tag),
),
);
}

@override
Future<void> signAsSender({
required String transactionId,
required String senderSignature,
}) async {
final existing = await _transactionsDao.getById(transactionId);
if (existing == null) throw Exception('Transaction not found');

await _transactionsDao.insert(
TransactionsTableCompanion.insert(
id: transactionId,
fromUserPublicKey: existing.fromUserPublicKey,
toUserPublicKey: existing.toUserPublicKey,
amount: existing.amount,
currency: existing.currency,
status: TransactionStatus.partiallySigned,
description: Value(existing.description),
tag: Value(existing.tag),
senderSignature: Value(senderSignature),
),
);
}

@override
Future<void> acceptTransaction({
required String transactionId,
required String receiverSignature,
required String signedBalancePayload,
}) async {
final existing = await _transactionsDao.getById(transactionId);
if (existing == null) throw Exception('Transaction not found');

await _transactionsDao.insert(
TransactionsTableCompanion.insert(
id: transactionId,
fromUserPublicKey: existing.fromUserPublicKey,
toUserPublicKey: existing.toUserPublicKey,
amount: existing.amount,
currency: existing.currency,
status: TransactionStatus.signed,
description: Value(existing.description),
tag: Value(existing.tag),
senderSignature: Value(existing.senderSignature),
receiverSignature: Value(receiverSignature),
),
);

final currentBalance = await _balancesDao.getByPublicKeyAndCurrency(
existing.fromUserPublicKey,
existing.currency,
);
final currentNet = currentBalance?.netAmount ?? 0;
final newNet = currentNet - existing.amount.toInt();

await _balancesDao.upsert(
BalancesTableCompanion(
userPublicKey: Value(existing.fromUserPublicKey),
currency: Value(existing.currency),
netAmount: Value(newNet),
signed: Value(signedBalancePayload),
updatedAt: Value(DateTime.now()),
),
);
}

@override
Future<void> rejectTransaction(String transactionId) async {
return;
}
}
55 changes: 55 additions & 0 deletions lib/data/user/user_repository.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
import 'package:drift/drift.dart';
import 'package:zplit/core/database/app_database.dart';
import 'package:zplit/core/database/daos/users_dao.dart';
import 'package:zplit/domain/models/user/user_model.dart';
import 'package:zplit/domain/repositories/user/user_repository.dart';

class UserRepositoryImpl implements UserRepository {
final UsersDao _usersDao;

UserRepositoryImpl({required UsersDao usersDao}) : _usersDao = usersDao;

UserModel _toModel(UsersTableData d) => UserModel(
publicKey: d.publicKey,
displayName: d.displayName,
cryptoAddress: d.cryptoAddress,
profilePicture: d.profilePicture,
defaultCurrency: d.defaultCurrency,
);

@override
Future<List<UserModel>> getAllUsers() async {
final rows = await _usersDao.getAll();
return rows.map(_toModel).toList();
}

@override
Future<UserModel?> getUserByPublicKey(String publicKey) async {
final row = await _usersDao.getByPublicKey(publicKey);
return row == null ? null : _toModel(row);
}

@override
Future<void> upsertUser({
required String publicKey,
required String displayName,
String? cryptoAddress,
String? profilePicture,
required String defaultCurrency,
}) {
return _usersDao.upsert(
UsersTableCompanion(
publicKey: Value(publicKey),
displayName: Value(displayName),
cryptoAddress: Value(cryptoAddress),
profilePicture: Value(profilePicture),
defaultCurrency: Value(defaultCurrency),
),
);
}

@override
Future<int> deleteUser(String publicKey) {
return _usersDao.deleteUser(publicKey);
}
}
15 changes: 15 additions & 0 deletions lib/domain/models/balance/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,
});
}
13 changes: 13 additions & 0 deletions lib/domain/models/group/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,
});
}
29 changes: 29 additions & 0 deletions lib/domain/models/transaction/transaction_model.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import 'package:zplit/core/database/tables/transactions_table.dart';

class TransactionModel {
final String id;
final String fromUserPublicKey;
final String toUserPublicKey;
final BigInt amount;
final String currency;
final TransactionStatus status;
final String? description;
final String? tag;
final DateTime createdAt;
final String? senderSignature;
final String? receiverSignature;

const TransactionModel({
required this.id,
required this.fromUserPublicKey,
required this.toUserPublicKey,
required this.amount,
required this.currency,
required this.status,
this.description,
this.tag,
required this.createdAt,
this.senderSignature,
this.receiverSignature,
});
}
Loading