116 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			116 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import { NextRequest, NextResponse } from 'next/server';
 | 
						|
import { db, users } from '@/lib/db';
 | 
						|
import { generateMemorableToken, isValidToken } from '@/lib/auth/tokens';
 | 
						|
import { setTokenCookie, getTokenCookie } from '@/lib/auth/cookies';
 | 
						|
import { eq } from 'drizzle-orm';
 | 
						|
 | 
						|
export async function GET() {
 | 
						|
  try {
 | 
						|
    // Check if user already has a token
 | 
						|
    const existingToken = await getTokenCookie();
 | 
						|
 | 
						|
    if (existingToken) {
 | 
						|
      // Verify token exists in database
 | 
						|
      const userRows = await db.select().from(users).where(eq(users.token, existingToken));
 | 
						|
 | 
						|
      if (userRows.length > 0) {
 | 
						|
        const user = userRows[0];
 | 
						|
        return NextResponse.json({
 | 
						|
          authenticated: true,
 | 
						|
          token: existingToken,
 | 
						|
          userId: user.id,
 | 
						|
        });
 | 
						|
      }
 | 
						|
    }
 | 
						|
 | 
						|
    return NextResponse.json({ authenticated: false });
 | 
						|
  } catch (error) {
 | 
						|
    console.error('Auth check error:', error);
 | 
						|
    return NextResponse.json({ authenticated: false }, { status: 500 });
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
export async function POST(request: NextRequest) {
 | 
						|
  try {
 | 
						|
    const body = (await request.json()) as { action: string; token?: string };
 | 
						|
    const { action, token } = body;
 | 
						|
 | 
						|
    if (action === 'create') {
 | 
						|
      // Generate new token and create user
 | 
						|
      const newToken = generateMemorableToken();
 | 
						|
 | 
						|
      const newUserRows = await db
 | 
						|
        .insert(users)
 | 
						|
        .values({
 | 
						|
          token: newToken,
 | 
						|
        })
 | 
						|
        .returning();
 | 
						|
 | 
						|
      if (newUserRows.length === 0) {
 | 
						|
        throw new Error('Failed to create user');
 | 
						|
      }
 | 
						|
 | 
						|
      const newUser = newUserRows[0];
 | 
						|
      await setTokenCookie(newToken);
 | 
						|
 | 
						|
      return NextResponse.json({
 | 
						|
        success: true,
 | 
						|
        token: newToken,
 | 
						|
        userId: newUser.id,
 | 
						|
      });
 | 
						|
    }
 | 
						|
 | 
						|
    if (action === 'login' && token) {
 | 
						|
      // Validate token format
 | 
						|
      if (!isValidToken(token)) {
 | 
						|
        return NextResponse.json(
 | 
						|
          {
 | 
						|
            success: false,
 | 
						|
            error: 'Invalid token format',
 | 
						|
          },
 | 
						|
          { status: 400 },
 | 
						|
        );
 | 
						|
      }
 | 
						|
 | 
						|
      // Check if token exists
 | 
						|
      const userRows = await db.select().from(users).where(eq(users.token, token));
 | 
						|
 | 
						|
      if (userRows.length === 0) {
 | 
						|
        return NextResponse.json(
 | 
						|
          {
 | 
						|
            success: false,
 | 
						|
            error: 'Token not found',
 | 
						|
          },
 | 
						|
          { status: 404 },
 | 
						|
        );
 | 
						|
      }
 | 
						|
 | 
						|
      const user = userRows[0];
 | 
						|
      await setTokenCookie(token);
 | 
						|
 | 
						|
      return NextResponse.json({
 | 
						|
        success: true,
 | 
						|
        token,
 | 
						|
        userId: user.id,
 | 
						|
      });
 | 
						|
    }
 | 
						|
 | 
						|
    return NextResponse.json(
 | 
						|
      {
 | 
						|
        success: false,
 | 
						|
        error: 'Invalid action',
 | 
						|
      },
 | 
						|
      { status: 400 },
 | 
						|
    );
 | 
						|
  } catch (error) {
 | 
						|
    console.error('Auth error:', error);
 | 
						|
    return NextResponse.json(
 | 
						|
      {
 | 
						|
        success: false,
 | 
						|
        error: 'Internal server error',
 | 
						|
      },
 | 
						|
      { status: 500 },
 | 
						|
    );
 | 
						|
  }
 | 
						|
}
 |