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