Skip to content

Commit

Permalink
Merge pull request #3 from Antarctic-penguin/R04
Browse files Browse the repository at this point in the history
R04
  • Loading branch information
blade8128ch authored Nov 8, 2023
2 parents bac6966 + 42502a9 commit aeec7d7
Show file tree
Hide file tree
Showing 20 changed files with 1,155 additions and 549 deletions.
1 change: 1 addition & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
JWT_SECRET=
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
21 changes: 15 additions & 6 deletions app.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,27 @@ if (process.env.NODE_ENV !== 'production') {
require('dotenv').config()
}
const express = require('express')
const helpers = require('./_helpers');
const passport = require('./config/passport')
//const helpers = require('./_helpers')
const { getUser } = require('./_helpers')
const { apis } = require('./routes')

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

app.use(express.urlencoded({ extended: true }))
app.use(express.json())

app.use(passport.initialize())
// use helpers.getUser(req) to replace req.user
function authenticated(req, res, next){
// passport.authenticate('jwt', { ses...
};
app.use((req, res, next) => {
//res.locals.success_messages = req.flash('success_messages')
//res.locals.error_messages = req.flash('error_messages')
res.locals.user = getUser(req)
next()
})

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

app.use('/api', apis)
app.listen(port, () => console.log(`Example app listening on port ${port}!`))
Expand Down
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
39 changes: 39 additions & 0 deletions config/passport.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,44 @@
const passport = require('passport')
const LocalStrategy = require('passport-local')
const passportJWT = require('passport-jwt')
const bcrypt = require('bcryptjs')
const { User } = require('../models')

const JWTStrategy = passportJWT.Strategy
const ExtractJWT = passportJWT.ExtractJwt


passport.use(new LocalStrategy(
// customize user field
{
usernameField: 'account',
passwordField: 'password',
passReqToCallback: true
},
// authenticate user or admin
(req, account, password, cb) => {
User.findOne({ where: { account } })
.then(user => {
if (!user) return cb(Error('帳號不存在'), false)

bcrypt.compare(password, user.password).then(res => {
if (!res) return cb(Error('密碼輸入錯誤!'), false)

return cb(null, user)
})
})
}
))

const jwtOptions = {
jwtFromRequest: ExtractJWT.fromAuthHeaderAsBearerToken(),
secretOrKey: process.env.JWT_SECRET
}

passport.use(new JWTStrategy(jwtOptions, (jwtPayload, cb) => {
User.findByPk(jwtPayload.id)
.then(user => cb(null, user))
.catch(err => cb(err))
}))

module.exports = passport
11 changes: 10 additions & 1 deletion controllers/apis/admin-controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,15 @@ const adminServices = require('../../services/admin-services')
const adminController = {
getTweets: (req, res, next) => {
adminServices.getTweets(req, (err, data) => err ? next(err) : res.json(data))
}
},
postTweet: (req, res, next) => {
adminServices.postTweet(req, (err, data) => err ? next(err) : res.json({ status: 'success', data }))
},
deleteTweet: (req, res, next) => {
adminServices.deleteTweet(req, (err, data) => err ? next(err) : res.json({ status: 'success', data }))
},
getUsers: (req, res, next) => {
adminServices.getUsers(req, (err, data) => err ? next(err) : res.json(data))
},
}
module.exports = adminController
13 changes: 13 additions & 0 deletions controllers/apis/tweet-controller.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
const tweetServices = require('../../services/tweet-services')
const tweetController = {
getTweets: (req, res, next) => {
tweetServices.getTweets(req, (err, data) => err ? next(err) : res.json(data))
},
getTweet: (req, res, next) => {
tweetServices.getTweet(req, (err, data) => err ? next(err) : res.json(data))
},
postTweet: (req, res, next) => {
tweetServices.postTweet(req, (err, data) => err ? next(err) : res.json({ status: 'success', data }))
},
}
module.exports = tweetController
20 changes: 20 additions & 0 deletions controllers/apis/user-controller.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
const jwt = require('jsonwebtoken')
const userController = {
signIn: (req, res, next) => {
try {
const userData = req.user.toJSON()
delete userData.password
const token = jwt.sign(userData, process.env.JWT_SECRET, { expiresIn: '30d' })
res.json({
status: 'success',
data: {
token,
user: userData
}
})
} catch (err) {
next(err)
}
}
}
module.exports = userController
20 changes: 20 additions & 0 deletions middleware/api-auth.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
const passport = require('../config/passport') // 引入 passport
const helpers = require('../_helpers')
//const authenticated = passport.authenticate('jwt', { session: false })
const authenticated = (req, res, next) => {
passport.authenticate('jwt', { session: false }, (err, user) => {
if (err || !user) return res.status(401).json({ status: 'error', message: 'unauthorized' })
req.user = user
next()
})(req, res, next)
}
const authenticatedAdmin = (req, res, next) => {
console.log(helpers.getUser(req))
if (helpers.getUser(req) && helpers.getUser(req).role === 'admin') return next()
return res.status(403).json({ status: 'error', message: 'permission denied' })
}

module.exports = {
authenticated,
authenticatedAdmin
}
26 changes: 26 additions & 0 deletions middleware/error-handler.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
module.exports = {
generalErrorHandler (err, req, res, next) {
if (err instanceof Error) {
req.flash('error_messages', `${err.name}: ${err.message}`)
} else {
req.flash('error_messages', `${err}`)
}
res.redirect('back')

next(err)
},
apiErrorHandler (err, req, res, next) {
if (err instanceof Error) {
res.status(err.status || 500).json({
status: 'error',
message: `${err.name}: ${err.message}`
})
} else {
res.status(500).json({
status: 'error',
message: `${err}`
})
}
next(err)
}
}
4 changes: 4 additions & 0 deletions middleware/multer.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
const multer = require('multer')
const upload = multer({ dest: 'temp/' })

module.exports = upload
Loading

0 comments on commit aeec7d7

Please sign in to comment.