N-FIN-12: add button to generate sample data

This commit is contained in:
Markus Thielker 2024-03-11 03:38:30 +01:00
parent 95f36977da
commit b8a7a5d6f4
No known key found for this signature in database
3 changed files with 223 additions and 1 deletions

View file

@ -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}/>
</div>
</CardContent>
<CardFooter>
<CardFooter className="space-x-4">
{
process.env.NODE_ENV === 'development' && (
<GenerateSampleDataForm onSubmit={generateSampleData}/>
)
}
<SignOutForm onSubmit={signOut}/>
</CardFooter>
</Card>

View file

@ -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<ActionResponse> }) {
const router = useRouter();
const handleSubmit = async () => {
const response = await onSubmit();
toast(sonnerContent(response));
if (response.redirect) {
router.push(response.redirect);
}
};
return (
<Button className="w-full" variant="outline" onClick={handleSubmit}>Generate sample data</Button>
);
}

View file

@ -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<ActionResponse> {
'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',
};
}