diff --git a/apps/blog-next/app/api/forgot-password/route.ts b/apps/blog-next/app/api/forgot-password/route.ts index 001e7d7..a81fed6 100644 --- a/apps/blog-next/app/api/forgot-password/route.ts +++ b/apps/blog-next/app/api/forgot-password/route.ts @@ -1,5 +1,5 @@ import { requestPasswordReset } from '@holo-js/auth' -import { sanitizeFlashedInput, validate } from '@holo-js/forms' +import { validate } from '@holo-js/forms' import { forgotPasswordForm } from '@/lib/schemas/auth' @@ -14,15 +14,12 @@ export async function POST(request: Request) { const { error } = await requestPasswordReset(submission.data) if (error) { - return Response.json({ - ok: false as const, + const failure = submission.fail({ status: error.status, - valid: false as const, - values: sanitizeFlashedInput(submission.values), errors: error.fields, - }, { - status: error.status, }) + + return Response.json(failure, { status: failure.status }) } return Response.json(submission.success({ diff --git a/apps/blog-next/app/api/login/route.ts b/apps/blog-next/app/api/login/route.ts index 85f8ca8..019e907 100644 --- a/apps/blog-next/app/api/login/route.ts +++ b/apps/blog-next/app/api/login/route.ts @@ -1,5 +1,5 @@ import { login } from '@holo-js/auth' -import { sanitizeFlashedInput, validate } from '@holo-js/forms' +import { validate } from '@holo-js/forms' import { loginForm } from '@/lib/schemas/auth' @@ -16,20 +16,12 @@ export async function POST(request: Request) { const { data: session, error } = await login(submission.data) if (error) { - return Response.json({ - ok: false as const, + const failure = submission.fail({ status: error.status, - valid: false as const, - values: sanitizeFlashedInput(submission.values), errors: error.fields, - }, { - status: error.status, }) - } - const headers = new Headers() - for (const cookie of session.cookies) { - headers.append('set-cookie', cookie) + return Response.json(failure, { status: failure.status }) } return Response.json(submission.success({ @@ -40,7 +32,5 @@ export async function POST(request: Request) { ? session.emailVerificationRoute ?? '/verify-email' : '/admin', user: session.user, - }), { - headers, - }) + })) } diff --git a/apps/blog-next/app/api/logout/route.ts b/apps/blog-next/app/api/logout/route.ts index 3be87d2..3b94ae4 100644 --- a/apps/blog-next/app/api/logout/route.ts +++ b/apps/blog-next/app/api/logout/route.ts @@ -1,18 +1,12 @@ import { logout, user } from '@holo-js/auth' export async function POST() { - const signedOut = await logout() - const headers = new Headers() - for (const cookie of signedOut.cookies) { - headers.append('set-cookie', cookie) - } + await logout() return Response.json({ ok: true, authenticated: false, message: 'Signed out successfully.', user: await user(), - }, { - headers, }) } diff --git a/apps/blog-next/app/api/register/route.ts b/apps/blog-next/app/api/register/route.ts index f7c109c..01e27db 100644 --- a/apps/blog-next/app/api/register/route.ts +++ b/apps/blog-next/app/api/register/route.ts @@ -1,5 +1,5 @@ import { loginUsing, register } from '@holo-js/auth' -import { sanitizeFlashedInput, validate } from '@holo-js/forms' +import { validate } from '@holo-js/forms' import { registerForm } from '@/lib/schemas/auth' @@ -16,23 +16,15 @@ export async function POST(request: Request) { const { data: created, error } = await register(submission.data) if (error) { - return Response.json({ - ok: false as const, + const failure = submission.fail({ status: error.status, - valid: false as const, - values: sanitizeFlashedInput(submission.values), errors: error.fields, - }, { - status: error.status, }) - } - const session = await loginUsing(created) - const headers = new Headers() - for (const cookie of session.cookies) { - headers.append('set-cookie', cookie) + return Response.json(failure, { status: failure.status }) } + const session = await loginUsing(created) return Response.json(submission.success({ message: session.emailVerificationRequired ? 'Account created. Check your inbox to verify your email address.' @@ -43,6 +35,5 @@ export async function POST(request: Request) { user: session.user, }, 201), { status: 201, - headers, }) } diff --git a/apps/blog-next/app/api/reset-password/route.ts b/apps/blog-next/app/api/reset-password/route.ts index 3cd5e3a..8014429 100644 --- a/apps/blog-next/app/api/reset-password/route.ts +++ b/apps/blog-next/app/api/reset-password/route.ts @@ -1,5 +1,5 @@ import { resetPassword } from '@holo-js/auth' -import { sanitizeFlashedInput, validate } from '@holo-js/forms' +import { validate } from '@holo-js/forms' import { resetPasswordForm } from '@/lib/schemas/auth' @@ -14,15 +14,12 @@ export async function POST(request: Request) { const { error } = await resetPassword(submission.data) if (error) { - return Response.json({ - ok: false as const, + const failure = submission.fail({ status: error.status, - valid: false as const, - values: sanitizeFlashedInput(submission.values), errors: error.fields, - }, { - status: error.status, }) + + return Response.json(failure, { status: failure.status }) } return Response.json(submission.success({ diff --git a/apps/blog-next/app/api/verify-email/route.ts b/apps/blog-next/app/api/verify-email/route.ts index 341a604..a0c552a 100644 --- a/apps/blog-next/app/api/verify-email/route.ts +++ b/apps/blog-next/app/api/verify-email/route.ts @@ -1,5 +1,5 @@ import { check, verification } from '@holo-js/auth' -import { sanitizeFlashedInput, validate } from '@holo-js/forms' +import { validate } from '@holo-js/forms' import { verifyEmailForm } from '@/lib/schemas/auth' @@ -15,15 +15,12 @@ export async function POST(request: Request) { const wasAuthenticated = await check() const { error } = await verification.consume(submission.data.token) if (error) { - return Response.json({ - ok: false as const, + const failure = submission.fail({ status: error.status, - valid: false as const, - values: sanitizeFlashedInput(submission.values), errors: error.fields, - }, { - status: error.status, }) + + return Response.json(failure, { status: failure.status }) } return Response.json(submission.success({ diff --git a/apps/blog-next/app/auth/github/callback/route.ts b/apps/blog-next/app/auth/github/callback/route.ts new file mode 100644 index 0000000..b3b3e24 --- /dev/null +++ b/apps/blog-next/app/auth/github/callback/route.ts @@ -0,0 +1,21 @@ +import { redirect } from 'next/navigation' +import auth from '@holo-js/auth' +import { callback } from '@holo-js/auth-social' + +export function GET(request: Request): Promise { + return handleCallback(request) +} + +async function handleCallback(request: Request): Promise { + const result = await callback('github', request) + if (!result.ok) { + return Response.json({ + message: result.message, + }, { + status: result.status, + }) + } + + await auth.guard(result.guard).loginUsing(result.user) + redirect('/admin') +} diff --git a/apps/blog-next/app/auth/github/route.ts b/apps/blog-next/app/auth/github/route.ts new file mode 100644 index 0000000..0650a4c --- /dev/null +++ b/apps/blog-next/app/auth/github/route.ts @@ -0,0 +1,5 @@ +import { redirect } from '@holo-js/auth-social' + +export function GET(request: Request): Promise { + return redirect('github', request) +} diff --git a/apps/blog-next/app/auth/google/callback/route.ts b/apps/blog-next/app/auth/google/callback/route.ts new file mode 100644 index 0000000..827b3d8 --- /dev/null +++ b/apps/blog-next/app/auth/google/callback/route.ts @@ -0,0 +1,21 @@ +import { redirect } from 'next/navigation' +import auth from '@holo-js/auth' +import { callback } from '@holo-js/auth-social' + +export function GET(request: Request): Promise { + return handleCallback(request) +} + +async function handleCallback(request: Request): Promise { + const result = await callback('google', request) + if (!result.ok) { + return Response.json({ + message: result.message, + }, { + status: result.status, + }) + } + + await auth.guard(result.guard).loginUsing(result.user) + redirect('/admin') +} diff --git a/apps/blog-next/app/auth/google/route.ts b/apps/blog-next/app/auth/google/route.ts new file mode 100644 index 0000000..5c1baa4 --- /dev/null +++ b/apps/blog-next/app/auth/google/route.ts @@ -0,0 +1,5 @@ +import { redirect } from '@holo-js/auth-social' + +export function GET(request: Request): Promise { + return redirect('google', request) +} diff --git a/apps/blog-next/app/login/page.tsx b/apps/blog-next/app/login/page.tsx index 36914d2..2c39684 100644 --- a/apps/blog-next/app/login/page.tsx +++ b/apps/blog-next/app/login/page.tsx @@ -44,6 +44,11 @@ export default function LoginPage() {

Use your email address and password to access the admin area.

+ +
{ event.preventDefault(); form.submit() }} style={{ display: 'grid', gap: '0.9rem' }}>