update with login hashing not working
This commit is contained in:
		
							
								
								
									
										35
									
								
								Sean/models/User.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								Sean/models/User.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,35 @@ | ||||
| // models/User.js | ||||
|  | ||||
| const { Sequelize, DataTypes } = require('sequelize'); | ||||
| const sequelize = new Sequelize(process.env.database, process.env.user, process.env.password, { | ||||
|   host: process.env.host, | ||||
|   dialect: 'mysql', | ||||
|   timezone: 'Z', // Set the timezone to UTC | ||||
| }); | ||||
|  | ||||
| const User = sequelize.define('User', { | ||||
|   name: { | ||||
|     type: DataTypes.STRING, | ||||
|     allowNull: false, | ||||
|   }, | ||||
|   username: { | ||||
|     type: DataTypes.STRING, | ||||
|     allowNull: false, | ||||
|     unique: true, | ||||
|   }, | ||||
|   email: { | ||||
|     type: DataTypes.STRING, | ||||
|     allowNull: false, | ||||
|     unique: true, | ||||
|   }, | ||||
|   password: { | ||||
|     type: DataTypes.STRING, | ||||
|     allowNull: false, | ||||
|   }, | ||||
|   jobTitle: { | ||||
|     type: DataTypes.STRING, | ||||
|     allowNull: false, | ||||
|   }, | ||||
| }); | ||||
|  | ||||
| module.exports = User; | ||||
| @ -2,6 +2,8 @@ const express = require('express'); | ||||
| const session = require('express-session'); | ||||
| const mysql = require('mysql'); | ||||
| const bodyParser = require('body-parser'); | ||||
| const bcrypt = require('bcrypt'); | ||||
|  | ||||
|  | ||||
| const app = express(); | ||||
| const PORT = process.env.PORT || 3000; | ||||
| @ -16,6 +18,13 @@ const mysqlConfig = { | ||||
| }; | ||||
|  | ||||
| const mysqlConnection = mysql.createConnection(mysqlConfig); | ||||
| mysqlConnection.connect((err) => { | ||||
|   if (err) { | ||||
|     console.error('Error connecting to MySQL:', err); | ||||
|     return; | ||||
|   } | ||||
|   console.log('Connected to MySQL'); | ||||
| }); | ||||
|  | ||||
| app.use(bodyParser.urlencoded({ extended: true })); | ||||
| app.use(session({ secret: 'your_session_secret', resave: false, saveUninitialized: true })); | ||||
| @ -119,6 +128,64 @@ app.get('/inusers', isAuthenticated, (req, res) => { | ||||
|   }); | ||||
| }); | ||||
|  | ||||
| app.post('/createUser', async (req, res) => { | ||||
|   try { | ||||
|     const { name, username, email, password, jobTitle } = req.body; | ||||
|  | ||||
|     // Hash the password using bcrypt | ||||
|     const hashedPassword = await bcrypt.hash(password, 10); | ||||
|  | ||||
|     // Start a transaction | ||||
|     mysqlConnection.beginTransaction((transactionErr) => { | ||||
|       if (transactionErr) { | ||||
|         console.error('Error starting transaction:', transactionErr); | ||||
|         res.status(500).json({ error: 'Internal Server Error' }); | ||||
|         return; | ||||
|       } | ||||
|  | ||||
|       // Define the insert query | ||||
|       const insertUserQuery = 'INSERT INTO users (name, username, email, password, lastLogin, jobTitle) VALUES (?, ?, ?, ?, NULL, ?)'; | ||||
|  | ||||
|       // Log the query and its parameters | ||||
|       console.log('Insert Query:', insertUserQuery); | ||||
|       console.log('Query Parameters:', [name, username, email, hashedPassword, jobTitle]); | ||||
|  | ||||
|       // Execute the query with user data | ||||
|       mysqlConnection.query(insertUserQuery, [name, username, email, hashedPassword, jobTitle], (queryErr, results) => { | ||||
|         if (queryErr) { | ||||
|           console.error('Error executing query:', queryErr); | ||||
|  | ||||
|           // Rollback the transaction in case of an error | ||||
|           mysqlConnection.rollback((rollbackErr) => { | ||||
|             if (rollbackErr) { | ||||
|               console.error('Error rolling back transaction:', rollbackErr); | ||||
|             } | ||||
|             res.status(500).json({ error: 'Internal Server Error' }); | ||||
|           }); | ||||
|           return; | ||||
|         } | ||||
|  | ||||
|         // Commit the transaction | ||||
|         mysqlConnection.commit((commitErr) => { | ||||
|           if (commitErr) { | ||||
|             console.error('Error committing transaction:', commitErr); | ||||
|             res.status(500).json({ error: 'Internal Server Error' }); | ||||
|             return; | ||||
|           } | ||||
|  | ||||
|           // Log the results of the query | ||||
|           console.log('Query Results:', results); | ||||
|  | ||||
|           // Respond with a success message | ||||
|           res.status(201).json({ message: 'User created successfully' }); | ||||
|         }); | ||||
|       }); | ||||
|     }); | ||||
|   } catch (error) { | ||||
|     console.error('Error creating user:', error); | ||||
|     res.status(500).json({ error: 'Internal Server Error' }); | ||||
|   } | ||||
| }); | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| @ -9,6 +9,9 @@ | ||||
|   <title>In-House Users</title> | ||||
|   <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/5.3.0/css/bootstrap.min.css"> | ||||
|   <link rel="stylesheet" href="/style.css"> | ||||
|   <link rel="stylesheet" href="/user-creation.css"> | ||||
|   <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css"> | ||||
|  | ||||
|    | ||||
| </head> | ||||
|  | ||||
| @ -65,55 +68,33 @@ | ||||
|         </tbody> | ||||
|       </table> | ||||
|     </div> | ||||
|     <div class="container"> | ||||
|     <div id="createUserForm" class="user-creation-container" style="display: none;"> | ||||
|       <div class="title">Registration</div> | ||||
|       <div class="content"> | ||||
|         <form action="#"> | ||||
|         <form action="/createUser" id="userForm" method="post"> | ||||
|           <div class="user-details"> | ||||
|             <div class="input-box"> | ||||
|               <span class="details">Full Name</span> | ||||
|               <input type="text" placeholder="Enter your name" required> | ||||
|               <input type="text" name="name" placeholder="Enter your name" required> | ||||
|             </div> | ||||
|             <div class="input-box"> | ||||
|               <span class="details">Username</span> | ||||
|               <input type="text" placeholder="Enter your username" required> | ||||
|               <input type="text" name="username" placeholder="Enter your username" required> | ||||
|             </div> | ||||
|             <div class="user-creation-container"> | ||||
|             <div class="input-box"> | ||||
|               <span class="details">Email</span> | ||||
|               <input type="text" placeholder="Enter your email" required> | ||||
|             </div> | ||||
|             <div class="input-box"> | ||||
|               <span class="details">Phone Number</span> | ||||
|               <input type="text" placeholder="Enter your number" required> | ||||
|               <input type="text" name="email" placeholder="Enter your email" required> | ||||
|             </div> | ||||
|             <div class="input-box"> | ||||
|               <span class="details">Password</span> | ||||
|               <input type="text" placeholder="Enter your password" required> | ||||
|               <input type="password" name="password" placeholder="Enter your password" required> | ||||
|             </div> | ||||
|             <div class="input-box"> | ||||
|               <span class="details">Confirm Password</span> | ||||
|               <input type="text" placeholder="Confirm your password" required> | ||||
|             </div> | ||||
|           </div> | ||||
|           <div class="gender-details"> | ||||
|             <input type="radio" name="gender" id="dot-1"> | ||||
|             <input type="radio" name="gender" id="dot-2"> | ||||
|             <input type="radio" name="gender" id="dot-3"> | ||||
|             <span class="gender-title">Gender</span> | ||||
|             <div class="category"> | ||||
|               <label for="dot-1"> | ||||
|               <span class="dot one"></span> | ||||
|               <span class="gender">Male</span> | ||||
|             </label> | ||||
|             <label for="dot-2"> | ||||
|               <span class="dot two"></span> | ||||
|               <span class="gender">Female</span> | ||||
|             </label> | ||||
|             <label for="dot-3"> | ||||
|               <span class="dot three"></span> | ||||
|               <span class="gender">Prefer not to say</span> | ||||
|               </label> | ||||
|               <span class="details">Job Title</span> | ||||
|               <select name="jobTitle"> | ||||
|                 <option value="admin">Admin</option> | ||||
|                 <option value="dataAnalyst">Data Analyst</option> | ||||
|               </select> | ||||
|             </div> | ||||
|           </div> | ||||
|           <div class="button"> | ||||
| @ -130,37 +111,57 @@ | ||||
|   <script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.17.4/xlsx.full.min.js"></script> | ||||
|   <script src="https://cdnjs.cloudflare.com/ajax/libs/FileSaver.js/2.0.5/FileSaver.min.js"></script> | ||||
|   <script src="https://cdnjs.cloudflare.com/ajax/libs/exceljs/4.2.1/exceljs.min.js"></script> | ||||
|  | ||||
|   <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script> | ||||
|   <script> | ||||
|     const allUsers = <%- JSON.stringify(allUsers) %>; | ||||
|      const allUsers = <%- JSON.stringify(allUsers) %>; | ||||
|  | ||||
|     document.getElementById('downloadButton').addEventListener('click', function () { | ||||
|       console.log('Download button clicked'); | ||||
|       downloadExcel(allUsers); | ||||
|     }); | ||||
| document.getElementById('downloadButton').addEventListener('click', function () { | ||||
|   console.log('Download button clicked'); | ||||
|   downloadExcel(allUsers); | ||||
| }); | ||||
|  | ||||
|     document.getElementById('addUserLink').addEventListener('click', function () { | ||||
|       document.getElementById('downloadButtonContainer').style.display = 'none'; | ||||
|       document.getElementById('userDataContainer').style.display = 'none'; | ||||
|       document.getElementById('createUserForm').style.display = 'block'; | ||||
|     }); | ||||
| document.getElementById('addUserLink').addEventListener('click', function () { | ||||
|   document.getElementById('downloadButtonContainer').style.display = 'none'; | ||||
|   document.getElementById('userDataContainer').style.display = 'none'; | ||||
|   document.getElementById('createUserForm').style.display = 'block'; | ||||
| }); | ||||
|  | ||||
|     document.getElementById('userDataLink').addEventListener('click', function () { | ||||
|       document.getElementById('downloadButtonContainer').style.display = 'block'; | ||||
|       document.getElementById('userDataContainer').style.display = 'block'; | ||||
|       document.getElementById('createUserForm').style.display = 'none'; | ||||
|     }); | ||||
| document.getElementById('userDataLink').addEventListener('click', function () { | ||||
|   document.getElementById('downloadButtonContainer').style.display = 'block'; | ||||
|   document.getElementById('userDataContainer').style.display = 'block'; | ||||
|   document.getElementById('createUserForm').style.display = 'none'; | ||||
| }); | ||||
|  | ||||
|     document.getElementById('userForm').addEventListener('submit', function (event) { | ||||
|       event.preventDefault(); | ||||
|       const formData = new FormData(this); | ||||
|       const newUser = {}; | ||||
|       formData.forEach((value, key) => { | ||||
|         newUser[key] = value; | ||||
|       }); | ||||
|       console.log('New User:', newUser); | ||||
|       // You can send the newUser data to your server here | ||||
| document.getElementById('userForm').addEventListener('submit', function (event) { | ||||
|   event.preventDefault(); | ||||
|   const formData = new FormData(this); | ||||
|   const newUser = {}; | ||||
|   formData.forEach((value, key) => { | ||||
|     newUser[key] = value; | ||||
|   }); | ||||
|  | ||||
|   console.log('Form Data Before Sending:', newUser); | ||||
|  | ||||
|   fetch('/createUser', { | ||||
|     method: 'POST', | ||||
|     headers: { | ||||
|       'Content-Type': 'application/json', | ||||
|     }, | ||||
|     body: JSON.stringify(newUser), | ||||
|   }) | ||||
|     .then(response => { | ||||
|       if (!response.ok) { | ||||
|         throw new Error(`HTTP error! Status: ${response.status}`); | ||||
|       } | ||||
|       return response.json(); | ||||
|     }) | ||||
|     .then(data => { | ||||
|       console.log('Success:', data); | ||||
|     }) | ||||
|     .catch(error => { | ||||
|       console.error('Fetch Error:', error); | ||||
|     }); | ||||
| }) | ||||
|  | ||||
|     function downloadExcel(allUsers) { | ||||
|       if (allUsers && allUsers.length > 0) { | ||||
|  | ||||
| @ -1,8 +1,11 @@ | ||||
| /* style.css */ | ||||
|  | ||||
| /* Sidebar Styles */ | ||||
| body { | ||||
| 	margin: 0; | ||||
| 	font-family: 'Arial', sans-serif; | ||||
|   } | ||||
|  | ||||
|    | ||||
|   #sidebar { | ||||
| 	height: 100%; | ||||
| 	width: 250px; | ||||
| @ -11,12 +14,12 @@ body { | ||||
| 	padding-top: 60px; | ||||
| 	transition: 0.5s; | ||||
|   } | ||||
|  | ||||
|    | ||||
|   #sidebar img { | ||||
| 	width: 100%; | ||||
| 	margin-bottom: 20px; | ||||
|   } | ||||
|  | ||||
|    | ||||
|   #sidebar a { | ||||
| 	padding: 10px 15px; | ||||
| 	text-decoration: none; | ||||
| @ -25,27 +28,27 @@ body { | ||||
| 	display: block; | ||||
| 	transition: 0.3s; | ||||
|   } | ||||
|  | ||||
|    | ||||
|   #sidebar a:hover { | ||||
| 	background-color: #555; | ||||
|   } | ||||
|  | ||||
|    | ||||
|   #content { | ||||
| 	margin-left: 250px; | ||||
| 	padding: 16px; | ||||
|   } | ||||
|  | ||||
|    | ||||
|   @media screen and (max-width: 600px) { | ||||
| 	#sidebar { | ||||
| 	  width: 0; | ||||
| 	  overflow-x: hidden; | ||||
| 	} | ||||
|  | ||||
|    | ||||
| 	#content { | ||||
| 	  margin-left: 0; | ||||
| 	} | ||||
|   } | ||||
|  | ||||
|    | ||||
|   #sidebarCollapse { | ||||
| 	width: 40px; | ||||
| 	height: 40px; | ||||
| @ -55,7 +58,7 @@ body { | ||||
| 	cursor: pointer; | ||||
| 	z-index: 1; | ||||
|   } | ||||
|  | ||||
|    | ||||
|   #sidebarCollapse span { | ||||
| 	display: block; | ||||
| 	background: white; | ||||
| @ -64,53 +67,55 @@ body { | ||||
| 	margin: 6px auto; | ||||
| 	transition: 0.3s; | ||||
|   } | ||||
|  | ||||
|    | ||||
|   #sidebarCollapse:hover span:nth-child(1) { | ||||
| 	transform: rotate(-45deg) translate(-5px, 6px); | ||||
|   } | ||||
|  | ||||
|    | ||||
|   #sidebarCollapse:hover span:nth-child(2) { | ||||
| 	opacity: 0; | ||||
|   } | ||||
|  | ||||
|    | ||||
|   #sidebarCollapse:hover span:nth-child(3) { | ||||
| 	transform: rotate(45deg) translate(-5px, -6px); | ||||
|   } | ||||
|  | ||||
|    | ||||
|   #userDataContainer { | ||||
| 	margin-top: 20px; | ||||
|   } | ||||
|  | ||||
|    | ||||
|   /* Table Styles */ | ||||
|   table { | ||||
| 	border-collapse: collapse; | ||||
| 	width: 100%; | ||||
| 	margin-top: 20px; | ||||
|   } | ||||
|  | ||||
|    | ||||
|   th, | ||||
|   td { | ||||
| 	border: 1px solid #dddddd; | ||||
| 	text-align: left; | ||||
| 	padding: 12px; | ||||
|   } | ||||
|  | ||||
|    | ||||
|   th { | ||||
| 	background-color: #f2f2f2; | ||||
|   } | ||||
|  | ||||
|    | ||||
|   tr:hover { | ||||
| 	background-color: #f5f5f5; | ||||
|   } | ||||
|  | ||||
|    | ||||
|   td { | ||||
| 	white-space: nowrap; | ||||
|   } | ||||
|  | ||||
|    | ||||
|   /* Dropdown Styles */ | ||||
|   .dropdown { | ||||
| 	display: block; | ||||
| 	margin-top: 20px; | ||||
|   } | ||||
|  | ||||
|    | ||||
|   .dropdown-toggle { | ||||
| 	color: white; | ||||
| 	background-color: #333; | ||||
| @ -122,47 +127,47 @@ body { | ||||
| 	width: 100%; | ||||
| 	text-align: left; | ||||
|   } | ||||
|  | ||||
|    | ||||
|   .dropdown-toggle:hover { | ||||
| 	background-color: #555; | ||||
|   } | ||||
|  | ||||
|    | ||||
|   .dropdown-menu { | ||||
| 	background-color: #333; | ||||
|   } | ||||
|  | ||||
|    | ||||
|   .dropdown-item { | ||||
| 	color: white; | ||||
|   } | ||||
|  | ||||
|    | ||||
|   .dropdown-item:hover { | ||||
| 	background-color: #555; | ||||
|   } | ||||
|  | ||||
|    | ||||
|   /* Additional styles for Bootstrap form */ | ||||
|   form { | ||||
| 	max-width: 400px; | ||||
| 	margin: auto; | ||||
|   } | ||||
|  | ||||
|    | ||||
|   .mb-3 { | ||||
| 	margin-bottom: 1rem; | ||||
|   } | ||||
|  | ||||
|    | ||||
|   .btn-primary { | ||||
| 	background-color: #007bff; | ||||
| 	border-color: #007bff; | ||||
|   } | ||||
|  | ||||
|    | ||||
|   .btn-primary:hover { | ||||
| 	background-color: #0056b3; | ||||
| 	border-color: #0056b3; | ||||
|   } | ||||
|   /* style.css */ | ||||
|  | ||||
| .user-creation-container .input-box { | ||||
| 	margin-bottom: 15px; | ||||
| 	width: calc(100% / 2 - 20px); | ||||
|    | ||||
|   /* User Creation Form Styles */ | ||||
|   .user-creation-container .input-box { | ||||
| 	margin-bottom: 20px; | ||||
| 	width: 100%; | ||||
|   } | ||||
|    | ||||
|   .user-creation-container .input-box span.details { | ||||
| @ -195,7 +200,7 @@ body { | ||||
|    | ||||
|   .user-creation-container form .category { | ||||
| 	display: flex; | ||||
| 	width: 80%; | ||||
| 	width: 100%; | ||||
| 	margin: 14px 0; | ||||
| 	justify-content: space-between; | ||||
|   } | ||||
| @ -252,7 +257,7 @@ body { | ||||
|    | ||||
|   @media (max-width: 584px) { | ||||
| 	.user-creation-container .user-details .input-box { | ||||
| 	  margin-bottom: 15px; | ||||
| 	  margin-bottom: 20px; | ||||
| 	  width: 100%; | ||||
| 	} | ||||
| 	.user-creation-container form .category { | ||||
| @ -272,4 +277,31 @@ body { | ||||
| 	  flex-direction: column; | ||||
| 	} | ||||
|   } | ||||
|    | ||||
|   #createUserForm { | ||||
| 	display: none; | ||||
|   } | ||||
|    | ||||
|   #createUserForm .container { | ||||
| 	margin-top: 20px; | ||||
|   } | ||||
|    | ||||
|   #createUserForm form { | ||||
| 	max-width: 400px; | ||||
| 	margin: auto; | ||||
|   } | ||||
|    | ||||
|   #createUserForm .mb-3 { | ||||
| 	margin-bottom: 1rem; | ||||
|   } | ||||
|    | ||||
|   #createUserForm .btn-primary { | ||||
| 	background-color: #007bff; | ||||
| 	border-color: #007bff; | ||||
|   } | ||||
|    | ||||
|   #createUserForm .btn-primary:hover { | ||||
| 	background-color: #0056b3; | ||||
| 	border-color: #0056b3; | ||||
|   } | ||||
|    | ||||
							
								
								
									
										101
									
								
								Sean/views/user-creation.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										101
									
								
								Sean/views/user-creation.css
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,101 @@ | ||||
| /* user-creation.css */ | ||||
|  | ||||
| .user-creation-container { | ||||
|     margin-top: 20px; | ||||
| } | ||||
|  | ||||
| .user-creation-container form { | ||||
|     max-width: 400px; | ||||
|     margin: auto; | ||||
| } | ||||
|  | ||||
| .user-creation-container .user-details .input-box { | ||||
|     margin-bottom: 15px; | ||||
|     width: 100%; | ||||
| } | ||||
|  | ||||
| .user-creation-container .user-details .input-box input, | ||||
| .user-creation-container .user-details .input-box select { | ||||
|     height: 45px; | ||||
|     width: 100%; | ||||
|     outline: none; | ||||
|     font-size: 16px; | ||||
|     border-radius: 5px; | ||||
|     padding-left: 15px; | ||||
|     border: 1px solid #ccc; | ||||
|     border-bottom-width: 2px; | ||||
|     transition: all 0.3s ease; | ||||
| } | ||||
|  | ||||
| .user-creation-container .user-details .input-box input:focus, | ||||
| .user-creation-container .user-details .input-box input:valid, | ||||
| .user-creation-container .user-details .input-box select:focus { | ||||
|     border-color: #9b59b6; | ||||
| } | ||||
|  | ||||
| .user-creation-container form .category { | ||||
|     display: flex; | ||||
|     width: 100%; | ||||
|     margin: 14px 0; | ||||
|     justify-content: space-between; | ||||
| } | ||||
|  | ||||
| .user-creation-container form .category select { | ||||
|     height: 45px; | ||||
|     width: 100%; /* Adjusted width to match other input boxes */ | ||||
|     outline: none; | ||||
|     font-size: 16px; | ||||
|     border-radius: 5px; | ||||
|     padding-left: 15px; | ||||
|     border: 1px solid #ccc; | ||||
|     transition: all 0.3s ease; | ||||
| } | ||||
|  | ||||
| .user-creation-container form .button { | ||||
|     height: 45px; | ||||
|     margin: 35px 0; | ||||
| } | ||||
|  | ||||
| .user-creation-container form .button input { | ||||
|     height: 100%; | ||||
|     width: 100%; | ||||
|     border-radius: 5px; | ||||
|     border: none; | ||||
|     color: #fff; | ||||
|     font-size: 18px; | ||||
|     font-weight: 500; | ||||
|     letter-spacing: 1px; | ||||
|     cursor: pointer; | ||||
|     transition: all 0.3s ease; | ||||
|     background: linear-gradient(135deg, #71b7e6, #9b59b6); | ||||
| } | ||||
|  | ||||
| .user-creation-container form .button input:hover { | ||||
|     background: linear-gradient(-135deg, #71b7e6, #9b59b6); | ||||
| } | ||||
|  | ||||
| @media (max-width: 584px) { | ||||
|     .user-creation-container .user-details .input-box { | ||||
|         margin-bottom: 15px; | ||||
|         width: 100%; | ||||
|     } | ||||
|  | ||||
|     .user-creation-container form .category { | ||||
|         width: 100%; | ||||
|     } | ||||
|  | ||||
|     .user-creation-container .content form .user-details { | ||||
|         max-height: 300px; | ||||
|         overflow-y: scroll; | ||||
|     } | ||||
|  | ||||
|     .user-creation-container .user-details::-webkit-scrollbar { | ||||
|         width: 5px; | ||||
|     } | ||||
| } | ||||
|  | ||||
| @media (max-width: 459px) { | ||||
|     .user-creation-container .container .content .category { | ||||
|         flex-direction: column; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										1548
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										1548
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @ -17,6 +17,7 @@ | ||||
|   }, | ||||
|   "homepage": "https://github.com/Newtbot/MP#readme", | ||||
|   "dependencies": { | ||||
|     "bcrypt": "^5.1.1", | ||||
|     "body-parser": "^1.20.2", | ||||
|     "coap": "^1.3.0", | ||||
|     "dotenv": "^16.3.1", | ||||
|  | ||||
		Reference in New Issue
	
	Block a user