Skip to content

Commit

Permalink
new user group added (#21)
Browse files Browse the repository at this point in the history
  • Loading branch information
burtonjong authored Jul 3, 2024
1 parent 98d8b57 commit 2b2f13f
Show file tree
Hide file tree
Showing 5 changed files with 87 additions and 30 deletions.
2 changes: 1 addition & 1 deletion amplify/auth/resource.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ export const auth = defineAuth({
loginWith: {
email: true,
},
groups: ["AdminUser", "GuestUser"],
groups: ["AdminUser", "GuestUser", "FirstTimeUser"],
triggers: {
postConfirmation,
preSignUp,
Expand Down
3 changes: 2 additions & 1 deletion amplify/data/resource.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,14 @@ const schema = a
email: a.string().required(),
firstName: a.string().required(),
lastName: a.string().required(),
role: a.string().default("GuestUser"),
role: a.string().default("FirstTimeUser"),
totalEarnings: a.float(),
sessionsAttended: a.hasMany("SessionsAttended", "sessionAttendedId"),
})
.authorization((allow) => [
allow.group("GuestUser").to(["read"]),
allow.group("AdminUser").to(["read", "update", "delete", "create"]),
allow.group("FirstTimeUser").to(["read"]),
]),
SessionsAttended: a
.model({
Expand Down
19 changes: 17 additions & 2 deletions src/components/Header.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,17 @@ import Link from "next/link";
import { useRouter } from "next/navigation";
import { useEffect, useState } from "react";

import { useUser } from "./contexts/UserContext";

export default function Header({
isSignedIn,
}: {
isSignedIn: boolean | undefined;
}) {
const [authCheck, setAuthCheck] = useState(isSignedIn);

const user = useUser().currentUser;

const router = useRouter();
useEffect(() => {
const hubListenerCancel = Hub.listen("auth", (data) => {
Expand Down Expand Up @@ -49,15 +53,26 @@ export default function Header({
{ name: "Spreadsheet", href: "/spreadsheet", loggedIn: true },
{ name: "Home", href: "/home", loggedIn: true },
{ name: "Planner", href: "/planner", loggedIn: true },
{ name: "Admin Panel", href: "/admin", loggedIn: true },
];

const routes = defaultRoutes.filter(
const loggedInRoutes = defaultRoutes.filter(
(route) => route.loggedIn === authCheck || route.loggedIn === undefined,
);

let renderedRoutes = loggedInRoutes;

if (user.role !== "AdminUser") {
renderedRoutes = loggedInRoutes.filter(
(route) => route.name !== "Admin Panel",
);
}

console.log(user);

return (
<div className="flex h-24 flex-row items-center justify-evenly bg-slate-500">
{routes.map((route) => (
{renderedRoutes.map((route) => (
<Link key={route.name} href={route.href}>
{route.name}
</Link>
Expand Down
92 changes: 66 additions & 26 deletions src/components/contexts/UserContext.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import { generateClient } from "aws-amplify/api";
import { fetchAuthSession, signOut } from "aws-amplify/auth";
import { Hub } from "aws-amplify/utils";
import { useContext } from "react";
import { type ReactNode, createContext, useEffect, useState } from "react";

Expand All @@ -14,6 +15,7 @@ interface Props {
export enum UserType {
AdminUser = "AdminUser",
GuestUser = "GuestUser",
FirstTimeUser = "FirstTimeUser",
}

export interface IUser {
Expand All @@ -39,18 +41,16 @@ export const UserContext = createContext<IUserReturn>({} as IUserReturn);
export function UserContextProvider({ children }: Props) {
const [currentUser, setCurrentUser] = useState<IUser>({
username: "",
type: UserType.GuestUser,
type: UserType.FirstTimeUser,
populated: false,
});

// TO DO load other user info from table
useEffect(() => {
async function currentAuthenticatedUser() {
try {
const user = await fetchAuthSession();
console.log(user);
if (!user.userSub) {
throw new Error("No user");
}

if (
(
Expand All @@ -61,37 +61,77 @@ export function UserContextProvider({ children }: Props) {
signOut();
console.error("User not in group");
}
if (!user.userSub) {
throw new Error("No user");
}
console.log(user.userSub);

const response = await client.models.User.get({
id: user.tokens?.accessToken.payload.username as string,
});
try {
const response = await client.models.User.get({
id: user.userSub as string,
});

if (response.data === null) {
// Logout User record does not exist in DB
signOut();
console.error("User not in DB");
if (response.data === null) {
// Logout User record does not exist in DB
signOut();
console.error("User not in DB");
}

setCurrentUser({
username: user.tokens?.accessToken.payload.username as string,
type: (
user.tokens?.idToken?.payload["cognito:groups"] as UserType[]
)?.[0],
populated: true,
email: response.data?.email ?? "",
firstName: response.data?.firstName ?? "",
lastName: response.data?.lastName ?? "",
role: response.data?.role ?? "",
});
} catch (error) {
console.error(error);
}

setCurrentUser({
username: user.tokens?.accessToken.payload.username as string,
type: (
user.tokens?.idToken?.payload["cognito:groups"] as UserType[]
)?.[0],
populated: true,
email: response.data?.email ?? "",
firstName: response.data?.firstName ?? "",
lastName: response.data?.lastName ?? "",
role: response.data?.role ?? "",
});
} catch (err) {
if (String(err).includes("No user")) {
// Set user information based on the authentication session...
} catch (error) {
if (String(error).includes("No user")) {
console.info("Not Logged in");
setCurrentUser({
username: "",
type: UserType.FirstTimeUser,
populated: true,
role: UserType.FirstTimeUser,
});
} else {
console.error(err);
console.error(error);
}
}
}
void currentAuthenticatedUser();

currentAuthenticatedUser();

const hubListenerCancel = Hub.listen("auth", (data) => {
switch (data.payload.event) {
case "signedIn":
currentAuthenticatedUser();
console.log("Signed In");
break;
case "signedOut":
setCurrentUser({
username: "",
type: UserType.FirstTimeUser,
populated: true,
role: UserType.FirstTimeUser,
});
console.log("Signed Out");
break;
}
});

// Clean up the listener
return () => {
hubListenerCancel();
};
}, []);
return (
<UserContext.Provider value={{ currentUser }}>
Expand Down
1 change: 1 addition & 0 deletions src/components/contexts/amplifyUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,5 +22,6 @@ export async function isAuthenticated() {
return !!currentUser;
} catch (error) {
console.error(error);
return false;
}
}

0 comments on commit 2b2f13f

Please sign in to comment.