@ministryofjustice/hmpps-prison-permissions-lib 0.4.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +47 -5
- package/README.md +2 -1
- package/dist/contractTests/prisonerProfile/scenarios/domains/prisonerSpecific/prisonerIncentives/{PrisonerIncentivesReadScenarios.d.ts → IncentiveLevelHistoryReadScenarios.d.ts} +1 -1
- package/dist/contractTests/prisonerProfile/scenarios/domains/prisonerSpecific/prisonerSpecificRisks/CsraAssessmentHistoryReadScenarios.d.ts +2 -0
- package/dist/index.cjs +100 -41
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +41 -30
- package/dist/index.esm.js +100 -42
- package/dist/index.esm.js.map +1 -1
- package/dist/services/permissions/checks/domains/prisonerSpecific/prisonerIncentives/incentiveLevelHistoryRead/IncentiveLevelHistoryReadCheck.d.ts +2 -0
- package/dist/services/permissions/checks/domains/prisonerSpecific/prisonerIncentives/{prisonerIncentivesRead/PrisonerIncentivesReadScenarios.d.ts → incentiveLevelHistoryRead/IncentiveLevelHistoryReadScenarios.d.ts} +1 -1
- package/dist/services/permissions/checks/domains/prisonerSpecific/prisonerSpecificRisks/PrisonerSpecificRisksCheck.d.ts +3 -0
- package/dist/services/permissions/checks/domains/prisonerSpecific/prisonerSpecificRisks/csraRead/CsraAssessmentHistoryReadCheck.d.ts +2 -0
- package/dist/services/permissions/checks/domains/prisonerSpecific/prisonerSpecificRisks/csraRead/CsraAssessmentHistoryReadScenarios.d.ts +2 -0
- package/dist/services/permissions/utils/PermissionUtils.d.ts +4 -1
- package/dist/testUtils/PrisonerPermissionsMock.d.ts +3 -0
- package/dist/types/public/permissions/domains/prisonerSpecific/PrisonerSpecificDomainPermissions.d.ts +3 -1
- package/dist/types/public/permissions/domains/prisonerSpecific/personPrisonCategory/PersonPrisonCategoryPermissions.d.ts +1 -0
- package/dist/types/public/permissions/domains/prisonerSpecific/prisonerIncentives/PrisonerIncentivesPermissions.d.ts +2 -1
- package/dist/types/public/permissions/domains/prisonerSpecific/prisonerSpecificRisks/PrisonerSpecificRisksPermissionPaths.d.ts +4 -0
- package/dist/types/public/permissions/domains/prisonerSpecific/prisonerSpecificRisks/PrisonerSpecificRisksPermissions.d.ts +5 -0
- package/package.json +16 -16
- package/dist/services/permissions/checks/domains/interventions/personInterventions/csipRead/CSIPReadCheck.d.ts +0 -2
- package/dist/services/permissions/checks/domains/interventions/personInterventions/csipRead/CSIPReadScenarios.d.ts +0 -1
- package/dist/services/permissions/checks/domains/prisonerSpecific/prisonerIncentives/prisonerIncentivesRead/PrisonerIncentivesReadCheck.d.ts +0 -2
- /package/dist/services/permissions/checks/domains/{interventions/personInterventions/csipRead/CSIPReadCheck.test.d.ts → prisonerSpecific/prisonerIncentives/incentiveLevelHistoryRead/IncentiveLevelHistoryReadCheck.test.d.ts} +0 -0
- /package/dist/services/permissions/checks/domains/prisonerSpecific/{prisonerIncentives/prisonerIncentivesRead/PrisonerIncentivesReadCheck.test.d.ts → prisonerSpecificRisks/csraRead/CsraAssessmentHistoryReadCheck.test.d.ts} +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -2,9 +2,45 @@
|
|
|
2
2
|
|
|
3
3
|
Please use this to capture reasoning behind changes:
|
|
4
4
|
|
|
5
|
+
## 1.0.0
|
|
6
|
+
|
|
7
|
+
### Breaking changes:
|
|
8
|
+
|
|
9
|
+
* Renamed `PrisonerIncentivesPermission.read` to `PrisonerIncentivesPermission.read_incentive_level` to distinguish
|
|
10
|
+
between reading just the incentive level vs the incentives history and comments. This only affected the Prisoner
|
|
11
|
+
Profile contract tests.
|
|
12
|
+
|
|
13
|
+
### New features:
|
|
14
|
+
|
|
15
|
+
* Introduction of `PrisonerIncentivesPermission.read_incentive_level_history`.
|
|
16
|
+
|
|
17
|
+
We reviewed the permissions around incentives and found that there were conflicting permissions between
|
|
18
|
+
displaying the incentive level in the Prisoner Profile banner, the incentives card in the Prisoner Profile overview
|
|
19
|
+
and the incentives service itself. Connect DPS and the Incentives team agreed that just reading the incentive level
|
|
20
|
+
should follow the base checks for the profile, whilst reading the incentives history and comments should not
|
|
21
|
+
be allowed for prisoners in a prison outside the user's caseload.
|
|
22
|
+
|
|
23
|
+
We have therefore introduced a new permission to capture the incentive level history permission.
|
|
24
|
+
|
|
25
|
+
* Introduction of CSRA permissions for reading the CSRA rating of a prisoner and also the history and details of
|
|
26
|
+
CSRA assessments.
|
|
27
|
+
|
|
28
|
+
It was decided (see Slack #hmpps-data-domains on 17/11/25) that CSRA should sit in the 'Prisoner Specific Risks'
|
|
29
|
+
domain, `as it is solely an assessment of their suitability to share a cell and who with`
|
|
30
|
+
|
|
31
|
+
The permissions mirror the logic that was used in the Prisoner Profile.
|
|
32
|
+
|
|
33
|
+
* Introduction of a `PersonPrisonCategoryPermission.read` permission that matches the base checks. This matched the
|
|
34
|
+
existing logic in the Prisoner Profile for reading a prisoner's category.
|
|
35
|
+
|
|
36
|
+
## 0.5.0
|
|
37
|
+
|
|
38
|
+
No functionality changes. Dependencies updated and support for node 24 has been added.
|
|
39
|
+
|
|
5
40
|
## 0.4.0
|
|
6
41
|
|
|
7
|
-
Access period for users with both the `POM` and `GLOBAL_SEARCH` roles to access prisoner case notes after a transfer
|
|
42
|
+
Access period for users with both the `POM` and `GLOBAL_SEARCH` roles to access prisoner case notes after a transfer
|
|
43
|
+
extended from 30 to 90 days.
|
|
8
44
|
|
|
9
45
|
## 0.3.0
|
|
10
46
|
|
|
@@ -12,9 +48,15 @@ Official release for updates to the Case Notes and Religion permissions.
|
|
|
12
48
|
|
|
13
49
|
**Case Notes Permissions:**
|
|
14
50
|
|
|
15
|
-
Previously if a user had both the `POM` and `GLOBAL_SEARCH` roles they would be able read/write case notes any prisoner.
|
|
51
|
+
Previously if a user had both the `POM` and `GLOBAL_SEARCH` roles they would be able read/write case notes any prisoner.
|
|
52
|
+
The case notes permissions have now been updated so that users with both the `POM` and `GLOBAL_SEARCH` roles will only
|
|
53
|
+
be able to read/write a prisoner's case notes if the prisoner has been in the users establishment within the last 30
|
|
54
|
+
days.
|
|
16
55
|
|
|
17
|
-
The permissions check requires additional data to be passed in via the `Prisoner` which now expects the
|
|
56
|
+
The permissions check requires additional data to be passed in via the `Prisoner` which now expects the
|
|
57
|
+
`previousPrisonId` and `previousPrisonLeavingDate` fields to be present. This data has been added to the prisoner search
|
|
58
|
+
API so clients using the permissions library will need to ensure the following fields are present in the `Prisoner`
|
|
59
|
+
interface.
|
|
18
60
|
|
|
19
61
|
```
|
|
20
62
|
export default interface Prisoner {
|
|
@@ -29,8 +71,8 @@ export default interface Prisoner {
|
|
|
29
71
|
|
|
30
72
|
**Religion and Belief Permissions:**
|
|
31
73
|
|
|
32
|
-
The permissions check for `PersonProtectedCharacteristicsPermission.read_religion_and_belief` updated to only allow read
|
|
33
|
-
prisoner's religion data to users who are part of the prisoner's caseload.
|
|
74
|
+
The permissions check for `PersonProtectedCharacteristicsPermission.read_religion_and_belief` updated to only allow read
|
|
75
|
+
access to a prisoner's religion data to users who are part of the prisoner's caseload.
|
|
34
76
|
|
|
35
77
|
## 0.3.0-alpha.1
|
|
36
78
|
|
package/README.md
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# hmpps-prison-permissions-lib
|
|
2
2
|
|
|
3
3
|
[](https://operations-engineering-reports.cloud-platform.service.justice.gov.uk/public-report/hmpps-prison-permissions-lib "Link to report")
|
|
4
|
+
[](https://github.com/ministryofjustice/hmpps-prison-permissions-lib/actions/workflows/pipeline.yml)
|
|
4
5
|
|
|
5
6
|
A Node.js client library to centralise the process of determining user permissions for prison services and data.
|
|
6
7
|
|
|
@@ -143,7 +144,7 @@ setupNunjucksPermissions(njkEnv)
|
|
|
143
144
|
|
|
144
145
|
* Using the permissions check in the template, for example:
|
|
145
146
|
|
|
146
|
-
```
|
|
147
|
+
```nunjucks
|
|
147
148
|
{% if isGranted(PrisonerMoneyPermission.read, res.locals.prisonerPermissions) %}
|
|
148
149
|
...
|
|
149
150
|
{% endif %}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { TestScenarios } from '../../../../../../testUtils/TestScenario';
|
|
2
|
-
export declare const
|
|
2
|
+
export declare const incentiveLevelHistoryReadScenarios: TestScenarios;
|
package/dist/index.cjs
CHANGED
|
@@ -113,8 +113,14 @@ const isActiveCaseLoad = (prisonId, user) => user.authSource === 'nomis' && user
|
|
|
113
113
|
function isInUsersCaseLoad(prisonId, user) {
|
|
114
114
|
return user.authSource === 'nomis' && user.caseLoads?.some(caseLoad => caseLoad.caseLoadId === prisonId);
|
|
115
115
|
}
|
|
116
|
-
|
|
117
|
-
return ['OUT'
|
|
116
|
+
const isReleased = (prisoner) => {
|
|
117
|
+
return !!prisoner?.prisonId && ['OUT'].includes(prisoner.prisonId);
|
|
118
|
+
};
|
|
119
|
+
const isTransferring = (prisoner) => {
|
|
120
|
+
return !!prisoner?.prisonId && ['TRN'].includes(prisoner.prisonId);
|
|
121
|
+
};
|
|
122
|
+
function isReleasedOrTransferring(prisoner) {
|
|
123
|
+
return isReleased(prisoner) || isTransferring(prisoner);
|
|
118
124
|
}
|
|
119
125
|
function userHasSomeRolesFrom(rolesToCheck, user) {
|
|
120
126
|
return (rolesToCheck.length === 0 ||
|
|
@@ -221,9 +227,9 @@ function baseCheckStatus(user, prisoner) {
|
|
|
221
227
|
return exports.PermissionCheckStatus.NOT_PRISON_USER;
|
|
222
228
|
if (prisoner.restrictedPatient)
|
|
223
229
|
return restrictedPatientStatus(user, prisoner);
|
|
224
|
-
if (prisoner
|
|
230
|
+
if (isReleased(prisoner))
|
|
225
231
|
return releasedPrisonerStatus(user);
|
|
226
|
-
if (prisoner
|
|
232
|
+
if (isTransferring(prisoner))
|
|
227
233
|
return transferringPrisonerStatus(user);
|
|
228
234
|
if (inUsersCaseLoad || globalSearchUser)
|
|
229
235
|
return exports.PermissionCheckStatus.OK;
|
|
@@ -259,14 +265,14 @@ exports.PrisonerAdjudicationsPermission = void 0;
|
|
|
259
265
|
PrisonerAdjudicationsPermission["read"] = "prisoner:prisoner-adjudications:read";
|
|
260
266
|
})(exports.PrisonerAdjudicationsPermission || (exports.PrisonerAdjudicationsPermission = {}));
|
|
261
267
|
|
|
262
|
-
const permission$
|
|
268
|
+
const permission$g = exports.PrisonerAdjudicationsPermission.read;
|
|
263
269
|
function prisonerAdjudicationsReadCheck(request) {
|
|
264
270
|
const { user, prisoner, baseCheckStatus } = request;
|
|
265
271
|
const baseCheckPassed = baseCheckStatus === exports.PermissionCheckStatus.OK;
|
|
266
272
|
const check = baseCheckPassed &&
|
|
267
273
|
(isInUsersCaseLoad(prisoner.prisonId, user) || userHasSomeRolesFrom([exports.Role.PomUser, exports.Role.ReceptionUser], user));
|
|
268
274
|
if (!check)
|
|
269
|
-
logDeniedPermissionCheck(permission$
|
|
275
|
+
logDeniedPermissionCheck(permission$g, request, exports.PermissionCheckStatus.NOT_IN_CASELOAD);
|
|
270
276
|
return check;
|
|
271
277
|
}
|
|
272
278
|
|
|
@@ -278,43 +284,64 @@ function prisonerAdjudicationsCheck(request) {
|
|
|
278
284
|
|
|
279
285
|
exports.PrisonerIncentivesPermission = void 0;
|
|
280
286
|
(function (PrisonerIncentivesPermission) {
|
|
281
|
-
PrisonerIncentivesPermission["
|
|
287
|
+
PrisonerIncentivesPermission["read_incentive_level"] = "prisoner:prisoner-incentives:read_incentive_level";
|
|
288
|
+
PrisonerIncentivesPermission["read_incentive_level_history"] = "prisoner:prisoner-incentives:read_incentive_level_history";
|
|
282
289
|
})(exports.PrisonerIncentivesPermission || (exports.PrisonerIncentivesPermission = {}));
|
|
283
290
|
|
|
284
|
-
const permission$
|
|
285
|
-
function
|
|
286
|
-
const
|
|
287
|
-
const
|
|
288
|
-
const
|
|
291
|
+
const permission$f = exports.PrisonerIncentivesPermission.read_incentive_level_history;
|
|
292
|
+
function incentiveLevelHistoryReadCheck(request) {
|
|
293
|
+
const baseCheckPassed = request.baseCheckStatus === exports.PermissionCheckStatus.OK;
|
|
294
|
+
const incentiveLevelHistoryAccess = checkIncentiveLevelHistoryAccess(request);
|
|
295
|
+
const incentiveLevelHistoryCheckPassed = incentiveLevelHistoryAccess === exports.PermissionCheckStatus.OK;
|
|
296
|
+
const check = baseCheckPassed && incentiveLevelHistoryCheckPassed;
|
|
289
297
|
if (!check)
|
|
290
|
-
logDeniedPermissionCheck(permission$
|
|
298
|
+
logDeniedPermissionCheck(permission$f, request, incentiveLevelHistoryAccess);
|
|
291
299
|
return check;
|
|
292
300
|
}
|
|
301
|
+
function checkIncentiveLevelHistoryAccess(request) {
|
|
302
|
+
const { user, prisoner } = request;
|
|
303
|
+
// Restricted patients follows the base check rules:
|
|
304
|
+
if (prisoner.restrictedPatient)
|
|
305
|
+
return restrictedPatientStatus(user, prisoner);
|
|
306
|
+
// Released prisoners follows the base check rules:
|
|
307
|
+
if (isReleased(prisoner))
|
|
308
|
+
return releasedPrisonerStatus(user);
|
|
309
|
+
// Transferring prisoner incentive history can only be accessed by users with the Global Search role:
|
|
310
|
+
if (isTransferring(prisoner))
|
|
311
|
+
return userHasSomeRolesFrom([exports.Role.GlobalSearch], user)
|
|
312
|
+
? exports.PermissionCheckStatus.OK
|
|
313
|
+
: exports.PermissionCheckStatus.PRISONER_IS_TRANSFERRING;
|
|
314
|
+
// Global search is not sufficient for incentive level history access:
|
|
315
|
+
return isInUsersCaseLoad(prisoner.prisonId, user) ? exports.PermissionCheckStatus.OK : exports.PermissionCheckStatus.NOT_IN_CASELOAD;
|
|
316
|
+
}
|
|
293
317
|
|
|
294
318
|
function prisonerIncentivesCheck(request) {
|
|
295
319
|
return {
|
|
296
|
-
[exports.PrisonerIncentivesPermission.
|
|
320
|
+
[exports.PrisonerIncentivesPermission.read_incentive_level]: baseCheck(exports.PrisonerIncentivesPermission.read_incentive_level, request),
|
|
321
|
+
[exports.PrisonerIncentivesPermission.read_incentive_level_history]: incentiveLevelHistoryReadCheck(request),
|
|
297
322
|
};
|
|
298
323
|
}
|
|
299
324
|
|
|
300
325
|
exports.PersonPrisonCategoryPermission = void 0;
|
|
301
326
|
(function (PersonPrisonCategoryPermission) {
|
|
327
|
+
PersonPrisonCategoryPermission["read"] = "prisoner:person-prison-category:read";
|
|
302
328
|
PersonPrisonCategoryPermission["edit"] = "prisoner:person-prison-category:edit";
|
|
303
329
|
})(exports.PersonPrisonCategoryPermission || (exports.PersonPrisonCategoryPermission = {}));
|
|
304
330
|
|
|
305
|
-
const permission$
|
|
331
|
+
const permission$e = exports.PersonPrisonCategoryPermission.edit;
|
|
306
332
|
function personPrisonCategoryEditCheck(request) {
|
|
307
333
|
const { user, baseCheckStatus } = request;
|
|
308
334
|
const baseCheckPassed = baseCheckStatus === exports.PermissionCheckStatus.OK;
|
|
309
335
|
const check = baseCheckPassed &&
|
|
310
336
|
userHasSomeRolesFrom([exports.Role.CreateCategorisation, exports.Role.CreateRecategorisation, exports.Role.ApproveCategorisation, exports.Role.CategorisationSecurity], user);
|
|
311
337
|
if (!check)
|
|
312
|
-
logDeniedPermissionCheck(permission$
|
|
338
|
+
logDeniedPermissionCheck(permission$e, request, exports.PermissionCheckStatus.ROLE_NOT_PRESENT);
|
|
313
339
|
return check;
|
|
314
340
|
}
|
|
315
341
|
|
|
316
342
|
function personPrisonCategoryCheck(request) {
|
|
317
343
|
return {
|
|
344
|
+
[exports.PersonPrisonCategoryPermission.read]: baseCheck(exports.PersonPrisonCategoryPermission.read, request),
|
|
318
345
|
[exports.PersonPrisonCategoryPermission.edit]: personPrisonCategoryEditCheck(request),
|
|
319
346
|
};
|
|
320
347
|
}
|
|
@@ -325,17 +352,17 @@ exports.PrisonerSchedulePermission = void 0;
|
|
|
325
352
|
PrisonerSchedulePermission["edit_activity"] = "prisoner:activity:edit";
|
|
326
353
|
})(exports.PrisonerSchedulePermission || (exports.PrisonerSchedulePermission = {}));
|
|
327
354
|
|
|
328
|
-
const permission$
|
|
355
|
+
const permission$d = exports.PrisonerSchedulePermission.edit_appointment;
|
|
329
356
|
function prisonerAppointmentEditCheck(request) {
|
|
330
357
|
const { user, prisoner, baseCheckStatus } = request;
|
|
331
358
|
const baseCheckPassed = baseCheckStatus === exports.PermissionCheckStatus.OK;
|
|
332
359
|
const check = baseCheckPassed && isActiveCaseLoad(prisoner.prisonId, user) && !prisoner.restrictedPatient;
|
|
333
360
|
if (!check)
|
|
334
|
-
logDeniedPermissionCheck(permission$
|
|
361
|
+
logDeniedPermissionCheck(permission$d, request, exports.PermissionCheckStatus.NOT_ACTIVE_CASELOAD);
|
|
335
362
|
return check;
|
|
336
363
|
}
|
|
337
364
|
|
|
338
|
-
const permission$
|
|
365
|
+
const permission$c = exports.PrisonerSchedulePermission.edit_activity;
|
|
339
366
|
function prisonerActivityEditCheck(request) {
|
|
340
367
|
const { user, prisoner, baseCheckStatus } = request;
|
|
341
368
|
const baseCheckPassed = baseCheckStatus === exports.PermissionCheckStatus.OK;
|
|
@@ -345,7 +372,7 @@ function prisonerActivityEditCheck(request) {
|
|
|
345
372
|
isActiveCaseLoad(prisoner.prisonId, user) &&
|
|
346
373
|
!prisoner.restrictedPatient;
|
|
347
374
|
if (!check)
|
|
348
|
-
logDeniedPermissionCheck(permission$
|
|
375
|
+
logDeniedPermissionCheck(permission$c, request, userHasActivityHubRole ? exports.PermissionCheckStatus.NOT_ACTIVE_CASELOAD : exports.PermissionCheckStatus.ROLE_NOT_PRESENT);
|
|
349
376
|
return check;
|
|
350
377
|
}
|
|
351
378
|
|
|
@@ -361,16 +388,16 @@ exports.UseOfForcePermission = void 0;
|
|
|
361
388
|
UseOfForcePermission["edit"] = "prisoner:use-of-force:edit";
|
|
362
389
|
})(exports.UseOfForcePermission || (exports.UseOfForcePermission = {}));
|
|
363
390
|
|
|
364
|
-
const permission$
|
|
391
|
+
const permission$b = exports.UseOfForcePermission.edit;
|
|
365
392
|
function useOfForceEditCheck(request) {
|
|
366
393
|
const { user, prisoner, baseCheckStatus } = request;
|
|
367
394
|
const baseCheckPassed = baseCheckStatus === exports.PermissionCheckStatus.OK;
|
|
368
395
|
const check = baseCheckPassed &&
|
|
369
396
|
!prisoner.restrictedPatient &&
|
|
370
397
|
(isInUsersCaseLoad(prisoner.prisonId, user) ||
|
|
371
|
-
(isReleasedOrTransferring(prisoner
|
|
398
|
+
(isReleasedOrTransferring(prisoner) && userHasRole(exports.Role.InactiveBookings, user)));
|
|
372
399
|
if (!check)
|
|
373
|
-
logDeniedPermissionCheck(permission$
|
|
400
|
+
logDeniedPermissionCheck(permission$b, request, exports.PermissionCheckStatus.NOT_IN_CASELOAD);
|
|
374
401
|
return check;
|
|
375
402
|
}
|
|
376
403
|
|
|
@@ -385,14 +412,14 @@ exports.PrisonerAlertsPermission = void 0;
|
|
|
385
412
|
PrisonerAlertsPermission["edit"] = "prisoner:prisoner-alerts:edit";
|
|
386
413
|
})(exports.PrisonerAlertsPermission || (exports.PrisonerAlertsPermission = {}));
|
|
387
414
|
|
|
388
|
-
const permission$
|
|
415
|
+
const permission$a = exports.PrisonerAlertsPermission.edit;
|
|
389
416
|
function prisonerAlertsEditCheck(request) {
|
|
390
417
|
const baseCheckPassed = request.baseCheckStatus === exports.PermissionCheckStatus.OK;
|
|
391
418
|
const alertsEditCheck = checkAlertsEditAccess(request);
|
|
392
419
|
const alertsEditCheckPassed = alertsEditCheck === exports.PermissionCheckStatus.OK;
|
|
393
420
|
const check = baseCheckPassed && alertsEditCheckPassed;
|
|
394
421
|
if (!check)
|
|
395
|
-
logDeniedPermissionCheck(permission$
|
|
422
|
+
logDeniedPermissionCheck(permission$a, request, alertsEditCheck);
|
|
396
423
|
return check;
|
|
397
424
|
}
|
|
398
425
|
function checkAlertsEditAccess(request) {
|
|
@@ -405,11 +432,11 @@ function checkAlertsEditAccess(request) {
|
|
|
405
432
|
if (prisoner.restrictedPatient)
|
|
406
433
|
return restrictedPatientStatus(user, prisoner);
|
|
407
434
|
// Released prisoners follow base check:
|
|
408
|
-
if (prisoner
|
|
435
|
+
if (isReleased(prisoner))
|
|
409
436
|
return releasedPrisonerStatus(user);
|
|
410
437
|
// For transferring prisoners, only the Inactive Bookings role is acceptable,
|
|
411
438
|
// Global Search role is not sufficient:
|
|
412
|
-
if (prisoner
|
|
439
|
+
if (isTransferring(prisoner)) {
|
|
413
440
|
return userHasRole(exports.Role.InactiveBookings, user)
|
|
414
441
|
? exports.PermissionCheckStatus.OK
|
|
415
442
|
: exports.PermissionCheckStatus.PRISONER_IS_TRANSFERRING;
|
|
@@ -426,6 +453,30 @@ function prisonerAlertsCheck(request) {
|
|
|
426
453
|
};
|
|
427
454
|
}
|
|
428
455
|
|
|
456
|
+
exports.PrisonerSpecificRisksPermission = void 0;
|
|
457
|
+
(function (PrisonerSpecificRisksPermission) {
|
|
458
|
+
PrisonerSpecificRisksPermission["read_csra_rating"] = "prisoner:csra-rating:read";
|
|
459
|
+
PrisonerSpecificRisksPermission["read_csra_assessment_history"] = "prisoner:csra-assessment-history:read";
|
|
460
|
+
})(exports.PrisonerSpecificRisksPermission || (exports.PrisonerSpecificRisksPermission = {}));
|
|
461
|
+
|
|
462
|
+
const permission$9 = exports.PrisonerSpecificRisksPermission.read_csra_assessment_history;
|
|
463
|
+
function csraAssessmentHistoryReadCheck(request) {
|
|
464
|
+
const { user, prisoner } = request;
|
|
465
|
+
const baseCheckPassed = request.baseCheckStatus === exports.PermissionCheckStatus.OK;
|
|
466
|
+
const inUsersCaseLoad = isInUsersCaseLoad(prisoner.prisonId, user);
|
|
467
|
+
const check = baseCheckPassed && (inUsersCaseLoad || (isTransferring(prisoner) && userHasRole(exports.Role.GlobalSearch, user)));
|
|
468
|
+
if (!check)
|
|
469
|
+
logDeniedPermissionCheck(permission$9, request, isTransferring(prisoner) ? exports.PermissionCheckStatus.PRISONER_IS_TRANSFERRING : exports.PermissionCheckStatus.NOT_IN_CASELOAD);
|
|
470
|
+
return check;
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
function prisonerSpecificRisksCheck(request) {
|
|
474
|
+
return {
|
|
475
|
+
[exports.PrisonerSpecificRisksPermission.read_csra_rating]: baseCheck(exports.PrisonerSpecificRisksPermission.read_csra_rating, request),
|
|
476
|
+
[exports.PrisonerSpecificRisksPermission.read_csra_assessment_history]: csraAssessmentHistoryReadCheck(request),
|
|
477
|
+
};
|
|
478
|
+
}
|
|
479
|
+
|
|
429
480
|
function prisonerSpecificCheck(request) {
|
|
430
481
|
return {
|
|
431
482
|
prisonerMoney: prisonerMoneyCheck(request),
|
|
@@ -435,6 +486,7 @@ function prisonerSpecificCheck(request) {
|
|
|
435
486
|
prisonerSchedule: prisonerScheduleCheck(request),
|
|
436
487
|
useOfForce: useOfForceCheck(request),
|
|
437
488
|
prisonerAlerts: prisonerAlertsCheck(request),
|
|
489
|
+
prisonerSpecificRisks: prisonerSpecificRisksCheck(request),
|
|
438
490
|
};
|
|
439
491
|
}
|
|
440
492
|
|
|
@@ -468,9 +520,9 @@ function checkLocationDetailsAndHistoryAccess(request) {
|
|
|
468
520
|
// Follows the base check:
|
|
469
521
|
if (prisoner.restrictedPatient)
|
|
470
522
|
return restrictedPatientStatus(user, prisoner);
|
|
471
|
-
if (prisoner
|
|
523
|
+
if (isReleased(prisoner))
|
|
472
524
|
return releasedPrisonerStatus(user);
|
|
473
|
-
if (prisoner
|
|
525
|
+
if (isTransferring(prisoner))
|
|
474
526
|
return transferringPrisonerStatus(user);
|
|
475
527
|
if (inUsersCaseLoad)
|
|
476
528
|
return exports.PermissionCheckStatus.OK;
|
|
@@ -551,10 +603,10 @@ function checkCaseNotesAccess(request) {
|
|
|
551
603
|
if (prisoner.restrictedPatient)
|
|
552
604
|
return restrictedPatientStatus(user, prisoner);
|
|
553
605
|
// Released prisoners follows the base check rules:
|
|
554
|
-
if (prisoner
|
|
606
|
+
if (isReleased(prisoner))
|
|
555
607
|
return releasedPrisonerStatus(user);
|
|
556
608
|
// Case notes are only accessible for transferring prisoners if the user has the Inactive Bookings role:
|
|
557
|
-
if (prisoner
|
|
609
|
+
if (isTransferring(prisoner)) {
|
|
558
610
|
return userHasRole(exports.Role.InactiveBookings, user)
|
|
559
611
|
? exports.PermissionCheckStatus.OK
|
|
560
612
|
: exports.PermissionCheckStatus.PRISONER_IS_TRANSFERRING;
|
|
@@ -688,11 +740,11 @@ function checkPhotoAccess(request) {
|
|
|
688
740
|
if (prisoner.restrictedPatient)
|
|
689
741
|
return restrictedPatientStatus(user, prisoner);
|
|
690
742
|
// Released prisoners follows the base check rules:
|
|
691
|
-
if (prisoner
|
|
743
|
+
if (isReleased(prisoner))
|
|
692
744
|
return releasedPrisonerStatus(user);
|
|
693
745
|
// Photos are only accessible for transferring prisoners if the user has the Inactive Bookings role
|
|
694
746
|
// (Global Search is NOT sufficient):
|
|
695
|
-
if (prisoner
|
|
747
|
+
if (isTransferring(prisoner)) {
|
|
696
748
|
return userHasRole(exports.Role.InactiveBookings, user)
|
|
697
749
|
? exports.PermissionCheckStatus.OK
|
|
698
750
|
: exports.PermissionCheckStatus.PRISONER_IS_TRANSFERRING;
|
|
@@ -967,10 +1019,10 @@ function checkProbationDocumentsReadAccess(request) {
|
|
|
967
1019
|
if (prisoner.restrictedPatient)
|
|
968
1020
|
return restrictedPatientStatus(user, prisoner);
|
|
969
1021
|
// Released prisoners follow the base check rules:
|
|
970
|
-
if (prisoner
|
|
1022
|
+
if (isReleased(prisoner))
|
|
971
1023
|
return releasedPrisonerStatus(user);
|
|
972
1024
|
// Transferring prisoners follow the base check rules:
|
|
973
|
-
if (prisoner
|
|
1025
|
+
if (isTransferring(prisoner))
|
|
974
1026
|
return transferringPrisonerStatus(user);
|
|
975
1027
|
if (isInUsersCaseLoad(prisoner.prisonId, user))
|
|
976
1028
|
return exports.PermissionCheckStatus.OK;
|
|
@@ -995,13 +1047,9 @@ exports.PersonInterventionsPermission = void 0;
|
|
|
995
1047
|
PersonInterventionsPermission["read_csip"] = "prisoner:csip:read";
|
|
996
1048
|
})(exports.PersonInterventionsPermission || (exports.PersonInterventionsPermission = {}));
|
|
997
1049
|
|
|
998
|
-
function csipReadCheck(request) {
|
|
999
|
-
return inUsersCaseLoad(exports.PersonInterventionsPermission.read_csip, request);
|
|
1000
|
-
}
|
|
1001
|
-
|
|
1002
1050
|
function personInterventionsCheck(request) {
|
|
1003
1051
|
return {
|
|
1004
|
-
[exports.PersonInterventionsPermission.read_csip]:
|
|
1052
|
+
[exports.PersonInterventionsPermission.read_csip]: inUsersCaseLoad(exports.PersonInterventionsPermission.read_csip, request),
|
|
1005
1053
|
};
|
|
1006
1054
|
}
|
|
1007
1055
|
|
|
@@ -1100,11 +1148,13 @@ const prisonerMoneyPermissionPaths = {
|
|
|
1100
1148
|
|
|
1101
1149
|
// eslint-disable-next-line import/prefer-default-export
|
|
1102
1150
|
const prisonerIncentivesPermissionPaths = {
|
|
1103
|
-
[exports.PrisonerIncentivesPermission.
|
|
1151
|
+
[exports.PrisonerIncentivesPermission.read_incentive_level]: `domainGroups.prisonerSpecific.prisonerIncentives.${exports.PrisonerIncentivesPermission.read_incentive_level}`,
|
|
1152
|
+
[exports.PrisonerIncentivesPermission.read_incentive_level_history]: `domainGroups.prisonerSpecific.prisonerIncentives.${exports.PrisonerIncentivesPermission.read_incentive_level_history}`,
|
|
1104
1153
|
};
|
|
1105
1154
|
|
|
1106
1155
|
// eslint-disable-next-line import/prefer-default-export
|
|
1107
1156
|
const personPrisonCategoryPermissionPaths = {
|
|
1157
|
+
[exports.PersonPrisonCategoryPermission.read]: `domainGroups.prisonerSpecific.personPrisonCategory.${exports.PersonPrisonCategoryPermission.read}`,
|
|
1108
1158
|
[exports.PersonPrisonCategoryPermission.edit]: `domainGroups.prisonerSpecific.personPrisonCategory.${exports.PersonPrisonCategoryPermission.edit}`,
|
|
1109
1159
|
};
|
|
1110
1160
|
|
|
@@ -1124,6 +1174,12 @@ const prisonerAlertsPermissionPaths = {
|
|
|
1124
1174
|
[exports.PrisonerAlertsPermission.edit]: `domainGroups.prisonerSpecific.prisonerAlerts.${exports.PrisonerAlertsPermission.edit}`,
|
|
1125
1175
|
};
|
|
1126
1176
|
|
|
1177
|
+
// eslint-disable-next-line import/prefer-default-export
|
|
1178
|
+
const prisonerSpecificRisksPermissionPaths = {
|
|
1179
|
+
[exports.PrisonerSpecificRisksPermission.read_csra_rating]: `domainGroups.prisonerSpecific.prisonerSpecificRisks.${exports.PrisonerSpecificRisksPermission.read_csra_rating}`,
|
|
1180
|
+
[exports.PrisonerSpecificRisksPermission.read_csra_assessment_history]: `domainGroups.prisonerSpecific.prisonerSpecificRisks.${exports.PrisonerSpecificRisksPermission.read_csra_assessment_history}`,
|
|
1181
|
+
};
|
|
1182
|
+
|
|
1127
1183
|
// eslint-disable-next-line import/prefer-default-export
|
|
1128
1184
|
const prisonerSpecificDomainPermissionPaths = {
|
|
1129
1185
|
...prisonerMoneyPermissionPaths,
|
|
@@ -1133,6 +1189,7 @@ const prisonerSpecificDomainPermissionPaths = {
|
|
|
1133
1189
|
...prisonerSchedulePermissionPaths,
|
|
1134
1190
|
...useOfForcePermissionPaths,
|
|
1135
1191
|
...prisonerAlertsPermissionPaths,
|
|
1192
|
+
...prisonerSpecificRisksPermissionPaths,
|
|
1136
1193
|
};
|
|
1137
1194
|
|
|
1138
1195
|
// eslint-disable-next-line import/prefer-default-export
|
|
@@ -1374,6 +1431,7 @@ const nunjucksEnums = {
|
|
|
1374
1431
|
...nunjucksEnum({ PrisonerIncentivesPermission: exports.PrisonerIncentivesPermission }),
|
|
1375
1432
|
...nunjucksEnum({ PrisonerMoneyPermission: exports.PrisonerMoneyPermission }),
|
|
1376
1433
|
...nunjucksEnum({ PrisonerSchedulePermission: exports.PrisonerSchedulePermission }),
|
|
1434
|
+
...nunjucksEnum({ PrisonerSpecificRisksPermission: exports.PrisonerSpecificRisksPermission }),
|
|
1377
1435
|
...nunjucksEnum({ PrisonerVisitsAndVisitorsPermission: exports.PrisonerVisitsAndVisitorsPermission }),
|
|
1378
1436
|
...nunjucksEnum({ ProbationDocumentsPermission: exports.ProbationDocumentsPermission }),
|
|
1379
1437
|
...nunjucksEnum({ SOCPermission: exports.SOCPermission }),
|
|
@@ -1411,6 +1469,7 @@ exports.prisonerPermissionPaths = prisonerPermissionPaths;
|
|
|
1411
1469
|
exports.prisonerPermissionsGuard = prisonerPermissionsGuard;
|
|
1412
1470
|
exports.prisonerSchedulePermissionPaths = prisonerSchedulePermissionPaths;
|
|
1413
1471
|
exports.prisonerSpecificDomainPermissionPaths = prisonerSpecificDomainPermissionPaths;
|
|
1472
|
+
exports.prisonerSpecificRisksPermissionPaths = prisonerSpecificRisksPermissionPaths;
|
|
1414
1473
|
exports.prisonerVisitsAndVisitorsPermissionPaths = prisonerVisitsAndVisitorsPermissionPaths;
|
|
1415
1474
|
exports.probationDocumentsPermissionPaths = probationDocumentsPermissionPaths;
|
|
1416
1475
|
exports.probationDomainPermissionPaths = probationDomainPermissionPaths;
|