From b8a7a5d6f44825eba9e0194990d3151a051dbd37 Mon Sep 17 00:00:00 2001 From: Markus Thielker Date: Mon, 11 Mar 2024 03:38:30 +0100 Subject: [PATCH] N-FIN-12: add button to generate sample data --- src/app/account/page.tsx | 9 +- .../form/generateSampleDataForm.tsx | 25 +++ src/lib/actions/generateSampleData.ts | 190 ++++++++++++++++++ 3 files changed, 223 insertions(+), 1 deletion(-) create mode 100644 src/components/form/generateSampleDataForm.tsx create mode 100644 src/lib/actions/generateSampleData.ts diff --git a/src/app/account/page.tsx b/src/app/account/page.tsx index 38b1ae4..1b6d787 100644 --- a/src/app/account/page.tsx +++ b/src/app/account/page.tsx @@ -7,6 +7,8 @@ import { Label } from '@/components/ui/label'; import { Input } from '@/components/ui/input'; import SignOutForm from '@/components/form/signOutForm'; import { URL_SIGN_IN } from '@/lib/constants'; +import GenerateSampleDataForm from '@/components/form/generateSampleDataForm'; +import generateSampleData from '@/lib/actions/generateSampleData'; export default async function AccountPage() { @@ -37,7 +39,12 @@ export default async function AccountPage() { value={user?.username}/> - + + { + process.env.NODE_ENV === 'development' && ( + + ) + } diff --git a/src/components/form/generateSampleDataForm.tsx b/src/components/form/generateSampleDataForm.tsx new file mode 100644 index 0000000..b894137 --- /dev/null +++ b/src/components/form/generateSampleDataForm.tsx @@ -0,0 +1,25 @@ +'use client'; + +import { Button } from '@/components/ui/button'; +import React from 'react'; +import { useRouter } from 'next/navigation'; +import { toast } from 'sonner'; +import { sonnerContent } from '@/components/ui/sonner'; +import { ActionResponse } from '@/lib/types/ActionResponse'; + +export default function GenerateSampleDataForm({onSubmit}: { onSubmit: () => Promise }) { + + const router = useRouter(); + + const handleSubmit = async () => { + const response = await onSubmit(); + toast(sonnerContent(response)); + if (response.redirect) { + router.push(response.redirect); + } + }; + + return ( + + ); +} diff --git a/src/lib/actions/generateSampleData.ts b/src/lib/actions/generateSampleData.ts new file mode 100644 index 0000000..5414f1e --- /dev/null +++ b/src/lib/actions/generateSampleData.ts @@ -0,0 +1,190 @@ +import { prismaClient } from '@/prisma'; +import type { Category, Entity } from '@prisma/client'; +import { EntityType } from '@prisma/client'; +import { getUser } from '@/auth'; +import { URL_SIGN_IN } from '@/lib/constants'; +import { ActionResponse } from '@/lib/types/ActionResponse'; + +export default async function generateSampleData(): Promise { + 'use server'; + + const user = await getUser(); + + if (!user) { + return { + type: 'error', + message: 'You must be logged in to create/update an category.', + redirect: URL_SIGN_IN, + }; + } + + // Categories: create sample data + const categories: Category[] = await prismaClient.category.findMany({where: {userId: user.id}}); + if (await prismaClient.category.count({where: {userId: user.id}}) == 0) { + + console.log('Creating sample categories...'); + + categories.push(await prismaClient.category.create({ + data: { + userId: user.id, + name: 'Groceries', + color: '#FFBEAC', + }, + })); + + categories.push(await prismaClient.category.create({ + data: { + userId: user.id, + name: 'Drugstore items', + color: '#9CBCFF', + }, + })); + + categories.push(await prismaClient.category.create({ + data: { + userId: user.id, + name: 'Going out', + color: '#F1ADFF', + }, + })); + + categories.push(await prismaClient.category.create({ + data: { + userId: user.id, + name: 'Random stuff', + color: '#C1FFA9', + }, + })); + + categories.push(await prismaClient.category.create({ + data: { + userId: user.id, + name: 'Salary', + color: '#FFF787', + }, + })); + + console.log('Sample categories created.'); + } + console.log(categories); + + // Entities: create sample data + const entities: Entity[] = await prismaClient.entity.findMany({where: {userId: user.id}}); + if (await prismaClient.entity.count({where: {userId: user.id}}) == 0) { + + console.log('Creating sample entities...'); + + entities.push(await prismaClient.entity.create({ + data: { + userId: user.id, + name: 'Main Account', + type: EntityType.Account, + }, + })); + + entities.push(await prismaClient.entity.create({ + data: { + userId: user.id, + name: 'Company', + type: EntityType.Entity, + }, + })); + + entities.push(await prismaClient.entity.create({ + data: { + userId: user.id, + name: 'Supermarket 1', + type: EntityType.Entity, + }, + })); + + entities.push(await prismaClient.entity.create({ + data: { + userId: user.id, + name: 'Supermarket 2', + type: EntityType.Entity, + }, + })); + + entities.push(await prismaClient.entity.create({ + data: { + userId: user.id, + name: 'Supermarket 3', + type: EntityType.Entity, + }, + })); + + entities.push(await prismaClient.entity.create({ + data: { + userId: user.id, + name: 'Supermarket 4', + type: EntityType.Entity, + }, + })); + + console.log('Sample entities created.'); + } + console.log(entities); + + // Payments: create sample data + console.log('Creating sample payments...'); + + if (await prismaClient.payment.count({where: {userId: user.id}}) == 0) { + for (let i = 0; i < 4; i++) { + + const date = new Date(); + date.setDate(1); + date.setMonth(date.getMonth() - i); + + await prismaClient.payment.create({ + data: { + userId: user.id, + amount: 200000, + date: date, + payorId: entities[1].id, + payeeId: entities[0].id, + categoryId: 5, + createdAt: date, + updatedAt: date, + }, + }); + } + } + + let minAmount = 200; // 2€ + let maxAmount = 3000; // 30€ + let minPayee = entities[2].id; + let maxPayee = entities[entities.length - 1].id; + let minCategory = categories[0].id; + let maxCategory = categories[categories.length - 1].id; + let payments = 196; + + for (let i = 0; i < payments; i++) { + + const date = new Date( + new Date().getTime() - Math.floor(Math.random() * 10000000000)); + + await prismaClient.payment.create({ + data: { + userId: user.id, + amount: Math.floor( + Math.random() * (maxAmount - minAmount) + minAmount), + date: date, + payorId: 1, + payeeId: Math.floor( + Math.random() * (maxPayee - minPayee) + minPayee), + categoryId: Math.floor( + Math.random() * (maxCategory - minCategory) + minCategory), + createdAt: date, + updatedAt: date, + }, + }); + } + + console.log('Sample payments created.'); + + return { + type: 'success', + message: 'Sample data created', + }; +}