fix: refs #7917 fix methods, tests, acls #3085
|
@ -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
|
|||||||
|
('AgencyTerm', 'filter', 'READ', 'ALLOW', 'ROLE', 'supplier'),
|
||||||
|
('Route', 'summary', 'READ', 'ALLOW', 'ROLE', 'supplier');
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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
jgallego
commented
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 = [];
|
||||||
|
|
|
@ -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
jgallego
commented
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,
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -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', {
|
||||||
jgallego
commented
els test de back han de verificar les 3 opcions, 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;
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
});
|
});
|
||||||
|
|
|
@ -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);
|
||||||
});
|
});
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
|
@ -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
jgallego
commented
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
jgallego
commented
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;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue
confirmar con jbreso que rol tienen los autonomos que van a usar esto
Lo van a ver usuarios delivery