Skip to content

Commit 3789d82

Browse files
committed
refactor frontend auth and add user service
1 parent 56700d7 commit 3789d82

File tree

17 files changed

+254
-98
lines changed

17 files changed

+254
-98
lines changed

backend/src/auth/auth.controller.ts

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,35 @@
11
import { Request, Response } from "express";
2-
import { signUp, login, currentUser, logout } from "./auth.service";
2+
import { signUp, login, logout } from "./auth.service";
3+
4+
export async function handleSignUp(req: Request, res: Response) {
5+
try {
6+
const { email, password } = req.body;
7+
console.log(`signing up new user ${email}`);
8+
const signedUp = await signUp(email, password);
9+
res.status(200).send(signedUp);
10+
} catch (error) {
11+
console.error(error);
12+
res.status(500).send(error);
13+
}
14+
}
315

416
export async function handleLogin(req: Request, res: Response) {
517
try {
618
const { email, password } = req.body;
19+
console.log(`logging in user ${email}`);
720
const loggedIn = await login(email, password);
8-
res.send(loggedIn);
21+
res.status(200).send(loggedIn);
22+
} catch (error) {
23+
console.error(error);
24+
res.status(500).send(error);
25+
}
26+
}
27+
28+
export async function handleLogout(req: Request, res: Response) {
29+
try {
30+
console.log(`logging out`);
31+
await logout();
32+
res.status(200).send();
933
} catch (error) {
1034
console.error(error);
1135
res.status(500).send(error);

backend/src/auth/auth.service.ts

Lines changed: 26 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -4,60 +4,50 @@ import {
44
createUserWithEmailAndPassword,
55
signInWithEmailAndPassword,
66
signOut,
7+
UserCredential,
78
} from "firebase/auth";
89
import { firebaseConfig } from "../firebase/firebase.config";
910

10-
interface Result {
11-
success: boolean;
12-
data: {} | undefined;
13-
}
14-
1511
initializeApp(firebaseConfig);
1612
const auth = getAuth();
1713

18-
export async function signUp(email: string, password: string): Promise<Result> {
14+
export async function signUp(
15+
email: string,
16+
password: string
17+
): Promise<UserCredential> {
1918
try {
20-
const data = await createUserWithEmailAndPassword(auth, email, password);
21-
if (data) {
22-
// get new user details
23-
return Promise.resolve({ success: true, data });
24-
}
25-
return Promise.reject({ success: false, data });
26-
} catch (error) {
27-
console.log(error);
19+
const user: UserCredential = await createUserWithEmailAndPassword(
20+
auth,
21+
email,
22+
password
23+
);
24+
return Promise.resolve(user);
25+
} catch (error: any) {
2826
return Promise.reject(error);
2927
}
3028
}
3129

32-
export async function login(email: string, password: string): Promise<Result> {
30+
export async function login(
31+
email: string,
32+
password: string
33+
): Promise<UserCredential> {
3334
try {
34-
const data = await signInWithEmailAndPassword(auth, email, password);
35-
return Promise.resolve({ success: true, data });
35+
const user: UserCredential = await signInWithEmailAndPassword(
36+
auth,
37+
email,
38+
password
39+
);
40+
return Promise.resolve(user);
3641
} catch (error) {
37-
console.error(error);
38-
return Promise.reject({ success: false, error });
42+
return Promise.reject(error);
3943
}
4044
}
4145

42-
export async function logout(): Promise<Result> {
46+
export async function logout(): Promise<void> {
4347
try {
4448
await signOut(auth);
45-
return Promise.resolve({ success: true, data: "logged out" });
46-
} catch (error) {
47-
console.error(error);
48-
return Promise.reject({ success: false, error });
49-
}
50-
}
51-
52-
export async function currentUser(): Promise<Result> {
53-
try {
54-
const user = await auth.currentUser;
55-
if (user) {
56-
return Promise.resolve({ success: true, data: user });
57-
}
58-
return Promise.reject({ success: false, error: "You're not logged in!" });
49+
return Promise.resolve();
5950
} catch (error) {
60-
console.error(error);
61-
return Promise.reject({ success: false, error });
51+
return Promise.reject(error);
6252
}
6353
}

backend/src/index.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
import express from "express";
22
import cors from "cors";
3-
import { handleLogin } from "./auth/auth.controller";
3+
import {
4+
handleLogin,
5+
handleLogout,
6+
handleSignUp,
7+
} from "./auth/auth.controller";
8+
import { handleCreateUser, handleGetUser } from "./user/user.controller";
49
const app = express();
510
const port = 3001;
611

@@ -11,7 +16,12 @@ app.get("/", (req, res) => {
1116
res.send("Hello World!");
1217
});
1318

19+
app.post("/signup", handleSignUp);
1420
app.post("/login", handleLogin);
21+
app.delete("/logout", handleLogout);
22+
23+
app.post("/user", handleCreateUser);
24+
app.get("/user", handleGetUser);
1525

1626
app.listen(port, () => {
1727
console.log(`Peerprep listening on port ${port}`);
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import { Request, Response } from "express";
2+
import { createUser, getUser } from "./user.service";
3+
4+
export async function handleCreateUser(req: Request, res: Response) {
5+
try {
6+
const { email } = req.body;
7+
console.log(`creating user ${email}`);
8+
const user = await createUser(email);
9+
res.status(200).send(user);
10+
} catch (error) {
11+
console.error(error);
12+
res.status(500).send(error);
13+
}
14+
}
15+
16+
export async function handleGetUser(req: Request, res: Response) {
17+
try {
18+
console.log(req.query.email);
19+
const { email } = req.query;
20+
console.log(`getting user ${email}`);
21+
if (typeof email === "string") {
22+
const user = await getUser(email);
23+
res.status(200).send(user);
24+
} else {
25+
res.status(500).send("no params");
26+
}
27+
} catch (error) {
28+
console.error(error);
29+
res.status(500).send(error);
30+
}
31+
}

backend/src/user/user.service.ts

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
import { initializeApp } from "firebase/app";
2+
import { doc, getDoc, getFirestore, setDoc } from "firebase/firestore";
3+
import { firebaseConfig } from "../firebase/firebase.config";
4+
5+
initializeApp(firebaseConfig);
6+
const db = getFirestore();
7+
8+
interface User {
9+
email: string;
10+
name?: string;
11+
year?: string;
12+
major?: string;
13+
role: string;
14+
completed: number;
15+
}
16+
17+
export async function createUser(email: string): Promise<User> {
18+
try {
19+
await setDoc(doc(db, "users", email), {
20+
email: email,
21+
role: "user",
22+
completed: 0,
23+
});
24+
return Promise.resolve({
25+
email: email,
26+
role: "user",
27+
completed: 0,
28+
});
29+
} catch (error) {
30+
return Promise.reject(error);
31+
}
32+
}
33+
34+
export async function getUser(email: string): Promise<User> {
35+
try {
36+
const data = await getDoc(doc(db, "users", email));
37+
const user = data.data();
38+
if (user) {
39+
return Promise.resolve({
40+
email: email,
41+
name: user.name ? user.name : undefined,
42+
year: user.year ? user.year : undefined,
43+
major: user.major ? user.major : undefined,
44+
role: user.role,
45+
completed: user.completed,
46+
});
47+
}
48+
return Promise.reject("no such user");
49+
} catch (error) {
50+
return Promise.reject(error);
51+
}
52+
}

frontend/src/api/auth/data.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import httpClient from "../axios/config";
2+
import { AuthDTO } from "./dto";
3+
import { UserCredential } from "firebase/auth";
4+
5+
export const registerUser = (params: AuthDTO) =>
6+
httpClient.post<UserCredential>("/signup", params);
7+
8+
export const signIn = (params: AuthDTO) =>
9+
httpClient.post<UserCredential>("/login", params);
10+
11+
export const signOut = () => httpClient.delete("/logout");

frontend/src/api/auth/dto.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
export interface AuthDTO {
2+
email: string;
3+
password: string;
4+
}

frontend/src/api/auth/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export * from "./data";
2+
export * from "./dto";

frontend/src/api/axios/config.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import axios from "axios";
2+
3+
const httpClient = axios.create({
4+
baseURL: process.env.REACT_APP_BASE_URL,
5+
});
6+
7+
export default httpClient;

frontend/src/api/user/data.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import httpClient from "../axios/config";
2+
import { UserModel } from "./model";
3+
4+
export const createUser = (email: string) =>
5+
httpClient.post<UserModel>("/user", { email: email });
6+
7+
export const getUser = (email: string) =>
8+
httpClient.get<UserModel>("/user", { params: { email: email } });

0 commit comments

Comments
 (0)