diff --git a/_docs/old_scripts.zip b/_docs/old_scripts.zip new file mode 100644 index 0000000..914b19b Binary files /dev/null and b/_docs/old_scripts.zip differ diff --git a/src/repositories/ingredient-repository.js b/src/repositories/ingredient-repository.js deleted file mode 100644 index 29150e3..0000000 --- a/src/repositories/ingredient-repository.js +++ /dev/null @@ -1,206 +0,0 @@ -// Bookshelf -const bookshelf = require('../database/bookshelf').bookshelf; -const model = require('../models/ingredient-model'); - -// Model validation -const Validator = require('jsonschema').Validator; -const validator = new Validator(); -const IngredientValidation = require("../validations/IngredientValidation"); -validator.addSchema(IngredientValidation, "/IngredientValidation"); - -// Validations -const isXSSAttempt = require('../functions').isXSSAttempt; -const isEmptyObject = require('../functions').isEmptyObject; - -class IngredientRepository { - - constructor() { - } - - getAll() { - return new Promise((resolve, reject) => { - new model() - .fetchAll({ withRelated: ['spells'] }) - .then(v => { - resolve(v.toJSON({ omitPivot: true })); - }) - .catch(err => { - console.log(err); - reject({ - "message": "Il n'existe aucun ingrédient disponible.", - "code": 404, - }); - }); - }); - } - - - getOne(id) { - return new Promise((resolve, reject) => { - new model() - .where({ 'id': id }) - .fetch({ withRelated: ['spells'] }) - .then(v => { - resolve(v.toJSON({ omitPivot: true })); - }) - .catch(err => { - console.log(err); - reject({ - "message": "L'ingrédient en question n'a pas pu être trouvé.", - "code": 404, - }); - }); - }); - } - - getSpellsFromOne(id) { - return new Promise((resolve, reject) => { - new model() - .where({ 'id': id }) - .fetch({ withRelated: ['spells', 'spells.schools', 'spells.variables', 'spells.ingredients', 'spells.schools.meta_schools'] }) - .then(v => { - resolve(v.toJSON({ omitPivot: true })); - }) - .catch(err => { - console.log(err); - reject({ - "message": "Les sortilèges liés à cet ingrédient n'ont pas pu être récupérés.", - "code": 404, - }); - }); - }); - } - - addOne(igr) { - return new Promise((resolve, reject) => { - // Checks if body exists and if the model fits, and throws errors if it doesn't - if (isEmptyObject(igr)) { - reject({ - "message": "Le corps de la requête ne peut pas être vide.", - "code": 403, - }); - } else if (!validator.validate(igr, IngredientValidation).valid) { - reject({ - "message": `Le modèle d'ingrédient n'est pas respecté : ${validator.validate(s, IngredientValidation).errors}`, - "code": 403, - }); - } else if (isXSSAttempt(igr.description)) { - reject({ - "message": "Tentative d'injection XSS détectée, requête refusée.", - "code": 403, - }); - } else { - bookshelf.transaction(t => { - return new model({ - 'name': igr.name, - 'description': igr.description, - }).save(null, { - transacting: t - }) - .catch(err => { - throw err; - }); - }) - .then(v => { - return v.load(['spells']); - }) - .then(v => { - resolve(this.getOne(v.id)); - }) - .catch(err => { - console.log(err); - reject({ - "message": "Une erreur d'insertion s'est produite.", - "code": 500, - }); - }); - } - }); - } - - updateOne(id, igr) { - return new Promise((resolve, reject) => { - // Checks if body exists and if the model fits, and throws errors if it doesn't - if (isEmptyObject(igr)) { - reject({ - "message": "Le corps de la requête ne peut pas être vide.", - "code": 403, - }); - } else if (!validator.validate(igr, IngredientValidation).valid) { - reject({ - "message": `Le modèle d'ingrédient n'est pas respecté : ${validator.validate(s, IngredientValidation).errors}`, - "code": 403, - }); - } else if (isXSSAttempt(igr.description)) { - reject({ - "message": "Tentative d'injection XSS détectée, requête refusée.", - "code": 403, - }); - } else { - new model({ id: id }) - .fetch({ require: true, withRelated: ['spells'] }) - .then(v => { - bookshelf.transaction(t => { - return v.save({ - 'name': igr.name, - 'description': igr.description, - }, { - method: 'update', - transacting: t - }) - .catch(err => { - console.log(err); - throw err; - }); - }) - .then(v => { - return v.load(['spells']); - }) - .then(v => { - resolve(this.getOne(v.id)); - }) - .catch(err => { - console.log(err); - reject({ - "message": "Une erreur d'insertion s'est produite.", - "code": 500, - }); - }); - }) - .catch(err => { - console.log(err); - reject({ - "message": "L'ingrédient en question n'a pas été trouvé.", - "code": 404, - }); - }); - } - }); - } - - deleteOne(id) { - return new Promise((resolve, reject) => { - new model() - .where({ 'id': id }) - .fetch({ require: true, withRelated: ['spells'] }) - .then(v => { - v.spells().detach(); - v.destroy(); - }) - .then(() => { - resolve({ - 'message': 'Ingredient with ID ' + id + ' successfully deleted !' - }); - }) - .catch(err => { - console.log(err); - reject({ - "message": "L'ingrédient en question n'a pas été trouvé.", - "code": 404, - }); - }); - }); - } -} - -module.exports = IngredientRepository; \ No newline at end of file diff --git a/src/repositories/meta-school-repository.js b/src/repositories/meta-school-repository.js deleted file mode 100644 index 1431c67..0000000 --- a/src/repositories/meta-school-repository.js +++ /dev/null @@ -1,51 +0,0 @@ -// Bookshelf -const model = require('../models/meta-school-model') - -// Model validation -const Validator = require('jsonschema').Validator -const validator = new Validator() -const MetaSchoolValidation = require("../validations/MetaSchoolValidation") -validator.addSchema(MetaSchoolValidation, "/MetaSchoolValidation") - -class MetaSchoolRepository { - - constructor() { - } - - getAll() { - return new Promise((resolve, reject) => { - new model() - .fetchAll({ withRelated: ['schools'] }) - .then(v => { - resolve(v.toJSON({ omitPivot: true })) - }) - .catch(err => { - console.log(err) - reject({ - "message": "Il n'existe aucune grande école disponible.", - "code": 404 - }); - }) - }) - } - - getOne(id) { - return new Promise((resolve, reject) => { - new model() - .where({ 'id': id }) - .fetch({ withRelated: ['schools'] }) - .then(v => { - resolve(v.toJSON({ omitPivot: true })) - }) - .catch(err => { - console.log(err) - reject({ - "message": "La grande école en question n'a pas pu être trouvée.", - "code": 404 - }); - }) - }) - } -} - -module.exports = MetaSchoolRepository \ No newline at end of file diff --git a/src/repositories/school-repository.js b/src/repositories/school-repository.js deleted file mode 100644 index 22740e8..0000000 --- a/src/repositories/school-repository.js +++ /dev/null @@ -1,207 +0,0 @@ -// Bookshelf -const bookshelf = require('../database/bookshelf').bookshelf; -const model = require('../models/school-model'); - -// Model validation -const Validator = require('jsonschema').Validator; -const validator = new Validator(); -const SchoolValidation = require("../validations/SchoolValidation"); -validator.addSchema(SchoolValidation, "/SchoolValidation"); - -// Validations -const isXSSAttempt = require('../functions').isXSSAttempt; -const isEmptyObject = require('../functions').isEmptyObject; - -class SchoolRepository { - - constructor() { - } - - getAll() { - return new Promise((resolve, reject) => { - new model() - .fetchAll({ withRelated: ['meta_schools'] }) - .then(v => { - resolve(v.toJSON({ omitPivot: true })); - }) - .catch(err => { - console.log(err); - reject({ - "message": "Il n'existe aucune école disponible.", - "code": 404, - }); - }); - }); - } - - getOne(id) { - return new Promise((resolve, reject) => { - new model() - .where({ 'id': id }) - .fetch({ withRelated: ['meta_schools'] }) - .then(v => { - resolve(v.toJSON({ omitPivot: true })); - }) - .catch(err => { - console.log(err); - reject({ - "message": "L'école en question n'a pas pu être trouvée.", - "code": 404, - }); - }); - }); - } - - getSpellsFromOne(id) { - return new Promise((resolve, reject) => { - new model() - .where({ 'id': id }) - .fetch({ withRelated: ['spells', 'spells.schools', 'spells.variables', 'spells.ingredients', 'spells.schools.meta_schools'] }) - .then(v => { - resolve(v.toJSON({ omitPivot: true })); - }) - .catch(err => { - console.log(err); - reject({ - "message": "Les sortilèges de cette école n'ont pas pu être récupérés.", - "code": 404, - }); - }); - }); - } - - addOne(s) { - return new Promise((resolve, reject) => { - // Checks if body exists and if the model fits, and throws errors if it doesn't - if (isEmptyObject(s)) { - reject({ - "message": "Le corps de la requête ne peut pas être vide.", - "code": 403, - }); - } else if (!validator.validate(s, SchoolValidation).valid) { - reject({ - "message": `Le modèle d'école n'est pas respecté : ${validator.validate(s, SchoolValidation).errors}`, - "code": 403, - }); - } else if (isXSSAttempt(s.name) || isXSSAttempt(s.description)) { - reject({ - "message": "Tentative d'injection XSS détectée, requête refusée.", - "code": 403, - }); - } else { - bookshelf.transaction(t => { - return new model({ - 'name': s.name, - 'description': s.description, - 'meta_school_id': s.meta_school_id, - }).save(null, { - transacting: t - }) - .catch(err => { - throw err; - }); - }) - .then(v => { - return v.load(['meta_schools']); - }) - .then(v => { - resolve(this.getOne(v.id)); - }) - .catch(err => { - console.log(err); - reject({ - "message": "Une erreur d'insertion s'est produite.", - "code": 500, - }); - }); - } - }); - } - - updateOne(id, s) { - return new Promise((resolve, reject) => { - // Checks if body exists and if the model fits, and throws errors if it doesn't - if (isEmptyObject(s)) { - reject({ - "message": "Le corps de la requête ne peut pas être vide.", - "code": 403, - }); - } else if (!validator.validate(s, SchoolValidation).valid) { - reject({ - "message": `Le modèle d'école n'est pas respecté : ${validator.validate(s, SchoolValidation).errors}`, - "code": 403, - }); - } else if (isXSSAttempt(s.name) || isXSSAttempt(s.description)) { - reject({ - "message": "Tentative d'injection XSS détectée, requête refusée.", - "code": 403, - }); - } else { - new model({ id: id }) - .fetch({ require: true, withRelated: ['meta_schools'] }) - .then(v => { - bookshelf.transaction(t => { - return v.save({ - 'name': s.name, - 'description': s.description, - 'meta_school_id': s.meta_school_id - }, { - method: 'update', - transacting: t - }) - .catch(err => { - console.log(err); - throw err; - }); - }) - .then(v => { - return v.load(['meta_schools']); - }) - .then(v => { - resolve(this.getOne(v.id)); - }) - .catch(err => { - console.log(err); - reject({ - "message": "Une erreur d'insertion s'est produite.", - "code": 500, - }); - }); - }) - .catch(err => { - console.log(err); - reject({ - "message": "L'école en question n'a pas été trouvée.", - "code": 404, - }); - }); - } - }); - } - - deleteOne(id) { - return new Promise((resolve, reject) => { - new model() - .where({ 'id': id }) - .fetch({ require: true, withRelated: ['spells', 'meta_schools'] }) - .then(v => { - v.spells().detach(); - v.destroy(); - }) - .then(() => { - resolve({ - 'message': 'School with ID ' + id + ' successfully deleted !' - }); - }) - .catch(err => { - console.log(err); - reject({ - "message": "L'école en question n'a pas été trouvée.", - "code": 404, - }); - }); - }); - } -} - -module.exports = SchoolRepository; \ No newline at end of file diff --git a/src/repositories/spell-repository.js b/src/repositories/spell-repository.js deleted file mode 100644 index aa07ddd..0000000 --- a/src/repositories/spell-repository.js +++ /dev/null @@ -1,351 +0,0 @@ -'use strict' -// Bookshelf -const bookshelf = require('../database/bookshelf').bookshelf -const model = require('../models/spell-model') - -// Model validation -const Validator = require('jsonschema').Validator -const validator = new Validator() -const SpellValidation = require("../validations/SpellValidation") -validator.addSchema(SpellValidation, "/SpellValidation") - -// Validations -const isXSSAttempt = require('../functions').isXSSAttempt -const isEmptyObject = require('../functions').isEmptyObject - -class SpellRepository { - - constructor() { - } - - getAll(name, description, level, charge, cost, ritual) { - return new Promise((resolve, reject) => { - - let query = new model(); - - if (name) { - query.where('name', 'like', `%${name}%`) - } - if (description) { - query.where('description', 'like', `%${description}%`) - } - if (level) { - query.where({ 'level': level }) - } - if (charge) { - query.where({ 'charge': charge }) - } - if (cost) { - query.where({ 'cost': cost }) - } - if (ritual) { - query.where({ 'is_ritual': ritual }) - } - - query.fetchAll({ withRelated: ['schools.meta_schools', 'variables', 'ingredients', 'author'] }) - .then(v => { - resolve(v.toJSON({ omitPivot: true })) - }) - .catch(err => { - console.log(err); - reject({ - "message": "Il n'existe aucun sortilège disponible.", - "code": 404, - }); - }) - }) - } - - getAllPublic(name, description, level, charge, cost, ritual) { - return new Promise((resolve, reject) => { - - let query = new model().where({ 'public': 1 }) - - if (name) { - query.where('name', 'like', `%${name}%`) - } - if (description) { - query.where('description', 'like', `%${description}%`) - } - if (level) { - query.where({ 'level': level }) - } - if (charge) { - query.where({ 'charge': charge }) - } - if (cost) { - query.where({ 'cost': cost }) - } - if (ritual) { - query.where({ 'is_ritual': ritual }) - } - - query.fetchAll({ withRelated: ['schools.meta_schools', 'variables', 'ingredients', 'author'] }) - .then(v => { - resolve(v.toJSON({ omitPivot: true })); - }) - .catch(err => { - console.log(err); - reject({ - "message": "Il n'existe aucun sortilège disponible.", - "code": 404, - }); - }) - }) - } - - getPage(page) { - return new Promise((resolve, reject) => { - new model() - .where({ 'public': 1 }) - .fetchPage({ - pageSize: 20, - page: page, - withRelated: ['schools.meta_schools', 'variables', 'ingredients', 'author'], - }) - .then(v => { - resolve(v.toJSON({ omitPivot: true })) - }) - .catch(err => { - console.log(err); - reject({ - "message": "La page de sortilèges n'a pas pu être chargée", - "code": 404, - }); - }) - }) - } - - getOne(id) { - return new Promise((resolve, reject) => { - new model() - .where({ 'id': id }) - .fetch({ withRelated: ['schools.meta_schools', 'variables', 'ingredients', 'author'] }) - .then(v => { - resolve(v.toJSON({ omitPivot: true })) - }) - .catch(err => { - console.log(err); - reject({ - "message": "Le sortilège en question n'a pas été trouvé.", - "code": 404, - }); - }) - }) - } - - addOne(s) { - return new Promise((resolve, reject) => { - // Checks if body exists and if the model fits, and throws errors if it doesn't - if (isEmptyObject(s)) { - reject({ - "message": "Le corps de la requête ne peut pas être vide.", - "code": 403, - }); - } else if (!validator.validate(s, SpellValidation).valid) { - reject({ - "message": `Le modèle de sortilège n'est pas respecté : ${validator.validate(s, SpellValidation).errors}`, - "code": 403, - }); - } else if (isXSSAttempt(s.name) || isXSSAttempt(s.description) || isXSSAttempt(s.cost)) { - reject({ - "message": "Tentative d'injection XSS détectée, requête refusée.", - "code": 403, - }); - } else { - bookshelf.transaction(t => { - return new model({ - 'name': s.name, - 'description': s.description, - 'level': s.level, - 'charge': s.charge, - 'cost': s.cost, - 'is_ritual': s.is_ritual - }).save(null, { - transacting: t - }) - .tap(spell => { - return spell - .schools() - .attach(s.schools, { - transacting: t - }); - }) - .tap(spell => { - return spell - .variables() - .attach(s.variables, { - transacting: t - }); - }) - .tap(spell => { - return spell - .ingredients() - .attach(s.ingredients, { - transacting: t - }); - }) - .catch(err => { - console.log(err); - reject({ - "message": "Un attributs du sortilège a provoqué une erreur d'insertion.", - "code": 500, - }); - }) - }) - .then(v => { - return v.load(['schools.meta_schools', 'variables', 'ingredients', 'author']) - }) - .then(v => { - resolve(this.getOne(v.id)) - }) - .catch(err => { - console.log(err); - reject({ - "message": "Le sortilège n'a pas pu être ajouté.", - "code": 500, - }); - }) - } - }) - } - - updateOne(id, s) { - return new Promise((resolve, reject) => { - // Checks if body exists and if the model fits, and throws errors if it doesn't - if (isEmptyObject(s)) { - reject({ - "message": "Le corps de la requête ne peut pas être vide.", - "code": 403, - }); - } else if (!validator.validate(s, SpellValidation).valid) { - reject({ - "message": `Le modèle de sortilège n'est pas respecté : ${validator.validate(s, SpellValidation).errors}`, - "code": 403, - }); - } else if (isXSSAttempt(s.name) || isXSSAttempt(s.description) || isXSSAttempt(s.cost)) { - reject({ - "message": "Tentative d'injection XSS détectée, requête refusée.", - "code": 403, - }); - } else { - new model({ id: id }) - .fetch({ require: true, withRelated: ['schools.meta_schools', 'variables', 'ingredients', 'author'] }) - .then(v => { - bookshelf.transaction(t => { - return v.save({ - 'name': s.name, - 'description': s.description, - 'level': s.level, - 'charge': s.charge, - 'cost': s.cost, - 'is_ritual': s.is_ritual - }, { - method: 'update', - transacting: t - }) - // Detaches AND attaches pivot tables, dw about it - .tap(spell => { - if (s.schools) { - let schools = spell.related('school'); - return spell.schools().detach(schools, { transacting: t }); - } - return spell - }) - .tap(spell => { - if (s.variables) { - let variables = spell.related('variable'); - return spell.variables().detach(variables, { transacting: t }); - } - return spell; - }) - .tap(spell => { - if (s.ingredients) { - let ingredients = spell.related('ingredient'); - return spell.ingredients().detach(ingredients, { transacting: t }); - } - return spell; - }) - .tap(spell => { - return spell - .schools() - .attach(s.schools, { - transacting: t - }); - }) - .tap(spell => { - return spell - .variables() - .attach(s.variables, { - transacting: t - }); - }) - .tap(spell => { - return spell - .ingredients() - .attach(s.ingredients, { - transacting: t - }); - }) - .catch(err => { - console.log(err); - reject({ - "message": "Un attributs du sortilège a provoqué une erreur d'insertion.", - "code": 500, - }) - }) - }) - .then(v => { - return v.load(['schools.meta_schools', 'variables', 'ingredients', 'author']); - }) - .then(v => { - resolve(this.getOne(v.id)); - }) - .catch(err => { - console.log(err); - reject({ - "message": "Une erreur de chargement est survenue.", - "code": 500, - }); - }) - }) - .catch(err => { - console.log(err); - reject({ - "message": "Le sortilège en question n'a pas été trouvé.", - "code": 404, - }); - }) - } - }) - } - - deleteOne(id) { - return new Promise((resolve, reject) => { - new model() - .where({ 'id': id }) - .fetch({ require: true, withRelated: ['schools.meta_schools', 'variables', 'ingredients', 'author'] }) - .then(v => { - v.schools().detach(); - v.variables().detach(); - v.ingredients().detach(); - v.destroy(); - }) - .then(() => { - resolve({ - "message": `Le sortilège #${id} a été supprimé avec succès.`, - "code": 200, - }); - }) - .catch(err => { - console.log(err); - reject({ - "message": "Le sortilège en question n'a pas été trouvé.", - "code": 404, - }); - }) - }) - } -} - -module.exports = SpellRepository \ No newline at end of file diff --git a/src/repositories/user-repository.js b/src/repositories/user-repository.js deleted file mode 100644 index 6edc212..0000000 --- a/src/repositories/user-repository.js +++ /dev/null @@ -1,562 +0,0 @@ -'use strict' -// Bookshelf -const bookshelf = require('../database/bookshelf').bookshelf; -const model = require('../models/user-model'); -const token_model = require('../models/api-token-model'); - -// Hashing and passwords -const bcrypt = require('bcrypt'); -const { v4: uuidv4 } = require('uuid'); - -// Mailing methods -const mails = require('../smtp/mails'); - -// Model validation -const Validator = require('jsonschema').Validator; -const validator = new Validator(); -const UserValidation = require("../validations/UserValidation"); -validator.addSchema(UserValidation, "/UserValidation"); - -// Validations -const isXSSAttempt = require('../functions').isXSSAttempt; -const isEmptyObject = require('../functions').isEmptyObject; - -class UserRepository { - - constructor() { - } - - /** - * Fetches all users in the dabatase. - * - * @returns { Promise } - * Fulfilled data: Array of user objects. - */ - getAll() { - return new Promise((resolve, reject) => { - new model() - .fetchAll({ withRelated: ['role.permissions'] }) - .then(v => { - resolve(v.toJSON({ omitPivot: true })); - }) - .catch(err => { - console.log(err) - reject({ - "message": "Erreur de base de données, les utilisateurs n'ont pas pu être récupérés.", - "code": 500, - }); - }) - }) - } - - /** - * Fetches a user object associated with the uuid. - * - * @param { string } uuid - * @param { boolean } full - * Whether the password should also be fetched. (should never be true unless you want to log the user) - * - * @returns { Promise } - * Fulfilled data: Queried user object. - */ - getOneByUUID(uuid, full) { - return new Promise((resolve, reject) => { - - if (!(uuid)) { - reject({ - "message": "La requête doit renseigner un uuid.", - "code": 400, - }) - } - - new model() - .where({ 'uuid': uuid }) - .fetch({ withRelated: ['role.permissions'] }) - .then(v => { - resolve(v.toJSON({ omitPivot: true, visibility: !full })); - }) - .catch(() => { - reject({ - "message": "L'utilisateur avec cet UUID n'a pas été trouvé.", - "code": 404, - }); - }) - }) - } - - /** - * Fetches a user object associated with the mail address. - * - * @param { string } mail - * @param { boolean } full - * Whether the password should also be fetched. (should never be true unless you want to log the user) - * - * @returns { Promise } - * Fulfilled data: Queried user object. - */ - getOneByEmail(mail, full) { - return new Promise((resolve, reject) => { - - if (!(mail)) { - reject({ - "message": "La requête doit renseigner un email.", - "code": 400, - }) - } - - new model() - .where({ 'mail': mail }) - .fetch({ withRelated: ['role'] }) - .then(v => { - resolve(v.toJSON({ omitPivot: true, visibility: !full })); - }) - .catch(() => { - reject({ - "message": "L'utilisateur avec cet email n'a pas été trouvé.", - "code": 404, - }); - }); - }) - } - - /** - * Fetches all spells linked to a user's uuid - * - * @param { string } uuid - * - * @returns - */ - getSpellsFromOne(uuid) { - return new Promise((resolve, reject) => { - - if (!(uuid)) { - reject({ - "message": "La requête doit renseigner un uuid.", - "code": 400, - }) - } - - new model() - .where({ 'uuid': uuid }) - .fetch({ withRelated: ['role', 'spells.schools.meta_schools', 'spells.variables', 'spells.ingredients'] }) - .then(v => { - resolve(v.toJSON({ omitPivot: true })); - }) - .catch(() => { - reject({ - "message": "Les sorts liés à cet utilisateur n'ont pas été trouvés.", - "code": 404, - }); - }); - }) - } - - /** - * Registers a user based on the model at ./models/user-model.js. - * - * @param { object} u - * User object - * - * @returns { Promise } - * Fulfilled data: Queried user object. - */ - addOne(u) { - return new Promise(async (resolve, reject) => { - // Checks if body exists and if the model fits, and throws errors if it doesn't - if (isEmptyObject(u)) { - reject({ - "message": "Le corps de requête ne peut être vide.", - "code": 403, - }) - } else if (!validator.validate(u, UserValidation).valid) { - reject({ - "message": "Structure de la requête invalide - " + validator.validate(u, UserValidation).errors, - "code": 403, - }) - } else if (isXSSAttempt(u.name) || isXSSAttempt(u.password) || isXSSAttempt(u.mail)) { - reject({ - "message": "Essai d'injection détecté, avortement de la requête.", - "code": 403, - }) - } else { - let hash = await bcrypt.hash(u.password, 10); - - let uuid = uuidv4(); - let verification_token = uuidv4(); - - this.checkIfEmailAvailable(u.mail) - .then(() => { - bookshelf.transaction(t => { - return new model({ - 'uuid': uuid, - 'name': u.name, - 'mail': u.mail, - 'password': hash, - 'verification_token': verification_token, - }) - .save(null, { - transacting: t - }) - .catch(err => { - console.log(err); - reject({ - "message": "Un attribut de l'utilisateur a provoqué une erreur d'insertion.", - "code": 500, - }); - }) - }) - .then(() => { - return this.getOneByUUID(uuid, false) - }) - .then(newUser => { - - // Send a mail to the new user's email with a link to verification url - mails.sendRegistrationMail({ - user: { - name: newUser.name, - mail: newUser.mail, - token: verification_token, - } - }); - - // Then resolves the api call - resolve({ - "message": `Compte utilisateur #${newUser.id} créé avec succès.`, - "code": 201, - "user": newUser, - }); - }) - .catch(err => { - console.log(err); - resolve({ - "message": "Une erreur s'est produite en créant votre compte. Veuillez réessayer ultérieurement ou contactez l'administrateur.", - "code": 500, - }) - }) - }) - .catch(err => { - reject(err) - }) - } - }) - } - - /** - * Verifies an account based on a private UUID token - * - * @param { string } token - * A UUID v4 identification token provided at registration and on special demands - * - * @returns Redirects to login page - */ - verifyUser(token) { - return new Promise((resolve, reject) => { - new model() - .where({ 'verification_token': token }) - .fetch() - .then(v => { - bookshelf.transaction(t => { - return v.save({ - 'verification_token': null, - 'verified': 1, - }, { - method: 'update', - transacting: t - }) - }) - .then(() => { - resolve({ - "message": "Insérez ici une future redirection vers le client.", - "code": 202, - }) - }) - }) - .catch(() => { - reject({ - "message": "Le lien de vérification ne semble pas correct.", - "code": 404, - }) - }) - }); - } - - /** - * Logs a user by comparing the dual mail/password inputs - * - * @param { string } mail - * @param { string } password - * - * @return { Promise } - * Fulfilled data: Queried user object. - */ - logUser(mail, password) { - return new Promise((resolve, reject) => { - this.getOneByEmail(mail, true) - .then(async fetchedUser => { - - let match = await bcrypt.compare(password, fetchedUser.password); - - // Makes sure no hash gets out - delete fetchedUser.password; - - // If you found a user... - if (match) { - // If they're banned... - if (fetchedUser.banned) { - reject({ - "message": `L'utilisateur #${fetchedUser.name} a été banni, la connexion est impossible.`, - "code": 403, - }); - // If they're not verified... - } else if (!fetchedUser.verified) { - reject({ - "message": `L'utilisateur #${fetchedUser.name} n'as pas été vérifié, le compte doit être activé avant la connexion.`, - "code": 401, - }); - } else { - resolve({ - "message": `L'utilisateur #${fetchedUser.name} s'est connecté.`, - "code": 200, - "user": fetchedUser, - }); - } - } else { - reject({ - "message": "Les informations de connexions sont erronées.", - "code": 400, - }); - } - }) - .catch(err => { - reject(err); - }) - }) - } - - /** - * Generate a token for the user to use the API - * Requires mail and password for verifying the user - * - * @param { string } mail - * @param { string } password - * - * @returns { Promise } - * Fulfilled data: A unique UUID token string. - */ - genAPIToken(mail, password) { - return new Promise((resolve, reject) => { - this.logUser(mail, password) - .then(v => { - let user = v.user; - let new_token = uuidv4(); - - bookshelf.transaction(t => { - return new token_model({ - 'value': new_token, - 'user_uuid': user.uuid, - }) - .save(null, { - transacting: t - }) - .catch(err => { - // If the account already has an API key linked... - if (err.errno === 1062) { - this.fetchAPIKey(user.uuid) - .then(old_api_key => { - reject({ - "message": "Votre compte a déjà généré une clé d'API.", - "code": 409, - "API_key": old_api_key.value, - }); - }); - - // Default errors - } else { - throw err - } - }); - }) - .then(api_key => { - resolve({ - "message": "La clé d'API a été généré.", - "code": 201, - "API_key": api_key, - }) - }) - .catch(err => { - console.log(err); - reject({ - "message": "La génération de jeton d'API n'a pas pu être conclue.", - "code": 500, - }); - }) - }) - .catch(err => { - reject(err); - }) - }) - } - - checkAPITokenPerms(token, permissions) { - return new Promise(async (resolve, reject) => { - - // If the request doesn't have a token, reject it. - if (!token) { - reject({ - "message": "Vous devez utiliser un jeton d'API dans l'en-tête de votre requête.", - "code": 401, - }) - } - - // Fetches user from token - new token_model() - .where({ 'value': token }) - .fetch({ withRelated: 'user.role.permissions' }) - - // Catches not found errors - .catch(err => { - if (err instanceof token_model.NotFoundError) { - reject({ - "message": "Ce jeton n'est affilié à aucun compte.", - "code": 404, - }); - } else { - reject({ - "message": "Le jeton ou l'utilisateur n'a pas pu être récupéré.", - "code": 500, - }); - } - }) - - .then(fullToken => { - token = fullToken.toJSON({ omitPivot: true }); - - // If the token is associated with a banned user... - if (token.user.banned) { - reject({ - "message": "Le jeton est lié à un utilisateur banni, il n'est donc plus utilisable.", - "code": 401, - }); - } - - // If the token is associated with a non-verified user... - if (!token.user.verified) { - reject({ - "message": "Le jeton est lié à un utilisateur non-vérifié, il n'est donc pas utilisable.", - "code": 401, - }); - } - - let user_permissions = token.user.role.permissions; - - // Convert user_perm to array - user_permissions.forEach((user_perm, i) => { - user_permissions[i] = user_perm.slug; - }); - - // Loops to check if the person has all the permissions required... - permissions.forEach(perm => { - // If not, reject... - if (!user_permissions.includes(perm)) { - reject({ - "message": "Permissions insuffisantes.", - "code": 401 - }) - } - }); - - // If everything went well, resolve the promise. - resolve({ - "message": "Credentials accepted.", - "code": 200 - }); - }) - - // Unhandled errors - .catch(() => { - reject({ - "message": "Une erreur inconnue est survenue.", - "code": 500, - }); - }); - }) - } - - /** - * Check if the email that was input is available for account creation. - * - * @param {string} mail - * - * @returns { Promise } - * Fulfilled: HTTP 200 if email is available. - * Rejected: HTTP 400-409 if email is already used. - */ - checkIfEmailAvailable(mail) { - return new Promise((resolve, reject) => { - - if (!(mail)) { - reject({ - "message": "La requête doit renseigner un email.", - "code": 400, - }) - } - - if (!this.validateMail(mail)) { - reject({ - "message": "La requête n'est pas un email valide.", - "code": 400, - }) - } - - this.getOneByEmail(mail, false) - .then(() => { - reject({ - "message": "Cet email est déjà lié à un compte.", - "code": 409, - }) - }) - .catch(() => { - resolve({ - "message": "Cet email est disponible.", - "code": 200, - }) - }) - }) - } - - /** - * Fetches the associated api_token from a user uuid. - * - * @param { string } uuid - * - * @returns { Promise } - * Fulfilled data: Queried API token object - */ - fetchAPIKey(uuid) { - return new Promise((resolve, reject) => { - new token_model() - .where({ 'user_uuid': uuid }) - .fetch() - .then(v => { - resolve(v.toJSON({ omitPivot: true })); - }) - .catch(err => { - reject(err); - }) - }) - } - - /** - * Whether a mail is correctly formed and ripe for receiving, ie: xxx@yyy.zzz. - * - * @param { string } mail - * - * @returns { boolean } - */ - validateMail(mail) { - const regex = /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; - return regex.test(String(mail).toLowerCase()); - } -} - -module.exports = UserRepository \ No newline at end of file diff --git a/src/repositories/variable-repository.js b/src/repositories/variable-repository.js deleted file mode 100644 index 69192cb..0000000 --- a/src/repositories/variable-repository.js +++ /dev/null @@ -1,204 +0,0 @@ -// Bookshelf -const bookshelf = require('../database/bookshelf').bookshelf; -const model = require('../models/variable-model'); - -// Model validation -const Validator = require('jsonschema').Validator; -const validator = new Validator(); -const VariableValidation = require("../validations/VariableValidation"); -validator.addSchema(VariableValidation, "/VariableValidation"); - -// Validations -const isXSSAttempt = require('../functions').isXSSAttempt; -const isEmptyObject = require('../functions').isEmptyObject; - -class VariableRepository { - - constructor() { - } - - getAll() { - return new Promise((resolve, reject) => { - new model() - .fetchAll({ withRelated: ['spells'] }) - .then(v => { - resolve(v.toJSON({ omitPivot: true })); - }) - .catch(err => { - console.log(err); - reject({ - "message": "Il n'existe aucune variable disponible.", - "code": 404, - }); - }); - }); - } - - - getOne(id) { - return new Promise((resolve, reject) => { - new model() - .where({ 'id': id }) - .fetch({ withRelated: ['spells'] }) - .then(v => { - resolve(v.toJSON({ omitPivot: true })); - }) - .catch(err => { - console.log(err); - reject({ - "message": "La variable en question n'a pas pu être trouvée.", - "code": 404, - }); - }); - }); - } - - getSpellsFromOne(id) { - return new Promise((resolve, reject) => { - new model() - .where({ 'id': id }) - .fetch({ withRelated: ['spells', 'spells.schools', 'spells.variables', 'spells.ingredients', 'spells.schools.meta_schools'] }) - .then(v => { - resolve(v.toJSON({ omitPivot: true })); - }) - .catch(err => { - console.log(err); - reject({ - "message": "Les sortilèges liés à cette variable n'ont pas pu être récupérés.", - "code": 404, - }); - }); - }); - } - - addOne(vr) { - return new Promise((resolve, reject) => { - // Checks if body exists and if the model fits, and throws errors if it doesn't - if (isEmptyObject(vr)) { - reject({ - "message": "Le corps de la requête ne peut pas être vide.", - "code": 403, - }); - } else if (!validator.validate(vr, VariableValidation).valid) { - reject({ - "message": `Le modèle de variable n'est pas respecté : ${validator.validate(s, VariableValidation).errors}`, - "code": 403, - }); - } else if (isXSSAttempt(vr.description)) { - reject({ - "message": "Tentative d'injection XSS détectée, requête refusée.", - "code": 403, - }); - } else { - bookshelf.transaction(t => { - return new model({ - 'description': vr.description, - }).save(null, { - transacting: t - }) - .catch(err => { - throw err; - }); - }) - .then(v => { - return v.load(['spells']); - }) - .then(v => { - resolve(this.getOne(v.id)); - }) - .catch(err => { - console.log(err); - reject({ - "message": "Une erreur d'insertion s'est produite.", - "code": 500, - }); - }); - } - }); - } - - updateOne(id, vr) { - return new Promise((resolve, reject) => { - // Checks if body exists and if the model fits, and throws errors if it doesn't - if (isEmptyObject(vr)) { - reject({ - "message": "Le corps de la requête ne peut pas être vide.", - "code": 403, - }); - } else if (!validator.validate(vr, VariableValidation).valid) { - reject({ - "message": `Le modèle de variable n'est pas respecté : ${validator.validate(s, VariableValidation).errors}`, - "code": 403, - }); - } else if (isXSSAttempt(vr.description)) { - reject({ - "message": "Tentative d'injection XSS détectée, requête refusée.", - "code": 403, - }); - } else { - new model({ id: id }) - .fetch({ require: true, withRelated: ['spells'] }) - .then(v => { - bookshelf.transaction(t => { - return v.save({ - 'description': vr.description, - }, { - method: 'update', - transacting: t - }) - .catch(err => { - console.log(err); - throw err; - }); - }) - .then(v => { - return v.load(['spells']); - }) - .then(v => { - resolve(this.getOne(v.id)); - }) - .catch(err => { - console.log(err); - reject({ - "message": "Une erreur d'insertion s'est produite.", - "code": 500, - }); - }); - }) - .catch(err => { - console.log(err); - reject({ - "message": "La variable en question n'a pas été trouvée.", - "code": 404, - }); - }); - } - }); - } - - deleteOne(id) { - return new Promise((resolve, reject) => { - new model() - .where({ 'id': id }) - .fetch({ require: true, withRelated: ['spells'] }) - .then(v => { - v.spells().detach(); - v.destroy(); - }) - .then(() => { - resolve({ - 'message': 'Variable with ID ' + id + ' successfully deleted !' - }); - }) - .catch(err => { - console.log(err); - reject({ - "message": "La variable en question n'a pas été trouvée.", - "code": 404, - }); - }); - }); - } -} - -module.exports = VariableRepository; \ No newline at end of file diff --git a/src/routes/auth.js b/src/routes/auth.js deleted file mode 100644 index 16a23b4..0000000 --- a/src/routes/auth.js +++ /dev/null @@ -1,28 +0,0 @@ -// Router -const express = require('express'); -let router = express.Router(); - -// Repository -const UserRepository = require('../repositories/user-repository'); -const Users = new UserRepository(); - -// ROUTES -// GEN API TOKEN -const generateAPIToken = (mail, password) => { - return Users.genAPIToken(mail, password) - .catch(err => { - throw err; - }); -}; -router.get('/genToken', async (req, res) => { - generateAPIToken(req.body.mail, req.body.password) - .then(v => { - res.setHeader('Content-Type', 'application/json;charset=utf-8'); - res.end(JSON.stringify(v)); - }) - .catch(err => { - res.status(err.code).send(JSON.stringify(err)); - }); -}); - -module.exports = router; \ No newline at end of file diff --git a/src/routes/index.js b/src/routes/index.js deleted file mode 100644 index 01c4109..0000000 --- a/src/routes/index.js +++ /dev/null @@ -1,18 +0,0 @@ -const spells = require('./spells'); -const schools = require('./schools'); -const meta_schools = require('./meta_schools'); -const variables = require('./variables'); -const ingredients = require('./ingredients'); -const users = require('./users'); - -const auth = require('./auth'); - -module.exports = { - auth, - spells, - schools, - meta_schools, - ingredients, - variables, - users, -}; \ No newline at end of file diff --git a/src/routes/ingredients.js b/src/routes/ingredients.js deleted file mode 100644 index c2e8ce5..0000000 --- a/src/routes/ingredients.js +++ /dev/null @@ -1,183 +0,0 @@ -// Router -const express = require('express'); -let router = express.Router(); - -// AuthGuard -const authGuard = require('./middleware/authGuard'); - -// Repository -const IngredientRepository = require('../repositories/ingredient-repository'); -const Ingredients = new IngredientRepository(); - -// Functions -const functions = require('../functions'); - -// ROUTES -// GET ALL ------------------ -const getIngredients = () => { - return Ingredients.getAll() - .catch(err => { - console.log(err); - throw err; - }); -}; -router.get( - '/', - async (req, res) => { - getIngredients() - .then(v => { - res.setHeader('Content-Type', 'application/json;charset=utf-8'); - res.end(JSON.stringify(v)); - }) - .catch(err => { - res.status(err.code).send(JSON.stringify( - { - "error": err.message, - "code": err.code - }) - ); - }); - }); - - -// GET ONE ------------------ -const getIngredient = (id) => { - return Ingredients.getOne(id) - .catch(err => { - console.log(err); - throw err; - }); -}; -router.get( - '/:id/', - async (req, res) => { - getIngredient(req.params.id) - .then(v => { - res.setHeader('Content-Type', 'application/json;charset=utf-8'); - res.end(JSON.stringify(v)); - }) - .catch(err => { - res.status(err.code).send(JSON.stringify( - { - "error": err.message, - "code": err.code - }) - ); - }); - }); - - -// GET SPELLS FROM ONE ------------------ -const getSpellsFromOne = (id) => { - return Ingredients.getSpellsFromOne(id) - .catch(err => { - console.log(err); - throw err; - }); -}; -router.get( - '/:id/spells', - async (req, res) => { - getSpellsFromOne(req.params.id) - .then(v => { - res.setHeader('Content-Type', 'application/json;charset=utf-8'); - res.end(JSON.stringify(v)); - }) - .catch(err => { - res.status(err.code).send(JSON.stringify( - { - "error": err.message, - "code": err.code - }) - ); - }); - }); - - -// CREATE ONE ------------------ -const addIngredient = (igr) => { - return Ingredients.addOne(igr) - .catch(err => { - console.log(err); - throw err; - }); -}; -router.post( - '/', - authGuard(['SUBMIT_INGREDIENTS']), - async (req, res) => { - addIngredient(req.body) - .then(v => { - res.setHeader('Content-Type', 'application/json;charset=utf-8'); - res.send(JSON.stringify(v)); - }) - .catch(err => { - res.status(err.code).send(JSON.stringify( - { - "error": err.message, - "code": err.code - }) - ); - }); - }); - - -// UPDATE ONE ------------------ -const updateIngredient = (id, igr) => { - return Ingredients.updateOne(id, igr) - .catch(err => { - console.log(err); - throw err; - }); -}; -router.put( - '/:id/', - authGuard(['SUBMIT_INGREDIENTS', 'MODIFY_INGREDIENTS']), - async (req, res) => { - updateIngredient(req.params.id, req.body) - .then(v => { - res.setHeader('Content-Type', 'application/json;charset=utf-8'); - res.send(JSON.stringify(v)); - }) - .catch(err => { - res.status(err.code).send(JSON.stringify( - { - "error": err.message, - "code": err.code - }) - ); - }); - }); - - -// DELETE ONE ------------------ -const deleteIngredient = (id) => { - return Ingredients.deleteOne(id) - .catch(err => { - console.log(err); - throw err; - }); -}; -router.delete( - '/:id/', - authGuard(['SUBMIT_INGREDIENTS', 'MODIFY_INGREDIENTS', 'DELETE_INGREDIENTS']), - async (req, res) => { - deleteIngredient(req.params.id) - .then(v => { - res.setHeader('Content-Type', 'application/json;charset=utf-8'); - res.send(JSON.stringify(v)); - }) - .catch(err => { - res.status(err.code).send(JSON.stringify( - { - "error": err.message, - "code": err.code - }) - ); - }); - }); - -// Param validations -router.param('id', functions.paramIntCheck); - -module.exports = router; \ No newline at end of file diff --git a/src/routes/meta_schools.js b/src/routes/meta_schools.js deleted file mode 100644 index 587de24..0000000 --- a/src/routes/meta_schools.js +++ /dev/null @@ -1,65 +0,0 @@ -// Router -const express = require('express'); -let router = express.Router(); - -// Functions -const functions = require('../functions'); - -// Repository -const MetaSchoolRepository = require('../repositories/meta-school-repository'); -const MetaSchools = new MetaSchoolRepository(); - -// ROUTES -// GET ALL ------------------ -const getMetaSchools = () => { - return MetaSchools.getAll() - .catch(err => { - console.log(err); - throw err; - }); -}; -router.get('/', async (req, res) => { - getMetaSchools() - .then(v => { - res.setHeader('Content-Type', 'application/json;charset=utf-8'); - res.end(JSON.stringify(v)); - }) - .catch(err => { - res.status(err.code).send(JSON.stringify( - { - "error": err.message, - "code": err.code - }) - ); - }); -}); - - -// GET ONE ------------------ -const getMetaSchool = (id) => { - return MetaSchools.getOne(id) - .catch(err => { - console.log(err); - throw err; - }); -}; -router.get('/:id/', async (req, res) => { - getMetaSchool(req.params.id) - .then(v => { - res.setHeader('Content-Type', 'application/json;charset=utf-8'); - res.end(JSON.stringify(v)); - }) - .catch(err => { - res.status(err.code).send(JSON.stringify( - { - "error": err.message, - "code": err.code - }) - ); - }); -}); - -// Param validations -router.param('id', functions.paramIntCheck); - -module.exports = router; \ No newline at end of file diff --git a/src/routes/middleware/authGuard.js b/src/routes/middleware/authGuard.js deleted file mode 100644 index ec951b2..0000000 --- a/src/routes/middleware/authGuard.js +++ /dev/null @@ -1,23 +0,0 @@ -// Repository -const UserRepository = require('../../repositories/user-repository'); -const Users = new UserRepository(); - -// AUTHGUARD -const authGuard = (permissions) => { - return async (req, res, next) => { - - // Get token from headers - let api_token = req.headers['auracle_key']; - - // Uses repo to validate the associated perms with the token - Users.checkAPITokenPerms(api_token, permissions) - .then(() => { - next(); - }) - .catch(err => { - res.status(err.code).send(JSON.stringify(err)); - }); - }; -}; - -module.exports = authGuard; \ No newline at end of file diff --git a/src/routes/schools.js b/src/routes/schools.js deleted file mode 100644 index 306e917..0000000 --- a/src/routes/schools.js +++ /dev/null @@ -1,182 +0,0 @@ -// Router -const express = require('express'); -let router = express.Router(); - -// AuthGuard -const authGuard = require('./middleware/authGuard'); - -// Repository -const SchoolRepository = require('../repositories/school-repository'); -const Schools = new SchoolRepository(); - -// Functions -const functions = require('../functions'); - -// ROUTES -// GET ALL ------------------ -const getSchools = () => { - return Schools.getAll() - .catch(err => { - console.log(err); - throw err; - }); -}; -router.get( - '/', - async (req, res) => { - getSchools() - .then(v => { - res.setHeader('Content-Type', 'application/json;charset=utf-8'); - res.end(JSON.stringify(v)); - }) - .catch(err => { - res.status(err.code).send(JSON.stringify( - { - "error": err.message, - "code": err.code - }) - ); - }); - }); - - -// GET ONE ------------------ -const getSchool = (id) => { - return Schools.getOne(id) - .catch(err => { - console.log(err); - throw err; - }); -}; -router.get( - '/:id/', - async (req, res) => { - getSchool(req.params.id) - .then(v => { - res.setHeader('Content-Type', 'application/json;charset=utf-8'); - res.end(JSON.stringify(v)); - }) - .catch(err => { - res.status(err.code).send(JSON.stringify( - { - "error": err.message, - "code": err.code - }) - ); - }); - }); - - -// GET SPELLS FROM ONE ------------------ -const getSpellsFromOne = (id) => { - return Schools.getSpellsFromOne(id) - .catch(err => { - console.log(err); - throw err; - }); -}; -router.get( - '/:id/spells', - async (req, res) => { - getSpellsFromOne(req.params.id) - .then(v => { - res.setHeader('Content-Type', 'application/json;charset=utf-8'); - res.end(JSON.stringify(v)); - }) - .catch(err => { - res.status(err.code).send(JSON.stringify( - { - "error": err.message, - "code": err.code - }) - ); - }); - }); - - -// CREATE ONE ------------------ -const addSchool = (s) => { - return Schools.addOne(s) - .catch(err => { - console.log(err); - throw err; - }); -}; -router.post( - '/', - authGuard(['SUBMIT_SCHOOL']), - async (req, res) => { - addSchool(req.body) - .then(v => { - res.setHeader('Content-Type', 'application/json;charset=utf-8'); - res.send(JSON.stringify(v)); - }) - .catch(err => { - res.status(err.code).send(JSON.stringify( - { - "error": err.message, - "code": err.code - }) - ); - }); - }); - -// UPDATE ONE ------------------ -const updateSchool = (id, s) => { - return Schools.updateOne(id, s) - .catch(err => { - console.log(err); - throw err; - }); -}; -router.put( - '/:id/', - authGuard(['SUBMIT_SCHOOLS', 'MODIFY_SCHOOLS']), - async (req, res) => { - updateSchool(req.params.id, req.body) - .then(v => { - res.setHeader('Content-Type', 'application/json;charset=utf-8'); - res.send(JSON.stringify(v)); - }) - .catch(err => { - res.status(err.code).send(JSON.stringify( - { - "error": err.message, - "code": err.code - }) - ); - }); - }); - - -// DELETE ONE ------------------ -const deleteSchool = (id) => { - return Schools.deleteOne(id) - .catch(err => { - console.log(err); - throw err; - }); -}; -router.delete( - '/:id/', - authGuard(['SUBMIT_SCHOOLS', 'MODIFY_SCHOOLS', 'DELETE_SCHOOLS']), - async (req, res) => { - deleteSchool(req.params.id) - .then(v => { - res.setHeader('Content-Type', 'application/json;charset=utf-8'); - res.send(JSON.stringify(v)); - }) - .catch(err => { - res.status(err.code).send(JSON.stringify( - { - "error": err.message, - "code": err.code - }) - ); - }); - }); - -// Param validations -router.param('id', functions.paramIntCheck); - -module.exports = router; \ No newline at end of file diff --git a/src/routes/spells.js b/src/routes/spells.js deleted file mode 100644 index 151d31e..0000000 --- a/src/routes/spells.js +++ /dev/null @@ -1,209 +0,0 @@ -// Router -const express = require('express'); -let router = express.Router(); - -// AuthGuard -const authGuard = require('./middleware/authGuard'); - -// Repository -const SpellReposity = require('../repositories/spell-repository'); -const Spells = new SpellReposity(); - -// Functions -const functions = require('../functions'); - -// ROUTES -// GET ALL PUBLIC ------------------ -const getPublicSpells = (name, description, level, charge, cost, ritual) => { - return Spells.getAllPublic(name, description, level, charge, cost, ritual) - .catch(err => { - console.log(err); - throw err; - }); -}; -router.get( - '//:name?/:description?/:level?/:charge?/:cost?/:ritual?/', - async (req, res) => { - getPublicSpells(req.query.name, req.query.description, req.query.level, req.query.charge, req.query.cost, req.query.ritual) - .then(v => { - res.setHeader('Content-Type', 'application/json;charset=utf-8'); - res.end(JSON.stringify(v)); - }) - .catch(err => { - res.status(err.code).send(JSON.stringify( - { - "error": err.message, - "code": err.code - }) - ); - }); - }); - -// GET ALL ------------------ -const getSpells = (name, description, level, charge, cost, ritual) => { - return Spells.getAll(name, description, level, charge, cost, ritual) - .catch(err => { - console.log(err); - throw err; - }); -}; -router.get( - '/private/:name?/:description?/:level?/:charge?/:cost?/:ritual?/', - authGuard(['SECRET_SPELLS']), - async (req, res) => { - getSpells(req.query.name, req.query.description, req.query.level, req.query.charge, req.query.cost, req.query.ritual) - .then(v => { - res.setHeader('Content-Type', 'application/json;charset=utf-8'); - res.end(JSON.stringify(v)); - }) - .catch(err => { - res.status(err.code).send(JSON.stringify( - { - "error": err.message, - "code": err.code - }) - ); - }); - }); - -// GET SOME ------------------ -const getSomeSpells = (page) => { - return Spells.getPage(page) - .catch(err => { - console.log(err); - throw err; - }); -}; -router.get( - '/page/:page', - async (req, res) => { - getSomeSpells(req.params.page) - .then(v => { - res.setHeader('Content-Type', 'application/json;charset=utf-8'); - res.end(JSON.stringify(v)); - }) - .catch(err => { - res.status(err.code).send(JSON.stringify( - { - "error": err.message, - "code": err.code - }) - ); - }); - }); - -// GET ONE ------------------ -const getSpell = (id) => { - return Spells.getOne(id) - .catch(err => { - console.log(err); - throw err; - }); -}; -router.get( - '/:id/', - async (req, res) => { - getSpell(req.params.id) - .then(v => { - res.setHeader('Content-Type', 'application/json;charset=utf-8'); - res.end(JSON.stringify(v)); - }) - .catch(err => { - res.status(err.code).send(JSON.stringify( - { - "error": err.message, - "code": err.code - }) - ); - }); - }); - - -// CREATE ONE ------------------ -const addSpell = (s) => { - return Spells.addOne(s) - .catch(err => { - console.log(err); - throw err; - }); -}; -router.post( - '/', - authGuard(['SUBMIT_SPELLS']), - async (req, res) => { - addSpell(req.body) - .then(v => { - res.setHeader('Content-Type', 'application/json;charset=utf-8'); - res.send(JSON.stringify(v)); - }) - .catch(err => { - res.status(err.code).send(JSON.stringify( - { - "error": err.message, - "code": err.code - }) - ); - }); - }); - - -// UPDATE ONE ------------------ -const updateSpell = (id, s) => { - return Spells.updateOne(id, s) - .catch(err => { - console.log(err); - throw err; - }); -}; -router.put( - '/:id/', - authGuard(['SUBMIT_SPELLS', 'MODIFY_SPELLS']), - async (req, res) => { - updateSpell(req.params.id, req.body) - .then(v => { - res.setHeader('Content-Type', 'application/json;charset=utf-8'); - res.send(JSON.stringify(v)); - }) - .catch(err => { - res.status(err.code).send(JSON.stringify( - { - "error": err.message, - "code": err.code - }) - ); - }); - }); - - -// DELETE ONE ------------------ -const deleteSpell = (id) => { - return Spells.deleteOne(id) - .catch(err => { - console.log(err); - throw err; - }); -}; -router.delete( - '/:id/', - authGuard(['SUBMIT_SPELLS', 'MODIFY_SPELLS', 'DELETE_SPELLS']), - async (req, res) => { - deleteSpell(req.params.id) - .then(v => { - res.setHeader('Content-Type', 'application/json;charset=utf-8'); - res.send(JSON.stringify(v)); - }) - .catch(err => { - res.status(err.code).send(JSON.stringify( - { - "error": err.message, - "code": err.code - }) - ); - }); - }); - -// Param validations -router.param('id', functions.paramIntCheck); -router.param('page', functions.paramIntCheck); - -module.exports = router; diff --git a/src/routes/users.js b/src/routes/users.js deleted file mode 100644 index 754bba6..0000000 --- a/src/routes/users.js +++ /dev/null @@ -1,178 +0,0 @@ -// Router -const express = require('express'); -let router = express.Router(); - -// AuthGuard -// const authGuard = require('./middleware/authGuard'); - -// Repository -const UserRepository = require('../repositories/user-repository'); -const Users = new UserRepository(); - -// ROUTES -// GET ALL ------------------ -const getUsers = () => { - return Users.getAll() - .catch(err => { - throw err; - }); -}; -router.get('/', async (req, res) => { - getUsers() - .then(v => { - res.setHeader('Content-Type', 'application/json;charset=utf-8'); - res.end(JSON.stringify(v)); - }) - .catch(err => { - res.status(err.code).send(JSON.stringify( - { - "error": err.message, - "code": err.code - }) - ); - }); -}); - - -// GET ONE FROM UUID ------------------ -const getUserByUUID = (uuid) => { - return Users.getOneByUUID(uuid) - .catch(err => { - throw err; - }); -}; -router.get('/:uuid/', async (req, res) => { - getUserByUUID(req.params.uuid) - .then(v => { - res.setHeader('Content-Type', 'application/json;charset=utf-8'); - res.end(JSON.stringify(v)); - }) - .catch(err => { - res.status(err.code).send(JSON.stringify( - { - "error": err.message, - "code": err.code - }) - ); - }); -}); - -// GET SPELLS FROM ONE ------------------ -const getSpellsFromUser = (uuid) => { - return Users.getSpellsFromOne(uuid) - .catch(err => { - throw err; - }); -}; -router.get('/:uuid/spells', async (req, res) => { - getSpellsFromUser(req.params.uuid) - .then(v => { - res.setHeader('Content-Type', 'application/json;charset=utf-8'); - res.end(JSON.stringify(v)); - }) - .catch(err => { - res.status(err.code).send(JSON.stringify( - { - "error": err.message, - "code": err.code - }) - ); - }); -}); - - -// CHECK IF MAIL IS AVAILABLE ------------------ -const checkIfEmailAvailable = (mail) => { - return Users.checkIfEmailAvailable(mail) - .catch(err => { - throw err; - }); -}; -router.get('/available/:mail/', async (req, res) => { - checkIfEmailAvailable(req.params.mail) - .then(v => { - res.setHeader('Content-Type', 'application/json;charset=utf-8'); - res.end(JSON.stringify(v)); - }) - .catch(err => { - res.status(err.code).send(JSON.stringify( - { - "error": err.message, - "code": err.code - }) - ); - }); -}); - - -// CREATE ONE ------------------ -const addUser = (u) => { - return Users.addOne(u) - .catch(err => { - throw err; - }); -}; -router.post('/', async (req, res) => { - addUser(req.body) - .then(v => { - res.setHeader('Content-Type', 'application/json;charset=utf-8'); - res.send(JSON.stringify(v)); - }) - .catch(err => { - res.status(err.code).send(JSON.stringify( - { - "error": err.message, - "code": err.code - }) - ); - }); -}); - - -// VERIFY A USER -const verifyUser = (token) => { - return Users.verifyUser(token) - .catch(err => { - throw err; - }); -}; -router.get('/verification/:token', async (req, res) => { - verifyUser(req.params.token) - .then(v => { - res.setHeader('Content-Type', 'application/json;charset=utf-8'); - res.send(JSON.stringify(v)); - }) - .catch(err => { - res.status(err.code).send(JSON.stringify( - { - "error": err.message, - "code": err.code - }) - ); - }); -}); - -// LOG A USER ------------------ -const logUser = (mail, password) => { - return Users.logUser(mail, password) - .catch(err => { - throw err; - }); -}; -router.post('/login', async (req, res) => { - logUser(req.body.mail, req.body.password) - .then(v => { - res.setHeader('Content-Type', 'application/json;charset=utf-8'); - res.end(JSON.stringify(v)); - }) - .catch(err => { - res.status(err.code).send(JSON.stringify( - { - "error": err.message, - "code": err.code - }) - ); - }); -}); - -module.exports = router; \ No newline at end of file diff --git a/src/routes/variables.js b/src/routes/variables.js deleted file mode 100644 index 30a5e90..0000000 --- a/src/routes/variables.js +++ /dev/null @@ -1,185 +0,0 @@ -'use strict'; - -// Router -const express = require('express'); -let router = express.Router(); - -// AuthGuard -const authGuard = require('./middleware/authGuard'); - -// Repository -const VariableRepository = require('../repositories/variable-repository'); -const Variables = new VariableRepository(); - -// Functions -const functions = require('../functions'); - -// ROUTES -// GET ALL ------------------ -const getvariables = () => { - return Variables.getAll() - .catch(err => { - console.log(err); - throw err; - }); -}; -router.get( - '/', - async (req, res) => { - getvariables() - .then(v => { - res.setHeader('Content-Type', 'application/json;charset=utf-8'); - res.end(JSON.stringify(v)); - }) - .catch(err => { - res.status(err.code).send(JSON.stringify( - { - "error": err.message, - "code": err.code - }) - ); - }); - }); - - -// GET ONE ------------------ -const getVariable = (id) => { - return Variables.getOne(id) - .catch(err => { - console.log(err); - throw err; - }); -}; -router.get( - '/:id/', - async (req, res) => { - getVariable(req.params.id) - .then(v => { - res.setHeader('Content-Type', 'application/json;charset=utf-8'); - res.end(JSON.stringify(v)); - }) - .catch(err => { - res.status(err.code).send(JSON.stringify( - { - "error": err.message, - "code": err.code - }) - ); - }); - }); - - -// GET SPELLS FROM ONE ------------------ -const getSpellsFromOne = (id) => { - return Variables.getSpellsFromOne(id) - .catch(err => { - console.log(err); - throw err; - }); -}; -router.get( - '/:id/spells', - async (req, res) => { - getSpellsFromOne(req.params.id) - .then(v => { - res.setHeader('Content-Type', 'application/json;charset=utf-8'); - res.end(JSON.stringify(v)); - }) - .catch(err => { - res.status(err.code).send(JSON.stringify( - { - "error": err.message, - "code": err.code - }) - ); - }); - }); - - -// CREATE ONE ------------------ -const addVariable = (vr) => { - return Variables.addOne(vr) - .catch(err => { - console.log(err); - throw err; - }); -}; -router.post( - '/', - authGuard(['SUBMIT_VARIABLES']), - async (req, res) => { - addVariable(req.body) - .then(v => { - res.setHeader('Content-Type', 'application/json;charset=utf-8'); - res.send(JSON.stringify(v)); - }) - .catch(err => { - res.status(err.code).send(JSON.stringify( - { - "error": err.message, - "code": err.code - }) - ); - }); - }); - - -// UPDATE ONE ------------------ -const updateVariable = (id, vr) => { - return Variables.updateOne(id, vr) - .catch(err => { - console.log(err); - throw err; - }); -}; -router.put( - '/:id/', - authGuard(['SUBMIT_VARIABLES', 'MODIFY_VARIABLES']), - async (req, res) => { - updateVariable(req.params.id, req.body) - .then(v => { - res.setHeader('Content-Type', 'application/json;charset=utf-8'); - res.send(JSON.stringify(v)); - }) - .catch(err => { - res.status(err.code).send(JSON.stringify( - { - "error": err.message, - "code": err.code - }) - ); - }); - }); - - -// DELETE ONE ------------------ -const deleteVariable = (id) => { - return Variables.deleteOne(id) - .catch(err => { - console.log(err); - throw err; - }); -}; -router.delete( - '/:id/', - authGuard(['SUBMIT_VARIABLES', 'MODIFY_VARIABLES', 'DELETE_VARIABLES']), - async (req, res) => { - deleteVariable(req.params.id) - .then(v => { - res.setHeader('Content-Type', 'application/json;charset=utf-8'); - res.send(JSON.stringify(v)); - }) - .catch(err => { - res.status(err.code).send(JSON.stringify( - { - "error": err.message, - "code": err.code - }) - ); - }); - }); - -// Param validations -router.param('id', functions.paramIntCheck); - -module.exports = router; \ No newline at end of file diff --git a/src/smtp/config.js b/src/smtp/config.js deleted file mode 100644 index fe58640..0000000 --- a/src/smtp/config.js +++ /dev/null @@ -1,14 +0,0 @@ -const nodemailer = require('nodemailer'); - -const transport = nodemailer.createTransport({ - host: "smtp.mailtrap.io", - port: 2525, - auth: { - user: process.env.SMTP_USER, - pass: process.env.SMTP_PASS, - } -}); - -module.exports = { - transport, -}; \ No newline at end of file diff --git a/src/smtp/mails.js b/src/smtp/mails.js deleted file mode 100644 index b267b1d..0000000 --- a/src/smtp/mails.js +++ /dev/null @@ -1,61 +0,0 @@ -const smtp = require('./config'); -const fs = require('fs'); -const handlebars = require('handlebars'); - -// Sender address for mail service -const sender = 'tymos@auracle.io'; - -// Fetches a HTML template file for parsing -const getTemplateFile = (path) => { - return new Promise((resolve, reject) => { - fs.readFile(path, { encoding: 'utf-8' }, (err, html) => { - if (err) { - reject(err); - } else { - resolve(html); - } - }); - }); -}; - -/** - * SEND REGISTRATION MAIL FUNCTION - * @param {Object} data - * - user - * - name - * - mail - * - token - */ -const sendRegistrationMail = (data) => { - getTemplateFile(__dirname + '/templates/template-sign-up.html') - .then(html => { - let template = handlebars.compile(html); - let template_parsed = template(data); - - let message = { - from: sender, - to: data.user.mail, - subject: 'Inscription Auracle.io', - html: template_parsed, - }; - - smtp.transport.sendMail(message, (err, info) => { - if (err) { - throw err; - } else { - console.log(info); - } - }); - }) - .catch(err => { - console.log(err); - }); -}; - -// const sendBanEmail = (date) => { -// return null; -// }; - -module.exports = { - sendRegistrationMail, -}; \ No newline at end of file diff --git a/src/smtp/templates/template-sign-up.html b/src/smtp/templates/template-sign-up.html deleted file mode 100644 index 1b15b5b..0000000 --- a/src/smtp/templates/template-sign-up.html +++ /dev/null @@ -1,114 +0,0 @@ - - - - - Template Email Auracle Inscription - - - - -
-
-
-

