Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 11 additions & 6 deletions .env
Original file line number Diff line number Diff line change
@@ -1,10 +1,15 @@
PORT = 8080
HOST_NAME=localhost
USER=root
PASSWORD=123Khoabin
DATABASE_NAME=hcmut_ssps
# There is no need to change the value of the variables in this file as they are already in server configuration
# PORT = 8080
# HOST_NAME=localhost
# USER=root
# PASSWORD=123Khoabin
# DATABASE_NAME=hcmut_ssps

# Database Configuration
DB_USER=root
DB_PASSWORD=123Khoabin
DB_NAME=print_service
MYSQL_ROOT_PASSWORD=123Khoabin
MYSQL_ROOT_PASSWORD=123Khoabin
MYSQL_DATABASE=spss
MYSQL_USER=root
MYSQL_PASSWORD=123Khoabin
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,5 @@
log.txt
/server/node_modules
/client/node_modules
package-lock.json
package-lock.json
/node_modules
12 changes: 6 additions & 6 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,19 +28,19 @@ services:
depends_on:
- mysql
volumes:
- /server
- /server/node_modules
- ./server:/app
- /app/node_modules

mysql:
image: mysql:8.0
ports:
- "3307:3306" # Change the port to avoid conflict with local MySQL server
restart: always
environment:
- MYSQL_ROOT_PASSWORD= 123Khoabin
- MYSQL_DATABASE= print_service
- MYSQL_USER= root
- MYSQL_PASSWORD= 123Khoabin
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
- MYSQL_DATABASE=${MYSQL_DATABASE}
- MYSQL_USER=${MYSQL_USER}
- MYSQL_PASSWORD=${MYSQL_PASSWORD}
volumes:
- mysql_data:/var/lib/mysql

Expand Down
10 changes: 10 additions & 0 deletions server/.env
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# Server Configuration
PORT=8000
NODE_ENV=development

# Database Configuration
DB_HOST=mysql
DB_USER=your_user
DB_PASSWORD=your_password
DB_NAME=your_database
DB_PORT=3306
File renamed without changes.
81 changes: 81 additions & 0 deletions server/controllers/PrinterController.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
const {
addPrinter,
updatePrinterPage,
updatePrinterStatus,
deletePrinter,
getPrinterByID,
getAllPrinter,
} = require("../models/Printer");
async function addNew(req, res, next) {
const data = req.body;
try {
const result = await addPrinter(data);
res.json(result);
} catch (err) {
next(err);
}
}
async function updatePage(req, res, next) {
const data = req.body;
try {
const result = await updatePrinterPage(data);
res.json(result);
} catch (err) {
next(err);
}
}
async function updateStatus(req, res, next) {
const data = req.body;
try {
const result = await updatePrinterStatus(data);
res.json(result);
} catch (err) {
next(err);
}
}
async function deleteByID(req, res, next) {
const data = req.body;
try {
let foundPrinter = await getPrinterByID(data);
if (foundPrinter[0] == null) {
return res.status(404).json({ message: "Printer not found" });
}
const result = await deletePrinter(data);
res.json(result);
} catch (err) {
next(err);
}
}
async function getByID(req, res, next) {
const printerID = req.params.id;
try {
const printer = await getPrinterByID(printerID);

if (printer[0] == null) {
return res.status(404).json({ message: "Printer not found" });
}

res.json(printer);
} catch (err) {
next(err);
}
}
async function getAll(req, res, next) {
const data = req.query;
console.log(data);
try {
const printers = await getAllPrinter(data);
res.json(printers);
} catch (err) {
console.error("Error fetching printers:", err);
next(err);
}
}
module.exports = {
addNew,
updatePage,
updateStatus,
deleteByID,
getByID,
getAll,
};
Empty file.
Empty file.
4 changes: 3 additions & 1 deletion server/src/routes/database.js → server/db/database.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
require("dotenv").config();
const mysql = require("mysql2");

