108 lines
2.6 KiB
TypeScript
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 }
|
|
)
|
|
}
|
|
}
|