fix: refs #7917 fix methods, tests, acls #3085

Open
carlossa wants to merge 22 commits from 7917-freelancerRoute into dev
10 changed files with 54 additions and 26 deletions
Showing only changes of commit 273068e595 - Show all commits

View File

@ -0,0 +1,6 @@
INSERT INTO salix.ACL (model, property, accessType, permission, principalType, principalId)
VALUES
('Route', 'getTickets', 'READ', 'ALLOW', 'ROLE', 'supplier'),
carlossa marked this conversation as resolved Outdated

confirmar con jbreso que rol tienen los autonomos que van a usar esto

confirmar con jbreso que rol tienen los autonomos que van a usar esto

Lo van a ver usuarios delivery

Lo van a ver usuarios delivery
('AgencyTerm', 'filter', 'READ', 'ALLOW', 'ROLE', 'supplier'),
('Route', 'summary', 'READ', 'ALLOW', 'ROLE', 'supplier');

View File

@ -173,9 +173,7 @@ module.exports = Self => {
} }
}); });
filter = mergeFilters(ctx.args.filter, {where}); filter = mergeFilters(ctx.args.filter, {where});
const userId = ctx.req.accessToken.userId; const supplier = await Self.app.models.Supplier.isSupplier(ctx);
const client = await Self.app.models.Client.findById(userId, myOptions);
const supplier = await Self.app.models.Supplier.findOne({where: {nif: client.fi}}, myOptions);
if (supplier) { if (supplier) {
if (!filter.where) filter.where = {}; if (!filter.where) filter.where = {};
filter.where[`e.supplierFk`] = supplier.id; filter.where[`e.supplierFk`] = supplier.id;

View File

@ -74,6 +74,12 @@ module.exports = Self => {
filter = mergeFilters(filter, {where}); filter = mergeFilters(filter, {where});
const supplier = await Self.app.models.Supplier.isSupplier(ctx, myOptions);
carlossa marked this conversation as resolved Outdated

crear acl getRouteByAgency, comprobar los acl de mas a menos permisivo.

esta part de la tarea no la veig implementada

`crear acl getRouteByAgency, comprobar los acl de mas a menos permisivo.` esta part de la tarea no la veig implementada
if (supplier) {
if (!filter.where) filter.where = {};
filter.where[`a.supplierFk`] = supplier.id;
}
const date = Date.vnNew(); const date = Date.vnNew();
date.setHours(0, 0, 0, 0); date.setHours(0, 0, 0, 0);
const stmts = []; const stmts = [];

View File

@ -30,6 +30,7 @@ describe('AgencyTerm filter()', () => {
it('should return results matching "search" searching by integer', async() => { it('should return results matching "search" searching by integer', async() => {
let ctx = { let ctx = {
args: { args: {
ctx: {req: {accessToken: {userId: authUserId}}},
carlossa marked this conversation as resolved Outdated

posau comú en la par superior, en el beforeall hi ha exemples

posau comú en la par superior, en el beforeall hi ha exemples
search: 1, search: 1,
} }
}; };
@ -43,6 +44,7 @@ describe('AgencyTerm filter()', () => {
it('should return results matching "search" searching by string', async() => { it('should return results matching "search" searching by string', async() => {
let ctx = { let ctx = {
args: { args: {
ctx: {req: {accessToken: {userId: authUserId}}},
search: 'Plants SL', search: 'Plants SL',
} }
}; };
@ -65,6 +67,7 @@ describe('AgencyTerm filter()', () => {
const ctx = { const ctx = {
args: { args: {
ctx: {req: {accessToken: {userId: authUserId}}},
from: from, from: from,
to: to to: to
} }
@ -84,6 +87,7 @@ describe('AgencyTerm filter()', () => {
it('should return results matching "agencyModeFk"', async() => { it('should return results matching "agencyModeFk"', async() => {
let ctx = { let ctx = {
args: { args: {
ctx: {req: {accessToken: {userId: authUserId}}},
agencyModeFk: 1, agencyModeFk: 1,
} }
}; };
@ -97,6 +101,7 @@ describe('AgencyTerm filter()', () => {
it('should return results matching "agencyFk"', async() => { it('should return results matching "agencyFk"', async() => {
let ctx = { let ctx = {
args: { args: {
ctx: {req: {accessToken: {userId: authUserId}}},
agencyFk: 2, agencyFk: 2,
} }
}; };

View File

@ -2,7 +2,7 @@
const {ParameterizedSQL} = require('loopback-connector'); const {ParameterizedSQL} = require('loopback-connector');
module.exports = Self => { module.exports = Self => {
Self.remoteMethod('getTickets', { Self.remoteMethodCtx('getTickets', {
Review

els test de back han de verificar les 3 opcions,
un supplier no treballador sols veu lo seu
un treballador veu tot
uno que no es res, no veu res

els test de back han de verificar les 3 opcions, un supplier no treballador sols veu lo seu un treballador veu tot uno que no es res, no veu res
description: 'Find all instances of the model matched by filter from the data source.', description: 'Find all instances of the model matched by filter from the data source.',
accessType: 'READ', accessType: 'READ',
accepts: [ accepts: [
@ -23,7 +23,7 @@ module.exports = Self => {
} }
}); });
Self.getTickets = async(filter, options) => { Self.getTickets = async(ctx, filter, options) => {
const conn = Self.dataSource.connector; const conn = Self.dataSource.connector;
const myOptions = {}; const myOptions = {};
@ -78,6 +78,8 @@ module.exports = Self => {
AND tob2.observationTypeFk = ot2.id AND tob2.observationTypeFk = ot2.id
LEFT JOIN address a ON a.id = t.addressFk LEFT JOIN address a ON a.id = t.addressFk
LEFT JOIN agencyMode am ON am.id = t.agencyModeFk LEFT JOIN agencyMode am ON am.id = t.agencyModeFk
LEFT JOIN agency ag ON am.agencyFk = ag.id
LEFT JOIN supplierAgencyTerm sat ON sat.agencyFk = ag.id
LEFT JOIN account.user u ON u.id = r.workerFk LEFT JOIN account.user u ON u.id = r.workerFk
LEFT JOIN vehicle v ON v.id = r.vehicleFk LEFT JOIN vehicle v ON v.id = r.vehicleFk
LEFT JOIN workerMedia wm ON wm.workerFk = c.salesPersonFk` LEFT JOIN workerMedia wm ON wm.workerFk = c.salesPersonFk`
@ -85,6 +87,10 @@ module.exports = Self => {
if (!filter.where) filter.where = {}; if (!filter.where) filter.where = {};
const supplier = await Self.app.models.Supplier.isSupplier(ctx, myOptions);
if (supplier)
filter.where['sat.supplierFk'] = supplier.id;
const where = filter.where; const where = filter.where;
where['r.id'] = filter.id; where['r.id'] = filter.id;

View File

@ -3,7 +3,7 @@ const app = require('vn-loopback/server/server');
describe('route getTickets()', () => { describe('route getTickets()', () => {
it('should return the tickets for a given route', async() => { it('should return the tickets for a given route', async() => {
const filter = {id: 2}; const filter = {id: 2};
let result = await app.models.Route.getTickets(filter); let result = await app.models.Route.getTickets(ctx, filter);
expect(result.length).toEqual(1); expect(result.length).toEqual(1);
}); });

View File

@ -2,34 +2,34 @@ const app = require('vn-loopback/server/server');
describe('route summary()', () => { describe('route summary()', () => {
it('should return a summary object containing data from one route', async() => { it('should return a summary object containing data from one route', async() => {
const result = await app.models.Route.summary(1); const result = await app.models.Route.summary(ctx, 1);
expect(result.route.id).toEqual(1); expect(result.route.id).toEqual(1);
}); });
it(`should return a summary object containing it's agency`, async() => { it(`should return a summary object containing it's agency`, async() => {
const result = await app.models.Route.summary(1); const result = await app.models.Route.summary(ctx, 1);
const agency = result.route.agencyMode(); const agency = result.route.agencyMode();
expect(agency.name).toEqual('inhouse pickup'); expect(agency.name).toEqual('inhouse pickup');
}); });
it(`should return a summary object containing it's vehicle`, async() => { it(`should return a summary object containing it's vehicle`, async() => {
const result = await app.models.Route.summary(1); const result = await app.models.Route.summary(ctx, 1);
const vehicle = result.route.vehicle(); const vehicle = result.route.vehicle();
expect(vehicle.numberPlate).toEqual('3333-BAT'); expect(vehicle.numberPlate).toEqual('3333-BAT');
}); });
it(`should return a summary object containing it's worker`, async() => { it(`should return a summary object containing it's worker`, async() => {
const result = await app.models.Route.summary(1); const result = await app.models.Route.summary(ctx, 1);
const worker = result.route.worker().user(); const worker = result.route.worker().user();
expect(worker.name).toEqual('delivery'); expect(worker.name).toEqual('delivery');
}); });
it(`should return a summary object containing data from the tickets`, async() => { it(`should return a summary object containing data from the tickets`, async() => {
const result = await app.models.Route.summary(2); const result = await app.models.Route.summary(ctx, 2);
expect(result.tickets.length).toEqual(1); expect(result.tickets.length).toEqual(1);
}); });

View File

@ -1,5 +1,5 @@
module.exports = Self => { module.exports = Self => {
Self.remoteMethod('summary', { Self.remoteMethodCtx('summary', {
description: 'Returns the information of a route showed in the route summary', description: 'Returns the information of a route showed in the route summary',
accessType: 'READ', accessType: 'READ',
accepts: [{ accepts: [{
@ -19,7 +19,7 @@ module.exports = Self => {
} }
}); });
Self.summary = async id => { Self.summary = async(ctx, id) => {
let summary = {}; let summary = {};
let filter = { let filter = {
@ -53,7 +53,7 @@ module.exports = Self => {
}; };
summary.route = await Self.app.models.Route.findOne(filter); summary.route = await Self.app.models.Route.findOne(filter);
summary.tickets = await Self.app.models.Route.getTickets({id: id, order: 'priority ASC'}); summary.tickets = await Self.app.models.Route.getTickets(ctx, {id, order: 'priority ASC'});
return summary; return summary;
}; };

View File

@ -162,4 +162,11 @@ module.exports = Self => {
if ((nameChanged) && !isAlpha(name)) if ((nameChanged) && !isAlpha(name))
throw new UserError('The social name has an invalid format'); throw new UserError('The social name has an invalid format');
}); });
Self.isSupplier = async(ctx, options = {}) => {
carlossa marked this conversation as resolved
Review

aci es mes sencill que pases el userId directament

aci es mes sencill que pases el userId directament
const userId = ctx.req.accessToken.userId;
carlossa marked this conversation as resolved Outdated

ací es on dia que no cal pasar ctx, sino userId

ací es on dia que no cal pasar ctx, sino userId
const client = await Self.app.models.Client.findById(userId, options);
const supplier = await Self.app.models.Supplier.findOne({where: {nif: client.fi}}, options);
return supplier;
};
}; };