Compare commits

12 Commits

Author SHA1 Message Date
helori_ollivier 2bf87d1576 added page deletion 2026-04-26 16:59:13 +02:00
helori_ollivier e7383305ec added page edition 2026-04-26 16:56:25 +02:00
helori_ollivier 3fc60c5f85 changed DB schema 2026-04-26 16:43:03 +02:00
helori_ollivier 72ec88eb14 added get page by id + create page 2026-04-26 16:42:37 +02:00
helori_ollivier 22c108b086 added get pages 2026-04-26 16:07:53 +02:00
helori_ollivier 680b9d6fb1 added page model 2026-04-26 16:00:56 +02:00
helori_ollivier 2e5f38096e added folder delete 2026-04-26 15:54:13 +02:00
helori_ollivier d9f173d028 added update folder + reworked folder fetching hierarchy 2026-04-26 15:27:39 +02:00
helori_ollivier a0e23b672a reworked folder hierarchy fetch + adde folder creation 2026-04-26 14:42:43 +02:00
helori_ollivier 132b8cacd5 foder route ok 2026-04-24 23:28:53 +02:00
helori_ollivier 6813dd23e1 initilisation api (suite) 2026-04-24 22:39:11 +02:00
helori_ollivier 3c001d2623 initilisation api 2026-04-24 22:29:05 +02:00
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");
}
+27 -9
View File
@@ -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();
})
app.listen(port, () => { const folderRoutes = require('./routes/folder.routes');
console.log(`Example app listening on port ${port}`) 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(`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;
+1162 -211
View File
File diff suppressed because it is too large Load Diff
+8 -4
View File
@@ -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"
} }
} }
+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');