Skip to content

Commit 62f5cd9

Browse files
committed
edit user service to update profile
1 parent 80ca034 commit 62f5cd9

File tree

8 files changed

+85
-11
lines changed

8 files changed

+85
-11
lines changed

backend/src/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import {
55
handleLogout,
66
handleSignUp,
77
} from "./auth/auth.controller";
8-
import { handleCreateUser, handleGetUser } from "./user/user.controller";
8+
import { handleCreateUser, handleGetUser, handleUpdateUser } from "./user/user.controller";
99
const app = express();
1010
const port = 3001;
1111

@@ -22,6 +22,7 @@ app.delete("/logout", handleLogout);
2222

2323
app.post("/user", handleCreateUser);
2424
app.get("/user", handleGetUser);
25+
app.put("/user", handleUpdateUser);
2526

2627
app.listen(port, () => {
2728
console.log(`Peerprep listening on port ${port}`);

backend/src/user/user.controller.ts

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { Request, Response } from "express";
2-
import { createUser, getUser } from "./user.service";
2+
import { createUser, getUser, updateUser } from "./user.service";
33

44
export async function handleCreateUser(req: Request, res: Response) {
55
try {
@@ -29,3 +29,19 @@ export async function handleGetUser(req: Request, res: Response) {
2929
res.status(500).send(error);
3030
}
3131
}
32+
33+
export async function handleUpdateUser(req: Request, res: Response) {
34+
try {
35+
const email = req.body.params.email;
36+
if (typeof email === "string") {
37+
console.log(`updating user ${email}`);
38+
const user = await updateUser(email, req.body.params)
39+
res.status(200).send(user);
40+
} else {
41+
res.status(500).send("no params");
42+
}
43+
} catch (error) {
44+
console.error(error);
45+
res.status(500).send(error);
46+
}
47+
}

backend/src/user/user.service.ts

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { initializeApp } from "firebase/app";
2-
import { doc, getDoc, getFirestore, setDoc } from "firebase/firestore";
2+
import { doc, getDoc, getFirestore, setDoc, updateDoc } from "firebase/firestore";
33
import { firebaseConfig } from "../firebase/firebase.config";
44

55
initializeApp(firebaseConfig);
@@ -18,11 +18,17 @@ export async function createUser(email: string): Promise<User> {
1818
try {
1919
await setDoc(doc(db, "users", email), {
2020
email: email,
21+
name: "-",
22+
year: "-",
23+
major: "-",
2124
role: "user",
2225
completed: 0,
2326
});
2427
return Promise.resolve({
2528
email: email,
29+
name: "-",
30+
year: "-",
31+
major: "-",
2632
role: "user",
2733
completed: 0,
2834
});
@@ -50,3 +56,29 @@ export async function getUser(email: string): Promise<User> {
5056
return Promise.reject(error);
5157
}
5258
}
59+
60+
export async function updateUser(email: string, params: any): Promise<User> {
61+
try {
62+
const document = doc(db, "users", email);
63+
await updateDoc(document, {
64+
name: params.name,
65+
year: params.year,
66+
major: params.major
67+
})
68+
const data = await getDoc(doc(db, "users", email));
69+
const user = data.data();
70+
if (user) {
71+
return Promise.resolve({
72+
email: email,
73+
name: user.name ? user.name : undefined,
74+
year: user.year ? user.year : undefined,
75+
major: user.major ? user.major : undefined,
76+
role: user.role,
77+
completed: user.completed,
78+
});
79+
}
80+
return Promise.reject("no such user");
81+
} catch (error) {
82+
return Promise.reject(error);
83+
}
84+
}

frontend/src/api/user/data.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
import httpClient from "../axios/config";
2-
import { UserModel } from "./model";
2+
import { UserModel, Values } from "./model";
33

44
export const createUser = (email: string) =>
55
httpClient.post<UserModel>("/user", { email: email });
66

77
export const getUser = (email: string) =>
88
httpClient.get<UserModel>("/user", { params: { email: email } });
9+
10+
export const updateUser = (params: Values) =>
11+
httpClient.put<UserModel>("/user", { params });

frontend/src/api/user/model.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,7 @@ export interface UserModel {
66
role: string;
77
completed: number;
88
}
9+
10+
export interface Values {
11+
[key: string]: string;
12+
}

frontend/src/auth/auth.context.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import { createUser, getUser, UserModel } from "../api/user";
1515

1616
interface AuthContextData {
1717
user: UserModel | undefined;
18+
setUser: any | undefined,
1819
error: string;
1920
signUp: (email: string, password: string) => void;
2021
login: (email: string, password: string) => void;
@@ -27,6 +28,7 @@ interface AuthContextProviderProps {
2728

2829
const AuthContext = createContext<AuthContextData>({
2930
user: undefined,
31+
setUser: undefined,
3032
error: "",
3133
signUp: (email: string, password: string) => undefined,
3234
login: (email: string, password: string) => undefined,
@@ -101,8 +103,8 @@ export function AuthContextProvider({ children }: AuthContextProviderProps) {
101103
}, [setUser, navigate]);
102104

103105
const authContextProviderValue = useMemo(
104-
() => ({ user, error, signUp, login, logout }),
105-
[user, error, signUp, login, logout]
106+
() => ({ user, setUser, error, signUp, login, logout }),
107+
[user, setUser, error, signUp, login, logout]
106108
);
107109

108110
return (

frontend/src/components/DropDownOrTextField.tsx

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,13 @@ export function DropDownOrTextField({
3030
}: DropDownOrTextFieldProps) {
3131
const dropdowns = ["Year of Study", "Major"];
3232
const dropDownValues: DropDownValues = {
33-
"Year of Study": ["1", "2", "3", "4", ">5"],
33+
"Year of Study": ["1", "2", "3", "4", ">5", "-"],
3434
Major: [
3535
"Computer Science",
3636
"Business Analytics",
3737
"Information Systems",
3838
"Data Science",
39+
"-"
3940
],
4041
};
4142

@@ -57,7 +58,13 @@ export function DropDownOrTextField({
5758
</Select>
5859
</FormControl>
5960
) : (
60-
<TextField label={title} variant="outlined" value={value[data]} />
61+
<TextField label={title}
62+
variant="outlined"
63+
value={value[data]}
64+
disabled={title == "Email"} // Users cannot edit their email
65+
onChange={(e) => {
66+
setValue({ ...value, [data]: e.target.value })}
67+
} />
6168
)}
6269
</>
6370
);

frontend/src/pages/profile.tsx

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useEffect, useState } from "react";
1+
import { useEffect, useState, useCallback } from "react";
22
import {
33
Avatar,
44
Box,
@@ -12,9 +12,10 @@ import Navbar from "../components/Navbar";
1212
import ProfileField from "../components/ProfileField";
1313
import { useAuth } from "../auth/auth.context";
1414
import { Values } from "../components/DropDownOrTextField";
15+
import { updateUser } from "../api/user";
1516

1617
export default function Profile() {
17-
const { user } = useAuth();
18+
const { user, setUser } = useAuth();
1819
const [edit, setEdit] = useState(false);
1920
const [value, setValue] = useState<Values>({
2021
email: user?.email ? user?.email : "",
@@ -30,7 +31,15 @@ export default function Profile() {
3031
{ title: "Major", data: "major" },
3132
];
3233

33-
const toggleEdit = () => {
34+
const toggleEdit = async () => {
35+
if (edit) {
36+
try {
37+
const response = await updateUser(value);
38+
setUser(value)
39+
} catch (e) {
40+
console.log(e)
41+
}
42+
}
3443
setEdit(!edit);
3544
};
3645

0 commit comments

Comments
 (0)