├── .gitignore ├── images ├── Untitled.png └── Untitled1.png ├── Config └── mongoConfig.js ├── README.md ├── Models ├── blogSchema.js └── userSchema.js ├── package.json ├── Middleware └── authmiddleware.js ├── server.js └── routes ├── authrouter.js ├── userRouter.js └── blogrouter.js /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | node_modules/ 3 | .env -------------------------------------------------------------------------------- /images/Untitled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shannathomp/Blog-Api/HEAD/images/Untitled.png -------------------------------------------------------------------------------- /images/Untitled1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shannathomp/Blog-Api/HEAD/images/Untitled1.png -------------------------------------------------------------------------------- /Config/mongoConfig.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose') 2 | module.exports = async () => { 3 | try { 4 | await mongoose.connect(process.env.MONGODB_URI) 5 | mongoose.connection 6 | console.log('MongoDB connected'); 7 | } catch (error) { 8 | 9 | } 10 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Installation: 2 | No Installation needed. Web app. 3 | ## Blogapi: 4 | This is a finance blog Api is just a backend database created for storage of users. Api just the middleman connecting and communicating the backend with the front end. 5 | 6 | ## Dependencies: 7 | bcrypt, dotenv, express, jsonwebtoken, mongoose, morgan, helmet. 8 | 9 | ## Main Features 10 | 11 | 12 | 13 | 14 | ## Demo 15 | ![](./images/Untitled.png) 16 | -------------------------------------------------------------------------------- /Models/blogSchema.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose') 2 | 3 | 4 | const blogSchema = mongoose.Schema({ 5 | created_by: { 6 | type: String, 7 | required: true 8 | }, 9 | 10 | blog_title: { 11 | type: String, 12 | required: true 13 | }, 14 | 15 | blog_content:{ 16 | type: String, 17 | required:true 18 | }, 19 | 20 | private: { 21 | type: Boolean, 22 | default: false 23 | }, 24 | 25 | created_at: { 26 | type: Date, 27 | default: Date.now() 28 | } 29 | }) 30 | 31 | module.exports = mongoose.model('blog', blogSchema) -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "blog-api", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "server.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1", 8 | "start": "node server.js" 9 | }, 10 | "keywords": [], 11 | "author": "Shanna Thompson", 12 | "license": "ISC", 13 | "dependencies": { 14 | "bcrypt": "^5.0.1", 15 | "dotenv": "^16.0.1", 16 | "express": "^4.18.1", 17 | "express-validator": "^6.14.1", 18 | "helmet": "^5.1.0", 19 | "jsonwebtoken": "^8.5.1", 20 | "mongoose": "^6.3.8", 21 | "morgan": "^1.10.0" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Middleware/authmiddleware.js: -------------------------------------------------------------------------------- 1 | const jwt = require('jsonwebtoken') 2 | 3 | module.exports = (req, res, next) => { 4 | // get the token from the headers object 5 | const token = req.header('x-auth-token') 6 | 7 | // If NO token 8 | if (!token) { 9 | return res.json('No Token Access denied!') 10 | } 11 | // If we have a token 12 | try { 13 | const decoded = jwt.verify(token, process.env.SECRET_KEY) 14 | 15 | console.log(decoded); 16 | 17 | next() 18 | } catch (error) { 19 | console.log(error); 20 | res.status(400).json('Token not valid') 21 | } 22 | } -------------------------------------------------------------------------------- /Models/userSchema.js: -------------------------------------------------------------------------------- 1 | 2 | const mongoose = require('mongoose') 3 | const userSchema = mongoose.Schema({ 4 | username: { 5 | type: String, 6 | required: true 7 | }, 8 | 9 | email: { 10 | type: String, 11 | required: true, 12 | unique: true 13 | }, 14 | 15 | birthday: { 16 | type: Date, 17 | required: true 18 | }, 19 | 20 | age: { 21 | type: Number, 22 | required: true 23 | }, 24 | 25 | password: { 26 | type: String, 27 | required: true, 28 | }, 29 | 30 | Created_at: { 31 | type: Date, 32 | default: Date.now() 33 | } 34 | }) 35 | 36 | module.exports = mongoose.model('user', userSchema) 37 | -------------------------------------------------------------------------------- /server.js: -------------------------------------------------------------------------------- 1 | // PART ONE - Create your Server & Routers: 2 | // - Server 3 | // - Mongo Connected 4 | // - Middleware 5 | // - Routes Connected 6 | // - Routes 7 | // - /auth 8 | // - /blogs 9 | 10 | const express = require('express') 11 | const authrouter = require('./routes/authrouter') 12 | const blogrouter = require('./routes/blogrouter') 13 | const mongoConfig = require('./Config/mongoConfig') 14 | const userRouter = require('./routes/userRouter') 15 | const morgan = require('morgan') 16 | const helmet = require('helmet') 17 | require('dotenv').config() 18 | const app = express() 19 | 20 | 21 | app.use(express.json()) 22 | app.use(morgan('dev')) 23 | app.use(helmet()) 24 | const port = process.env.PORT || 3000 25 | 26 | app.use('/blogpost', blogrouter) 27 | app.use('/user', userRouter ) 28 | app.use('/auth', authrouter) 29 | 30 | app.get('/',(req,res) => { 31 | // res.status(200).json() 32 | res.send('

Welcome To Shanna\'s Finance Blog!!!

') 33 | }) 34 | 35 | app.listen(port, ()=> { 36 | console.log(`we running on port ${port}.....`); 37 | mongoConfig() 38 | }) -------------------------------------------------------------------------------- /routes/authrouter.js: -------------------------------------------------------------------------------- 1 | const express = require('express') 2 | const bcrypt = require('bcrypt') 3 | const jwt = require('jsonwebtoken') 4 | const UserModel = require('../Models/userSchema') 5 | 6 | const router = express.Router() 7 | 8 | //* User Login 9 | router.post('/', async (req, res) => { 10 | const userData = req.body 11 | 12 | 13 | try { 14 | const user = await UserModel.findOne({email: userData.email}) 15 | 16 | if (!user){ 17 | return res.json('User not found!') 18 | } 19 | 20 | 21 | const isMatch = await bcrypt.compare(userData.password, user.password) 22 | 23 | if (!isMatch){ 24 | return res.json('Password is not a match!') 25 | } 26 | // res.status(200).json('success!') 27 | 28 | const payload = { 29 | id: user._id, 30 | email: user.email 31 | } 32 | 33 | const TOKEN = jwt.sign(payload, process.env.SECRET_KEY, { expiresIn: "2 Days"}) 34 | 35 | res.status(201).json({ 36 | user: user, 37 | token: TOKEN 38 | }) 39 | 40 | } catch (error) { 41 | console.log(error); 42 | res.status(500).json('Server Error') 43 | } 44 | 45 | 46 | 47 | }) 48 | 49 | 50 | 51 | 52 | 53 | module.exports = router -------------------------------------------------------------------------------- /routes/userRouter.js: -------------------------------------------------------------------------------- 1 | const express = require('express') 2 | const UserModel = require('../Models/userSchema') 3 | const bcrypt = require('bcrypt') 4 | // const jwt = require('jsonwebtoken') 5 | const router = express.Router() 6 | const middleware = require('../Middleware/authmiddleware') 7 | 8 | 9 | router.get('/', async (req,res) => { 10 | 11 | try { 12 | const users = await UserModel.find() 13 | res.status(200).json(users) 14 | } catch (error) { 15 | console.log(error); 16 | } 17 | }) 18 | 19 | router.get('/:id', middleware, async (req,res) => { 20 | const id = req.params.id 21 | 22 | try { 23 | const user = await UserModel.findById(id) 24 | res.status(200).json(user) 25 | } catch (error) { 26 | console.error(error); 27 | } 28 | }) 29 | 30 | 31 | 32 | 33 | router.post('/', async (req, res) => { 34 | const userData = req.body 35 | try { 36 | const userExist = await UserModel.findOne({email: userData.email}) 37 | 38 | if (userExist){ 39 | return res.json({msg: 'User already exist'}) 40 | } 41 | const SALT = await bcrypt.genSalt(12) 42 | const hashedPassword = await bcrypt.hash(userData.password, SALT) 43 | userData.password = hashedPassword 44 | const user = await UserModel.create(userData) 45 | res.status(200).json(user) 46 | } catch (error) { 47 | res.status(400).json('You already created one') 48 | } 49 | }) 50 | 51 | router.delete('/:id', async (req,res) => { 52 | const id =req.params.id 53 | try { 54 | const user = await UserModel.findByIdAndDelete(id) 55 | res.status(204).json(user) 56 | } catch (error) { 57 | console.error(error); 58 | } 59 | }) 60 | 61 | module.exports = router 62 | 63 | 64 | -------------------------------------------------------------------------------- /routes/blogrouter.js: -------------------------------------------------------------------------------- 1 | const express = require('express') 2 | const blogModel = require('../Models/blogSchema') 3 | const router = express.Router() 4 | // const middleware = require('../Middleware/authmiddleware') 5 | 6 | 7 | 8 | router.get('/', async (req,res) => { 9 | try { 10 | const blogs = await blogModel.find() 11 | res.status(200).json(blogs) 12 | } catch (error) { 13 | console.error(error); 14 | } 15 | }) 16 | 17 | router.post('/', async (req,res) => { 18 | const blogData = req.body 19 | 20 | 21 | try { 22 | const blogs = await blogModel.create(blogData) 23 | res.status(200).json(blogs) 24 | } catch (error) { 25 | console.error(error); 26 | res.status(400).json('Bad request!') 27 | } 28 | }) 29 | 30 | router.get('/:id', async (req,res) => { 31 | const id = req.params.id 32 | 33 | try { 34 | const blog = await blogModel.findById(id) 35 | res.status(200).json(blog) 36 | } catch (error) { 37 | console.error(error); 38 | } 39 | }) 40 | 41 | router.put('/:id', async (req,res) => { 42 | const id = req.params.id 43 | const newData = req.body 44 | try { 45 | const blog = await blogModel.findByIdAndUpdate(id, newData, {new: true}) 46 | res.status(202).json(blog) 47 | } catch (error) { 48 | console.error(error); 49 | } 50 | }) 51 | 52 | router.delete('/:id', async (req,res) => { 53 | const id =req.params.id 54 | try { 55 | const blog = await blogModel.findByIdAndDelete(id) 56 | res.status(204).json(blog) 57 | } catch (error) { 58 | console.error(error); 59 | } 60 | }) 61 | 62 | module.exports = router --------------------------------------------------------------------------------