Skip to content

Commit cdff1ee

Browse files
authored
Merge pull request #120 from FastcampusMini/develop
Merge: Integrate changes from develop branch into master
2 parents b00fb25 + ade24ad commit cdff1ee

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

95 files changed

+15729
-2666
lines changed

.firebaserc

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"projects": {
3+
"default": "loantech-7603b"
4+
}
5+
}

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,5 @@ dist-ssr
2626
# etc
2727
.env
2828
.local.env
29-
test.md
29+
test.md
30+
testt.md

README.md

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
11
# mini-project-fe
22

3-
api 명세: https://documenter.getpostman.com/view/25760000/2s935so2bC
4-
배포(develop): https://subtle-stardust-bdb90a.netlify.app/
5-
63
## 라이브러리
74

85
- `react-icons` 아이콘 컴포넌트

firebase.json

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
{
2+
"firestore": {
3+
"rules": "firestore.rules",
4+
"indexes": "firestore.indexes.json"
5+
},
6+
"functions": [
7+
{
8+
"source": "functions",
9+
"codebase": "default",
10+
"ignore": [
11+
"node_modules",
12+
".git",
13+
"firebase-debug.log",
14+
"firebase-debug.*.log"
15+
],
16+
"predeploy": [
17+
"npm --prefix \"$RESOURCE_DIR\" run build"
18+
]
19+
}
20+
],
21+
"storage": {
22+
"rules": "storage.rules"
23+
}
24+
}

firestore.indexes.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"indexes": [],
3+
"fieldOverrides": []
4+
}

firestore.rules

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
rules_version = '2';
2+
service cloud.firestore {
3+
match /databases/{database}/documents {
4+
match /{document=**} {
5+
allow read, write: if
6+
request.time < timestamp.date(2023, 4, 14);
7+
}
8+
}
9+
}

functions/.gitignore

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# Compiled JavaScript files
2+
lib/**/*.js
3+
lib/**/*.js.map
4+
5+
# TypeScript v1 declaration files
6+
typings/
7+
8+
# Node.js dependency directory
9+
node_modules/

functions/api/auth/deleteUser.js

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
const admin = require('firebase-admin');
2+
const jwt = require('jsonwebtoken');
3+
4+
const firestore = admin.firestore();
5+
const SECRET_KEY = 'my-secret-key';
6+
7+
const deleteUser = async (req, res) => {
8+
const authHeader = req.headers.authorization;
9+
10+
if (!authHeader) {
11+
return res.status(401).json({ error: 'Authorization header missing' });
12+
}
13+
14+
const token = authHeader.split(' ')[1];
15+
16+
try {
17+
const { userId } = jwt.verify(token, SECRET_KEY);
18+
19+
await admin.auth().deleteUser(userId);
20+
await firestore.collection('users').doc(userId).delete();
21+
22+
return res.status(200).json({
23+
code: 200,
24+
message: `${userId} 계정이 성공적으로 삭제됐습니다.`,
25+
});
26+
} catch (error) {
27+
return res.status(400).json({ code: 400, error: error.message });
28+
}
29+
};
30+
module.exports = deleteUser;

functions/api/auth/getUser.js

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
const admin = require('firebase-admin');
2+
const jwt = require('jsonwebtoken');
3+
4+
const firestore = admin.firestore();
5+
const SECRET_KEY = 'my-secret-key';
6+
const SUCCESS_MSG = '요청에 성공하였습니다.';
7+
8+
const getUser = async (req, res) => {
9+
const authHeader = req.headers.authorization;
10+
11+
if (!authHeader) {
12+
return res
13+
.status(401)
14+
.json({ code: 401, error: 'Authorization header가 존재하지 않습니다.' });
15+
}
16+
17+
const token = authHeader.split(' ')[1];
18+
try {
19+
const { userId } = jwt.verify(token, SECRET_KEY);
20+
const userSnapshot = await firestore.collection('users').doc(userId).get();
21+
const userData = userSnapshot.data();
22+
23+
if (!userData) {
24+
return res.status(404).json({ code: 404, error: 'User not found' });
25+
}
26+
27+
return res
28+
.status(200)
29+
.json({ code: 200, message: SUCCESS_MSG, data: userData });
30+
} catch (error) {
31+
return res
32+
.status(401)
33+
.json({ code: 401, error: 'Invalid or expired token' });
34+
}
35+
};
36+
37+
module.exports = getUser;

functions/api/auth/login.js

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
const admin = require('firebase-admin');
2+
const jwt = require('jsonwebtoken');
3+
4+
const firestore = admin.firestore();
5+
const SECRET_KEY = 'my-secret-key';
6+
const SUCCESS_MSG = '요청에 성공하였습니다.';
7+
const TOKEN_EXPIRATION = '24h';
8+
9+
const login = async (req, res) => {
10+
const { email, password } = req.body;
11+
if (!email || !password) {
12+
return res.status(400).json({
13+
code: 400,
14+
message: 'email 혹은 password 가 없습니다.',
15+
data: undefined,
16+
});
17+
}
18+
19+
try {
20+
const { uid } = await admin.auth().getUserByEmail(email);
21+
const userSnapshot = await firestore.collection('users').doc(uid).get();
22+
const userData = userSnapshot.data();
23+
if (userData.password !== password)
24+
return res.status(400).json({ code: 400, message: '비밀번호 불일치' });
25+
if (!userData) {
26+
return res.status(404).json({
27+
code: 404,
28+
message: '존재하지 않는 회원입니다.',
29+
});
30+
}
31+
const token = jwt.sign({ userId: uid }, SECRET_KEY, {
32+
expiresIn: TOKEN_EXPIRATION,
33+
});
34+
35+
return res.status(200).json({
36+
code: 200,
37+
message: SUCCESS_MSG,
38+
data: {
39+
user: userData,
40+
accessToken: token,
41+
refreshToken: token,
42+
},
43+
});
44+
} catch (error) {
45+
return res.status(400).json({
46+
code: 400,
47+
message: error.message,
48+
});
49+
}
50+
};
51+
module.exports = login;

0 commit comments

Comments
 (0)