Skip to content

Commit a7f0a6c

Browse files
committed
Add functionality to match button
1 parent bb68806 commit a7f0a6c

File tree

9 files changed

+69
-19
lines changed

9 files changed

+69
-19
lines changed

peerprep/api/gateway.ts

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import { cookies } from "next/headers";
2-
import { LoginResponse, Question, SigninResponse, StatusBody } from "./structs";
2+
import { LoginResponse, Question, UserServiceResponse, StatusBody } from "./structs";
33
import DOMPurify from "isomorphic-dompurify";
44

55
export function generateAuthHeaders() {
66
return {
7-
Authorization: `Bearer ${cookies().get("session")}`,
8-
};
7+
"Authorization": `Bearer ${cookies().get("session")?.value}`,
8+
};;
99
}
1010

1111
export function generateJSONHeaders() {
@@ -75,7 +75,7 @@ export async function postSignupUser(validatedFields: {
7575
username: string;
7676
email: string;
7777
password: string;
78-
}): Promise<SigninResponse | StatusBody> {
78+
}): Promise<UserServiceResponse | StatusBody> {
7979
try {
8080
console.log(JSON.stringify(validatedFields));
8181
const res = await fetch(`${process.env.NEXT_PUBLIC_USER_SERVICE}/users`, {
@@ -97,3 +97,23 @@ export async function postSignupUser(validatedFields: {
9797
return { error: err.message, status: 400 };
9898
}
9999
}
100+
101+
export async function verifyUser(): Promise<UserServiceResponse | StatusBody> {
102+
try {
103+
const res = await fetch(
104+
`${process.env.NEXT_PUBLIC_USER_SERVICE}/auth/verify-token`,
105+
{
106+
method: "GET",
107+
headers: generateAuthHeaders(),
108+
}
109+
);
110+
const json = await res.json();
111+
112+
if (!res.ok) {
113+
return { error: json.message, status: res.status };
114+
}
115+
return json;
116+
} catch (err: any) {
117+
return { error: err.message, status: 400 };
118+
}
119+
}

peerprep/api/structs.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ export interface LoginResponse {
4343
data: UserDataAccessToken;
4444
}
4545

46-
export interface SigninResponse {
46+
export interface UserServiceResponse {
4747
message: string;
4848
data: UserData;
4949
}

peerprep/app/actions/server_actions.ts

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,16 @@
11
"use server";
2-
import { getSessionLogin, postSignupUser } from "@/api/gateway";
2+
import { getSessionLogin, postSignupUser, verifyUser } from "@/api/gateway";
33
// defines the server-sided login action.
44
import {
55
SignupFormSchema,
66
LoginFormSchema,
77
FormState,
88
isError,
9+
UserServiceResponse,
910
} from "@/api/structs";
10-
import { createSession } from "@/app/actions/session";
11+
import { createSession, expireSession } from "@/app/actions/session";
1112
import { redirect } from "next/navigation";
13+
import { cookies } from "next/headers";
1214

1315
// credit - taken from Next.JS Auth tutorial
1416
export async function signup(state: FormState, formData: FormData) {
@@ -59,3 +61,18 @@ export async function login(state: FormState, formData: FormData) {
5961
console.log(json.error);
6062
}
6163
}
64+
65+
export async function hydrateUid(): Promise<undefined|string> {
66+
if (!cookies().has("session")) {
67+
console.log("No session found - triggering switch back to login page.");
68+
redirect("/auth/login");
69+
}
70+
const json = await verifyUser();
71+
if (isError(json)) {
72+
console.log("Failed to fetch user ID.");
73+
console.log(`Error ${json.status}: ${json.error}`);
74+
redirect("/api/internal/auth/expire");
75+
}
76+
77+
return json.data.id;
78+
}

peerprep/app/actions/session.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,7 @@ export async function createSession(accessToken: string) {
1111
path: "/",
1212
});
1313
}
14+
15+
export async function expireSession() {
16+
cookies().delete("session");
17+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { expireSession } from "@/app/actions/session";
2+
import { NextRequest, NextResponse } from "next/server";
3+
4+
export async function GET(request: NextRequest) {
5+
await expireSession();
6+
const url = request.nextUrl.clone();
7+
url.pathname = "/auth/login";
8+
return NextResponse.redirect(url);
9+
}

peerprep/app/api/internal/questions/route.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import { generateAuthHeaders, generateJSONHeaders } from "@/api/gateway";
2-
import { QuestionFullBody } from "@/api/structs";
32
import { NextRequest, NextResponse } from "next/server";
43

54
export async function GET() {

peerprep/app/questions/page.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@ import QuestionList from "@/components/questionpage/QuestionList";
33
import Matchmaking from "@/components/questionpage/Matchmaking";
44
import { QuestionFilterProvider } from "@/contexts/QuestionFilterContext";
55
import { UserInfoProvider } from "@/contexts/UserInfoContext";
6+
import { hydrateUid } from "../actions/server_actions";
67

7-
const QuestionsPage = () => {
8+
async function QuestionsPage() {
9+
const userId = await hydrateUid();
810
return (
9-
<UserInfoProvider>
11+
<UserInfoProvider userid={userId}>
1012
<QuestionFilterProvider>
1113
<Matchmaking></Matchmaking>
1214
<QuestionList></QuestionList>

peerprep/components/questionpage/Matchmaking.tsx

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,6 @@ import {
99
checkMatchStatus,
1010
findMatch,
1111
} from "@/app/api/internal/matching/helper";
12-
import { match } from "assert";
13-
import { TIMEOUT } from "dns";
1412

1513
const QUERY_INTERVAL_MILLISECONDS = 5000;
1614
const TIMEOUT_MILLISECONDS = 30000;

peerprep/contexts/UserInfoContext.tsx

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,23 @@
44
"use client";
55
import React, { createContext, useContext, useState, ReactNode } from "react";
66

7+
interface UserInfoProviderProps {
8+
userid: string|undefined,
9+
children: ReactNode
10+
}
11+
712
interface UserInfoContextType {
813
userid: string;
9-
setUserid: (userid: string) => void;
1014
}
1115

1216
const UserInfoContext = createContext<UserInfoContextType | undefined>(
1317
undefined
1418
);
1519

16-
export const UserInfoProvider: React.FC<{ children: ReactNode }> = ({
17-
children,
18-
}) => {
19-
const [userid, setUserid] = useState<string>("test-user");
20-
20+
export function UserInfoProvider({ userid, children }: UserInfoProviderProps) {
21+
const val = userid ? userid : "";
2122
return (
22-
<UserInfoContext.Provider value={{ userid, setUserid }}>
23+
<UserInfoContext.Provider value={{ userid: val }}>
2324
{children}
2425
</UserInfoContext.Provider>
2526
);

0 commit comments

Comments
 (0)