Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
187 commits
Select commit Hold shift + click to select a range
24d5d4d
feat: migration and model-test done
Zephzer Aug 22, 2023
3df4220
feat: modify model
Zephzer Aug 22, 2023
9fcbbd6
feat: add avatar and cover defultvalue
Zephzer Aug 22, 2023
9ec28c5
add setting view
yanghaotse Aug 22, 2023
08bc56d
Merge pull request #1 from Zephzer/migration
hao0516hsu Aug 22, 2023
234d9ab
Merge remote-tracking branch 'origin' into user
yanghaotse Aug 23, 2023
a4dceaa
project initialization
hao0516hsu Aug 23, 2023
0f2cb14
Merge pull request #2 from Zephzer/feature/signup
Zephzer Aug 23, 2023
bf997d9
feat:handlebars-helper and undone error and auth feature
Zephzer Aug 23, 2023
29a5564
feat: signup page
hao0516hsu Aug 23, 2023
36876be
add right views
yanghaotse Aug 23, 2023
6dee9f1
Merge remote-tracking branch 'origin' into user
yanghaotse Aug 23, 2023
fb00c7c
feat:common-feature done
Zephzer Aug 23, 2023
f295153
add notice msg
Zephzer Aug 23, 2023
debd45e
feat: signup
hao0516hsu Aug 23, 2023
797e0ff
feat: add tweets.hbs
Iris5410 Aug 23, 2023
3f51e4f
feat: signin page
hao0516hsu Aug 23, 2023
9315770
feat: admin/signin page
hao0516hsu Aug 23, 2023
fa4c7cc
feat: add user seeder
Zephzer Aug 23, 2023
f6a2ef5
modify auth middleware
Zephzer Aug 23, 2023
8038415
Merge branch 'master' into feature/common-feature
hao0516hsu Aug 23, 2023
d929175
Merge pull request #3 from Zephzer/feature/common-feature
hao0516hsu Aug 23, 2023
28c32a6
Merge pull request #4 from Zephzer/feature/mainPage
Zephzer Aug 23, 2023
510f564
feat: add tweets seeder
Zephzer Aug 23, 2023
d2fe6f7
Merge branch 'feature/signup'
hao0516hsu Aug 23, 2023
fda8e41
Merge remote-tracking branch 'origin/master' into feature/signup
hao0516hsu Aug 23, 2023
7110fc3
feat: add reply seeder and modify tweet seeder
Zephzer Aug 23, 2023
d874c0d
add following.hbs
yanghaotse Aug 24, 2023
ff2969b
Merge remote-tracking branch 'origin' into user
yanghaotse Aug 24, 2023
63af7b2
feat: add maxLength
Zephzer Aug 24, 2023
470e54a
feat: signin
hao0516hsu Aug 24, 2023
ad63f6c
feat: modify details
hao0516hsu Aug 24, 2023
2329aae
Merge pull request #5 from Zephzer/seeder
yanghaotse Aug 24, 2023
f5733fa
feat: add posting modal
Iris5410 Aug 24, 2023
f1e4c8e
add user following views & edit right views
yanghaotse Aug 24, 2023
1d96a61
Merge remote-tracking branch 'origin' into user
yanghaotse Aug 24, 2023
8fdde74
add followings & setting route
yanghaotse Aug 24, 2023
f54fccc
add followings.hbs & followers.hbs & follow-tabs/user-header partials
yanghaotse Aug 24, 2023
5f33964
fix: middleware/auth and passport
hao0516hsu Aug 24, 2023
8fc113f
edit user-setting.hbs
yanghaotse Aug 24, 2023
a8ae2a0
edit follow-tabs
yanghaotse Aug 24, 2023
a1170f3
add user-tabs
yanghaotse Aug 24, 2023
a62c557
Merge pull request #6 from Zephzer/feature/signup
Iris5410 Aug 24, 2023
3d4fd49
Merge remote-tracking branch 'origin/master'
hao0516hsu Aug 24, 2023
33c2f55
feat: modify config for heroku
hao0516hsu Aug 24, 2023
24193c1
fix: tweets-seed
hao0516hsu Aug 24, 2023
4203030
fix: replies-seed
hao0516hsu Aug 24, 2023
55b9ebe
feat: add reply modal
Iris5410 Aug 24, 2023
a67929c
Merge branch 'master' into feature/postModal
Zephzer Aug 24, 2023
2d9fdc2
Merge pull request #7 from Zephzer/feature/postModal
Zephzer Aug 24, 2023
3e7df4d
Merge remote-tracking branch 'origin' into Feature/user
yanghaotse Aug 25, 2023
ccdf6bf
edit followings & followers layout
yanghaotse Aug 25, 2023
f322bf9
fix: duplicate routes
Iris5410 Aug 25, 2023
1c02ddb
feat: add sidebar ifCond & href & logout
yanghaotse Aug 25, 2023
5b217df
fix duplicate routes
yanghaotse Aug 25, 2023
2476b6b
Merge pull request #9 from Zephzer/feature/fix-duplicate-routes
Zephzer Aug 25, 2023
c9bbb7c
Merge branch 'master' into Feature/user-views
hao0516hsu Aug 25, 2023
f23f368
Merge pull request #8 from Zephzer/Feature/user-views
hao0516hsu Aug 25, 2023
e03f179
Merge branch 'master' of https://github.com/Zephzer/twitter-fullstack…
hao0516hsu Aug 25, 2023
ae00db1
feat: add data to main page
Iris5410 Aug 25, 2023
9cd0445
Merge pull request #10 from Zephzer/feature/main-views
hao0516hsu Aug 26, 2023
ffce68a
feat: add user-tweets views & profile partials
yanghaotse Aug 26, 2023
c7a40f8
Merge remote-tracking branch 'origin' into Feature/user-views
yanghaotse Aug 26, 2023
3d22053
feat: add postTweet function
Iris5410 Aug 26, 2023
be739fe
Merge branch 'master' of https://github.com/Zephzer/twitter-fullstack…
hao0516hsu Aug 26, 2023
e3dbf07
feat: add postReply function
Iris5410 Aug 26, 2023
c415a7a
feat: add user-replies views
yanghaotse Aug 26, 2023
9358875
feat: add logout & localeDate
Iris5410 Aug 26, 2023
4bd34a2
Merge pull request #11 from Zephzer/feature/main-views
yanghaotse Aug 26, 2023
b92e2b8
Merge pull request #12 from Zephzer/feature/logout
yanghaotse Aug 26, 2023
563a5a0
feat: add user-likes views
yanghaotse Aug 26, 2023
7aef011
Merge remote-tracking branch 'origin' into Feature/user-views
yanghaotse Aug 26, 2023
84e95f8
fix: user-likes & user-tweets text layout
yanghaotse Aug 26, 2023
5620795
feat: add user-link
yanghaotse Aug 27, 2023
7094256
Merge pull request #13 from Zephzer/Feature/user-views
Iris5410 Aug 27, 2023
ca6143f
admin
Zephzer Aug 27, 2023
9effde1
Merge branch 'master' into feature/admin2
Zephzer Aug 27, 2023
9596974
Merge pull request #15 from Zephzer/feature/admin2
Iris5410 Aug 28, 2023
f2d88be
Merge branch 'master' of https://github.com/Zephzer/twitter-fullstack…
hao0516hsu Aug 28, 2023
5a56102
feat: add profile-modal
yanghaotse Aug 28, 2023
da4b9fc
Merge remote-tracking branch 'origin' into Feature/user-views
yanghaotse Aug 28, 2023
8e0114e
feat: add tweet.hbs
Iris5410 Aug 28, 2023
52c512a
modify getusers
Zephzer Aug 28, 2023
d0e9ce2
Merge pull request #16 from Zephzer/Feature/user-views
Zephzer Aug 28, 2023
e41114e
feat: add getTweet function
Iris5410 Aug 28, 2023
0b0024e
Merge pull request #17 from Zephzer/feature/modify
Iris5410 Aug 28, 2023
b47d5fe
feat: add getUserTweets
yanghaotse Aug 29, 2023
072b284
feat: addLike & removeLike function
Iris5410 Aug 29, 2023
9aa9fd1
Merge pull request #18 from Zephzer/feature/reply-list
hao0516hsu Aug 29, 2023
1b1cbfb
feat: add getUserLikes
yanghaotse Aug 29, 2023
8210e3a
Merge pull request #19 from Zephzer/feature/like
yanghaotse Aug 29, 2023
632faa0
Merge branch 'master' of https://github.com/Zephzer/twitter-fullstack…
hao0516hsu Aug 29, 2023
cbb0d99
feat: add getUserFollowings & getUserFollowers
yanghaotse Aug 29, 2023
3944c8a
Merge remote-tracking branch 'origin' into Feature/user-function
yanghaotse Aug 29, 2023
03643ee
fix: currentUserId
yanghaotse Aug 29, 2023
f1d08bc
replace req.user with getUser(req)
yanghaotse Aug 30, 2023
f8b8bc2
feat: add character limit
Iris5410 Aug 30, 2023
1800d72
feat: add getUserSetting
yanghaotse Aug 30, 2023
02020f1
Merge pull request #20 from Zephzer/Feature/user-function
hao0516hsu Aug 30, 2023
ae0d83a
Merge branch 'master' of https://github.com/Zephzer/twitter-fullstack…
hao0516hsu Aug 30, 2023
c6c9a0b
Merge remote-tracking branch 'origin/master' into feature/character-l…
Iris5410 Aug 30, 2023
14129f8
adjust sidebar position
Iris5410 Aug 30, 2023
fa8271f
feat: add putUserSetting
yanghaotse Aug 30, 2023
be29010
Merge pull request #21 from Zephzer/feature/character-limit
Zephzer Aug 30, 2023
84f5d84
fix: route editUser
yanghaotse Aug 30, 2023
b74de6a
feat: edit avatar and cover preview
Zephzer Aug 30, 2023
d42d478
feat: add route PUT /users/:id/setting
yanghaotse Aug 30, 2023
8bc254e
feat: edit user profile
Zephzer Aug 30, 2023
c3ecfd3
feat: add avatar-img 'rounded-circle'
yanghaotse Aug 31, 2023
ba594cb
feat: add color #ff6600 to 'x' icon in reply-modal & post-modal
yanghaotse Aug 31, 2023
8c84d14
feat: add route PUT /users/:id/setting
yanghaotse Aug 31, 2023
c6679b6
Merge branch 'master' of https://github.com/Zephzer/twitter-fullstack…
hao0516hsu Aug 31, 2023
b645a3a
feat: modify
Zephzer Aug 31, 2023
f7a7995
modify
Zephzer Aug 31, 2023
c8e3214
add word break
Iris5410 Aug 31, 2023
69c6552
feat: test done
Zephzer Aug 31, 2023
c24f66b
feature: addFollowing & removeFollowing
Iris5410 Aug 31, 2023
881a2a5
fix: remove root from rightbar
yanghaotse Aug 31, 2023
e43b29a
Merge branch 'master' into Feature/user-function
yanghaotse Aug 31, 2023
07bb602
Merge pull request #22 from Zephzer/Feature/user-function
yanghaotse Aug 31, 2023
c0e0615
fix: edit reply-modal in user-tweets & user-likes
yanghaotse Aug 31, 2023
6ca26f8
Merge remote-tracking branch 'origin' into Feature/user-function
yanghaotse Aug 31, 2023
7d688e1
Merge branch 'master' into feature/user-edit
hao0516hsu Aug 31, 2023
e40ba13
Merge pull request #23 from Zephzer/feature/user-edit
hao0516hsu Aug 31, 2023
ae772ee
Merge remote-tracking branch 'origin' into Feature/user-function
yanghaotse Aug 31, 2023
d47bb29
Merge branch 'master' of https://github.com/Zephzer/twitter-fullstack…
hao0516hsu Aug 31, 2023
9607e0e
feat: add textarea charCount
Zephzer Aug 31, 2023
f9b0a6b
Merge branch 'master' into feature/follow
yanghaotse Aug 31, 2023
c6df769
Merge pull request #24 from Zephzer/feature/follow
yanghaotse Aug 31, 2023
180ec16
Merge remote-tracking branch 'origin' into Feature/user-function
yanghaotse Aug 31, 2023
0006420
feat: add dotenv
yanghaotse Aug 31, 2023
00bd9d3
feat: add topUser in getTweets
yanghaotse Aug 31, 2023
139a8f2
feat: add text-break in reply-modal
yanghaotse Aug 31, 2023
6c1690f
Merge pull request #25 from Zephzer/Feature/user-function
Iris5410 Aug 31, 2023
e18f83b
cover
Zephzer Aug 31, 2023
a4e2470
Merge branch 'master' of https://github.com/Zephzer/twitter-fullstack…
hao0516hsu Aug 31, 2023
3dcc10e
fix: remove test code from reply-modal
yanghaotse Sep 1, 2023
c893eda
docs: add README
hao0516hsu Sep 1, 2023
10fdc5c
Update README.md
hao0516hsu Sep 1, 2023
10824c1
fix: avatar-img in right.hbs
yanghaotse Sep 1, 2023
fdf9a6f
fix: sidebar width
yanghaotse Sep 1, 2023
d8d70f6
feat: add post-modal in user-tweets & user-likes & user-reply & user-…
yanghaotse Sep 1, 2023
0751731
fix: remove current user from right.hbs
yanghaotse Sep 1, 2023
a09f334
feat: add topUser in getTweet
yanghaotse Sep 1, 2023
97e860f
add href on user-avatar & user-name
yanghaotse Sep 1, 2023
226f1c5
feat: add href on tweets
yanghaotse Sep 1, 2023
4adfac5
fix: add avatar-img href & edit reply account in tweet.hbs
yanghaotse Sep 1, 2023
121f525
Merge pull request #26 from Zephzer/readme
Iris5410 Sep 2, 2023
e1b0342
Merge pull request #27 from Zephzer/feature/edit-modify
Iris5410 Sep 2, 2023
1dafb1b
modify get api btn eventlistener
Zephzer Sep 2, 2023
fc9395e
fix followship route
Iris5410 Sep 2, 2023
d51336d
Merge pull request #28 from Zephzer/feature/url
yanghaotse Sep 2, 2023
cdaddee
Merge remote-tracking branch 'origin' into Feature/user-function
yanghaotse Sep 2, 2023
a2a1b2b
Merge pull request #29 from Zephzer/feature/RWD
hao0516hsu Sep 2, 2023
5579719
Merge remote-tracking branch 'origin' into Feature/user-function
yanghaotse Sep 2, 2023
361b197
add password type in user-setting
yanghaotse Sep 2, 2023
fd7a50d
fix: avatar-img in right.hbs
yanghaotse Sep 2, 2023
d00e882
Merge pull request #30 from Zephzer/Feature/feature-completion
Zephzer Sep 2, 2023
1041df3
fix: add verification in signup page
hao0516hsu Sep 2, 2023
c604de5
Merge pull request #31 from Zephzer/feature/signup
yanghaotse Sep 2, 2023
3d37321
feat: add text-break in reply-modal
yanghaotse Sep 2, 2023
32dd7aa
fix: adjust reply-modal to center
yanghaotse Sep 2, 2023
7d36913
fix: avatar-img in user-likes
yanghaotse Sep 2, 2023
084ea9d
fix: add currentUserId in getTweet
yanghaotse Sep 2, 2023
c2b9cc7
Merge pull request #32 from Zephzer/Feature/feature-completion
Iris5410 Sep 3, 2023
a43919d
style: tweet.hbs add post-modal
Iris5410 Sep 3, 2023
b6726c2
fix: homepage photo and README
hao0516hsu Sep 3, 2023
b33855b
fix: modify layout settings of user photo in admin page
hao0516hsu Sep 3, 2023
744d87f
Merge pull request #34 from Zephzer/readme
Zephzer Sep 3, 2023
a285c9a
Merge pull request #33 from Zephzer/adjust-style
hao0516hsu Sep 3, 2023
1522064
style: add scroll to right-sidebar
Iris5410 Sep 3, 2023
9a7bd97
add required to profile-modal input
Iris5410 Sep 3, 2023
62ecec7
feat: add slice to topUser
Zephzer Sep 3, 2023
df56fef
Merge pull request #35 from Zephzer/style/right-sidebar
hao0516hsu Sep 3, 2023
a18d762
Merge pull request #36 from Zephzer/feature/topUser-10
Zephzer Sep 3, 2023
1922c42
feat:add slice
Zephzer Sep 3, 2023
09715bd
Merge pull request #37 from Zephzer/feature/topUser10
yanghaotse Sep 3, 2023
816f0db
reply-modal validation test (invalid)
yanghaotse Sep 3, 2023
b72ab45
Merge remote-tracking branch 'origin' into Feature/feature-completion
yanghaotse Sep 3, 2023
647f727
feat: add validation in reply-modal
yanghaotse Sep 3, 2023
5c0bcbd
Merge pull request #39 from Zephzer/Feature/reply-modal-validation
Zephzer Sep 3, 2023
f1877a0
fixed
Zephzer Sep 4, 2023
2d42987
Merge pull request #40 from Zephzer/feature/avatar
hao0516hsu Sep 4, 2023
19f2854
fix
Zephzer Sep 4, 2023
6521042
Merge pull request #41 from Zephzer/feature/test
Zephzer Sep 4, 2023
f7daad8
fix: change demo url
hao0516hsu Sep 4, 2023
ff4199d
Merge pull request #42 from Zephzer/readme
Iris5410 Sep 4, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
IMGUR_CLIENT_ID=
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -84,4 +84,6 @@ typings/
.fusebox/

