Compare commits

12 Commits
13 changed files with 1538 additions and 224 deletions
+6
View File
@@ -0,0 +1,6 @@
DB_HOST=localhost
DB_USER=user
DB_PASSWORD=password
DB_NAME=dbName
PORT=5000
+18
View File
@@ -0,0 +1,18 @@
const { Sequelize } = require('sequelize');
// Connexion à la base de données MySQL
const db = new Sequelize(
process.env.DB_NAME, // Nom de la base de données
process.env.DB_USER, // Utilisateur
process.env.DB_PASSWORD, // Mot de passe
{
host: process.env.DB_HOST, // Hôte de la base de données (localhost ou IP)
dialect: 'mysql', // Type de base de données
logging: false, // Désactiver les logs de SQL (facultatif)
define: {
timestamps: false
}
}
);
module.exports = db;
+104
View File
@@ -0,0 +1,104 @@
const folder = require('../models/folder.model');
exports.getFoldersByHierarchy = async (req, res) => {
let folders = await folder.findAll();
let hierarchy = []
for (let i = 0; i < folders.length; i++) {
folders[i].dataValues.subFolders = []
}
let curNode = findByValue(folders, "folderParent", null);
while (folders.length > 0 && curNode != null) {
let childNode = findByValue(folders, "folderParent", curNode.folderId)
if (childNode) {
curNode.dataValues.subFolders.push(childNode);
curNode = childNode;
}
else if (curNode.folderParent != null) {
folders.splice(folders.indexOf(curNode), 1);
curNode = findByValue(folders, "folderId", curNode.folderParent);
}
else {
folders.splice(folders.indexOf(curNode), 1);
hierarchy.push(curNode);
curNode = findByValue(folders, "folderParent", null);
}
}
res.json(hierarchy);
}
exports.getFolders = async (req, res) => {
const folders = await folder.findAll();
res.json(folders);
}
exports.getFoldersById = async (req, res) => {
const id = req.params.id
const folders = await folder.findAll({
where: {
folderId: id,
}},
);
res.json(folders);
}
exports.createFolder = async (req, res) => {
const jsonFolder = req.body;
await folder.create({
folderName: jsonFolder.name,
folderParent: jsonFolder.parent,
});
res.status(201).json("ok");
}
exports.updateFolder = async (req, res) => {
const folderId = req.params.id;
const jsonFolder = req.body;
await folder.update({
folderName: jsonFolder.name,
folderParent: jsonFolder.parent,
},
{
where: {
folderId: folderId,
},
});
res.status(200).json("ok");
}
exports.deleteFolder = async (req, res) => {
const folderId = req.params.id;
await folder.destroy({
where: {
folderId:folderId,
},
});
res.status(200).json("ok");
}
function findByValue(list, key, value) {
for (el of list) {
if (el[key] == value) {
return el;
}
}
return null;
}
+75
View File
@@ -0,0 +1,75 @@
const page = require('../models/page.model');
exports.getPages = async (req, res) => {
const pages = await page.findAll();
res.json(pages);
}
exports.getPageById = async (req, res) => {
const id = req.params.id
const pages = await page.findAll({
where: {
pageId: id,
}},
);
res.json(pages);
}
exports.createPage = async (req, res) => {
const jsonPage = req.body
await page.create({
pageTitle: jsonPage.name,
pageFolder: jsonPage.folder,
})
res.status(201).json("ok");
}
exports.updatePage = async (req, res) => {
const jsonPage = req.body;
const pageId = req.params.id;
await page.update({
pageTitle: jsonPage.name,
pageFolder: jsonPage.folder,
},
{
where: {
pageId: pageId
}
})
res.status(200).json("ok");
}
exports.updatePageContent = async (req, res) => {
const jsonPage = req.body;
const pageId = req.params.id;
await page.update({
pageContent: jsonPage.content,
},
{
where: {
pageId: pageId
}
})
res.status(200).json("ok");
}
exports.deletePage = async (req, res) => {
const pageId = req.params.id;
await page.destroy(
{
where: {
pageId: pageId
}
});
res.status(200).json("ok");
}
+25 -7
View File
@@ -1,11 +1,29 @@
const express = require('express')
const app = express()
const port = 3000
require('dotenv').config();
app.get('/', (req, res) => {
res.send('Hello World!')
})
const express = require('express');
const app = express();
const folderRoutes = require('./routes/folder.routes');
const pageRoutes = require('./routes/page.routes');
const db = require('./config/db');
// Middleware pour le parsing des JSON
app.use(express.json());
// Utilisation des routes
app.use('/api', folderRoutes);
app.use('/api', pageRoutes);
// Démarrer l'application et connecter la base de données
const port = process.env.PORT || 5000
db
.authenticate()
.then(() => {
console.log('Connexion à la base de données réussie');
app.listen(port, () => {
console.log(`Example app listening on port ${port}`)
console.log(`Serveur démarré sur le port ${port}`);
});
})
.catch((error) => {
console.error('Impossible de se connecter à la base de données:', error);
});
+28
View File
@@ -0,0 +1,28 @@
const {Sequelize, DataTypes} = require('sequelize');
const db = require('../config/db')
const folder = db.define('Folders', {
folderId: {
type: DataTypes.INTEGER,
primaryKey: true,
autoIncrement: true,
},
folderName: {
type: DataTypes.STRING,
allowNull: false,
},
folderParent: {
type: DataTypes.INTEGER,
allowNull: true,
references: {
model: 'Folders',
key: 'folderId',
},
},
});
folder.hasMany(folder, { as: 'subFolders', foreignKey: 'folderParent', onDelete: 'CASCADE' });
module.exports = folder;
+42
View File
@@ -0,0 +1,42 @@
const {Sequelize, DataTypes} = require('sequelize');
const db = require('../config/db');
const folder = require('./folder.model');
const page = db.define('Pages', {
pageId: {
type: DataTypes.INTEGER,
primaryKey: true,
autoIncrement: true,
},
pageTitle: {
type: DataTypes.STRING,
allowNull: false,
},
pageFolder: {
type: DataTypes.INTEGER,
allowNull: true,
references: {
model: 'Folders',
key: 'folderId',
},
},
pageContent: {
type: DataTypes.TEXT,
allowNull: true,
},
},
{
indexes: [
{
fields: ['pageTitle', 'pageFolder'],
unique: true,
}
]
});
//page.belongsTo(folder, { as: 'pageParentFolder', foreignKey: 'pageFolder', onDelete: 'CASCADE'})
module.exports = page;
+1161 -210
View File
File diff suppressed because it is too large Load Diff
+8 -4
View File
@@ -3,14 +3,18 @@
"version": "0.0.0",
"private": true,
"scripts": {
"start": "node ./bin/www"
"start": "node index.js"
},
"dependencies": {
"body-parser": "^2.2.2",
"cookie-parser": "~1.4.4",
"debug": "~2.6.9",
"express": "~4.16.1",
"dotenv": "^17.4.2",
"express": "^4.22.1",
"http-errors": "~1.6.3",
"jade": "~1.11.0",
"morgan": "~1.9.1"
"jade": "^0.29.0",
"morgan": "^1.10.1",
"mysql2": "^3.22.2",
"sequelize": "^6.37.8"
}
}
+15
View File
@@ -0,0 +1,15 @@
const express = require('express');
const router = express.Router();
const folderController = require('../controller/folder.controller')
router.get('/folders', folderController.getFolders);
router.get('/folders/hierarchy', folderController.getFoldersByHierarchy);
router.get('/folders/:id', folderController.getFoldersById);
router.post('/folders', folderController.createFolder);
router.put('/folders/:id', folderController.updateFolder);
router.delete('/folders/:id', folderController.deleteFolder);
module.exports = router;
+14
View File
@@ -0,0 +1,14 @@
const express = require('express');
const router = express.Router();
const pageController = require('../controller/page.controller')
router.get('/pages', pageController.getPages);
router.get('/pages/:id', pageController.getPageById);
router.post('/pages', pageController.createPage);
router.put('/pages/:id', pageController.updatePage);
router.put('/pages/:id/content', pageController.updatePageContent);
router.delete('/pages/:id', pageController.deletePage);
module.exports = router;
+4
View File
@@ -0,0 +1,4 @@
module.exports = (err, req, res, next) => {
console.error(err);
res.status(500).json({ message: 'Erreur serveur interne' });
};
+35
View File
@@ -0,0 +1,35 @@
DROP TABLE IF EXISTS Pages;
DROP TABLE IF EXISTS Folders;
-- CREATE TABLES
CREATE TABLE Folders (
folderId INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
folderName VARCHAR(50) NOT NULL,
folderParent INT UNSIGNED,
CONSTRAINT sf_folderParent_folderId FOREIGN KEY (folderParent) REFERENCES Folders(folderId) ON DELETE CASCADE
);
CREATE TABLE Pages (
pageId INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
pageTitle VARCHAR(50) NOT NULL,
pageFolder INT UNSIGNED,
pageContent TEXT,
CONSTRAINT fk_pages_folder FOREIGN KEY (pageFolder) REFERENCES Folders(folderId) ON DELETE CASCADE,
CONSTRAINT unique_titel_folder UNIQUE (pageTitle, pageFolder)
);
-- Populate Tables
INSERT INTO Folders (folderId, folderName, folderParent) VALUES
(1, "animaux", NULL),
(2, "mamifère", 1),
(3, "plantes", NULL);
INSERT INTO Pages (pageTitle, pageFolder, pageContent) VALUES
('Vache', 2, 'La vache est un mamifères'),
('Pin des Landes', NULL, 'Le pin des landes est un pin que lon retrouve dans les landes'),
('Le lézard', 1, 'Le lézard est un reptile à sang froid');