Compare commits
12 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 2bf87d1576 | |||
| e7383305ec | |||
| 3fc60c5f85 | |||
| 72ec88eb14 | |||
| 22c108b086 | |||
| 680b9d6fb1 | |||
| 2e5f38096e | |||
| d9f173d028 | |||
| a0e23b672a | |||
| 132b8cacd5 | |||
| 6813dd23e1 | |||
| 3c001d2623 |
@@ -0,0 +1,6 @@
|
|||||||
|
DB_HOST=localhost
|
||||||
|
DB_USER=user
|
||||||
|
DB_PASSWORD=password
|
||||||
|
DB_NAME=dbName
|
||||||
|
|
||||||
|
PORT=5000
|
||||||
@@ -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;
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
@@ -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
@@ -1,11 +1,29 @@
|
|||||||
const express = require('express')
|
require('dotenv').config();
|
||||||
const app = express()
|
|
||||||
const port = 3000
|
|
||||||
|
|
||||||
app.get('/', (req, res) => {
|
const express = require('express');
|
||||||
res.send('Hello World!')
|
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, () => {
|
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);
|
||||||
|
});
|
||||||
@@ -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;
|
||||||
@@ -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;
|
||||||
Generated
+1161
-210
File diff suppressed because it is too large
Load Diff
+8
-4
@@ -3,14 +3,18 @@
|
|||||||
"version": "0.0.0",
|
"version": "0.0.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "node ./bin/www"
|
"start": "node index.js"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"body-parser": "^2.2.2",
|
||||||
"cookie-parser": "~1.4.4",
|
"cookie-parser": "~1.4.4",
|
||||||
"debug": "~2.6.9",
|
"debug": "~2.6.9",
|
||||||
"express": "~4.16.1",
|
"dotenv": "^17.4.2",
|
||||||
|
"express": "^4.22.1",
|
||||||
"http-errors": "~1.6.3",
|
"http-errors": "~1.6.3",
|
||||||
"jade": "~1.11.0",
|
"jade": "^0.29.0",
|
||||||
"morgan": "~1.9.1"
|
"morgan": "^1.10.1",
|
||||||
|
"mysql2": "^3.22.2",
|
||||||
|
"sequelize": "^6.37.8"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
@@ -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;
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
module.exports = (err, req, res, next) => {
|
||||||
|
console.error(err);
|
||||||
|
res.status(500).json({ message: 'Erreur serveur interne' });
|
||||||
|
};
|
||||||
+35
@@ -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');
|
||||||
Reference in New Issue
Block a user