diff options
| author | Lucas Faria Mendes <lucas.fariamo08@gmail.com> | 2026-08-16 23:17:42 +0000 |
|---|---|---|
| committer | Lucas Faria Mendes <lucas.fariamo08@gmail.com> | 2026-08-16 23:17:42 +0000 |
| commit | 375482e654a01615683867e732ac9e458c7cbe74 (patch) | |
| tree | 12d1b31b8deb6bf8590bcdbc2cfb52dcc553e006 /api/src/modules/recurring-expenses/recurring-expenses.service.ts | |
| parent | 2c2dfba45357bbd205a59145ae55a2779c911ae0 (diff) | |
| download | yaba-master.tar.gz yaba-master.zip | |
Signed-off-by: Lucas Faria Mendes <lucas.fariamo08@gmail.com>
Diffstat (limited to 'api/src/modules/recurring-expenses/recurring-expenses.service.ts')
| -rw-r--r-- | api/src/modules/recurring-expenses/recurring-expenses.service.ts | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/api/src/modules/recurring-expenses/recurring-expenses.service.ts b/api/src/modules/recurring-expenses/recurring-expenses.service.ts new file mode 100644 index 0000000..2bb9720 --- /dev/null +++ b/api/src/modules/recurring-expenses/recurring-expenses.service.ts @@ -0,0 +1,115 @@ +import { and, eq } from 'drizzle-orm'; +import { db } from '@/db/client'; +import { recurringExpenses } from '@/db/schema'; +import type { + CreateRecurringExpenseInput, + UpdateRecurringExpenseInput, +} from './recurring-expenses.schema'; + +export async function findRecurringExpensesByUser(userId: number) { + return db + .select() + .from(recurringExpenses) + .where(eq(recurringExpenses.user_id, userId)) + .orderBy(recurringExpenses.name); +} + +export async function findRecurringExpenseById(userId: number, id: number) { + const result = await db + .select() + .from(recurringExpenses) + .where( + and( + eq(recurringExpenses.user_id, userId), + eq(recurringExpenses.id, id), + ), + ) + .limit(1); + return result[0] ?? null; +} + +export async function createRecurringExpense( + userId: number, + data: CreateRecurringExpenseInput, +) { + const [created] = await db + .insert(recurringExpenses) + .values({ + user_id: userId, + name: data.name, + amount: data.amount, + category: data.category, + type: data.type, + due_day: data.due_day ?? null, + is_active: data.is_active, + starts_at: data.starts_at, + ends_at: data.ends_at ?? null, + }) + .returning(); + return created; +} + +export async function updateRecurringExpense( + userId: number, + id: number, + data: UpdateRecurringExpenseInput, +) { + const now = new Date().toISOString(); + + const [updated] = await db + .update(recurringExpenses) + .set({ + ...(data.name !== undefined && { name: data.name }), + ...(data.amount !== undefined && { amount: data.amount }), + ...(data.category !== undefined && { category: data.category }), + ...(data.type !== undefined && { type: data.type }), + ...(data.due_day !== undefined && { due_day: data.due_day }), + ...(data.is_active !== undefined && { is_active: data.is_active }), + ...(data.starts_at !== undefined && { starts_at: data.starts_at }), + ...(data.ends_at !== undefined && { ends_at: data.ends_at }), + updated_at: now, + }) + .where( + and( + eq(recurringExpenses.user_id, userId), + eq(recurringExpenses.id, id), + ), + ) + .returning(); + + return updated ?? null; +} + +export async function toggleRecurringExpense(userId: number, id: number) { + const expense = await findRecurringExpenseById(userId, id); + if (!expense) return null; + + const [updated] = await db + .update(recurringExpenses) + .set({ + is_active: !expense.is_active, + updated_at: new Date().toISOString(), + }) + .where( + and( + eq(recurringExpenses.user_id, userId), + eq(recurringExpenses.id, id), + ), + ) + .returning(); + + return updated ?? null; +} + +export async function deleteRecurringExpense(userId: number, id: number) { + const [deleted] = await db + .delete(recurringExpenses) + .where( + and( + eq(recurringExpenses.user_id, userId), + eq(recurringExpenses.id, id), + ), + ) + .returning(); + return deleted ?? null; +} |