Implement backend structure with Docker, database schema, and user authentication

This commit is contained in:
2026-05-26 13:01:11 +02:00
parent ac9679ab27
commit 4c0c441e92
14 changed files with 313 additions and 33 deletions
@@ -0,0 +1,12 @@
import mysql from "mysql2";
import dotenv from "dotenv";
dotenv.config();
const pool = mysql
.createPool({
host: process.env.DB_HOST,
user: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB_NAME,
})
.promise();
@@ -0,0 +1,42 @@
import mysql from "mysql2";
import dotenv from "dotenv";
dotenv.config();
const pool = mysql
.createPool({
host: process.env.DB_HOST,
user: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB_NAME,
})
.promise();
export const findUser = async (username, password) => {
const [result] = await pool.query(
"SELECT BIN_TO_UUID(uuid) AS uuid, username, first_name, last_name, email, is_admin, is_active, last_login FROM users WHERE username = ? AND password = ?;",
[username, password],
);
if (result.length <= 0) {
return { code: "e001" }; // username or password is wrong
}
if (!result[0].is_active) {
return { code: "e002" }; // user is deactivated
}
return { code: "s001", data: result[0] }; // user found
};
export const loginUser = async (username) => {
const [result] = await pool.query(
"UPDATE users SET last_login = NOW() WHERE username = ?;",
[username],
);
if (result.affectedRows > 0) {
return { code: "s002" };
} else {
return { code: "e003" };
}
};
+6
View File
@@ -0,0 +1,6 @@
import express from "express";
import dotenv from "dotenv";
dotenv.config();
const router = express.Router();
export default router;
+56
View File
@@ -0,0 +1,56 @@
import express from "express";
import dotenv from "dotenv";
import { generateToken } from "../../services/tokenService.js";
import { findUser, loginUser } from "./database/users.database.js";
dotenv.config();
const router = express.Router();
router.post("/login", async (req, res) => {
const username = req.body.username;
const password = req.body.password;
const result = await findUser(username, password);
if (result.code === "e001") {
res.status(404).json({
success: false,
code: "e001",
data: null,
message: "username oder password is wrong",
});
}
if (result.code === "e002") {
res.status(403).json({
success: false,
code: "e002",
data: null,
message: "user is deactivated",
});
}
if (result.code === "s001") {
const token = await generateToken(result.data);
const login = await loginUser(result.data.username);
if (login.code === "e003") {
res.status(500).json({
success: false,
code: "e003",
data: null,
message: "Unexpected server error. Please contact system admin.",
});
}
res.status(202).json({
success: true,
code: "s001",
data: {
token,
},
message: "User token generated successfully",
});
}
});
export default router;