feat: refs #6028 test
gitea/salix/pipeline/head There was a failure building this commit Details

This commit is contained in:
Javi Gallego 2023-11-22 15:54:38 +01:00
parent e146c0ea46
commit e856de0cfd
7 changed files with 110 additions and 74 deletions

View File

@ -18,7 +18,3 @@ INSERT INTO `salix`.`ACL` (`model`, `property`, `accessType`, `permission`, `pri
('Route', 'insertTicket', 'WRITE', 'ALLOW', 'ROLE', 'employee'), ('Route', 'insertTicket', 'WRITE', 'ALLOW', 'ROLE', 'employee'),
('Route', 'getDeliveryPoint', 'READ', 'ALLOW', 'ROLE', 'deliveryBoss'), ('Route', 'getDeliveryPoint', 'READ', 'ALLOW', 'ROLE', 'deliveryBoss'),
('Route', 'summary', 'READ', 'ALLOW', 'ROLE', 'employee'); ('Route', 'summary', 'READ', 'ALLOW', 'ROLE', 'employee');
INSERT INTO salix.AccessToken (id, ttl, scopes, created, userId, outdated) VALUES('1z0GILWTs8huKrJGp7Fj0PvHaGA8Gg9DTNhm6nn6AfhkNJygeVUHMZKOGfMPp0xO', 1209600, NULL, '2023-07-17 13:34:10', 56, '2023-07-31 13:34:10');
INSERT INTO salix.AccessToken (id, ttl, scopes, created, userId, outdated) VALUES('1z0GILWTs8huKrJGp7Fj0PvHaGA8Gg9DTNhm6nn6AfhkNJygeVUHMZKOGfMPp0xP', 1209600, NULL, '2023-07-17 13:34:10', 57, '2023-07-31 13:34:10');

View File

@ -1,19 +0,0 @@
const {models} = require('vn-loopback/server/server');
describe('getRoutesByWorker', () => {
fit('should return the routes of the worker can view all routes', async() => {
const deliveryBossId = 57;
const ctx = {req: {accessToken: {userId: deliveryBossId}}};
const result = await models.Route.getRoutesByWorker(ctx);
expect(result.length).toEqual(7);
});
fit('should return the routes of the worker can not view all routes', async() => {
const deliveryId = 56;
const ctx = {req: {accessToken: {userId: deliveryId}}};
const result = await models.Route.getRoutesByWorker(ctx);
expect(result.length).toEqual(5);
});
});

View File

@ -105,7 +105,7 @@ module.exports = Self => {
} }
}); });
filter = mergeFilters(ctx.args.filter, {where}); filter = mergeFilters(filter, {where});
let stmts = []; let stmts = [];
let stmt; let stmt;
@ -129,9 +129,11 @@ module.exports = Self => {
r.description, r.description,
am.name agencyName, am.name agencyName,
u.name AS workerUserName, u.name AS workerUserName,
v.numberPlate AS vehiclePlateNumber v.numberPlate AS vehiclePlateNumber,
Date_format(r.time, '%H:%i') hour
FROM route r FROM route r
LEFT JOIN agencyMode am ON am.id = r.agencyModeFk LEFT JOIN agencyMode am ON am.id = r.agencyModeFk
LEFT JOIN agency a ON a.id = am.agencyFk
LEFT JOIN vehicle v ON v.id = r.vehicleFk LEFT JOIN vehicle v ON v.id = r.vehicleFk
LEFT JOIN worker w ON w.id = r.workerFk LEFT JOIN worker w ON w.id = r.workerFk
LEFT JOIN account.user u ON u.id = w.id` LEFT JOIN account.user u ON u.id = w.id`

View File

@ -0,0 +1,66 @@
const mergeFilters = require('vn-loopback/util/filter').mergeFilters;
module.exports = Self => {
Self.remoteMethodCtx('getByWorker', {
description: 'Return the routes by worker',
accessType: 'READ',
returns: {
type: ['object'],
root: true
},
http: {
path: `/getByWorker`,
verb: 'GET'
}
});
Self.getByWorker = async ctx => {
const models = Self.app.models;
const userId = ctx.req.accessToken.userId;
const myOptions = {};
if (typeof options == 'object')
Object.assign(myOptions, options);
const canViewAll = await models.ACL.checkAccessAcl(ctx, 'Route', 'canViewAllRoute', 'READ');
let filterGrant = {};
console.log(userId);
console.log(canViewAll);
if (canViewAll) {
const userConfig = await models.UserConfig.getUserConfig(ctx, myOptions);
filterGrant = {
where: {'a.warehouseFk': userConfig.warehouseFk}
};
} else {
filterGrant = {
where: {'r.workerFk': userId}
};
}
const currentDate = Date.vnNew();
currentDate.setHours(0, 0, 0, 0);
const nextDay = Date.vnNew();
nextDay.setDate(currentDate.getDate() + 1);
const filter = {
where: {
and: [
{
or: [
{'r.created': currentDate},
{'r.created': nextDay}
]
}
]
},
order: [
'r.created ASC',
'r.time ASC',
'am.name ASC'
]
};
const result = await Self.filter(ctx, mergeFilters(filter, filterGrant));
return result;
};
};

View File

@ -1,48 +0,0 @@
module.exports = Self => {
Self.remoteMethodCtx('getRoutesByWorker', {
description: 'Return the routes by worker',
accessType: 'READ',
returns: {
type: 'object',
root: true
},
http: {
path: `/get-routes-by-worker`,
verb: 'GET'
}
});
Self.getRoutesByWorker = async(ctx, options) => {
const userId = ctx.req.accessToken.userId;
const myOptions = {};
if (typeof options == 'object')
Object.assign(myOptions, options);
const canViewAll = await Self.app.models.ACL.checkAccessAcl(ctx, 'Route', 'canViewAllRoute', 'READ');
const condition = canViewAll ? `ay.warehouseFK = uc.warehouseFk` : `r.workerFk = ${userId}`;
return Self.rawSql(`
SELECT concat(w.firstName , ' ', w.lastName) driver,
r.id,
Date_format(r.time, '%H:%i') hour,
r.created,
r.m3,
v.numberPlate,
a.name,
r.kmStart,
r.kmEnd,
r.started,
r.finished
FROM vn.route r
JOIN vn.vehicle v ON r.vehicleFk = v.id
JOIN vn.agencyMode a ON r.agencyModeFk = a.id
JOIN vn.agency ay ON a.agencyFk = ay.id
JOIN vn.worker w ON r.workerFk = w.id
LEFT JOIN vn.userConfig uc ON uc.userFk = ?
WHERE (r.created = util.VN_CURDATE() OR r.created = TIMESTAMPADD(day, 1, util.VN_CURDATE()))
AND ${condition}
ORDER BY r.created ASC, r.time ASC, a.name ASC
`, [userId], myOptions);
};
};

View File

@ -0,0 +1,39 @@
const app = require('vn-loopback/server/server');
const LoopBackContext = require('loopback-context');
fdescribe('route getByWorker()', () => {
const userId = 56;
const activeCtx = {
accessToken: {userId: userId},
http: {
req: {
headers: {origin: 'http://localhost'}
}
}
};
const ctx = {req: activeCtx};
beforeAll(() => {
spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({
active: activeCtx
});
});
it('should return routes assigned to the worker', async() => {
const result = await app.models.Route.getByWorker(ctx);
// Aquí se verifica que el resultado contiene rutas asignadas al usuario
console.log(result);
expect(result.every(route => route.workerFk === userId)).toBe(true);
});
it('should return all routes if user has canViewAllRoute permission', async() => {
// Simular que el usuario tiene permiso para ver todas las rutas
spyOn(app.models.ACL, 'checkAccessAcl').and.returnValue(Promise.resolve(true));
const result = await app.models.Route.getByWorker(ctx);
expect(result.some(route => route.workerFk != userId)).toBe(true);
});
});

View File

@ -14,10 +14,10 @@ module.exports = Self => {
require('../methods/route/driverRouteEmail')(Self); require('../methods/route/driverRouteEmail')(Self);
require('../methods/route/sendSms')(Self); require('../methods/route/sendSms')(Self);
require('../methods/route/downloadZip')(Self); require('../methods/route/downloadZip')(Self);
require('../methods/route/getRoutesByWorker')(Self);
require('../methods/route/cmr')(Self); require('../methods/route/cmr')(Self);
require('../methods/route/getExternalCmrs')(Self); require('../methods/route/getExternalCmrs')(Self);
require('../methods/route/downloadCmrsZip')(Self); require('../methods/route/downloadCmrsZip')(Self);
require('../methods/route/getByWorker')(Self);
Self.validate('kmStart', validateDistance, { Self.validate('kmStart', validateDistance, {
message: 'Distance must be lesser than 1000' message: 'Distance must be lesser than 1000'