Skip to content

Commit

Permalink
add helper function for isAuthRoute
Browse files Browse the repository at this point in the history
  • Loading branch information
chris-nowicki committed Oct 17, 2024
1 parent 8f91a3e commit a0c18ad
Show file tree
Hide file tree
Showing 9 changed files with 79 additions and 22 deletions.
3 changes: 2 additions & 1 deletion api/apiFunctions.interface.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@ export interface IUser {
labels: string[];
}

export interface ICollectionuser {
export interface ICollectionUser {
documentId: string;
// for the custom user collection
id: string;
email: string;
Expand Down
4 changes: 2 additions & 2 deletions api/apiFunctions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import {
ILeague,
IGameWeek,
IUser,
ICollectionuser,
ICollectionUser,
IWeeklyPicks,
INFLTeam,
IRecoveryToken,
Expand Down Expand Up @@ -152,7 +152,7 @@ export async function updateUserEmail({
*/
export async function getCurrentUser(
userId: IUser['id'],
): Promise<ICollectionuser> {
): Promise<ICollectionUser> {
try {
const user = await databases.listDocuments(
appwriteConfig.databaseId,
Expand Down
7 changes: 7 additions & 0 deletions app/(main)/league/all/page.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ jest.mock('@/store/dataStore', () => ({
id: '1234',
email: '[email protected]',
leagues: ['league1'],
labels: [],
},
allLeagues: [
{
Expand Down Expand Up @@ -82,6 +83,7 @@ describe('Leagues Component', () => {
leagues: [],
},
allLeagues: [],
labels: [],
});

render(<Leagues />);
Expand All @@ -105,6 +107,7 @@ describe('Leagues Component', () => {
leagues: [],
},
allLeagues: [],
labels: [],
});

render(<Leagues />);
Expand All @@ -121,6 +124,7 @@ describe('Leagues Component', () => {
email: '[email protected]',
id: '123',
leagues: [],
labels: [],
},
allLeagues: [
{
Expand Down Expand Up @@ -150,6 +154,7 @@ describe('Leagues Component', () => {
email: '[email protected]',
id: '123',
leagues: [],
labels: [],
};

const league = {
Expand Down Expand Up @@ -202,6 +207,7 @@ describe('Leagues Component', () => {
user.id,
user.email,
[...user.leagues, league.leagueId],
user.labels,
);
expect(toast.custom).toHaveBeenCalledWith(
<Alert
Expand All @@ -220,6 +226,7 @@ describe('Leagues Component', () => {
email: '[email protected]',
id: '123',
leagues: [],
labels: [],
};

const league = {
Expand Down
11 changes: 7 additions & 4 deletions app/(main)/league/all/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -100,10 +100,13 @@ const Leagues = (): JSX.Element => {
});

setLeagues([...leagues, league]);
updateUser(user.documentId, user.id, user.email, [
...user.leagues,
league.leagueId,
]);
updateUser(
user.documentId,
user.id,
user.email,
[...user.leagues, league.leagueId],
user.labels,
);
toast.custom(
<Alert
variant={AlertVariants.Success}
Expand Down
2 changes: 1 addition & 1 deletion components/UpdateEmailForm/UpdateEmailForm.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ const UpdateEmailForm = (): JSX.Element => {
/>,
);

updateUser(user.documentId, user.id, email, user.leagues);
updateUser(user.documentId, user.id, email, user.leagues, user.labels);
form.reset({ email: email || '', password: '' });
} catch (error) {
console.error('Email Update Failed', error);
Expand Down
32 changes: 20 additions & 12 deletions context/AuthContextProvider.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,11 @@ import { account } from '@/api/config';
import { useRouter } from 'next/navigation';
import { useDataStore } from '@/store/dataStore';
import type { DataStore } from '@/store/dataStore';
import { IUser } from '@/api/apiFunctions.interface';
import { ICollectionUser, IUser } from '@/api/apiFunctions.interface';
import { getCurrentUser } from '@/api/apiFunctions';
import { loginAccount, logoutHandler } from './AuthHelper';
import { usePathname } from 'next/navigation';
import { isAuthRequiredPath } from '@/utils/utils';

type UserCredentials = {
email: string;
Expand Down Expand Up @@ -85,26 +86,33 @@ export const AuthContextProvider = ({
*/
const getUser = async (): Promise<IUser | undefined> => {
if (!isSessionInLocalStorage()) {
if (
pathname !== '/register' &&
pathname !== '/account/recovery' &&
pathname !== '/recover-password'
) {
if (isAuthRequiredPath(pathname)) {
router.push('/login');
}
return;
}

try {
const user = await account.get();
const userData: IUser = await getCurrentUser(user.$id);
const userData: ICollectionUser = await getCurrentUser(user.$id);

const currentUser: IUser = {
documentId: userData.documentId,
id: userData.id,
email: userData.email,
leagues: userData.leagues,
labels: user.labels,
};

updateUser(
userData.documentId,
userData.id,
userData.email,
userData.leagues,
currentUser.documentId,
currentUser.id,
currentUser.email,
currentUser.leagues,
user.labels,
);
return userData;

return currentUser;
} catch (error) {
resetUser();
setIsSignedIn(false);
Expand Down
4 changes: 2 additions & 2 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

28 changes: 28 additions & 0 deletions utils/utils.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import {
getUserPick,
parseUserPick,
getUserLeagues,
isAuthRequiredPath,
} from './utils';
import { getCurrentLeague, getAllWeeklyPicks } from '@/api/apiFunctions';

Expand Down Expand Up @@ -179,6 +180,33 @@ describe('utils', () => {
});
});
});
describe('isAuthRequiredPath', () => {
it('should return false for non-auth paths', () => {
expect(isAuthRequiredPath('/register')).toBe(false);
expect(isAuthRequiredPath('/account/recovery')).toBe(false);
expect(isAuthRequiredPath('/recover-password')).toBe(false);
});

it('should return true for auth-required paths', () => {
expect(isAuthRequiredPath('/')).toBe(true);
expect(isAuthRequiredPath('/dashboard')).toBe(true);
expect(isAuthRequiredPath('/profile')).toBe(true);
expect(isAuthRequiredPath('/settings')).toBe(true);
});

it('should handle edge cases', () => {
expect(isAuthRequiredPath('')).toBe(true);
expect(isAuthRequiredPath('/register/')).toBe(true); // Trailing slash
expect(isAuthRequiredPath('/REGISTER')).toBe(true); // Case sensitivity
expect(isAuthRequiredPath('/register/subpage')).toBe(true);
});

it('should handle unusual inputs', () => {
expect(isAuthRequiredPath(' /register ')).toBe(true); // Spaces
expect(isAuthRequiredPath('/account/recovery?param=value')).toBe(true); // Query parameters
});
});

xdescribe('getUserLeagues', () => {
it('should return the list of leagues the user is a part of', async () => {
(getCurrentLeague as jest.Mock).mockResolvedValue(mockLeague);
Expand Down
10 changes: 10 additions & 0 deletions utils/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -176,3 +176,13 @@ export const hasTeamBeenPicked = (teamName: string, selectedTeams: string[]): bo
export const getNFLTeamLogo = (NFLTeams: INFLTeam[], teamName: string): string => {
return NFLTeams.find((teams) => teams.teamName === teamName)?.teamLogo as string;
}

/**
* Checks if the current path requires authentication
* @param pathname - The current path
* @returns {boolean} - Whether the current path requires authentication
*/
export const isAuthRequiredPath = (pathname: string): boolean => {
const nonAuthPaths = ['/register', '/account/recovery', '/recover-password'];
return !nonAuthPaths.includes(pathname);
};

0 comments on commit a0c18ad

Please sign in to comment.