Files
portfolio/prisma/seed.ts
2026-01-07 14:30:00 +01:00

275 lines
8.0 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { PrismaClient } from "@prisma/client";
const prisma = new PrismaClient();
async function main() {
console.log("🌱 Seeding database...");
// Clear existing data
await prisma.userInteraction.deleteMany();
await prisma.pageView.deleteMany();
await prisma.project.deleteMany();
// Create real projects
const projects = [
{
title: "Clarity",
description:
"A Flutter mobile app supporting people with dyslexia by displaying text in OpenDyslexic font and simplifying content using AI.",
content: `# Clarity - Dyslexia Support App
Clarity is a mobile application built with Flutter to help people with dyslexia read and understand text more easily.
## 🎯 Purpose
The app was designed to make reading more accessible by using the OpenDyslexic font, which is specifically designed to make letters more distinguishable and reduce reading errors.
## 🚀 Features
- **OpenDyslexic Font**: All text is displayed in the OpenDyslexic typeface
- **AI Text Simplification**: Complex texts are simplified using AI integration
- **Clean Interface**: Simple, distraction-free reading experience
- **Mobile-First**: Optimized for smartphones and tablets
- **Accessibility**: Built with accessibility in mind from the ground up
## 🛠️ Technologies Used
- Flutter
- Dart
- AI Integration for text simplification
- OpenDyslexic Font
## 📱 Platform Support
- iOS
- Android
## 💡 What I Learned
Building Clarity taught me a lot about accessibility, mobile UI/UX design, and how to integrate AI services into mobile applications. It was rewarding to create something that could genuinely help people in their daily lives.
## 🔮 Future Plans
- Add more font options
- Implement text-to-speech
- Support for more languages
- PDF and document scanning`,
tags: ["Flutter", "Mobile", "AI", "Accessibility", "Dart"],
featured: true,
category: "Mobile Development",
date: "2024",
published: true,
difficulty: "INTERMEDIATE",
timeToComplete: "4-6 weeks",
technologies: ["Flutter", "Dart", "AI Integration", "OpenDyslexic Font"],
challenges: [
"Implementing AI text simplification",
"Font rendering optimization",
"Mobile accessibility standards",
],
lessonsLearned: [
"Mobile development with Flutter",
"Accessibility best practices",
"AI API integration",
],
futureImprovements: [
"Text-to-speech",
"Multi-language support",
"Document scanning",
],
demoVideo: "",
screenshots: [],
colorScheme: "Clean and minimal with high contrast",
accessibility: true,
performance: {
lighthouse: 0,
bundleSize: "0KB",
loadTime: "0s",
},
analytics: {
views: 850,
likes: 67,
shares: 34,
},
},
{
title: "Self-Hosted Infrastructure & Portfolio",
description:
"A complete DevOps setup running in Docker Swarm. My Next.js projects are deployed via automated CI/CD pipelines with custom runners.",
content: `# Self-Hosted Infrastructure & Portfolio
Not just a website this is a complete self-hosted infrastructure project showcasing my DevOps skills and passion for self-hosting.
## 🏗️ Architecture
All my projects run on a Docker Swarm cluster hosted on IONOS and OVHcloud servers. Everything is self-managed, from the networking layer to the application deployments.
## 🚀 Features
- **Docker Swarm Cluster**: Multi-node orchestration for high availability
- **Traefik Reverse Proxy**: Automatic SSL certificates and routing
- **Automated CI/CD**: Custom GitLab/Gitea runners for continuous deployment
- **Zero-Downtime Deployments**: Rolling updates without service interruption
- **Redis Caching**: Performance optimization with Redis
- **Nginx Proxy Manager**: Additional layer for complex routing scenarios
## 🛠️ Tech Stack
- **Frontend**: Next.js, Tailwind CSS
- **Infrastructure**: Docker Swarm, Traefik, Nginx Proxy Manager
- **CI/CD**: Custom Git runners with automated pipelines
- **Monitoring**: Self-hosted monitoring stack
- **Security**: CrowdSec, Suricata, Mailcow
- **Caching**: Redis
## 🔐 Security
Security is a top priority. I use CrowdSec for intrusion prevention, Suricata for network monitoring, and Mailcow for secure email communications.
## 📈 DevOps Process
1. Code push triggers CI/CD pipeline
2. Automated tests run on custom runners
3. Docker images are built and tagged
4. Rolling deployment to Swarm cluster
5. Traefik automatically routes traffic
6. Zero downtime for users
## 💡 What I Learned
This project taught me everything about production-grade DevOps, from container orchestration to security hardening. Managing my own infrastructure has given me deep insights into networking, load balancing, and system administration.
## 🎯 Other Projects
Besides this portfolio, I host:
- Interactive photo galleries
- Quiz applications
- Game servers
- n8n automation workflows
- Various experimental Next.js apps
## 🔮 Future Improvements
- Kubernetes migration for more advanced orchestration
- Automated backup and disaster recovery
- Advanced monitoring with Prometheus and Grafana
- Multi-region deployment`,
tags: [
"Docker",
"Swarm",
"DevOps",
"CI/CD",
"Next.js",
"Traefik",
"Self-Hosting",
],
featured: true,
category: "DevOps",
date: "2024",
published: true,
difficulty: "ADVANCED",
timeToComplete: "Ongoing project",
technologies: [
"Docker Swarm",
"Traefik",
"Next.js",
"Redis",
"CI/CD",
"Nginx",
"CrowdSec",
"Suricata",
],
challenges: [
"Zero-downtime deployments",
"Network configuration",
"Security hardening",
"Performance optimization",
],
lessonsLearned: [
"Container orchestration",
"DevOps practices",
"Infrastructure as Code",
"Security best practices",
],
futureImprovements: [
"Kubernetes migration",
"Multi-region setup",
"Advanced monitoring",
"Automated backups",
],
demoVideo: "",
screenshots: [],
colorScheme: "Modern and professional",
accessibility: true,
performance: {
lighthouse: 0,
bundleSize: "0KB",
loadTime: "0s",
},
analytics: {
views: 1420,
likes: 112,
shares: 45,
},
},
];
for (const project of projects) {
await prisma.project.create({
data: {
...project,
difficulty: project.difficulty as
| "BEGINNER"
| "INTERMEDIATE"
| "ADVANCED"
| "EXPERT",
},
});
}
console.log(`✅ Created ${projects.length} projects`);
// Create some sample analytics data
for (let i = 1; i <= projects.length; i++) {
// Create page views
for (let j = 0; j < Math.floor(Math.random() * 100) + 50; j++) {
await prisma.pageView.create({
data: {
projectId: i,
page: `/projects/${i}`,
ip: `192.168.1.${Math.floor(Math.random() * 255)}`,
userAgent:
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
referrer: "https://google.com",
},
});
}
// Create user interactions
for (let j = 0; j < Math.floor(Math.random() * 20) + 10; j++) {
await prisma.userInteraction.create({
data: {
projectId: i,
type: Math.random() > 0.5 ? "LIKE" : "SHARE",
ip: `192.168.1.${Math.floor(Math.random() * 255)}`,
userAgent:
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
},
});
}
}
console.log("✅ Created sample analytics data");
console.log("🎉 Database seeding completed!");
}
main()
.catch((e) => {
console.error("❌ Error seeding database:", e);
process.exit(1);
})
.finally(async () => {
await prisma.$disconnect();
});