import { Card, CardContent, CardFooter, CardHeader, CardTitle, } from '@workspace/ui/components/card'; import { Input } from '@workspace/ui/components/input'; import { Textarea } from '@workspace/ui/components/textarea'; import { Button } from '@workspace/ui/components/button'; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger, DialogDescription } from '@workspace/ui/components/dialog'; import { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from '@workspace/ui/components/accordion'; import { Badge } from '@workspace/ui/components/badge'; import { Separator } from '@workspace/ui/components/separator'; import Link from 'next/link'; import { revalidatePath } from 'next/cache'; import { db, companies, jobs } from '@workspace/db'; import { Plus, Building2, Briefcase, MapPin, DollarSign, Calendar, ExternalLink } from 'lucide-react'; async function createCompany(formData: FormData) { 'use server'; const name = String(formData.get('name') ?? '').trim(); const email = String(formData.get('email') ?? '').trim(); const link = String(formData.get('link') ?? '').trim(); const description = String(formData.get('description') ?? '').trim() || 'N/A'; const imageURL = String(formData.get('imageURL') ?? '').trim() || 'https://via.placeholder.com/200x200?text=Company'; if (!name) return; await db.insert(companies).values({ name, email, link, description, imageURL }); revalidatePath('/'); } async function createJob(formData: FormData) { 'use server'; const companyId = Number(formData.get('companyId')); const title = String(formData.get('title') ?? '').trim(); const link = String(formData.get('jobLink') ?? '').trim(); const description = String(formData.get('jobDescription') ?? '').trim() || 'N/A'; const location = String(formData.get('location') ?? '').trim() || 'N/A'; const imageURL = String(formData.get('jobImageURL') ?? '').trim() || 'https://via.placeholder.com/100x100?text=Job'; const salary = String(formData.get('salary') ?? '').trim() || 'N/A'; const deadlineRaw = formData.get('deadline'); const applicationDeadline = deadlineRaw ? new Date(String(deadlineRaw)) : new Date(); if (!companyId || !title) return; await db.insert(jobs).values({ companyId, title, link, description, location, imageURL, salary, applicationDeadline, active: true, }); revalidatePath('/'); } async function getDashboardData() { try { // First, let's test a simple query without relations const companiesOnly = await db.select().from(companies); console.log('Companies query successful:', companiesOnly.length); // Now try the relation query const result = await db.query.companies.findMany({ with: { jobs: true } }); console.log('Full query successful:', result.length); return result; } catch (error) { console.error('Database query error:', error); // Fallback to companies only if the relation query fails const companiesOnly = await db.select().from(companies); return companiesOnly.map(company => ({ ...company, jobs: [] })); } } export default async function DashboardPage() { const data = await getDashboardData(); return (
Manage companies and their job listings
Total Companies
{data.length}
Total Jobs
{data.reduce((acc, company) => acc + company.jobs.length, 0)}
Active Jobs
{data.reduce((acc, company) => acc + company.jobs.filter(job => job.active).length, 0)}
Get started by adding your first company
{company.email}
{company.description}
)}This company doesn't have any job listings