Skip to content
Snippets Groups Projects
Commit cd9c56ff authored by Ludvig Damberg's avatar Ludvig Damberg
Browse files

Backend work

Login working
Register working
Web tokens working on register and login
parent 96cd47a4
No related branches found
No related tags found
No related merge requests found
MONGODB_URI=mongodb+srv://TDDD27:jZZQgFI4aRGrGuIw@uploadscluster.delrqyf.mongodb.net/?retryWrites=true&w=majority MONGODB_URI=mongodb+srv://TDDD27:jZZQgFI4aRGrGuIw@uploadscluster.delrqyf.mongodb.net/?retryWrites=true&w=majority
\ No newline at end of file
JWT_SECRET=TESTKEYFORTOKEN123
SALT=10
NODE_ENV=development
\ No newline at end of file
...@@ -2,9 +2,9 @@ const mongoose = require('mongoose') ...@@ -2,9 +2,9 @@ const mongoose = require('mongoose')
const express = require('express') const express = require('express')
const cors = require('cors') const cors = require('cors')
require('dotenv').config() require('dotenv').config()
const postModel = require('./models/UploadModel') const Routes = require('./routes/routes')
const uploadMiddleware = require('./middlewares/MulterMiddleware') const { errorHandler, notFound } = require('./middlewares/errorMiddleware')
const multer = require('multer')
const app = express() const app = express()
...@@ -29,20 +29,14 @@ mongoose.connect(process.env.MONGODB_URI) ...@@ -29,20 +29,14 @@ mongoose.connect(process.env.MONGODB_URI)
.catch(err => console.log(err)) .catch(err => console.log(err))
//Routes
app.post("/save", uploadMiddleware.single("photo"), (req,res) => { app.use(Routes)
const photo = req.file.filename
const post = new postModel({name:req.body.name,description: req.body.description, photo: photo}) //Error functions
post.save() app.use(notFound)
.then(console.log("Saved successfully")) app.use(errorHandler)
})
app.get('/posts', async (req,res) => {
\ No newline at end of file
const posts = await postModel.find()
res.send(posts)
})
const notFound = (req,res,next) => {
const error = new Error(`Not found ${req.originalUrl}`)
res.status(400)
next(error)
}
const errorHandler = (err,req,res,next) => {
const statusCode = res.statusCode === 200 ? 500 : res.statusCode
res.status(statusCode)
res.json({
message:err.message,
stack: process.env.NODE.ENV === "production" ? null : err.stack,
})
}
module.exports = {notFound,errorHandler}
\ No newline at end of file
const mongoose = require('mongoose')
const jwt = require('jsonwebtoken')
require('dotenv').config()
const passwordComplexity = require('joi-password-complexity')
const bcrypt = require('bcrypt')
const userSchema = new mongoose.Schema({
email:{
type: String,
required: true
},
username:{
type:String,
required: true
},
password:{
type:String,
required: true
}
},{
timestamps: true,
})
userSchema.pre('save', async function (next) {
if(!this.isModified('password')){
next()
}
const salt = await bcrypt.genSalt(10);
this.password = await bcrypt.hash(this.password, salt);
})
userSchema.methods.matchPassword = async function (enteredPassword) {
return await bcrypt.compare(enteredPassword,this.password)
}
const userModel = new mongoose.model('user',userSchema)
module.exports = userModel
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
...@@ -10,9 +10,13 @@ ...@@ -10,9 +10,13 @@
"author": "", "author": "",
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
"bcrypt": "^5.1.0",
"cors": "^2.8.5", "cors": "^2.8.5",
"dotenv": "^16.0.3", "dotenv": "^16.0.3",
"express": "^4.18.2", "express": "^4.18.2",
"express-async-handler": "^1.2.0",
"joi-password-complexity": "^5.1.0",
"jsonwebtoken": "^9.0.0",
"mongoose": "^7.0.3", "mongoose": "^7.0.3",
"multer": "^1.4.5-lts.1", "multer": "^1.4.5-lts.1",
"nodemon": "^2.0.22", "nodemon": "^2.0.22",
......
backend/public/uploads/1d07174c-0687-41d3-9cdc-98fd2e4ae0a8_.jpg

132 KiB

backend/public/uploads/bb539d72-f358-4056-a414-d57087a84692_.jpg

133 KiB

