generated from MarkusThielker/next-base
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
N-FIN-12: add sample data generation for development (#14)
Resolves #12
- Loading branch information
Showing
9 changed files
with
323 additions
and
4 deletions.
There are no files selected for viewing
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
'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)); | ||
router.refresh(); | ||
}; | ||
|
||
return ( | ||
<Button className="w-full" variant="outline" onClick={handleSubmit}>Generate sample data</Button> | ||
); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
'use client'; | ||
|
||
import * as React from 'react'; | ||
import * as SeparatorPrimitive from '@radix-ui/react-separator'; | ||
|
||
import { cn } from '@/lib/utils'; | ||
|
||
const Separator = React.forwardRef< | ||
React.ElementRef<typeof SeparatorPrimitive.Root>, | ||
React.ComponentPropsWithoutRef<typeof SeparatorPrimitive.Root> | ||
>( | ||
( | ||
{className, orientation = 'horizontal', decorative = true, ...props}, | ||
ref, | ||
) => ( | ||
<SeparatorPrimitive.Root | ||
ref={ref} | ||
decorative={decorative} | ||
orientation={orientation} | ||
className={cn( | ||
'shrink-0 bg-border', | ||
orientation === 'horizontal' ? 'h-[1px] w-full' : 'h-full w-[1px]', | ||
className, | ||
)} | ||
{...props} | ||
/> | ||
), | ||
); | ||
Separator.displayName = SeparatorPrimitive.Root.displayName; | ||
|
||
export { Separator }; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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', | ||
}; | ||
} |