├── .gitignore ├── routes └── drink.js ├── README.md ├── package.json ├── views └── index.ejs ├── models └── DrinkModel.js ├── server.js └── controller └── drinkController.js /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules -------------------------------------------------------------------------------- /routes/drink.js: -------------------------------------------------------------------------------- 1 | const express = require('express') 2 | const { getDrink, getSingleDrink, createDrink, uploadImage, deleteDrink, updateDrink } = require('../controller/drinkController') 3 | const router = express.Router() 4 | 5 | router.get('/', getDrink) 6 | 7 | router.get('/:id', getSingleDrink) 8 | 9 | router.post('/', uploadImage, createDrink) 10 | 11 | router.delete('/:id', deleteDrink) 12 | 13 | router.patch('/:id', updateDrink) 14 | 15 | module.exports = router -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # This is Drink menu backend project build using Node.js, 2 | 3 | ## technology used 4 | 5 | *Node.js 6 | 7 | *express.js 8 | 9 | *mongodb 10 | 11 | *multer 12 | 13 | # VIEW The project in Website 14 | 15 | ## "[github.com/AXG-coder/drink-menu-frontend](https://github.com/AXG-coder/drink-menu-frontend)" 16 | #The problem with the images not showing up is using a free hosting 17 | 18 | ## To run in 19 | 20 | ``` 21 | $ npm install 22 | ``` 23 | 24 | ``` 25 | $ npm run dev 26 | ``` 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "drink-menu-backend", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "server.js", 6 | "scripts": { 7 | "start": "node server.js", 8 | "dev": "nodemon server.js" 9 | }, 10 | "keywords": [], 11 | "author": "", 12 | "license": "ISC", 13 | "dependencies": { 14 | "cors": "^2.8.5", 15 | "dotenv": "^16.0.3", 16 | "ejs": "^3.1.8", 17 | "express": "^4.18.2", 18 | "mongoose": "^6.7.1", 19 | "multer": "^1.4.5-lts.1" 20 | }, 21 | "devDependencies": { 22 | "nodemon": "^2.0.20" 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /views/index.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | drink-menu-api 9 | 10 | 11 | 12 |

this is A drink menu api

13 |

get /api/drink to render drink list

14 |

get /api/drink/:id to render Single drink

15 |

post /api/drink/ to add Single drink

16 |

patch /api/drink/:id to update drink

17 | 18 | 19 | -------------------------------------------------------------------------------- /models/DrinkModel.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose') 2 | 3 | const Schema = mongoose.Schema 4 | 5 | 6 | const drinkSchema = new Schema({ 7 | drinkName: { 8 | type: String, 9 | required: true 10 | }, 11 | typOfDrink: { 12 | type: String, 13 | required: true 14 | }, 15 | price: { 16 | type: Number, 17 | required: true 18 | }, 19 | imageName: { 20 | type: String, 21 | required: true 22 | } 23 | }, { timestamps: true }) 24 | 25 | module.exports = mongoose.model('DrinkList', drinkSchema) -------------------------------------------------------------------------------- /server.js: -------------------------------------------------------------------------------- 1 | const express = require('express') 2 | require('dotenv').config() 3 | const mongoose = require('mongoose') 4 | const DrinkRoutes = require('./routes/drink') 5 | const cors = require('cors') 6 | 7 | 8 | const app = express() 9 | 10 | app.use(express.json()) 11 | app.use(cors()) 12 | app.set('view engine', 'ejs') 13 | 14 | app.use('/uploads', express.static('uploads')) 15 | 16 | app.use((req, res, next) => { 17 | console.log(req.path, req.method) 18 | next() 19 | }) 20 | 21 | app.get('/', async (req, res) => { 22 | res.render('index') 23 | }) 24 | 25 | app.use('/api/drink', DrinkRoutes) 26 | 27 | mongoose.connect(process.env.MONG_URI) 28 | .then(() => { 29 | app.listen(process.env.PORT || 5000, () => { 30 | console.log('listening on port: ', process.env.PORT) 31 | console.log('connected to mongoDB') 32 | }) 33 | }) 34 | .catch((error) => { 35 | console.log(error) 36 | }) 37 | 38 | -------------------------------------------------------------------------------- /controller/drinkController.js: -------------------------------------------------------------------------------- 1 | const DrinkList = require('../models/DrinkModel') 2 | const mongoose = require('mongoose') 3 | const multer = require('multer') 4 | 5 | const getDrink = async (req, res) => { 6 | const drink = await DrinkList.find({}).sort({ createdAt: -1 }) 7 | 8 | res.status(200).json(drink) 9 | } 10 | 11 | const getSingleDrink = async (req, res) => { 12 | const { id } = req.params 13 | 14 | if (!mongoose.Types.ObjectId.isValid(id)) { 15 | return res.status(404).json({ error: 'No drink found' }) 16 | } 17 | const SingleDrink = await DrinkList.findById(id) 18 | 19 | if (!SingleDrink) { 20 | return res.status(404).json({ error: 'NO drink found' }) 21 | } 22 | 23 | res.status(200).json(SingleDrink) 24 | } 25 | // img upload functions 26 | const muterConfig = multer.diskStorage({ 27 | destination: (req, file, callback) => { 28 | callback(null, 'uploads/') 29 | }, 30 | filename: (req, file, callback) => { 31 | callback(null, file.originalname) 32 | } 33 | }) 34 | 35 | const isImage = (req, file, callback) => { 36 | if (file.mimetype.startsWith('image')) { 37 | callback(null, true) 38 | } else { 39 | callback(new Error('Only Image is Allowed...')) 40 | } 41 | } 42 | 43 | const upload = multer({ storage: muterConfig, fileFilter: isImage, }) 44 | 45 | const uploadImage = upload.single('image') 46 | 47 | 48 | // post req 49 | const createDrink = (req, res) => { 50 | const drinkList = new DrinkList({ 51 | drinkName: req.body.drinkName, 52 | typOfDrink: req.body.typOfDrink, 53 | price: req.body.price, 54 | imageName: req.file.path 55 | }) 56 | 57 | drinkList.save() 58 | .then(() => res.json({ done: 'New drink has been add' })) 59 | .catch((error) => res.status(400).json(`pls Add ${error}`)) 60 | 61 | 62 | } 63 | 64 | const deleteDrink = async (req, res) => { 65 | const { id } = req.params 66 | 67 | if (!mongoose.Types.ObjectId.isValid(id)) { 68 | return res.status(404).json({ error: "No drink found" }) 69 | } 70 | 71 | const drink = await DrinkList.findOneAndDelete({ _id: id }) 72 | 73 | if (!drink) { 74 | return res.status(404).json({ error: 'No drink found' }) 75 | } 76 | 77 | res.status(200).json(drink) 78 | 79 | } 80 | 81 | const updateDrink = async (req, res) => { 82 | const { id } = req.params 83 | 84 | if (!mongoose.Types.ObjectId.isValid(id)) { 85 | return res.status(404).json({ error: 'No drink found' }) 86 | } 87 | 88 | const drink = await DrinkList.findByIdAndUpdate({ _id: id }, { 89 | ...req.body 90 | }) 91 | 92 | if (!drink) { 93 | return res.status(404).json({ error: 'No drink found' }) 94 | } 95 | 96 | res.status(200).json(drink) 97 | } 98 | 99 | module.exports = { 100 | getDrink, getSingleDrink, createDrink, uploadImage, deleteDrink, updateDrink 101 | } --------------------------------------------------------------------------------