11import { cookies } from "next/headers" ;
2- import { redirect } from "next/navigation" ;
32import { getIronSession } from "iron-session" ;
43import buildUri from "./build-uri" ;
4+ import { makeUpstreamClient } from "./apollo" ;
5+ import { BASIC_USER_INFO_QUERY , isAdmin , type BasicUserInfo } from "./user" ;
6+ import { CombinedGraphQLErrors } from "@apollo/client" ;
57
68// Constants for OAuth 2.0 PKCE flow
79export const OAUTH_CONFIG = {
@@ -20,7 +22,6 @@ export interface SessionData {
2022 access_token ?: string ;
2123 token_type ?: string ;
2224 expires_in ?: number ;
23- isLoggedIn : boolean ;
2425}
2526
2627if ( ! process . env . AUTH_SECRET ) {
@@ -83,15 +84,14 @@ export async function setAuthToken(
8384 session . access_token = token ;
8485 session . token_type = tokenType ;
8586 session . expires_in = expiresIn ;
86- session . isLoggedIn = true ;
8787
8888 await session . save ( ) ;
8989}
9090
9191export async function getAuthToken ( ) : Promise < string | null > {
9292 const session = await getSession ( ) ;
9393
94- if ( ! session . isLoggedIn || ! session . access_token ) {
94+ if ( ! session . access_token ) {
9595 return null ;
9696 }
9797
@@ -221,19 +221,49 @@ export async function revokeToken(token: string): Promise<void> {
221221}
222222
223223// Auth validation
224- export async function validateAuth ( ) : Promise < boolean > {
225- const token = await getAuthToken ( ) ;
226- return token !== null ;
224+ export interface AuthStatus {
225+ loggedIn : boolean ;
226+
227+ role ?: "admin" | "user" ;
228+ user ?: BasicUserInfo ;
227229}
228230
229- // Redirect helpers
230- export async function requireAuth ( ) : Promise < never > {
231- redirect ( "/login" ) ;
232- }
231+ export async function getAuthStatus ( ) : Promise < AuthStatus > {
232+ const token = await getAuthToken ( ) ;
233+ if ( ! token ) {
234+ return {
235+ loggedIn : false ,
236+ } ;
237+ }
238+
239+ // get user info
240+ const client = makeUpstreamClient ( { token } ) ;
241+
242+ try {
243+ const { data } = await client . query ( {
244+ query : BASIC_USER_INFO_QUERY ,
245+ } ) ;
246+ if ( ! data ) {
247+ return {
248+ loggedIn : true ,
249+ } ;
250+ }
251+
252+ return {
253+ role : isAdmin ( data ?. me ) ? "admin" : "user" ,
254+ user : data . me ,
255+ loggedIn : true ,
256+ } ;
257+ } catch ( error ) {
258+ if ( CombinedGraphQLErrors . is ( error ) && error . message === 'require authentication' ) {
259+ return {
260+ loggedIn : false ,
261+ } ;
262+ }
233263
234- export async function redirectIfAuthenticated ( ) : Promise < void > {
235- const isAuthenticated = await validateAuth ( ) ;
236- if ( isAuthenticated ) {
237- redirect ( "/" ) ;
264+ console . log ( "Error validating auth:" , error ) ;
265+ return {
266+ loggedIn : false ,
267+ } ;
238268 }
239269}
0 commit comments