aethex.live/app/api/auth/create-channel/route.ts

108 lines
2.6 KiB
TypeScript

import { createClient } from '@/lib/supabase/server'
import { PrismaClient } from '@prisma/client'
import { NextRequest, NextResponse } from 'next/server'
const prisma = new PrismaClient()
export async function POST(req: NextRequest) {
const supabase = await createClient()
const { data: { user } } = await supabase.auth.getUser()
if (!user) {
return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })
}
try {
const body = await req.json()
const { name, slug, bio, category } = body
// Validate input
if (!name || !slug) {
return NextResponse.json(
{ error: 'Channel name and slug are required' },
{ status: 400 }
)
}
// Check if slug is already taken
const existingChannel = await prisma.channel.findUnique({
where: { slug },
})
if (existingChannel) {
return NextResponse.json(
{ error: 'This channel URL is already taken' },
{ status: 400 }
)
}
// Find or create user by Supabase ID
let dbUser = await prisma.user.findUnique({
where: { supabaseId: user.id },
})
if (!dbUser) {
// Create user in database
dbUser = await prisma.user.create({
data: {
supabaseId: user.id,
email: user.email!,
username: user.email?.split('@')[0] || `user_${user.id.slice(0, 8)}`,
displayName: user.user_metadata?.full_name || user.email?.split('@')[0],
avatarUrl: user.user_metadata?.avatar_url,
},
})
}
// Create channel
const channel = await prisma.channel.create({
data: {
name,
slug,
description: bio,
category: category || 'other',
userId: dbUser.id,
},
})
// Mark user as creator
await prisma.user.update({
where: { id: dbUser.id },
data: { isCreator: true },
})
// Create initial channel stats
await prisma.channelStats.create({
data: {
channelId: channel.id,
},
})
// Create user preferences if not exists
const preferences = await prisma.userPreferences.findUnique({
where: { userId: dbUser.id },
})
if (!preferences) {
await prisma.userPreferences.create({
data: {
userId: dbUser.id,
},
})
}
return NextResponse.json(
{
channel,
message: 'Channel created successfully',
},
{ status: 201 }
)
} catch (error) {
console.error('Error creating channel:', error)
return NextResponse.json(
{ error: 'Failed to create channel' },
{ status: 500 }
)
}
}