aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib/api.ts
diff options
context:
space:
mode:
authorSebastien Castiel <sebastien@castiel.me>2024-01-08 18:11:11 +0100
committerGitHub <noreply@github.com>2024-01-08 12:11:11 -0500
commit0a8e56f80033ce889b38b01f2287cd6fbbe36dd6 (patch)
tree333572d8e30d340288e6bf2388428bf465e928a4 /src/lib/api.ts
parent0fb0c42ff56c9cc66aeb8f875c6389c3d2ace1b9 (diff)
Add splitmode and shares to expenses (#11)
* Add splitmode and shares to expenses * Update balances based on shares * Change field size * Form validation * Redesign expense form * Split unevenly by amount
Diffstat (limited to 'src/lib/api.ts')
-rw-r--r--src/lib/api.ts45
1 files changed, 33 insertions, 12 deletions
diff --git a/src/lib/api.ts b/src/lib/api.ts
index 98419d4..586a354 100644
--- a/src/lib/api.ts
+++ b/src/lib/api.ts
@@ -36,7 +36,7 @@ export async function createExpense(
for (const participant of [
expenseFormValues.paidBy,
- ...expenseFormValues.paidFor,
+ ...expenseFormValues.paidFor.map((p) => p.participant),
]) {
if (!group.participants.some((p) => p.id === participant))
throw new Error(`Invalid participant ID: ${participant}`)
@@ -50,10 +50,12 @@ export async function createExpense(
amount: expenseFormValues.amount,
title: expenseFormValues.title,
paidById: expenseFormValues.paidBy,
+ splitMode: expenseFormValues.splitMode,
paidFor: {
createMany: {
data: expenseFormValues.paidFor.map((paidFor) => ({
- participantId: paidFor,
+ participantId: paidFor.participant,
+ shares: paidFor.shares,
})),
},
},
@@ -84,12 +86,14 @@ export async function getGroupExpensesParticipants(groupId: string) {
export async function getGroups(groupIds: string[]) {
const prisma = await getPrisma()
- return (await prisma.group.findMany({
- where: { id: { in: groupIds } },
- include: { _count: { select: { participants: true } } },
- })).map(group => ({
+ return (
+ await prisma.group.findMany({
+ where: { id: { in: groupIds } },
+ include: { _count: { select: { participants: true } } },
+ })
+ ).map((group) => ({
...group,
- createdAt: group.createdAt.toISOString()
+ createdAt: group.createdAt.toISOString(),
}))
}
@@ -106,7 +110,7 @@ export async function updateExpense(
for (const participant of [
expenseFormValues.paidBy,
- ...expenseFormValues.paidFor,
+ ...expenseFormValues.paidFor.map((p) => p.participant),
]) {
if (!group.participants.some((p) => p.id === participant))
throw new Error(`Invalid participant ID: ${participant}`)
@@ -119,17 +123,34 @@ export async function updateExpense(
amount: expenseFormValues.amount,
title: expenseFormValues.title,
paidById: expenseFormValues.paidBy,
+ splitMode: expenseFormValues.splitMode,
paidFor: {
- connectOrCreate: expenseFormValues.paidFor.map((paidFor) => ({
+ create: expenseFormValues.paidFor
+ .filter(
+ (p) =>
+ !existingExpense.paidFor.some(
+ (pp) => pp.participantId === p.participant,
+ ),
+ )
+ .map((paidFor) => ({
+ participantId: paidFor.participant,
+ shares: paidFor.shares,
+ })),
+ update: expenseFormValues.paidFor.map((paidFor) => ({
where: {
- expenseId_participantId: { expenseId, participantId: paidFor },
+ expenseId_participantId: {
+ expenseId,
+ participantId: paidFor.participant,
+ },
+ },
+ data: {
+ shares: paidFor.shares,
},
- create: { participantId: paidFor },
})),
deleteMany: existingExpense.paidFor.filter(
(paidFor) =>
!expenseFormValues.paidFor.some(
- (pf) => pf === paidFor.participantId,
+ (pf) => pf.participant === paidFor.participantId,
),
),
},