From b313393af6236bc28108127f1f7fdd3e763032dd Mon Sep 17 00:00:00 2001 From: Alexis <35.alexis.pele@gmail.com> Date: Fri, 1 Jan 2021 22:07:22 +0100 Subject: [PATCH] Added getSpellsFromUser() method --- api/models/spell-model.js | 10 +++++++--- api/models/user-model.js | 4 ++++ api/repositories/spell-repository.js | 16 ++++++++-------- api/repositories/user-repository.js | 19 ++++++++++++++++++- api/routes/users.js | 23 +++++++++++++++++++++++ 5 files changed, 60 insertions(+), 12 deletions(-) diff --git a/api/models/spell-model.js b/api/models/spell-model.js index 96100a5..10dd65e 100644 --- a/api/models/spell-model.js +++ b/api/models/spell-model.js @@ -7,14 +7,18 @@ require('./ingredient-model') let Spell = bookshelf.Model.extend({ tableName: 'spell', + hidden: [ 'author_id' ], + author() { + return this.belongsTo( 'User', 'author_id' ); + }, schools() { - return this.belongsToMany( 'School', 'spell_school' ) + return this.belongsToMany( 'School', 'spell_school' ); }, variables() { - return this.belongsToMany( 'Variable', 'spell_variable' ) + return this.belongsToMany( 'Variable', 'spell_variable' ); }, ingredients() { - return this.belongsToMany( 'Ingredient', 'spell_ingredient' ) + return this.belongsToMany( 'Ingredient', 'spell_ingredient' ); } }) diff --git a/api/models/user-model.js b/api/models/user-model.js index a7407c4..0f8a1cb 100644 --- a/api/models/user-model.js +++ b/api/models/user-model.js @@ -2,6 +2,7 @@ const bookshelf = require('../database/bookshelf').bookshelf; require('./role-model'); +require('./spell-model'); let User = bookshelf.Model.extend({ tableName: 'user', @@ -9,6 +10,9 @@ let User = bookshelf.Model.extend({ role() { return this.belongsTo( 'Role' ); }, + spells() { + return this.hasMany( 'Spell', 'author_id' ); + } }) module.exports = bookshelf.model('User', User) \ No newline at end of file diff --git a/api/repositories/spell-repository.js b/api/repositories/spell-repository.js index 6e45138..9f43072 100644 --- a/api/repositories/spell-repository.js +++ b/api/repositories/spell-repository.js @@ -30,7 +30,7 @@ class SpellRepository { if (cost) { query.where({ 'cost' : cost }) } if (ritual) { query.where({ 'is_ritual' : ritual }) } - query.fetchAll({ withRelated: ['schools.meta_schools', 'variables', 'ingredients'] }) + query.fetchAll({ withRelated: [ 'schools.meta_schools', 'variables', 'ingredients', 'author' ] }) .then(v => { resolve(v.toJSON({ omitPivot: true })) }) @@ -56,7 +56,7 @@ class SpellRepository { if (cost) { query.where({ 'cost' : cost }) } if (ritual) { query.where({ 'is_ritual' : ritual }) } - query.fetchAll({ withRelated: ['schools.meta_schools', 'variables', 'ingredients'] }) + query.fetchAll({ withRelated: [ 'schools.meta_schools', 'variables', 'ingredients', 'author' ] }) .then(v => { resolve(v.toJSON({ omitPivot: true })); }) @@ -77,7 +77,7 @@ class SpellRepository { .fetchPage({ pageSize: 20, page: page, - withRelated: ['schools.meta_schools', 'variables', 'ingredients'], + withRelated: [ 'schools.meta_schools', 'variables', 'ingredients', 'author' ], }) .then(v => { resolve(v.toJSON({ omitPivot: true })) @@ -96,7 +96,7 @@ class SpellRepository { return new Promise((resolve, reject) => { new model() .where({ 'id' : id }) - .fetch({ withRelated: ['schools.meta_schools', 'variables', 'ingredients']}) + .fetch({ withRelated: [ 'schools.meta_schools', 'variables', 'ingredients', 'author' ]}) .then(v => { resolve(v.toJSON({ omitPivot: true })) }) @@ -170,7 +170,7 @@ class SpellRepository { }) }) .then(v => { - return v.load(['schools.meta_schools', 'variables', 'ingredients']) + return v.load([ 'schools.meta_schools', 'variables', 'ingredients', 'author' ]) }) .then(v => { resolve(this.getOne(v.id)) @@ -206,7 +206,7 @@ class SpellRepository { }); } else { new model({id: id}) - .fetch({require: true, withRelated: ['schools.meta_schools', 'variables', 'ingredients']}) + .fetch({require: true, withRelated: [ 'schools.meta_schools', 'variables', 'ingredients', 'author' ]}) .then(v => { bookshelf.transaction(t => { return v.save({ @@ -269,7 +269,7 @@ class SpellRepository { }) }) .then(v => { - return v.load(['schools.meta_schools', 'variables', 'ingredients']); + return v.load([ 'schools.meta_schools', 'variables', 'ingredients', 'author' ]); }) .then(v => { resolve(this.getOne(v.id)); @@ -297,7 +297,7 @@ class SpellRepository { return new Promise((resolve, reject) => { new model() .where({ 'id' : id }) - .fetch({require: true, withRelated: ['schools.meta_schools', 'variables', 'ingredients']}) + .fetch({require: true, withRelated: [ 'schools.meta_schools', 'variables', 'ingredients', 'author' ]}) .then(v => { v.schools().detach(); v.variables().detach(); diff --git a/api/repositories/user-repository.js b/api/repositories/user-repository.js index 177ef21..67c628a 100644 --- a/api/repositories/user-repository.js +++ b/api/repositories/user-repository.js @@ -63,7 +63,7 @@ class UserRepository { return new Promise((resolve, reject) => { new model() .where({ 'mail': mail }) - .fetch() + .fetch({ withRelated: [ 'role' ] }) .then(v => { resolve(v.toJSON({ omitPivot: true, visibility: !full })); }) @@ -72,7 +72,24 @@ class UserRepository { "message": "L'utilisateur avec cet email n'a pas été trouvé.", "code": 404, }); + }); + }) + } + + getSpellsFromOne(uuid) { + return new Promise((resolve, reject) => { + 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, + }); + }); }) } diff --git a/api/routes/users.js b/api/routes/users.js index 175fbea..0e536e9 100644 --- a/api/routes/users.js +++ b/api/routes/users.js @@ -60,6 +60,29 @@ router.get('/:uuid/', async (req, res) => { }) }) +// 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) => {