UNPKG

studiocms

Version:

Astro Native CMS for AstroDB. Built from the ground up by the Astro community.

62 lines (51 loc) 1.95 kB
import { Session } from 'studiocms:auth/lib'; import { StudioCMSRoutes } from 'studiocms:lib'; import { AuthSessionCookieName } from '../../../consts.js'; import { AllResponse, createEffectAPIRoutes, createJsonResponse, Effect, genLogger, OptionsResponse, } from '../../../effect.js'; export const { POST, OPTIONS, ALL } = createEffectAPIRoutes( { POST: (ctx) => genLogger('studiocms/routes/api/auth/logout/POST')(function* () { const { validateSessionToken, deleteSessionTokenCookie, invalidateSession } = yield* Session; const { cookies, redirect } = ctx; const sessionToken = cookies.get(AuthSessionCookieName)?.value ?? null; if (!sessionToken) return redirect(StudioCMSRoutes.authLinks.loginURL); const { session, user } = yield* validateSessionToken(sessionToken); // If there is no session, redirect to the login page if (session === null) { yield* deleteSessionTokenCookie(ctx); return redirect(StudioCMSRoutes.authLinks.loginURL); } // If there is no user, delete cookie and redirect to the login page if (!user || user === null) { yield* deleteSessionTokenCookie(ctx); return redirect(StudioCMSRoutes.authLinks.loginURL); } // Invalidate the session and delete the session token cookie yield* Effect.all([invalidateSession(session.id), deleteSessionTokenCookie(ctx)]); return redirect(StudioCMSRoutes.mainLinks.baseSiteURL); }), OPTIONS: () => Effect.try(() => OptionsResponse({ allowedMethods: ['GET', 'POST'] })), ALL: () => Effect.try(() => AllResponse()), }, { cors: { methods: ['GET', 'POST', 'OPTIONS'] }, onError: (error) => { console.error('API Error:', error); return createJsonResponse({ error: 'Internal Server Error' }, { status: 500 }); }, } ); /** * Alias for POST method to allow GET requests to logout. * This is useful for clients that may not support POST requests. */ export const GET = POST;