api creation
Sun Jul 23 2023 09:21:59 GMT+0000 (Coordinated Universal Time)
Saved by @nelson22
package.json // this is to aviod CORS policy // this method will only work in dev mode "proxy": "http://localhost:4000", ----------------------------------------------------------------- .env // no space in between PORT=4000 -------------------------------------------------------- server.js const express = require('express'); // env package is required to load enviorment variables from env files require('dotenv').config(); // mongoose connects to mongoDB const mongoose = require('mongoose'); const workoutRoutes = require('./routes/workout'); // register app const app = express(); // this checks if any req is coming into the server and if it does then it passes it and attaches it app.use(express.json()); // connect to mongoDB mongoose.connect(process.env.MONGO_URI) .then(() => { // listen to port // process is object where all envirment variables are loaded app.listen(process.env.PORT, () => { console.log('listening on port', process.env.PORT); }) }) .catch(err => {console.log(err)}) // this means when we hit '/api/workouts' url then execute workoutRoutes app.use('/api/workouts', workoutRoutes); ----------------------------------------------------------------- routes > workout.js const express = require('express'); const {postWorkout, allWorkout, particularWorkout, deleteWorkout, updateWorkout} = require('../controllers/workoutController'); // this creates an instance of the router const router = express.Router(); const requireAuth = require('../middleware/requireAuth'); router.use(requireAuth); router.get('/', allWorkout); router.get('/:id', particularWorkout); router.post('/', postWorkout); router.delete('/:id', deleteWorkout); router.patch('/:id', updateWorkout); module.exports = router ----------------------------------------------------------------- models > workoutModels.js const mongoose = require('mongoose'); const Schema = mongoose.Schema; const workoutSchema = new Schema({ title: { type: String, required: true }, reps: { type: Number, required: true }, load: { type: Number, required: true }, user_id: { type: String, required: true } }, {timestamps: true}) module.exports = mongoose.model('Workout', workoutSchema); ----------------------------------------------------------------- controllers > workoutController.js const Workout = require('../models/workoutModel'); const mongoose = require('mongoose'); // get all workouts const allWorkout = async (req, res) => { const user_id = req.user._id; const workout = await Workout.find({user_id}) res.status(200).json(workout) } // get a particular workout const particularWorkout = async (req, res) => { const {id} = req.params; if(!mongoose.Types.ObjectId.isValid(id)){ return res.status(404).json({error: 'No such workout found'}); } const workout = await Workout.findById(id); if(!workout){ return res.status(400).json({error: 'No workouts found'}); } res.status(200).json(workout); } // post a workout const postWorkout = async (req, res) => { const {title, reps, load} = req.body const user_id = req.user._id try{ const workout = await Workout.create({title, reps, load, user_id}) res.status(200).json(workout) }catch(err){ res.status(400).json({error: err.message}); } } // delete a workout const deleteWorkout = async (req, res) => { const {id} = req.params; if(!mongoose.Types.ObjectId.isValid(id)){ return res.status(404).json({error: 'No such workout found'}); } const workout = await Workout.findOneAndDelete({_id: id}) if(!workout){ return res.status(400).json({error: 'No workouts found'}); } res.status(200).json(workout); } // update a workout const updateWorkout = async (req, res) => { const {id} = req.params; if(!mongoose.Types.ObjectId.isValid(id)){ return res.status(404).json({error: 'No such workout found'}); } const workout = await Workout.findOneAndUpdate({_id: id}, { ...req.body }) if(!workout){ return res.status(400).json({error: 'No workouts found'}); } res.status(200).json(workout) } module.exports = { postWorkout, allWorkout, particularWorkout, deleteWorkout, updateWorkout } ----------------------------------------------------------- middleware > requireAuth.js const jwt = require('jsonwebtoken'); const User = require('../models/userModel'); const requireAuth = async (req, res, next) => { const {authorization} = req.headers; if(!authorization){ return res.status(401).json({error: 'Authorization token required'}); } const token = authorization.split(' ')[1] try{ const {_id} = jwt.verify(token, process.env.SECRET); req.user = await User.findOne({_id}).select({_id}) next() }catch(error){ console.log(error); res.status(401).json({error: 'Request is not authorized'}) } } module.exports = requireAuth
Comments