Skip to content

Commit

Permalink
feat: add path to parse data object in getMe route
Browse files Browse the repository at this point in the history
  • Loading branch information
LorexIQ committed Dec 7, 2023
1 parent 6e8453c commit abd9542
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 38 deletions.
30 changes: 15 additions & 15 deletions src/runtime/composables/useLocalAuth.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,14 @@ import { fetch, getContext } from '../helpers';
import useLocalAuthState from './useLocalAuthState';

async function signIn<T extends UseLocalAuthResponse = {}>(data: UseLocalAuthData, config?: UseLocalAuthConfig): Promise<T> {
const { options, state: { saveSession } } = await getContext();
const { options, state: { saveMeta } } = await getContext();
const router = useRouter();
const endpointConfig = options.endpoints.signIn!;

try {
const authData = await fetch<T>(endpointConfig, { body: data });

saveSession(authData);
saveMeta(authData);
await getMe();
await router.push(config?.redirectTo ?? options.pages.defaultRedirect!);

Expand All @@ -31,7 +31,7 @@ async function signIn<T extends UseLocalAuthResponse = {}>(data: UseLocalAuthDat
}
}
async function signUp<T extends UseLocalAuthResponse = {}>(data: UseLocalAuthData, config?: UseLocalAuthConfig): Promise<T> {
const { options, state: { saveSession } } = await getContext();
const { options, state: { saveMeta } } = await getContext();
const router = useRouter();
const endpointConfig = options.endpoints.signUp!;

Expand All @@ -40,7 +40,7 @@ async function signUp<T extends UseLocalAuthResponse = {}>(data: UseLocalAuthDat
try {
const signUpData = await fetch<T>(endpointConfig, { body: data });

saveSession(signUpData);
saveMeta(signUpData);
await getMe();
await router.push(config?.redirectTo ?? options.pages.defaultRedirect!);

Expand All @@ -51,7 +51,7 @@ async function signUp<T extends UseLocalAuthResponse = {}>(data: UseLocalAuthDat
}
}
async function signOut<T extends UseLocalAuthResponse = {}>(config?: UseLocalAuthConfig): Promise<T> {
const { options, state: { clearSession } } = await getContext();
const { options, state: { clearMeta } } = await getContext();
const router = useRouter();
const endpointConfig = options.endpoints.signOut!;

Expand All @@ -61,17 +61,17 @@ async function signOut<T extends UseLocalAuthResponse = {}>(config?: UseLocalAut
} catch (e: any) {
throw new LocalAuthError(`signOut > [${e.statusCode}] > ${JSON.stringify(e.response._data)}`);
} finally {
clearSession();
clearMeta();
await router.push(config?.redirectTo ?? options.pages.auth!);
}
} else {
clearSession();
clearMeta();
await router.push(config?.redirectTo ?? options.pages.auth!);
return {} as T;
}
}
async function getMe<T extends UseLocalAuthResponse = {}>(): Promise<T> {
const { options, state: { token, data, meta } } = await getContext();
const { options, state: { token, saveSession } } = await getContext();
const endpointConfig = options.endpoints.getMe!;

if (!token.value) throw new LocalAuthError('getMe > token is null. SignIn first');
Expand All @@ -83,8 +83,7 @@ async function getMe<T extends UseLocalAuthResponse = {}>(): Promise<T> {
try {
const meData = await fetch<T>(endpointConfig, { withToken: true });

Object.assign(data.value, meData);
meta.value.status = 'authorized';
saveSession(meData);

return meData;
} catch (e: any) {
Expand All @@ -97,7 +96,7 @@ async function getMe<T extends UseLocalAuthResponse = {}>(): Promise<T> {
}
}
async function refreshToken<T extends UseLocalAuthResponse = {}>(): Promise<T> {
const { options, state: { meta, saveSession } } = await getContext();
const { options, state: { meta, saveMeta } } = await getContext();
const endpointConfig = options.endpoints.refreshToken!;
const refreshConfig = options.refreshToken;

Expand All @@ -111,7 +110,7 @@ async function refreshToken<T extends UseLocalAuthResponse = {}>(): Promise<T> {
}
});

saveSession({
saveMeta({
[`${refreshConfig.path}`]: meta.value.refreshToken,
...refreshData
}, true);
Expand Down Expand Up @@ -143,7 +142,7 @@ async function refreshTokenWithCheck<T extends UseLocalAuthResponse = {}>(): Pro
}
}
async function checkAndSaveQueryAuth(): Promise<void> {
const { options, state: { softSaveSession } } = await getContext();
const { options, state: { softSaveMeta } } = await getContext();
const route = useRoute();
const query = route.query;

Expand All @@ -156,16 +155,17 @@ async function checkAndSaveQueryAuth(): Promise<void> {
const token = query[isTokenReading] ?? null;
let refreshToken = query[isRefreshTokenReading!] ?? null;

if (token) softSaveSession(token as string, refreshToken as string | null);
if (token) softSaveMeta(token as string, refreshToken as string | null);
} catch (e: any) {}
}

export function useLocalAuth(): UseLocalAuthReturn {
const { data, meta, token } = useLocalAuthState()
const { data, meta, token, origin } = useLocalAuthState()

const getters: UseLocalAuthReturnData = {
data: computed(() => data.value),
meta,
origin,
token
};

Expand Down
70 changes: 47 additions & 23 deletions src/runtime/composables/useLocalAuthState.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,53 +43,53 @@ export default function () {
const token = computed(() => sessionMetaInfo.value.token ? `${options.token.type} ${sessionMetaInfo.value.token}`.trim() : null);
const origin = trimWithSymbol(options.origin, '/');

function softClearSession(): void {
function parseValueWithPath<T = string>(data: UseLocalAuthResponse, path: string): T | undefined {
return path
.split('/')
.reduce((accum, current) => {
if (!accum) return undefined;
accum = accum[current];
return accum;
}, data as UseLocalAuthResponse | undefined) as T | undefined;
}

function softClearMeta(): void {
sessionMetaInfo.value = {
token: null,
refreshToken: null,
exp: null,
status: sessionMetaInfo.value.status
};
}
function clearSession(): void {
function clearMeta(): void {
sessionMetaInfo.value = {
token: null,
refreshToken: null,
exp: null,
status: 'unauthorized'
};

for (const key of Object.keys(sessionData.value)) {
delete sessionData.value[key];
}
}
function softSaveSession(token: string, refreshToken: string | null): void {
clearSession();
}
function softSaveMeta(token: string, refreshToken: string | null): void {
clearMeta();

sessionMetaInfo.value.token = token;
sessionMetaInfo.value.refreshToken = refreshToken;
sessionMetaInfo.value.exp = `${Math.round(Date.now() / 1000) + (options.token.lifetime as number)}`;
}
function saveSession(data: UseLocalAuthResponse, metaUpdate: boolean = false): void {
function parseValueWithPath(data: UseLocalAuthResponse, path: string): string | undefined {
return path
.split('/')
.reduce((accum, current) => {
if (!accum) return undefined;
accum = accum[current];
return accum;
}, data as UseLocalAuthResponse | undefined) as string | undefined;
}

metaUpdate ? softClearSession() : clearSession();
let parsedToken, parsedRefreshToken, parsedLifetime;
function saveMeta(data: UseLocalAuthResponse, metaUpdate: boolean = false): void {
metaUpdate ? softClearMeta() : clearMeta();
let parsedToken: string | undefined,
parsedRefreshToken: string | undefined,
parsedLifetime: string | undefined;

parsedToken = parseValueWithPath(data, options.token.path);
if (!parsedToken) throw new Error('error parse auth token. Check current token/path');

if (options.refreshToken.enabled) {
parsedRefreshToken = parseValueWithPath(data, options.refreshToken.path!);
if (!parsedToken) throw new Error('error parse refresh token. Check current token/refreshPath');
if (!parsedRefreshToken) throw new Error('error parse refresh token. Check current token/refreshPath');
}

const lifetime = options.token.lifetime as string | number;
Expand All @@ -104,6 +104,27 @@ export default function () {
sessionMetaInfo.value.refreshToken = parsedRefreshToken as string;
sessionMetaInfo.value.exp = `${parsedLifetime}`;
}
function clearSession(): void {
sessionMetaInfo.value.status = 'unauthorized';

for (const key of Object.keys(sessionData.value)) {
delete sessionData.value[key];
}
}
function saveSession(data: UseLocalAuthCredentials): void {
clearSession();
let parsedData: UseLocalAuthCredentials | undefined;

if (options.sessions.path) {
parsedData = parseValueWithPath(data, options.sessions.path);
if (!parsedData) throw new Error('error parse session data. Check current session/path');
} else {
parsedData = data;
}

Object.assign(sessionData.value, parsedData);
sessionMetaInfo.value.status = 'authorized';
}

const getters = {
data: sessionData,
Expand All @@ -112,9 +133,12 @@ export default function () {
origin
};
const actions = {
clearSession,
clearMeta,
softClearMeta,
saveMeta,
softSaveMeta,
saveSession,
softSaveSession
clearSession
};

return {
Expand Down

0 comments on commit abd9542

Please sign in to comment.