const {Router} = require('express')
const bcrypt = require("bcrypt")
const userModel = require('../models/user')
const postModel = require('../models/UploadModel')
const uploadMiddleware = require('../middlewares/MulterMiddleware')
const multer = require('multer')
const generateToken = require('../utils/generateToken')
const asyncHandler = require('express-async-handler')
const router = Router()
//Log in
router.post('/login',async (req,res) => {
const {email, password} = req.body
const user = await userModel.findOne({email})
if(user && (await user.matchPassword(password))){
res.json({
_id: user._id,
email:user.email,
username:user.username,
password:user.password,
token: generateToken(user._id)
})
console.log("Successfully logged in")
}
else{
console.log("wrong Credentials")
}
})
//Create post
router.post("/post", uploadMiddleware.single("photo"), (req,res) => {
const photo = req.file.filename
const post = new postModel({name:req.body.name,description: req.body.description, photo: photo})
post.save()
.then(console.log("Saved successfully"))
})
//Get posts
router.get('/posts', async (req,res) => {
const posts = await postModel.find()
res.send(posts)
})
//Register
router.post("/register", asyncHandler(async (req,res) => {
const {email,username,password} = req.body
const userExists = await userModel.findOne({email})
if(userExists){
res.status(404)
throw new Error("User Already exists")
}
const user = new userModel({
email,
username,
password
})
if(user){
res.json({
_id: user._id,
email:user.email,
username:user.username,
password:user.password,
token: generateToken(user._id)
})
await user.save()
}else{
console.log("error occured!")
}
}))
module.exports = router
\ No newline at end of file
const jwt = require("jsonwebtoken")
require('dotenv').config()
const generateToken = (id) => {
return jwt.sign({id}, process.env.JWT_SECRET,{
expiresIn: '1d',
})
}
module.exports = generateToken
\ No newline at end of file
...@@ -3,6 +3,9 @@ import React, {useState, useEffect} from 'react' ...@@ -3,6 +3,9 @@ import React, {useState, useEffect} from 'react'
import './styles.css' import './styles.css'
import Landing from './components/Landing' import Landing from './components/Landing'
import Post from './components/Post' import Post from './components/Post'
import SignUp from './components/SignUp'
import Login from './components/Login'
function App() { function App() {
...@@ -12,6 +15,7 @@ function App() { ...@@ -12,6 +15,7 @@ function App() {
const loadPosts = () => { const loadPosts = () => {
axios.get("http://localhost:5000/posts") axios.get("http://localhost:5000/posts")
.then((res) => { .then((res) => {
console.log(res.data) console.log(res.data)
...@@ -43,6 +47,8 @@ const loadPosts = () => { ...@@ -43,6 +47,8 @@ const loadPosts = () => {
) )
})}</div> })}</div>
</div> </div>
<SignUp/>
<Login/>
</> </>
); );
} }
......
import React from 'react'
import {useState} from 'react'
import axios from 'axios'
const Login = () => {
const[password,setPassword] = useState("")
const[email,setEmail] = useState("")
const Login = () => {
console.log({email,password})
axios.post("http://localhost:5000/login", {email, password})
.then((res) => {
console.log(res.data)
}).catch((err) => console.log(err))
}
return (
<div>
<input type='text' placeholder='Email' onChange={(e) => setEmail(e.target.value)}/>
<input type='text' placeholder='Password' onChange={(e) => setPassword(e.target.value)}/>
<button onClick={Login}>Sign up</button>
</div>
)
}
export default Login
\ No newline at end of file
import React from 'react'
import {useState} from 'react'
import axios from 'axios'
const SignUp = () => {
const[username,setUsername] = useState("")
const[password,setPassword] = useState("")
const[email,setEmail] = useState("")
const Signup = () => {
console.log({email,username,password})
const config = {
headers: {
"Content-type": "application/json",
},
};
axios.post("http://localhost:5000/register", {email,username,password},config)
.then((res) => {
console.log(res.data)
}).catch((err) => console.log(err))
}
return (
<div>
<input type='text' placeholder='Email' onChange={(e) => setEmail(e.target.value)}/>
<input type='text' placeholder='Username' onChange={(e) => setUsername(e.target.value)}/>
<input type='text' placeholder='Password' onChange={(e) => setPassword(e.target.value)}/>
<button onClick={Signup}>Sign up</button>
</div>
)
}
export default SignUp
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment