diff options
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | server/.env | 0 | ||||
-rw-r--r-- | server/config/db.js | 14 | ||||
-rw-r--r-- | server/models/User.js | 7 | ||||
-rw-r--r-- | server/routes/auth.js | 61 | ||||
-rw-r--r-- | server/server.js | 14 | ||||
-rw-r--r-- | src/App.js | 30 | ||||
-rw-r--r-- | src/components/Login.js | 34 | ||||
-rw-r--r-- | src/firebase/firebaseConfig.js | 17 |
9 files changed, 160 insertions, 18 deletions
@@ -14,6 +14,7 @@ # misc .DS_Store .env.local +.env .env.development.local .env.test.local .env.production.local diff --git a/server/.env b/server/.env deleted file mode 100644 index e69de29..0000000 --- a/server/.env +++ /dev/null diff --git a/server/config/db.js b/server/config/db.js new file mode 100644 index 0000000..effbe5e --- /dev/null +++ b/server/config/db.js @@ -0,0 +1,14 @@ +const mongoose = require('mongoose') +const connecttDB = async () => { + try { + await mongoose.connect(process.env.MONGO_URI, { + useNewUrlParser: true, + useUnifiedTopology: true, + }); + console.log('MongoDB Connected...'); + } catch (err) { + console.error(err.message); + process.exit(1); + } +}; +module.exports = connectDB; diff --git a/server/models/User.js b/server/models/User.js new file mode 100644 index 0000000..6773c64 --- /dev/null +++ b/server/models/User.js @@ -0,0 +1,7 @@ +const mongoose = require('mongoose'); +const UserSchema = new mongoose.Schema({ + username: { type: String, reauired: true, unique: true }, + password: { type: String, required: true }, + role: { type: String, default: 'admin' }, +}); +module.exports = mongoose.model('User', UserSchema); diff --git a/server/routes/auth.js b/server/routes/auth.js new file mode 100644 index 0000000..3fb0986 --- /dev/null +++ b/server/routes/auth.js @@ -0,0 +1,61 @@ +const express = require('express'); +const bcrypt = require('bcryptjs'); +const jwt = require('jsonwebtoken'); +const User = require('../models/User'); +const router = express.Router(); + +// Register +router.post('/register', async (req, res) => { + const { username, password } = req.body; + try { + let user = await User.findOne({ username }); + if (user) { + return res.status(400).json({ msg: 'User already exists' }); + } + user = new User({ + username, + password, + }); + const salt = await bcrypt.genSalt(10); + user.password = await bcrypt.hash(password, salt); + await user.save(); + res.status(200).send('User registered'); + } catch (err) { + console.error(err.message); + res.status(500).send('Server error'); + } +}); + +// Login +router.post('/login', async (req, res) => { + const { username, password } = req.body; + try { + const user = await User.findOne({ username }); + if (!user) { + return res.status(400).json({ msg: 'Invalid credentials' }); + } + const isMatch = await bcrypt.compare(password, user.password); + if (!isMatch) { + return res.status(400).json({ msg: 'Invalid credentials' }); + } + const payload = { + user: { + id: user.id, + }, + }; + jwt.sign( + payload, + process.env.JWT_SECRET, + { expiresIn: '1h' }, + (err, token) => { + if (err) throw err; + res.json({ token }); + } + ); + } catch (err) { + console.error(err.message); + res.status(500).send('Server error'); + } +}); + +module.exports = router; diff --git a/server/server.js b/server/server.js new file mode 100644 index 0000000..8836667 --- /dev/null +++ b/server/server.js @@ -0,0 +1,14 @@ +const express = require('express'); +const connectDB = require('./config/db'); +const cors = require('cors'); +const app = express(); +require('dotenv').config(); + +connectDB(); +app.use(cors()); +app.use(express.json()); + +app.use('/api/auth', require('./routes/auth')); + +const PORT = process.env.PORT || 5000; +app.listen(PORT, () => console.log(`Server started on port ${PORT}`)); @@ -1,25 +1,19 @@ -import logo from './logo.svg'; -import './App.css'; +import React, { useState } from 'react'; +import Login from './components/Login'; + +const App = () => { + const [isAuth, setIsAuth] = useState(false); -function App() { return ( <div className="App"> - <header className="App-header"> - <img src={logo} className="App-logo" alt="logo" /> - <p> - Edit <code>src/App.js</code> and save to reload. - </p> - <a - className="App-link" - href="https://reactjs.org" - target="_blank" - rel="noopener noreferrer" - > - Learn React - </a> - </header> + {isAuth ? <AdminPanel /> : <Login setAuth={setIsAuth} />} </div> ); -} +}; + +const AdminPanel = () => { + // Admin panel logic + return <div>Admin Panel</div>; +}; export default App; diff --git a/src/components/Login.js b/src/components/Login.js new file mode 100644 index 0000000..9a67051 --- /dev/null +++ b/src/components/Login.js @@ -0,0 +1,34 @@ +import React, { useState } from 'react'; +import axios from 'axios'; + +const Login = ({ setAuth }) => { + const [formData, setFormData] = useState({ + username: '', + password: '', + }); + + const { username, password } = formData; + + const onChange = (e) => setFormData({ ...formData, [e.target.name]: e.target.value }); + + const onSubmit = async (e) => { + e.preventDefault(); + try { + const res = await axios.post('/api/auth/login', formData); + localStorage.setItem('token', res.data.token); + setAuth(true); + } catch (err) { + console.error(err.response.data); + } + }; + + return ( + <form onSubmit={onSubmit}> + <input type="text" name="username" value={username} onChange={onChange} required /> + <input type="password" name="password" value={password} onChange={onChange} required /> + <button type="submit">Login</button> + </form> + ); +}; + +export default Login; diff --git a/src/firebase/firebaseConfig.js b/src/firebase/firebaseConfig.js new file mode 100644 index 0000000..12f2a35 --- /dev/null +++ b/src/firebase/firebaseConfig.js @@ -0,0 +1,17 @@ +import firebase from 'firebase/app'; +import 'firebase/storage'; + +const firebaseConfig = { + apiKey: process.env.REACT_APP_FIREBASE_API_KEY, + authDomain: process.env.REACT_APP_FIREBASE_AUTH_DOMAIN, + projectId: process.env.REACT_APP_FIREBASE_PROJECT_ID, + storageBucket: process.env.REACT_APP_FIREBASE_STORAGE_BUCKET, + messagingSenderId: process.env.REACT_APP_FIREBASE_MESSAGING_SENDER_ID, + appId: process.env.REACT_APP_FIREBASE_APP_ID, +}; + +firebase.initializeApp(firebaseConfig); + +const storage = firebase.storage(); + +export { storage, firebase as default }; |