63 lines
2.0 KiB
TypeScript
63 lines
2.0 KiB
TypeScript
import { redirect } from 'next/navigation';
|
|
import type { NextRequest } from 'next/server';
|
|
|
|
import { createAuthCallbackService, getErrorURLParameters } from '@kit/supabase/auth';
|
|
import { getSupabaseServerClient } from '@kit/supabase/server-client';
|
|
|
|
import { pathsConfig } from '@kit/shared/config';
|
|
import { createAccountsApi } from '@/packages/features/accounts/src/server/api';
|
|
|
|
const ERROR_PATH = '/auth/callback/error';
|
|
|
|
const redirectOnError = (searchParams?: string) => {
|
|
return redirect(`${ERROR_PATH}${searchParams ? `?${searchParams}` : ''}`);
|
|
}
|
|
|
|
export async function GET(request: NextRequest) {
|
|
const { searchParams } = new URL(request.url);
|
|
|
|
const error = searchParams.get('error');
|
|
if (error) {
|
|
const { searchParams } = getErrorURLParameters({ error });
|
|
return redirectOnError(searchParams);
|
|
}
|
|
|
|
const authCode = searchParams.get('code');
|
|
if (!authCode) {
|
|
return redirectOnError();
|
|
}
|
|
|
|
let redirectPath = searchParams.get('next') || pathsConfig.app.home;
|
|
// if we have an invite token, we redirect to the join team page
|
|
// instead of the default next url. This is because the user is trying
|
|
// to join a team and we want to make sure they are redirected to the
|
|
// correct page.
|
|
const inviteToken = searchParams.get('invite_token');
|
|
if (inviteToken) {
|
|
const urlParams = new URLSearchParams({
|
|
invite_token: inviteToken,
|
|
email: searchParams.get('email') ?? '',
|
|
});
|
|
|
|
redirectPath = `${pathsConfig.app.joinTeam}?${urlParams.toString()}`;
|
|
}
|
|
|
|
const service = createAuthCallbackService(getSupabaseServerClient());
|
|
const oauthResult = await service.exchangeCodeForSession(authCode);
|
|
if (!("isSuccess" in oauthResult)) {
|
|
return redirectOnError(oauthResult.searchParams);
|
|
}
|
|
|
|
const api = createAccountsApi(getSupabaseServerClient());
|
|
|
|
const account = await api.getPersonalAccountByUserId(
|
|
oauthResult.user.id,
|
|
);
|
|
|
|
if (!account.email || !account.name || !account.last_name) {
|
|
return redirect(pathsConfig.auth.updateAccount);
|
|
}
|
|
|
|
return redirect(redirectPath);
|
|
}
|