Pierre Kraemer 5 жил өмнө
parent
commit
ce5931f9d1

+ 50 - 0
correction_tp2/db.js

@@ -0,0 +1,50 @@
+const Sequelize = require('sequelize');
+
+// create Sequelize instance
+const sequelize = new Sequelize('w4a', 'w4a', 'w4aw4aw4a', {
+	host: 'localhost',
+	port: 3306,
+	dialect: 'mysql',
+	dialectOptions: { decimalNumbers: true }
+	// logging: false
+});
+
+
+// create models
+
+class Person extends Sequelize.Model { }
+
+Person.init({
+	lastname: Sequelize.STRING,
+	firstname: Sequelize.STRING
+}, {
+	sequelize,
+	modelName: 'Person'
+});
+
+class MailAddress extends Sequelize.Model { }
+
+MailAddress.init({
+	address: {
+		type: Sequelize.STRING,
+		validate: {
+			isEmail: true
+		}
+	},
+	type: Sequelize.ENUM('home', 'work')
+}, {
+	sequelize,
+	modelName: 'MailAddress'
+});
+
+// configure relations
+Person.hasMany(MailAddress, { onDelete: 'cascade' });
+MailAddress.belongsTo(Person, { onDelete: 'cascade' });
+
+// sync DB
+sequelize.sync();
+
+module.exports = {
+	Person,
+	MailAddress
+};

+ 71 - 0
correction_tp2/mail_address_ctrl.js

@@ -0,0 +1,71 @@
+const db = require('./db');
+
+module.exports = {
+	
+	get_all: (req, res, next) => {
+		return req.person.getMailAddresses({
+			order: [ 'type' ]
+		})
+		.then((mailAddresses) => res.json(mailAddresses))
+		.catch((err) => next(err));
+	},
+	
+	get_by_id: (req, res, next) => {
+		return req.person.getMailAddresses({
+			where: {
+				id: req.params.mail_address_id
+			}
+		})
+		.then((mailAddresses) => {
+			if (mailAddresses.length === 0) {
+				throw { status: 404, message: 'Requested MailAddress not found' };
+			}
+			return res.json(mailAddresses[0]);
+		})
+		.catch((err) => next(err));
+	},
+
+	create: (req, res, next) => {
+		const data = {
+			address: req.body.address || '',
+			type: req.body.type || 'home'
+		};
+		return req.person.createMailAddress(data)
+		.then((mailAddress) => res.json(mailAddress))
+		.catch((err) => next(err));
+	},
+
+	update_by_id: (req, res, next) => {
+		return req.person.getMailAddresses({
+			where: {
+				id: req.params.mail_address_id
+			}
+		})
+		.then((mailAddresses) => {
+			if (mailAddresses.length === 0) {
+				throw { status: 404, message: 'Requested MailAddress not found' };
+			}
+			Object.assign(mailAddresses[0], req.body);
+			return mailAddresses[0].save();
+		})
+		.then((mailAddress) => res.json(mailAddress))
+		.catch((err) => next(err));
+	},
+
+	delete_by_id: (req, res, next) => {
+		return req.person.getMailAddresses({
+			where: {
+				id: req.params.mail_address_id
+			}
+		})
+		.then((mailAddresses) => {
+			if (mailAddresses.length === 0) {
+				throw { status: 404, message: 'Requested MailAddress not found' };
+			}
+			return mailAddresses[0].destroy();
+		})
+		.then(() => res.status(200).end())
+		.catch((err) => next(err));
+	}
+
+};

+ 71 - 0
correction_tp2/person_ctrl.js

@@ -0,0 +1,71 @@
+const db = require('./db');
+
+module.exports = {
+	
+	get_all: (req, res, next) => {
+		return db.Person.findAll({
+			order: [ 'lastname' ]
+		})
+		.then((people) => res.json(people))
+		.catch((err) => next(err));
+	},
+	
+	load_by_id: (req, res, next) => {
+		return db.Person.findByPk(req.params.person_id)
+		.then((person) => {
+			if (!person) {
+				throw { status: 404, message: 'Requested Person not found' };
+			}
+			req.person = person;
+			return next();
+		})
+		.catch((err) => next(err));
+	},
+	
+	get_by_id: (req, res, next) => {
+		return db.Person.findByPk(req.params.person_id)
+		.then((person) => {
+			if (!person) {
+				throw { status: 404, message: 'Requested Person not found' };
+			}
+			return res.json(person);
+		})
+		.catch((err) => next(err));
+	},
+
+	create: (req, res, next) => {
+		const data = {
+			firstname: req.body.firstname || '',
+			lastname: req.body.lastname || ''
+		};
+		return db.Person.create(data)
+		.then((person) => res.json(person))
+		.catch((err) => next(err));
+	},
+
+	update_by_id: (req, res, next) => {
+		return db.Person.findByPk(req.params.person_id)
+		.then((person) => {
+			if (!person) {
+				throw { status: 404, message: 'Requested Person not found' };
+			}
+			Object.assign(person, req.body);
+			return person.save();
+		})
+		.then((person) => res.json(person))
+		.catch((err) => next(err));
+	},
+
+	delete_by_id: (req, res, next) => {
+		return db.Person.findByPk(req.params.person_id)
+		.then((person) => {
+			if (!person) {
+				throw { status: 404, message: 'Requested Person not found' };
+			}
+			return person.destroy();
+		})
+		.then(() => res.status(200).end())
+		.catch((err) => next(err));
+	}
+
+};

+ 43 - 0
correction_tp2/server.js

@@ -0,0 +1,43 @@
+const
+express = require('express'),
+bodyParser = require('body-parser');
+
+
+const app = express();
+
+
+app.use(bodyParser.json());
+
+
+// create controllers
+const person_ctrl = require('./person_ctrl');
+const mail_address_ctrl = require('./mail_address_ctrl');
+
+// register routes
+app.get('/person', person_ctrl.get_all);
+app.post('/person', person_ctrl.create);
+app.get('/person/:person_id', person_ctrl.get_by_id);
+app.put('/person/:person_id', person_ctrl.update_by_id);
+app.delete('/person/:person_id', person_ctrl.delete_by_id);
+
+app.get('/person/:person_id/mailAddress', person_ctrl.load_by_id, mail_address_ctrl.get_all);
+app.post('/person/:person_id/mailAddress', person_ctrl.load_by_id, mail_address_ctrl.create);
+app.get('/person/:person_id/mailAddress/:mail_address_id', person_ctrl.load_by_id, mail_address_ctrl.get_by_id);
+app.put('/person/:person_id/mailAddress/:mail_address_id', person_ctrl.load_by_id, mail_address_ctrl.update_by_id);
+app.delete('/person/:person_id/mailAddress/:mail_address_id', person_ctrl.load_by_id, mail_address_ctrl.delete_by_id);
+
+// register error handling middleware
+app.use((err, req, res, next) => {
+	if (err.status === undefined) {
+		return res.status(500).send(err.message);
+	} else {
+		return res.status(err.status).send(err.message);
+	}
+});
+
+// launch server
+const server = app.listen(3000, () => {
+	const host = server.address().address;
+	const port = server.address().port;
+	console.log('App listening at http://%s:%s', host, port);
+});