jedmund-svelte/prisma/seed.ts

370 lines
9.7 KiB
TypeScript

import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient()
async function main() {
console.log('🌱 Starting seed...')
// Clear existing data
await prisma.photo.deleteMany({})
await prisma.album.deleteMany({})
await prisma.post.deleteMany({})
await prisma.media.deleteMany({})
await prisma.project.deleteMany({})
console.log('✅ Cleared existing data')
// Create real projects from ProjectList
const projects = await Promise.all([
prisma.project.create({
data: {
slug: 'maitsu',
title: 'Maitsu',
subtitle: 'A hobby journal for weekly creativity',
description: 'Maitsu is a hobby journal that helps people make something new every week.',
year: 2023,
client: 'Personal Project',
role: 'Founder & Designer',
projectType: 'work',
backgroundColor: '#FFF7EA',
highlightColor: '#F77754',
displayOrder: 1,
status: 'published',
publishedAt: new Date()
}
}),
prisma.project.create({
data: {
slug: 'slack',
title: 'Slack',
subtitle: 'Redefining automation strategy',
description:
'At Slack, I helped redefine strategy for Workflows and other features in under the automation umbrella.',
year: 2022,
client: 'Slack Technologies',
role: 'Senior Product Designer',
projectType: 'work',
backgroundColor: '#4a154b',
highlightColor: '#611F69',
displayOrder: 2,
status: 'published',
publishedAt: new Date()
}
}),
prisma.project.create({
data: {
slug: 'figma',
title: 'Figma',
subtitle: 'Pioneering prototyping features',
description:
'At Figma, I designed features and led R&D and strategy for the nascent prototyping team.',
year: 2019,
client: 'Figma Inc.',
role: 'Product Designer',
projectType: 'work',
backgroundColor: '#2c2c2c',
highlightColor: '#0ACF83',
displayOrder: 3,
status: 'published',
publishedAt: new Date()
}
}),
prisma.project.create({
data: {
slug: 'pinterest',
title: 'Pinterest',
subtitle: 'Building from the ground up',
description:
'At Pinterest, I was the first product design hired, and touched almost every part of the product.',
year: 2011,
client: 'Pinterest',
role: 'Product Designer #1',
projectType: 'work',
backgroundColor: '#f7f7f7',
highlightColor: '#CB1F27',
displayOrder: 4,
status: 'published',
publishedAt: new Date()
}
})
])
console.log(`✅ Created ${projects.length} work projects`)
// Create Labs projects
const labsProjects = await Promise.all([
prisma.project.create({
data: {
slug: 'granblue-team',
title: 'granblue.team',
subtitle: 'Comprehensive web app for Granblue Fantasy players',
description:
'A comprehensive web application for Granblue Fantasy players to track raids, manage crews, and optimize team compositions. Features real-time raid tracking, character databases, and community tools.',
year: 2022,
client: 'Personal Project',
role: 'Full-Stack Developer',
externalUrl: 'https://granblue.team',
backgroundColor: '#1a1a2e',
highlightColor: '#16213e',
projectType: 'labs',
displayOrder: 1,
status: 'published',
publishedAt: new Date()
}
}),
prisma.project.create({
data: {
slug: 'subway-board',
title: 'Subway Board',
subtitle: 'Beautiful, minimalist NYC subway dashboard',
description:
'A beautiful, minimalist dashboard displaying real-time NYC subway arrival times. Clean interface inspired by the classic subway map design with live MTA data integration.',
year: 2023,
client: 'Personal Project',
role: 'Developer & Designer',
backgroundColor: '#0f4c81',
highlightColor: '#1e3a5f',
projectType: 'labs',
displayOrder: 2,
status: 'published',
publishedAt: new Date()
}
}),
prisma.project.create({
data: {
slug: 'siero-discord',
title: 'Siero for Discord',
subtitle: 'Discord bot for Granblue Fantasy communities',
description:
'A Discord bot for Granblue Fantasy communities providing character lookups, raid notifications, and server management tools. Serves thousands of users across multiple servers.',
year: 2021,
client: 'Personal Project',
role: 'Bot Developer',
backgroundColor: '#5865f2',
highlightColor: '#4752c4',
projectType: 'labs',
displayOrder: 3,
status: 'published',
publishedAt: new Date()
}
}),
prisma.project.create({
data: {
slug: 'homelab',
title: 'Homelab',
subtitle: 'Self-hosted infrastructure on Kubernetes',
description:
'Self-hosted infrastructure running on Kubernetes with monitoring, media servers, and development environments. Includes automated deployments and backup strategies.',
year: 2023,
client: 'Personal Project',
role: 'DevOps Engineer',
backgroundColor: '#ff6b35',
highlightColor: '#e55a2b',
projectType: 'labs',
displayOrder: 4,
status: 'published',
publishedAt: new Date()
}
})
])
console.log(`✅ Created ${labsProjects.length} labs projects`)
// Create test posts using new simplified types
const posts = await Promise.all([
prisma.post.create({
data: {
slug: 'hello-world',
postType: 'essay',
title: 'Hello World',
content: {
blocks: [
{ type: 'paragraph', content: 'This is my first essay on the new CMS!' },
{
type: 'paragraph',
content:
'The system now uses a simplified post type system with just essays and posts.'
},
{
type: 'paragraph',
content:
'Essays are perfect for longer-form content with titles and excerpts, while posts are great for quick thoughts and updates.'
}
]
},
tags: ['announcement', 'meta', 'cms'],
status: 'published',
publishedAt: new Date()
}
}),
prisma.post.create({
data: {
slug: 'quick-thought',
postType: 'post',
content: {
blocks: [
{
type: 'paragraph',
content:
'Just pushed a major update to the site. The new simplified post types are working great! 🎉'
}
]
},
tags: ['update', 'development'],
status: 'published',
publishedAt: new Date(Date.now() - 86400000) // Yesterday
}
}),
prisma.post.create({
data: {
slug: 'design-systems-thoughts',
postType: 'essay',
title: 'Thoughts on Design Systems',
content: {
blocks: [
{
type: 'paragraph',
content:
'Design systems have become essential for maintaining consistency across large products.'
},
{
type: 'paragraph',
content: 'The key is finding the right balance between flexibility and constraints.'
},
{
type: 'paragraph',
content:
'Too rigid, and designers feel boxed in. Too flexible, and you lose consistency.'
}
]
},
tags: ['design', 'systems', 'ux'],
status: 'published',
publishedAt: new Date(Date.now() - 172800000) // 2 days ago
}
}),
prisma.post.create({
data: {
slug: 'morning-coffee',
postType: 'post',
content: {
blocks: [
{
type: 'paragraph',
content: 'Perfect morning for coding with a fresh cup of coffee ☕'
}
]
},
tags: ['life', 'coffee'],
status: 'published',
publishedAt: new Date(Date.now() - 259200000) // 3 days ago
}
}),
prisma.post.create({
data: {
slug: 'weekend-project',
postType: 'post',
content: {
blocks: [
{
type: 'paragraph',
content:
'Built a small CLI tool over the weekend. Sometimes the best projects come from scratching your own itch.'
}
]
},
tags: ['projects', 'cli', 'weekend'],
status: 'draft'
}
})
])
console.log(`✅ Created ${posts.length} posts`)
// Create test album and photos
const album = await prisma.album.create({
data: {
slug: 'tokyo-trip-2024',
title: 'Tokyo Trip 2024',
description: 'Photos from my recent trip to Tokyo',
date: new Date('2024-03-15'),
location: 'Tokyo, Japan',
status: 'published',
isPhotography: true,
showInUniverse: true
}
})
const photos = await Promise.all([
prisma.photo.create({
data: {
albumId: album.id,
filename: 'tokyo-tower.jpg',
url: '/local-uploads/tokyo-tower.jpg',
thumbnailUrl: '/local-uploads/thumb-tokyo-tower.jpg',
width: 1920,
height: 1080,
caption: 'Tokyo Tower at sunset',
displayOrder: 1,
status: 'published',
showInPhotos: true,
exifData: {
camera: 'Sony A7III',
lens: '24-70mm f/2.8',
iso: 400,
aperture: 'f/5.6',
shutterSpeed: '1/250s'
}
}
}),
prisma.photo.create({
data: {
albumId: album.id,
filename: 'shibuya-crossing.jpg',
url: '/local-uploads/shibuya-crossing.jpg',
thumbnailUrl: '/local-uploads/thumb-shibuya-crossing.jpg',
width: 1920,
height: 1080,
caption: 'The famous Shibuya crossing',
displayOrder: 2,
status: 'published',
showInPhotos: true
}
})
])
await prisma.album.update({
where: { id: album.id },
data: { coverPhotoId: photos[0].id }
})
console.log(`✅ Created album with ${photos.length} photos`)
// Create test media entries
const media = await Promise.all([
prisma.media.create({
data: {
filename: 'blog-header.jpg',
mimeType: 'image/jpeg',
size: 245000,
url: '/local-uploads/blog-header.jpg',
thumbnailUrl: '/local-uploads/thumb-blog-header.jpg',
width: 1920,
height: 1080,
usedIn: [{ type: 'post', id: posts[0].id }]
}
})
])
console.log(`✅ Created ${media.length} media items`)
console.log('🎉 Seed completed!')
}
main()
.catch((e) => {
console.error('❌ Seed failed:', e)
process.exit(1)
})
.finally(async () => {
await prisma.$disconnect()
})