Showing
6 changed files
with
91 additions
and
52 deletions
... | @@ -37,8 +37,14 @@ npm run dev:server | ... | @@ -37,8 +37,14 @@ npm run dev:server |
37 | ``` | 37 | ``` |
38 | 38 | ||
39 | <br> | 39 | <br> |
40 | + | ||
40 | ### API reference | 41 | ### API reference |
42 | + | ||
41 | [Programming Quotes API](quotes.stormconsultancy.co.uk/random.json) | 43 | [Programming Quotes API](quotes.stormconsultancy.co.uk/random.json) |
42 | <br> | 44 | <br> |
45 | + | ||
46 | +[Trending-GitHub API](https://docs.trending-github.com/) | ||
47 | + | ||
43 | ### License | 48 | ### License |
49 | + | ||
44 | [MIT](https://choosealicense.com/licenses/mit/) | 50 | [MIT](https://choosealicense.com/licenses/mit/) | ... | ... |
... | @@ -47,8 +47,6 @@ const gitTrend = async (req, res) => { | ... | @@ -47,8 +47,6 @@ const gitTrend = async (req, res) => { |
47 | }; | 47 | }; |
48 | }; | 48 | }; |
49 | 49 | ||
50 | - | ||
51 | - | ||
52 | export const handleHome = async (req, res) => { | 50 | export const handleHome = async (req, res) => { |
53 | const quote = await getQuote(); | 51 | const quote = await getQuote(); |
54 | const trend = await gitTrend(); | 52 | const trend = await gitTrend(); |
... | @@ -73,37 +71,44 @@ export const handleHome = async (req, res) => { | ... | @@ -73,37 +71,44 @@ export const handleHome = async (req, res) => { |
73 | 71 | ||
74 | export const getUserDetail = async (req, res) => { | 72 | export const getUserDetail = async (req, res) => { |
75 | const quote = await getQuote(); | 73 | const quote = await getQuote(); |
74 | + const id = req.params.id; | ||
75 | + const user = await User.findById(id); | ||
76 | + console.log(user.tech); | ||
77 | + | ||
76 | res.render("userDetail", { | 78 | res.render("userDetail", { |
77 | pagetTitle: "User Detail", | 79 | pagetTitle: "User Detail", |
78 | quote: quote.quote, | 80 | quote: quote.quote, |
79 | author: quote.author, | 81 | author: quote.author, |
82 | + user, | ||
80 | }); | 83 | }); |
81 | }; | 84 | }; |
82 | 85 | ||
83 | -export const getEditProfile = async (req,res)=> { | 86 | +export const getEditProfile = async (req, res) => { |
84 | - const{ | 87 | + const { |
85 | - user:{_id:id} | 88 | + user: { _id: id }, |
86 | } = req; | 89 | } = req; |
87 | - try{ | 90 | + try { |
88 | const user = await User.findById(id); | 91 | const user = await User.findById(id); |
89 | - if(user.id !== id){ | 92 | + if (user.id !== id) { |
90 | throw Error(); | 93 | throw Error(); |
91 | - } else{ | 94 | + } else { |
92 | - res.render("editProfile",{pageTitle:"Edit Profile", user}); | 95 | + res.render("editProfile", { pageTitle: "Edit Profile", user }); |
93 | } | 96 | } |
94 | - }catch(error){ | 97 | + } catch (error) { |
95 | console.log(error); | 98 | console.log(error); |
96 | } | 99 | } |
97 | }; | 100 | }; |
98 | 101 | ||
99 | -export const postEditProfile = async (req,res) =>{ | 102 | +export const postEditProfile = async (req, res) => { |
100 | const { | 103 | const { |
101 | - user:{_id:id}, | 104 | + user: { _id: id }, |
102 | - body: {name, email, school, blogUrl, tech, career, introduction}, | 105 | + body: { name, email, school, blogUrl, tech, career, introduction }, |
103 | - file | 106 | + file, |
104 | } = req; | 107 | } = req; |
105 | - try{ | 108 | + try { |
106 | - const updatedUser = await User.findByIdAndUpdate(id, { | 109 | + const updatedUser = await User.findByIdAndUpdate( |
110 | + id, | ||
111 | + { | ||
107 | avatarUrl: file ? file.path : req.session.passport.user.avatarUrl, | 112 | avatarUrl: file ? file.path : req.session.passport.user.avatarUrl, |
108 | name, | 113 | name, |
109 | email, | 114 | email, |
... | @@ -111,14 +116,16 @@ export const postEditProfile = async (req,res) =>{ | ... | @@ -111,14 +116,16 @@ export const postEditProfile = async (req,res) =>{ |
111 | blogUrl, | 116 | blogUrl, |
112 | tech: User.formatTech(tech), | 117 | tech: User.formatTech(tech), |
113 | career: User.formatCareer(career), | 118 | career: User.formatCareer(career), |
114 | - introduction | 119 | + introduction, |
115 | }, | 120 | }, |
116 | { | 121 | { |
117 | - new: true | 122 | + new: true, |
118 | - }); | 123 | + } |
124 | + ); | ||
119 | req.session.passport.user = updatedUser; | 125 | req.session.passport.user = updatedUser; |
126 | + //console.log(updatedUser); | ||
120 | res.redirect("/users/edit-profile"); | 127 | res.redirect("/users/edit-profile"); |
121 | - }catch(error){ | 128 | + } catch (error) { |
122 | console.log(error); | 129 | console.log(error); |
123 | res.redirect("/"); | 130 | res.redirect("/"); |
124 | } | 131 | } |
... | @@ -151,24 +158,23 @@ export const githubLoginCallback = async (_, __, profile, done) => { | ... | @@ -151,24 +158,23 @@ export const githubLoginCallback = async (_, __, profile, done) => { |
151 | }, | 158 | }, |
152 | } = profile; | 159 | } = profile; |
153 | 160 | ||
154 | - try{ | 161 | + try { |
155 | - const user = await User.findOne({githubId}); | 162 | + const user = await User.findOne({ githubId }); |
156 | - if(user){ | 163 | + if (user) { |
157 | - user.githubId = githubId, | 164 | + (user.githubId = githubId), (user.githubName = githubName); |
158 | - user.githubName = githubName | ||
159 | await user.save(); | 165 | await user.save(); |
160 | return done(null, user); | 166 | return done(null, user); |
161 | - }else{ | 167 | + } else { |
162 | const newUser = await User.create({ | 168 | const newUser = await User.create({ |
163 | githubId, | 169 | githubId, |
164 | githubName, | 170 | githubName, |
165 | avatarUrl, | 171 | avatarUrl, |
166 | name, | 172 | name, |
167 | 173 | + email, | |
168 | }); | 174 | }); |
169 | return done(null, newUser); | 175 | return done(null, newUser); |
170 | } | 176 | } |
171 | - }catch(error){ | 177 | + } catch (error) { |
172 | return done(error); | 178 | return done(error); |
173 | } | 179 | } |
174 | }; | 180 | }; | ... | ... |
... | @@ -3,53 +3,52 @@ import mongoose from "mongoose"; | ... | @@ -3,53 +3,52 @@ import mongoose from "mongoose"; |
3 | const UserSchema = new mongoose.Schema({ | 3 | const UserSchema = new mongoose.Schema({ |
4 | name: { | 4 | name: { |
5 | type: String, | 5 | type: String, |
6 | - trim: true | 6 | + trim: true, |
7 | }, | 7 | }, |
8 | email: { | 8 | email: { |
9 | type: String, | 9 | type: String, |
10 | trim: true, | 10 | trim: true, |
11 | - unique: true | 11 | + unique: true, |
12 | }, | 12 | }, |
13 | avatarUrl: String, | 13 | avatarUrl: String, |
14 | githubId: { | 14 | githubId: { |
15 | type: Number, | 15 | type: Number, |
16 | - required: "GitHub id is required", | 16 | + required: "GitHub ID is required", |
17 | - unique: true | 17 | + unique: true, |
18 | }, | 18 | }, |
19 | githubName: { | 19 | githubName: { |
20 | type: String, | 20 | type: String, |
21 | required: "Github nickname is required", | 21 | required: "Github nickname is required", |
22 | - trim: true | 22 | + trim: true, |
23 | }, | 23 | }, |
24 | school: { | 24 | school: { |
25 | type: String, | 25 | type: String, |
26 | - trim: true | 26 | + trim: true, |
27 | }, | 27 | }, |
28 | tech: [{ type: String, trim: true }], | 28 | tech: [{ type: String, trim: true }], |
29 | career: [{ type: String, trim: true }], | 29 | career: [{ type: String, trim: true }], |
30 | - introduction: { type: String, maxLength: 500}, | 30 | + introduction: { type: String, maxLength: 500 }, |
31 | createdAt: { | 31 | createdAt: { |
32 | type: Date, | 32 | type: Date, |
33 | - default: Date.now | 33 | + default: Date.now, |
34 | }, | 34 | }, |
35 | blogUrl: { | 35 | blogUrl: { |
36 | type: String, | 36 | type: String, |
37 | - default: "#" | 37 | + default: "#", |
38 | }, | 38 | }, |
39 | githubUrl: { | 39 | githubUrl: { |
40 | type: String, | 40 | type: String, |
41 | - default: "#" | 41 | + default: "#", |
42 | - } | 42 | + }, |
43 | }); | 43 | }); |
44 | 44 | ||
45 | -UserSchema.static("formatTech", function(tech){ | 45 | +UserSchema.static("formatTech", function (tech) { |
46 | return tech.split(","); | 46 | return tech.split(","); |
47 | }); | 47 | }); |
48 | -UserSchema.static("formatCareer",function(career){ | 48 | +UserSchema.static("formatCareer", function (career) { |
49 | return career.split(","); | 49 | return career.split(","); |
50 | }); | 50 | }); |
51 | 51 | ||
52 | const User = mongoose.model("User", UserSchema); | 52 | const User = mongoose.model("User", UserSchema); |
53 | 53 | ||
54 | - | ||
55 | export default User; | 54 | export default User; | ... | ... |
1 | import express from "express"; | 1 | import express from "express"; |
2 | -import { getEditProfile, getUserDetail, handleUsers, postEditProfile } from "../controllers/userController"; | 2 | +import { |
3 | + getEditProfile, | ||
4 | + getUserDetail, | ||
5 | + handleUsers, | ||
6 | + postEditProfile, | ||
7 | +} from "../controllers/userController"; | ||
3 | import { onlyPrivate, uploadFiles } from "../middlewares"; | 8 | import { onlyPrivate, uploadFiles } from "../middlewares"; |
4 | 9 | ||
5 | const userRouter = express.Router(); | 10 | const userRouter = express.Router(); |
... | @@ -7,7 +12,12 @@ const userRouter = express.Router(); | ... | @@ -7,7 +12,12 @@ const userRouter = express.Router(); |
7 | userRouter.get("/", handleUsers); | 12 | userRouter.get("/", handleUsers); |
8 | 13 | ||
9 | userRouter.get("/edit-profile", onlyPrivate, getEditProfile); | 14 | userRouter.get("/edit-profile", onlyPrivate, getEditProfile); |
10 | -userRouter.post("/edit-profile", onlyPrivate, uploadFiles.single("photo"),postEditProfile); | 15 | +userRouter.post( |
16 | + "/edit-profile", | ||
17 | + onlyPrivate, | ||
18 | + uploadFiles.single("photo"), | ||
19 | + postEditProfile | ||
20 | +); | ||
11 | 21 | ||
12 | userRouter.get("/:id", getUserDetail); | 22 | userRouter.get("/:id", getUserDetail); |
13 | 23 | ... | ... |
... | @@ -11,23 +11,41 @@ block content | ... | @@ -11,23 +11,41 @@ block content |
11 | img(src="#") | 11 | img(src="#") |
12 | .user-profile__link | 12 | .user-profile__link |
13 | a(href="#") Github | 13 | a(href="#") Github |
14 | + |#{' '} | ||
14 | a(href="#") Blog | 15 | a(href="#") Blog |
15 | .user-profile__column | 16 | .user-profile__column |
16 | .user-profile__info | 17 | .user-profile__info |
17 | - h3 NAME | 18 | + h3(style="display: inline;") NAME: |
18 | - h3 GITHUB NICKNAME | 19 | + h4(style="display: inline;")=user.name |
19 | - h3 EMAIL | 20 | + br |
20 | - h3 SCHOOL | 21 | + h3(style="display: inline;") GITHUB NICKNAME: |
21 | - h3 TECH | 22 | + h4(style="display: inline;")=user.githubName |
22 | - h3 CAREER | 23 | + br |
23 | - h3 SELF-INTRODUCTION | 24 | + h3(style="display: inline;") EMAIL: |
25 | + h4(style="display: inline;")=user.email | ||
26 | + br | ||
27 | + h3(style="display: inline;") SCHOOL: | ||
28 | + h4(style="display: inline;")=user.school | ||
29 | + h3 TECH: | ||
30 | + ul | ||
31 | + each tech in user.tech | ||
32 | + li=tech | ||
33 | + h3 CAREER: | ||
34 | + ul | ||
35 | + each career in user.career | ||
36 | + li=career | ||
37 | + h3(style="display: inline;") SELF-INTRODUCTION: | ||
38 | + h4(style="display: inline;")=user.introduction | ||
24 | hr | 39 | hr |
25 | .user-status | 40 | .user-status |
26 | .user-status__contributions | 41 | .user-status__contributions |
27 | - img(src="http://ghchart.rshah.org/lsj8706" alt="Name Your Github chart") | 42 | + img(src=`http://ghchart.rshah.org/${user.githubName}` alt="Name Your Github chart") |
28 | .user-status__character | 43 | .user-status__character |
29 | h3 Your step | commit numbers | 44 | h3 Your step | commit numbers |
30 | img(src="https://preview.free3d.com/img/2019/12/2269306250288170045/1oe8ymrc-900.jpg" alt="character" style="height:200px; width:250px;") | 45 | img(src="https://preview.free3d.com/img/2019/12/2269306250288170045/1oe8ymrc-900.jpg" alt="character" style="height:200px; width:250px;") |
31 | .user-repositories | 46 | .user-repositories |
32 | .user-repo | 47 | .user-repo |
33 | h3 REPO 1 | 48 | h3 REPO 1 |
49 | + | ||
50 | + | ||
51 | + | ||
... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
-
Please register or login to post a comment