# DynamoDB Local files
.dynamodb/
.dynamodb/

temp/
1 change: 1 addition & 0 deletions Procfile
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
web: NODE_ENV=production node app.js
81 changes: 81 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
# Simple Twitter - Alphitter
![image](public/photos/homepage.png)
**可點擊[Demo](https://vast-gorge-80772-a3d6b2e88ad8.herokuapp.com/signin) ,查看專案預覽!**

## 專案簡介
> 本專案係以Twitter(今已改名為X)的架構所打造社群網站。

此網站能提供以下服務:
1. 註冊及登入帳號:
- **使用者能夠建立帳號,建立屬於自己的社群!**
- 有針對註冊帳號及登入帳號進行錯誤處理。
- 前後台登入路徑分離。
- 透過身分驗證,能夠有效阻擋一般使用者進入後台,管理員也無法進入前台。
2. 個人頁面:
- 使用者能夠修改帳號或密碼等登入資訊,且一樣會有驗證。
- 使用者能夠新增自我介紹或上傳個人照片等個人資料設定,展現自我!
- 使用者可以在個人頁面查看推文、回覆、或是喜歡內容的紀錄。
- 使用者亦能查看追隨者和被追隨者的清單。
3. 社群互動:
- 使用者能透過左側功能列的推文紐、或是首頁最上方的發文框,無時無刻發布推文。
- 使用者亦能夠對喜歡的推文按下Like。
- 使用者更能夠回覆有趣的推文,進行議題討論。
- 使用者還能夠追隨對感興趣的用戶,擴展社群(當然,若是之後不感興趣也可以取消追隨)。
- 主頁面右側會呈現前十大活躍用戶給使用者查看。
4. 後台監測:
- 管理員可於後台查看推文清單,了解議題的脈動。
- 管理員可於後台查看使用者活躍資料。
- 管理員可於後台刪除不當言論,維持論壇環境。

## 環境需求與相關套件
1. Node.js
2. MySQL (MySQL Workbench 8.0)
3. npm(Node Package Manager)
4. 環境檔(.env)

## 專案安裝與執行步驟
1. 請先確認「環境建置與需求」第1和2點所提及的程式皆已安裝。
2. 將此專案clone到本地。
3. 初始化專案-開啟終端機,在專案資料夾執行:
```
cd [filePath] # [filePath]為專案資料夾的路徑
npm init -y
```
4. 接著在終端機依序安裝套件(請見package.json的dependencies和devDependencies):
```
# 安裝dependencies的套件
# 以"express": "^4.16.4"為例,執行
npm install express@4.16.4
```
```
# 安裝devDependencies的套件
# 以"proxyquire": "^2.1.3"為例,執行
npm install -D proxyquire@2.1.3
```
5. 環境檔-在目標資料夾新增副檔名為**env**的檔案,私密資訊皆紀錄在**env.example**,請自行設定到內文中。
```
# .env的內文
IMGUR_CLIENT_ID=[yourSecret] # [yourSecret]為您的私密資訊
```
6. 資料庫設定-請在終端機藉由Sequelize,將Migration和Model的設定導入到MySql中。
```
npx sequelize db:migrate
```
7. 種子資料-請將種子資料匯入DB,做為初始化的測試資料。
```
npx sequelize db:seed:all
```
8. 在終端機啟動伺服器,成功或失敗皆會有通知訊息。
```
# 啟動方法1
npm run start (node app.js)
```
```
# 啟動方法2
npm run dev (nodemon app.js)
```
9. 在瀏覽器輸入 http://localhost:3000 ,即可連線。

## 相關設計
### 系統流程
![image](public/photos/twitter_flow.png)
51 changes: 45 additions & 6 deletions app.js
Original file line number Diff line number Diff line change
@@ -1,13 +1,52 @@
if (process.env.NODE_ENV !== 'production') {
require('dotenv').config()
}
// 引入模組
const express = require('express')
const helpers = require('./_helpers');
const handlebars = require('express-handlebars')
const methodOverride = require('method-override')
const session = require('express-session')
const flash = require('connect-flash')
// 引入路由
const routes = require('./routes/index')
// 引入helper
const { getUser } = require('./helpers/auth-helpers')
const handlebarsHelpers = require('./helpers/handlebars-helpers')
const passport = require('./config/passport')
const SESSION_SECRET = 'secret'

// 建立app
const app = express()
const port = 3000
const port = process.env.PORT || 3000

// use helpers.getUser(req) to replace req.user
// use helpers.ensureAuthenticated(req) to replace req.isAuthenticated()

app.get('/', (req, res) => res.send('Hello World!'))

// Handlebars 設定
app.use(express.static('public'))
app.engine('hbs', handlebars({ extname: '.hbs', defaultLayout: 'main', helpers: handlebarsHelpers }))
app.set('view engine', 'hbs')
app.use(express.urlencoded({ extended: true }))
app.use(express.json())
app.use(methodOverride('_method'))
app.use(express.static('public'))

app.use(session({ secret: SESSION_SECRET, resave: false, saveUninitialized: false }))
app.use(passport.initialize())
app.use(passport.session())
app.use(flash())
app.use((req, res, next) => {
res.locals.success_messages = req.flash('success_messages')
res.locals.error_messages = req.flash('error_messages')
res.locals.warning_messages = req.flash('warning_messages')
res.locals.notice_messages = req.flash('notice_messages')
res.locals.user = getUser(req)
next()
})


// 使用路由器
app.use(routes)

app.listen(port, () => console.log(`Example app listening on port ${port}!`))

module.exports = app
module.exports = app
6 changes: 1 addition & 5 deletions config/config.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,7 @@
"logging": false
},
"production": {
"username": "root",
"password": null,
"database": "database_production",
"host": "127.0.0.1",
"dialect": "mysql"
"use_env_variable": "MYSQL_DATABASE_URL"
},
"travis": {
"username": "travis",
Expand Down
44 changes: 44 additions & 0 deletions config/passport.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
const passport = require('passport')
const LocalStrategy = require('passport-local')
const bcrypt = require('bcryptjs')
const { User, Tweet } = require('../models')


// set up Passport strategy
passport.use(new LocalStrategy(
// customize user field
{
usernameField: 'account',
passwordField: 'password',
passReqToCallback: true
},
// authenticate user
(req, account, password, cb) => {
User.findOne({ where: { account } })
.then(user => {
if (!user) return cb(null, false, req.flash('error_messages', '帳號不存在!'))
if (req.route.path === '/signin' && user.toJSON().role === 'admin') return cb(null, false, req.flash('error_messages', '帳號不存在!'))
if (req.route.path === '/admin/signin' && user.toJSON().role === 'user') return cb(null, false, req.flash('error_messages', '帳號不存在!'))

bcrypt.compare(password, user.password).then(res => {
if (!res) return cb(null, false, req.flash('error_messages', '帳號不存在!'))
return cb(null, user)
})
})
}
))
// serialize and deserialize user
passport.serializeUser((user, cb) => {
cb(null, user.id)
})
passport.deserializeUser((id, cb) => {
User.findByPk(id, {
include: [
{ model: Tweet, as: 'LikedTweets' },
{ model: User, as: 'Followers' },
{ model: User, as: 'Followings' }
]
}).then(user => cb(null, user.toJSON()))
.catch(err => cb(err))
})
module.exports = passport
64 changes: 64 additions & 0 deletions controllers/admin-controller.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
const { Tweet, User, Like, Reply, sequelize } = require('../models')
const { Op } = require('sequelize')
const controllerHelper = require('../helpers/controller-helpers')
const adminController = {
getTweets: (req, res, next) => {
Tweet.findAll({
include: [User],
raw: true,
nest: true
})
.then(tweets => {
const maxLength = 50
tweets = tweets.map(tweet => ({
...tweet,
description: tweet.description.slice(0, maxLength)
}))
res.render('admin/tweets', { tweets })
})
.catch(err => next(err))
},
getUsers: (req, res, next) => {
User.findAll({
where: { [Op.or]: [{ role: 'user' }, { role: null }] },
attributes: {
name : 'name',
account: 'account',
cover: 'cover',
avatar: 'avatar',
include: [[sequelize.literal('(SELECT COUNT(*) FROM Tweets WHERE Tweets.user_id = User.id)'), 'tweetsCount'],
[sequelize.literal('(SELECT COUNT(*) FROM Followships WHERE Followships.follower_id = User.id)'), 'Followings'],
[sequelize.literal('(SELECT COUNT(*) FROM Followships WHERE Followships.following_id = User.id)'), 'Followers'],
[sequelize.literal('(SELECT COUNT(*) FROM Likes LEFT JOIN Tweets ON Tweets.id = Likes.tweet_id WHERE Tweets.user_id = User.id)'),
'likesCount']
]
},
order: [[sequelize.literal('tweetsCount'), 'DESC']],
raw: true
})
.then(users => {
return users.map(user => ({
...user,
tweetsCount: controllerHelper.ifThousand(user.tweetsCount),
likesCount: controllerHelper.ifThousand(user.likesCount)
}))
})
.then(users => {
res.render('admin/users', { users })
})
.catch(err => next(err))
},
deleteTweet: (req, res, next) => {
const id = req.params.id
Tweet.findByPk(id)
.then(tweet => {
if (!tweet) throw new Error("推文不存在")
return Reply.destroy({ where: { TweetId: id } })
})
.then(() => Like.destroy({ where: { TweetId: id } }))
.then(() => Tweet.destroy({ where: { id } }))
.then(() => res.redirect('/admin/tweets'))
}
}

module.exports = adminController
34 changes: 34 additions & 0 deletions controllers/api-controller.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
const { User } = require('../models')
const helper = require('../_helpers')

const apiController = {
editApi: (req, res, next) => {
const id = Number(helper.getUser(req).id)
if (id !== Number(req.params.id)) {
return res.json({ status: 'error' })
}
return User.findByPk(id, { raw: true })
.then(user => {
if (!user) throw new Error('使用者不存在')
return res.status(200).json(user)
})
.catch(err => next(err))
},
postApi: (req, res, next) => {
const { name } = req.body
const id = Number(helper.getUser(req).id)
if (id !== Number(req.params.id)) {
return res.json({ status: 'error' })
}
return User.findByPk(id)
.then(user => {
if (!user) throw new Error('使用者不存在')
return user.update({ name })
})
.then(user => res.json({ status: 'success', user }))
.catch(err => next(err))
}
}


module.exports = apiController
Loading