Bienvenue sur Auracle, {{ user.name }}!

-
-
-

Votre compte Auracle a bien été enregistré et est rattaché à cette adresse mail.

-

Cependant, afin de garantir la sécurité de vos données, votre compte doit être vérifié avant votre - première connexion. Vous pouvez - - suivre ce lien afin de confirmer votre inscription. - -

-

Si vous rencontrez des problèmes, n'hésitez pas à envoyer un mail à - - support@auracle.io - -

-

Merci de votre soutien !

-

Bien sincèrement, Izàc Tymos.

-
- -
-
- - - \ No newline at end of file diff --git a/src/validations/IngredientValidation.js b/src/validations/IngredientValidation.js deleted file mode 100644 index 962b6f9..0000000 --- a/src/validations/IngredientValidation.js +++ /dev/null @@ -1,11 +0,0 @@ -const Ingredient = { - "id": "/IngredientValidation", - "type": Object, - "properties": { - "name": { "type": "string" }, - "description": { "type": "string" } - }, - "required": ["name", "description"] -}; - -module.exports = Ingredient; \ No newline at end of file diff --git a/src/validations/MetaSchoolValidation.js b/src/validations/MetaSchoolValidation.js deleted file mode 100644 index 44b1848..0000000 --- a/src/validations/MetaSchoolValidation.js +++ /dev/null @@ -1,12 +0,0 @@ -const MetaSchool = { - "id": "/MetaSchoolValidation", - "type": Object, - "properties": { - "name": { "type": "string" }, - "description": { "type": "string" }, - "schools": { "type": "array" } - }, - "required": ["name", "description"] -}; - -module.exports = MetaSchool; \ No newline at end of file diff --git a/src/validations/SchoolValidation.js b/src/validations/SchoolValidation.js deleted file mode 100644 index 03f0148..0000000 --- a/src/validations/SchoolValidation.js +++ /dev/null @@ -1,12 +0,0 @@ -const School = { - "id": "/SchoolValidation", - "type": Object, - "properties": { - "name": { "type": "string" }, - "description": { "type": "string" }, - "meta_school_id": { "type": "number" }, - }, - "required": ["name", "description", "meta_school_id"] -}; - -module.exports = School; \ No newline at end of file diff --git a/src/validations/SpellValidation.js b/src/validations/SpellValidation.js deleted file mode 100644 index c440a6c..0000000 --- a/src/validations/SpellValidation.js +++ /dev/null @@ -1,39 +0,0 @@ -const Spell = { - "id": "/SpellValidation", - "type": Object, - "properties": { - "name": { "type": "string" }, - "description": { "type": "string" }, - "level": { "type": "number" }, - "charge": { "type": "number" }, - "cost": { "type": "string" }, - "is_ritual": { "type": "boolean" }, - "schools": { - "type": { "type": "array" }, - "items": { - "properties": { - "id": { "type": "number" }, - } - } - }, - "variables": { - "type": { "type": "array" }, - "items": { - "properties": { - "id": { "type": "number" }, - } - } - }, - "ingredients": { - "type": { "type": "array" }, - "items": { - "properties": { - "id": { "type": "number" }, - } - } - } - }, - "required": ["name", "description"] -}; - -module.exports = Spell; \ No newline at end of file diff --git a/src/validations/UserValidation.js b/src/validations/UserValidation.js deleted file mode 100644 index c6dd4e9..0000000 --- a/src/validations/UserValidation.js +++ /dev/null @@ -1,12 +0,0 @@ -const User = { - "id": "/UserValidation", - "type": Object, - "properties": { - "name": { "type": "string" }, - "mail": { "type": "string" }, - "password": { "type": "string" }, - }, - "required": ["name", "password", "mail"] -}; - -module.exports = User; \ No newline at end of file diff --git a/src/validations/VariableValidation.js b/src/validations/VariableValidation.js deleted file mode 100644 index 72e0928..0000000 --- a/src/validations/VariableValidation.js +++ /dev/null @@ -1,10 +0,0 @@ -const Variable = { - "id": "/VariableValidation", - "type": Object, - "properties": { - "description": { "type": "string" }, - }, - "required": ["description"] -}; - -module.exports = Variable; \ No newline at end of file