const connection = mysql.createConnection({
host: process.env.HOSTNAME || "localhost",
user: process.env.USER || "root",
password: process.env.PASSWORD || "123Khoabin",
password: process.env.PASSWORD || "locprobk22",
database: process.env.DATABASE_NAME || "hcmut_ssps",
});
connection.connect((err) => {
Expand Down
25 changes: 25 additions & 0 deletions server/db/printer.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
SQL
DROP DATABASE IF EXISTS hcmut_spss;

CREATE DATABASE hcmut_spss
DEFAULT CHARACTER SET utf8mb4
DEFAULT COLLATE utf8mb4_unicode_ci;
USE hcmut_spss;


CREATE TABLE SPSO (
SPSO_ID INT AUTO_INCREMENT,
USERNAME VARCHAR(32) NOT NULL UNIQUE,
PASSWORD VARCHAR(128) NOT NULL,
PRIMARY KEY(SPSO_ID)
) ENGINE=InnoDB;

CREATE TABLE PRINTER (
PRINTER_ID INT AUTO_INCREMENT,
BUILDING VARCHAR(32) NOT NULL,
ROOM VARCHAR(32) NOT NULL,
MODEL VARCHAR(32),
IS_ACTIVE BOOLEAN NOT NULL,
PAPER INT,
PRIMARY KEY (PRINTER_ID)
) ENGINE=InnoDB;
22 changes: 22 additions & 0 deletions server/middlewares/authentication.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
const jwt = require('jsonwebtoken');

function authenticate(req,res,next){
const authHeader = req.header('authorization');
if(!authHeader)
return res.status(401).send('Access Denied');

const token = authHeader.split(' ')[1];
if(!token)
return res.status(401).send('Access Denied');

jwt.verify(token, 'secret', (err, decoded) => {
if(err) {
res.status(400).send('Invalid Token');
} else {
req.user = decoded;
next();
}
});
}

module.exports = authenticate;
145 changes: 145 additions & 0 deletions server/models/Printer.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,145 @@
// const db = require("../routes/database");

async function addPrinter(data) {
if (data.building == null || data.room == null || data.model == null) {
throw new Error("Missing required");
}
try {
const dataToInsert = [
data.building,
data.room,
data.model,
data.is_active ?? true,
data.paper ?? 0,
];
console.log(dataToInsert);
const [result, _] = await db.execute(
"INSERT INTO PRINTER SET BUILDING = ?, ROOM = ?, MODEL = ?, IS_ACTIVE = ?, PAPER = ?",
dataToInsert
);
return result;
} catch (err) {
console.error(err);
throw err;
}
}

async function deletePrinter(data) {
try {
if (data.printerID == null) {
throw new Error("Missing required");
}

if (typeof data.printerID !== "number") {
throw new Error("Invalid Data Input");
}
const dataToInsert = [data.printerID];
const [result, _] = await db.execute(
`DELETE FROM PRINTER
WHERE PRINTER_ID = ?`,
dataToInsert
);
return { message: "Printer deleted successfully" };
} catch (err) {
console.error(`Error deleting printer with ID ${data.printerID}:`, err);
throw err;
}
}

async function getAllPrinter(data) {
const pageSize = Number(data.pageSize);
const offset = Number(data.offset);
if (isNaN(pageSize) || isNaN(offset)) {
throw new Error(
"Invalid Data Input: pageSize and offset must be valid numbers"
);
}
try {
const dataToInsert = [data.pageSize, data.offset];
const [result, _] = await db.execute(
`SELECT *
FROM PRINTER
ORDER BY PRINTER_ID
LIMIT ? OFFSET ?`,
dataToInsert
);
return result;
} catch (err) {
console.error(err);
throw err;
}
}
async function getPrinterByID(printerID) {
try {
if (isNaN(printerID)) {
throw new Error("Invalid Data Input: printerID must be a number");
}
const dataToInsert = [printerID];
const [result, _] = await db.execute(
`SELECT *
FROM PRINTER
WHERE PRINTER_ID = ?`,
dataToInsert
);
return result;
} catch (err) {
console.error("Error fetching printer:", err);
throw err;
}
}

async function updatePrinterPage(data) {
try {
if (
!data.printerID ||
typeof data.printerID !== "number" ||
typeof data.paper !== "number"
) {
throw new Error("Invalid Data Input");
}
const dataToInsert = [data.paper, data.printerID || 0];

const [result, _] = await db.execute(
`UPDATE PRINTER
SET PAPER = ?
WHERE PRINTER_ID = ?`,
dataToInsert
);
return result;
} catch (err) {
console.error(err);
throw err;
}
}
async function updatePrinterStatus(data) {
try {
if (
!data.printerID ||
typeof data.printerID !== "number" ||
typeof data.status !== "boolean"
) {
throw new Error("Invalid Data Input");
}
const dataToInsert = [data.status, data.printerId];

const [result, _] = await db.execute(
`UPDATE PRINTER
SET IS_ACTIVE = ?
WHERE PRINTER_ID = ?`,
dataToInsert
);
return result;
} catch (err) {
console.error(err);
throw err;
}
}

module.exports = {
addPrinter,
getAllPrinter,
getPrinterByID,
updatePrinterPage,
updatePrinterStatus,
deletePrinter,
};
5 changes: 5 additions & 0 deletions server/src/routes/index.js → server/routes/index.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
const express = require("express");
const user = require("./user");
// const history = require('./history');
const printer = require("./printer");
const router = express.Router();

router.get("/test", (req, res) => {
res.send("OK");
});

module.exports = router;
5 changes: 5 additions & 0 deletions server/routes/order.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
const express = require('express');
const router = express.Router();
const orderController = require('../controllers/OrderController');

module.exports = router;
9 changes: 9 additions & 0 deletions server/routes/printer.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
const express = require("express");
const router = express.Router();
const printerController = require("../controllers/PrinterController");
router.post("/", printerController.addNew);
router.post("/page", printerController.updatePage);
router.post("/status", printerController.updateStatus);
router.delete("/", printerController.deleteByID);
router.get("/:id", printerController.getByID);
router.get("/", printerController.getAll);
6 changes: 6 additions & 0 deletions server/routes/student.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
const express = require('express');
const router = express.Router();
const studentController = require('../controllers/StudentController');


module.exports = router;
Loading