From ca9dbbd7dbac127fa8153b5e93ab84ae7d1a6d6b Mon Sep 17 00:00:00 2001 From: Alexis <35.alexis.pele@gmail.com> Date: Fri, 23 Jul 2021 21:57:01 +0200 Subject: [PATCH] Moved old scripts to docs folder --- _docs/old_scripts.zip | Bin 0 -> 22760 bytes src/repositories/ingredient-repository.js | 206 -------- src/repositories/meta-school-repository.js | 51 -- src/repositories/school-repository.js | 207 -------- src/repositories/spell-repository.js | 351 ------------- src/repositories/user-repository.js | 562 --------------------- src/repositories/variable-repository.js | 204 -------- src/routes/auth.js | 28 - src/routes/index.js | 18 - src/routes/ingredients.js | 183 ------- src/routes/meta_schools.js | 65 --- src/routes/middleware/authGuard.js | 23 - src/routes/schools.js | 182 ------- src/routes/spells.js | 209 -------- src/routes/users.js | 178 ------- src/routes/variables.js | 185 ------- src/smtp/config.js | 14 - src/smtp/mails.js | 61 --- src/smtp/templates/template-sign-up.html | 114 ----- src/validations/IngredientValidation.js | 11 - src/validations/MetaSchoolValidation.js | 12 - src/validations/SchoolValidation.js | 12 - src/validations/SpellValidation.js | 39 -- src/validations/UserValidation.js | 12 - src/validations/VariableValidation.js | 10 - 25 files changed, 2937 deletions(-) create mode 100644 _docs/old_scripts.zip delete mode 100644 src/repositories/ingredient-repository.js delete mode 100644 src/repositories/meta-school-repository.js delete mode 100644 src/repositories/school-repository.js delete mode 100644 src/repositories/spell-repository.js delete mode 100644 src/repositories/user-repository.js delete mode 100644 src/repositories/variable-repository.js delete mode 100644 src/routes/auth.js delete mode 100644 src/routes/index.js delete mode 100644 src/routes/ingredients.js delete mode 100644 src/routes/meta_schools.js delete mode 100644 src/routes/middleware/authGuard.js delete mode 100644 src/routes/schools.js delete mode 100644 src/routes/spells.js delete mode 100644 src/routes/users.js delete mode 100644 src/routes/variables.js delete mode 100644 src/smtp/config.js delete mode 100644 src/smtp/mails.js delete mode 100644 src/smtp/templates/template-sign-up.html delete mode 100644 src/validations/IngredientValidation.js delete mode 100644 src/validations/MetaSchoolValidation.js delete mode 100644 src/validations/SchoolValidation.js delete mode 100644 src/validations/SpellValidation.js delete mode 100644 src/validations/UserValidation.js delete mode 100644 src/validations/VariableValidation.js diff --git a/_docs/old_scripts.zip b/_docs/old_scripts.zip new file mode 100644 index 0000000000000000000000000000000000000000..914b19b0a4671f57cb9237d71dcb41977219151c GIT binary patch literal 22760 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 { - 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