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

Open
carlossa wants to merge 23 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'),
('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);
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}}},
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;
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;
};
}; };