@doctorus/common 0.0.1 → 0.0.3
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/README.md +391 -1
- package/lib/index.d.ts +1 -3
- package/lib/index.js +2 -9
- package/lib/operations/actions.d.ts +41 -0
- package/lib/operations/actions.js +54 -0
- package/lib/operations/index.d.ts +4 -0
- package/lib/operations/index.js +21 -0
- package/lib/operations/operation.d.ts +60 -0
- package/lib/operations/operation.js +109 -0
- package/lib/operations/predefined.d.ts +85 -0
- package/lib/operations/predefined.js +112 -0
- package/lib/operations/resources.d.ts +68 -0
- package/lib/operations/resources.js +140 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1 +1,391 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @doctorus/common
|
|
2
|
+
|
|
3
|
+
Common TypeScript utilities for Doctorus - A shared library for managing operations, SSM parameters, and access control across infrastructure stacks and frontend applications.
|
|
4
|
+
|
|
5
|
+
[](https://www.npmjs.com/package/@doctorus/common)
|
|
6
|
+
[](https://github.com/DoctorusRepoOwner/common/blob/main/LICENSE)
|
|
7
|
+
|
|
8
|
+
## Installation
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
npm install @doctorus/common
|
|
12
|
+
# or
|
|
13
|
+
pnpm add @doctorus/common
|
|
14
|
+
# or
|
|
15
|
+
yarn add @doctorus/common
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Features
|
|
19
|
+
|
|
20
|
+
- 🔐 **Operations Module** - Resource-Action pattern for access control and audit logging
|
|
21
|
+
- 🗄️ **SSM Parameters** - AWS SSM Parameter Store utilities with environment support
|
|
22
|
+
- 📋 **Type Safety** - Full TypeScript support with comprehensive type definitions
|
|
23
|
+
- 🏥 **Medical & Public Resources** - Separate categorization for HIPAA compliance
|
|
24
|
+
- ✅ **100% Test Coverage** - Thoroughly tested and production-ready
|
|
25
|
+
|
|
26
|
+
## Modules
|
|
27
|
+
|
|
28
|
+
### 1. Operations Module
|
|
29
|
+
|
|
30
|
+
Manage operations in `RESOURCE:ACTION` format for access control, audit logging, and permission management.
|
|
31
|
+
|
|
32
|
+
#### Basic Usage
|
|
33
|
+
|
|
34
|
+
```typescript
|
|
35
|
+
import { Operation, Operations, Resource, Action } from '@doctorus/common';
|
|
36
|
+
|
|
37
|
+
// Use predefined operations
|
|
38
|
+
const operation = Operations.PATIENT_READ;
|
|
39
|
+
console.log(operation.toString()); // "PATIENT:READ"
|
|
40
|
+
|
|
41
|
+
// Create custom operations
|
|
42
|
+
const customOp = new Operation(Resource.PRESCRIPTION, Action.PRESCRIBE);
|
|
43
|
+
console.log(customOp.toString()); // "PRESCRIPTION:PRESCRIBE"
|
|
44
|
+
|
|
45
|
+
// Parse from string
|
|
46
|
+
const parsed = Operation.fromString("MEDICAL_SERVICE:SCHEDULE");
|
|
47
|
+
if (parsed) {
|
|
48
|
+
console.log(parsed.resource); // Resource.MEDICAL_SERVICE
|
|
49
|
+
console.log(parsed.action); // Action.SCHEDULE
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// Compare operations
|
|
53
|
+
const op1 = Operations.PATIENT_READ;
|
|
54
|
+
const op2 = Operations.PATIENT_READ;
|
|
55
|
+
console.log(op1.equals(op2)); // true
|
|
56
|
+
|
|
57
|
+
// Convert to JSON
|
|
58
|
+
const json = operation.toJSON();
|
|
59
|
+
// { resource: "PATIENT", action: "READ", operation: "PATIENT:READ" }
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
#### Resources
|
|
63
|
+
|
|
64
|
+
Resources are categorized as **Medical** (require special access control) or **Public** (standard access control):
|
|
65
|
+
|
|
66
|
+
**Medical Resources:**
|
|
67
|
+
- Patient: `PATIENT`, `PATIENT_MEDICAL_NOTES`, `PATIENT_MEDICAL_PROPERTIES`, `PATIENT_PAYMENT`
|
|
68
|
+
- Medical Services: `MEDICAL_SERVICE`, `MEDICAL_SERVICE_NOTE`, `MEDICAL_SERVICE_SCHEDULE`, `MEDICAL_SERVICE_FEES`, `MEDICAL_SERVICE_STATUS`
|
|
69
|
+
- Clinical: `MEDICAL_RECORD`, `MEDICAL_HISTORY`, `PRESCRIPTION`, `DIAGNOSIS`, `OBSERVATION`, `MEDICATION`, `ALLERGY`, `IMMUNIZATION`, `PROCEDURE`
|
|
70
|
+
- Measurements: `CLINICAL_NOTE`, `VITAL_SIGNS`, `MEASURE_MODEL`, `CALCULATED_MEASURE_MODEL`
|
|
71
|
+
- Diagnostics: `LAB_RESULT`, `IMAGING`
|
|
72
|
+
|
|
73
|
+
**Public Resources:**
|
|
74
|
+
- Account: `ACCOUNT`, `ACCOUNT_OWNERSHIP`, `ACCOUNT_PREFERENCES`
|
|
75
|
+
- User: `USER`, `CONTACT`
|
|
76
|
+
- Documents: `UPLOADED_DOCUMENT`, `DOCUMENT_LAYOUT`, `GENERATED_DOCUMENT`, `DOCUMENT_MODEL`, `SNIPPET`
|
|
77
|
+
- System: `NOTIFICATION`, `REPORT`, `AUDIT_LOG`, `SYSTEM`, `SETTINGS`, `MEMBERSHIP`, `LOCATION`, `TASK_TYPE`
|
|
78
|
+
|
|
79
|
+
#### Actions
|
|
80
|
+
|
|
81
|
+
```typescript
|
|
82
|
+
// CRUD operations
|
|
83
|
+
Action.CREATE, Action.READ, Action.UPDATE, Action.DELETE, Action.PUT, Action.LIST
|
|
84
|
+
|
|
85
|
+
// General actions
|
|
86
|
+
Action.MANAGE, Action.VIEW, Action.SEARCH
|
|
87
|
+
|
|
88
|
+
// Medical-specific actions
|
|
89
|
+
Action.PRESCRIBE, Action.DIAGNOSE, Action.SIGN, Action.VERIFY,
|
|
90
|
+
Action.SCHEDULE, Action.CANCEL, Action.APPROVE, Action.REJECT
|
|
91
|
+
|
|
92
|
+
// Medical service actions
|
|
93
|
+
Action.SET_MEDICAL_SERVICE_STATUS, Action.SET_MEDICAL_SERVICE_FEES
|
|
94
|
+
|
|
95
|
+
// Patient-specific actions
|
|
96
|
+
Action.UPDATE_STATUS, Action.VIEW_PATIENTS,
|
|
97
|
+
Action.PUT_PATIENT_PAYMENT, Action.DELETE_PATIENT_PAYMENT
|
|
98
|
+
|
|
99
|
+
// Data operations
|
|
100
|
+
Action.EXPORT, Action.IMPORT, Action.ARCHIVE, Action.RESTORE,
|
|
101
|
+
Action.SHARE, Action.DOWNLOAD, Action.UPLOAD
|
|
102
|
+
|
|
103
|
+
// System operations
|
|
104
|
+
Action.LOGIN, Action.LOGOUT, Action.CONFIGURE, Action.AUDIT
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
#### Helper Functions
|
|
108
|
+
|
|
109
|
+
```typescript
|
|
110
|
+
import {
|
|
111
|
+
isMedicalResource,
|
|
112
|
+
isPublicResource,
|
|
113
|
+
getAllOperations,
|
|
114
|
+
getOperationsByResource,
|
|
115
|
+
getOperationsByAction
|
|
116
|
+
} from '@doctorus/common';
|
|
117
|
+
|
|
118
|
+
// Check resource type
|
|
119
|
+
if (isMedicalResource(Resource.PATIENT)) {
|
|
120
|
+
// Apply HIPAA-compliant access controls
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
if (isPublicResource(Resource.USER)) {
|
|
124
|
+
// Apply standard access controls
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// Get all predefined operations
|
|
128
|
+
const allOps = getAllOperations();
|
|
129
|
+
|
|
130
|
+
// Filter operations by resource
|
|
131
|
+
const patientOps = getOperationsByResource(Resource.PATIENT);
|
|
132
|
+
// [PATIENT_CREATE, PATIENT_READ, PATIENT_UPDATE, ...]
|
|
133
|
+
|
|
134
|
+
// Filter operations by action
|
|
135
|
+
const createOps = getOperationsByAction(Action.CREATE);
|
|
136
|
+
// [PATIENT_CREATE, USER_CREATE, MEDICAL_RECORD_CREATE, ...]
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
#### Predefined Operations
|
|
140
|
+
|
|
141
|
+
Commonly used operations are predefined for convenience:
|
|
142
|
+
|
|
143
|
+
```typescript
|
|
144
|
+
// Account operations
|
|
145
|
+
Operations.ACCOUNT_CREATE, Operations.ACCOUNT_READ, Operations.ACCOUNT_UPDATE,
|
|
146
|
+
Operations.ACCOUNT_DELETE, Operations.ACCOUNT_MANAGE
|
|
147
|
+
|
|
148
|
+
// Patient operations
|
|
149
|
+
Operations.PATIENT_CREATE, Operations.PATIENT_READ, Operations.PATIENT_UPDATE,
|
|
150
|
+
Operations.PATIENT_DELETE, Operations.PATIENT_LIST, Operations.PATIENT_VIEW,
|
|
151
|
+
Operations.PATIENT_UPDATE_STATUS
|
|
152
|
+
|
|
153
|
+
// Medical service operations
|
|
154
|
+
Operations.MEDICAL_SERVICE_CREATE, Operations.MEDICAL_SERVICE_READ,
|
|
155
|
+
Operations.MEDICAL_SERVICE_UPDATE, Operations.MEDICAL_SERVICE_DELETE,
|
|
156
|
+
Operations.MEDICAL_SERVICE_MANAGE, Operations.MEDICAL_SERVICE_SCHEDULE,
|
|
157
|
+
Operations.MEDICAL_SERVICE_CANCEL, Operations.MEDICAL_SERVICE_SET_STATUS,
|
|
158
|
+
Operations.MEDICAL_SERVICE_SET_FEES
|
|
159
|
+
|
|
160
|
+
// Prescription operations
|
|
161
|
+
Operations.PRESCRIPTION_CREATE, Operations.PRESCRIPTION_READ,
|
|
162
|
+
Operations.PRESCRIPTION_UPDATE, Operations.PRESCRIPTION_SIGN,
|
|
163
|
+
Operations.PRESCRIPTION_PRESCRIBE
|
|
164
|
+
|
|
165
|
+
// User operations
|
|
166
|
+
Operations.USER_CREATE, Operations.USER_READ, Operations.USER_UPDATE,
|
|
167
|
+
Operations.USER_DELETE, Operations.USER_LOGIN, Operations.USER_LOGOUT
|
|
168
|
+
|
|
169
|
+
// ... and many more
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
### 2. SSM Parameters Module
|
|
173
|
+
|
|
174
|
+
Utilities for managing AWS SSM Parameter Store keys with environment support.
|
|
175
|
+
|
|
176
|
+
#### Basic Usage
|
|
177
|
+
|
|
178
|
+
```typescript
|
|
179
|
+
import {
|
|
180
|
+
SSM_PARAM_KEY,
|
|
181
|
+
buildSSMPath,
|
|
182
|
+
buildSSMPathWithPrefix,
|
|
183
|
+
extractEnvFromPath,
|
|
184
|
+
extractKeyFromPath,
|
|
185
|
+
isEnvAgnostic
|
|
186
|
+
} from '@doctorus/common';
|
|
187
|
+
|
|
188
|
+
// Build environment-specific path
|
|
189
|
+
const path = buildSSMPath('prod', SSM_PARAM_KEY.COGNITO_USER_POOL_ID);
|
|
190
|
+
console.log(path); // "/prod/user-pool-id"
|
|
191
|
+
|
|
192
|
+
// Build environment-agnostic path (for shared/central account parameters)
|
|
193
|
+
const sharedPath = buildSSMPath(null, SSM_PARAM_KEY.DB_USER);
|
|
194
|
+
console.log(sharedPath); // "/db-user"
|
|
195
|
+
|
|
196
|
+
// Build path with custom prefix
|
|
197
|
+
const customPath = buildSSMPathWithPrefix(
|
|
198
|
+
'/myapp/prod',
|
|
199
|
+
SSM_PARAM_KEY.GRAPHQL_API_ID
|
|
200
|
+
);
|
|
201
|
+
console.log(customPath); // "/myapp/prod/graphql-api-id"
|
|
202
|
+
|
|
203
|
+
// Extract environment from path
|
|
204
|
+
const env = extractEnvFromPath('/prod/user-pool-id');
|
|
205
|
+
console.log(env); // "prod"
|
|
206
|
+
|
|
207
|
+
// Extract key from path
|
|
208
|
+
const key = extractKeyFromPath('/prod/user-pool-id');
|
|
209
|
+
console.log(key); // SSM_PARAM_KEY.COGNITO_USER_POOL_ID
|
|
210
|
+
|
|
211
|
+
// Check if path is environment-agnostic
|
|
212
|
+
console.log(isEnvAgnostic('/db-user')); // true
|
|
213
|
+
console.log(isEnvAgnostic('/prod/user-pool-id')); // false
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
#### Available SSM Parameter Keys
|
|
217
|
+
|
|
218
|
+
```typescript
|
|
219
|
+
SSM_PARAM_KEY.COGNITO_USER_POOL_ID
|
|
220
|
+
SSM_PARAM_KEY.COGNITO_USER_POOL_WEB_CLIENT_ID
|
|
221
|
+
SSM_PARAM_KEY.COGNITO_OAUTH_DOMAIN
|
|
222
|
+
SSM_PARAM_KEY.RUM_GUEST_ROLE_ARN
|
|
223
|
+
SSM_PARAM_KEY.RUM_IDENTITY_POOL_ID
|
|
224
|
+
SSM_PARAM_KEY.RUM_APP_ID
|
|
225
|
+
SSM_PARAM_KEY.GRAPHQL_HTTP_URL
|
|
226
|
+
SSM_PARAM_KEY.GRAPHQL_WS_URL
|
|
227
|
+
SSM_PARAM_KEY.GRAPHQL_HOST
|
|
228
|
+
SSM_PARAM_KEY.GRAPHQL_API_ID
|
|
229
|
+
SSM_PARAM_KEY.MEDICAL_ASSETS_AWS_CLOUDFRONT_PRIVATE_KEY
|
|
230
|
+
SSM_PARAM_KEY.MEDICAL_ASSETS_AWS_CLOUDFRONT_KEY_ID
|
|
231
|
+
SSM_PARAM_KEY.MEDICAL_ASSETS_BUCKET_NAME
|
|
232
|
+
SSM_PARAM_KEY.PUBLIC_ASSETS_BUCKET_NAME
|
|
233
|
+
SSM_PARAM_KEY.DB_USER
|
|
234
|
+
SSM_PARAM_KEY.DB_PASSWORD
|
|
235
|
+
SSM_PARAM_KEY.MEDICAL_ASSETS_DISTRIBUTION_DOMAIN_NAME
|
|
236
|
+
SSM_PARAM_KEY.BASE_HOST
|
|
237
|
+
SSM_PARAM_KEY.EMAIL_FROM_ADDRESS
|
|
238
|
+
SSM_PARAM_KEY.EVENT_API_REAL_TIME_DNS
|
|
239
|
+
SSM_PARAM_KEY.EVENT_API_HTTP_DNS
|
|
240
|
+
SSM_PARAM_KEY.NOTIFIED_EVENT_ACTIONS
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
## Use Cases
|
|
244
|
+
|
|
245
|
+
### 1. Access Control
|
|
246
|
+
|
|
247
|
+
```typescript
|
|
248
|
+
import { Operation, isMedicalResource } from '@doctorus/common';
|
|
249
|
+
|
|
250
|
+
function checkPermission(userPermissions: string[], operation: Operation): boolean {
|
|
251
|
+
// Check if user has permission for this operation
|
|
252
|
+
const hasPermission = userPermissions.includes(operation.toString());
|
|
253
|
+
|
|
254
|
+
// Apply additional checks for medical resources
|
|
255
|
+
if (isMedicalResource(operation.resource)) {
|
|
256
|
+
// Enforce HIPAA compliance, additional logging, etc.
|
|
257
|
+
return hasPermission && user.hasHIPAAAccess;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
return hasPermission;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
// Usage
|
|
264
|
+
const canRead = checkPermission(
|
|
265
|
+
userPermissions,
|
|
266
|
+
Operations.PATIENT_READ
|
|
267
|
+
);
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
### 2. Audit Logging
|
|
271
|
+
|
|
272
|
+
```typescript
|
|
273
|
+
import { Operation, Operations } from '@doctorus/common';
|
|
274
|
+
|
|
275
|
+
interface AuditLog {
|
|
276
|
+
timestamp: Date;
|
|
277
|
+
userId: string;
|
|
278
|
+
operation: string;
|
|
279
|
+
resourceId: string;
|
|
280
|
+
success: boolean;
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
function logAudit(
|
|
284
|
+
userId: string,
|
|
285
|
+
operation: Operation,
|
|
286
|
+
resourceId: string,
|
|
287
|
+
success: boolean
|
|
288
|
+
) {
|
|
289
|
+
const log: AuditLog = {
|
|
290
|
+
timestamp: new Date(),
|
|
291
|
+
userId,
|
|
292
|
+
operation: operation.toString(),
|
|
293
|
+
resourceId,
|
|
294
|
+
success
|
|
295
|
+
};
|
|
296
|
+
|
|
297
|
+
// Store in audit log database
|
|
298
|
+
auditLogService.create(log);
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
// Usage
|
|
302
|
+
logAudit('user123', Operations.PRESCRIPTION_PRESCRIBE, 'rx-456', true);
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
### 3. Infrastructure Configuration
|
|
306
|
+
|
|
307
|
+
```typescript
|
|
308
|
+
import { buildSSMPath, SSM_PARAM_KEY } from '@doctorus/common';
|
|
309
|
+
import { StringParameter } from 'aws-cdk-lib/aws-ssm';
|
|
310
|
+
|
|
311
|
+
// In your CDK stack
|
|
312
|
+
const env = 'prod';
|
|
313
|
+
|
|
314
|
+
const userPoolId = StringParameter.valueFromLookup(
|
|
315
|
+
this,
|
|
316
|
+
buildSSMPath(env, SSM_PARAM_KEY.COGNITO_USER_POOL_ID)
|
|
317
|
+
);
|
|
318
|
+
|
|
319
|
+
const graphqlUrl = StringParameter.valueFromLookup(
|
|
320
|
+
this,
|
|
321
|
+
buildSSMPath(env, SSM_PARAM_KEY.GRAPHQL_HTTP_URL)
|
|
322
|
+
);
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
### 4. Frontend Configuration
|
|
326
|
+
|
|
327
|
+
```typescript
|
|
328
|
+
import { buildSSMPath, SSM_PARAM_KEY } from '@doctorus/common';
|
|
329
|
+
import { SSM } from '@aws-sdk/client-ssm';
|
|
330
|
+
|
|
331
|
+
async function loadConfig(environment: string) {
|
|
332
|
+
const ssm = new SSM();
|
|
333
|
+
|
|
334
|
+
const params = [
|
|
335
|
+
SSM_PARAM_KEY.COGNITO_USER_POOL_ID,
|
|
336
|
+
SSM_PARAM_KEY.GRAPHQL_HTTP_URL,
|
|
337
|
+
SSM_PARAM_KEY.RUM_APP_ID
|
|
338
|
+
];
|
|
339
|
+
|
|
340
|
+
const config: Record<string, string> = {};
|
|
341
|
+
|
|
342
|
+
for (const param of params) {
|
|
343
|
+
const path = buildSSMPath(environment, param);
|
|
344
|
+
const response = await ssm.getParameter({ Name: path });
|
|
345
|
+
config[param] = response.Parameter?.Value || '';
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
return config;
|
|
349
|
+
}
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
## Development
|
|
353
|
+
|
|
354
|
+
```bash
|
|
355
|
+
# Install dependencies
|
|
356
|
+
pnpm install
|
|
357
|
+
|
|
358
|
+
# Run tests
|
|
359
|
+
pnpm test
|
|
360
|
+
|
|
361
|
+
# Build
|
|
362
|
+
pnpm build
|
|
363
|
+
|
|
364
|
+
# Run projen (regenerate configuration)
|
|
365
|
+
pnpm projen
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
## Testing
|
|
369
|
+
|
|
370
|
+
The library includes comprehensive tests with 100% coverage:
|
|
371
|
+
|
|
372
|
+
```bash
|
|
373
|
+
pnpm test
|
|
374
|
+
```
|
|
375
|
+
|
|
376
|
+
## Contributing
|
|
377
|
+
|
|
378
|
+
Contributions are welcome! Please feel free to submit a Pull Request.
|
|
379
|
+
|
|
380
|
+
## License
|
|
381
|
+
|
|
382
|
+
Apache-2.0
|
|
383
|
+
|
|
384
|
+
## Related
|
|
385
|
+
|
|
386
|
+
- [AWS Systems Manager Parameter Store](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html)
|
|
387
|
+
- [AWS CDK](https://aws.amazon.com/cdk/)
|
|
388
|
+
|
|
389
|
+
---
|
|
390
|
+
|
|
391
|
+
Built with ❤️ for Doctorus
|
package/lib/index.d.ts
CHANGED
package/lib/index.js
CHANGED
|
@@ -14,13 +14,6 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
exports.Hello = void 0;
|
|
18
|
-
class Hello {
|
|
19
|
-
sayHello() {
|
|
20
|
-
return "hello, world!";
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
exports.Hello = Hello;
|
|
24
|
-
// Export SSM module
|
|
25
17
|
__exportStar(require("./ssm"), exports);
|
|
26
|
-
|
|
18
|
+
__exportStar(require("./operations"), exports);
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHdDQUFzQjtBQUN0QiwrQ0FBNkIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tIFwiLi9zc21cIjtcbmV4cG9ydCAqIGZyb20gXCIuL29wZXJhdGlvbnNcIjtcbiJdfQ==
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Action types for operations
|
|
3
|
+
*/
|
|
4
|
+
export declare enum Action {
|
|
5
|
+
CREATE = "CREATE",
|
|
6
|
+
READ = "READ",
|
|
7
|
+
UPDATE = "UPDATE",
|
|
8
|
+
DELETE = "DELETE",
|
|
9
|
+
PUT = "PUT",
|
|
10
|
+
LIST = "LIST",
|
|
11
|
+
MANAGE = "MANAGE",
|
|
12
|
+
VIEW = "VIEW",
|
|
13
|
+
SEARCH = "SEARCH",
|
|
14
|
+
GRANT = "GRANT",
|
|
15
|
+
REVOKE = "REVOKE",
|
|
16
|
+
PRESCRIBE = "PRESCRIBE",
|
|
17
|
+
DIAGNOSE = "DIAGNOSE",
|
|
18
|
+
SCHEDULE = "SCHEDULE",
|
|
19
|
+
CANCEL = "CANCEL",
|
|
20
|
+
APPROVE = "APPROVE",
|
|
21
|
+
REJECT = "REJECT",
|
|
22
|
+
SIGN = "SIGN",
|
|
23
|
+
VERIFY = "VERIFY",
|
|
24
|
+
SET_MEDICAL_SERVICE_STATUS = "SET_MEDICAL_SERVICE_STATUS",
|
|
25
|
+
SET_MEDICAL_SERVICE_FEES = "SET_MEDICAL_SERVICE_FEES",
|
|
26
|
+
UPDATE_STATUS = "UPDATE_STATUS",
|
|
27
|
+
VIEW_PATIENTS = "VIEW_PATIENTS",
|
|
28
|
+
PUT_PATIENT_PAYMENT = "PUT_PATIENT_PAYMENT",
|
|
29
|
+
DELETE_PATIENT_PAYMENT = "DELETE_PATIENT_PAYMENT",
|
|
30
|
+
EXPORT = "EXPORT",
|
|
31
|
+
IMPORT = "IMPORT",
|
|
32
|
+
ARCHIVE = "ARCHIVE",
|
|
33
|
+
RESTORE = "RESTORE",
|
|
34
|
+
SHARE = "SHARE",
|
|
35
|
+
DOWNLOAD = "DOWNLOAD",
|
|
36
|
+
UPLOAD = "UPLOAD",
|
|
37
|
+
LOGIN = "LOGIN",
|
|
38
|
+
LOGOUT = "LOGOUT",
|
|
39
|
+
CONFIGURE = "CONFIGURE",
|
|
40
|
+
AUDIT = "AUDIT"
|
|
41
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Action = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Action types for operations
|
|
6
|
+
*/
|
|
7
|
+
var Action;
|
|
8
|
+
(function (Action) {
|
|
9
|
+
// CRUD operations
|
|
10
|
+
Action["CREATE"] = "CREATE";
|
|
11
|
+
Action["READ"] = "READ";
|
|
12
|
+
Action["UPDATE"] = "UPDATE";
|
|
13
|
+
Action["DELETE"] = "DELETE";
|
|
14
|
+
Action["PUT"] = "PUT";
|
|
15
|
+
Action["LIST"] = "LIST";
|
|
16
|
+
// General actions
|
|
17
|
+
Action["MANAGE"] = "MANAGE";
|
|
18
|
+
Action["VIEW"] = "VIEW";
|
|
19
|
+
Action["SEARCH"] = "SEARCH";
|
|
20
|
+
// Access control
|
|
21
|
+
Action["GRANT"] = "GRANT";
|
|
22
|
+
Action["REVOKE"] = "REVOKE";
|
|
23
|
+
// Medical specific
|
|
24
|
+
Action["PRESCRIBE"] = "PRESCRIBE";
|
|
25
|
+
Action["DIAGNOSE"] = "DIAGNOSE";
|
|
26
|
+
Action["SCHEDULE"] = "SCHEDULE";
|
|
27
|
+
Action["CANCEL"] = "CANCEL";
|
|
28
|
+
Action["APPROVE"] = "APPROVE";
|
|
29
|
+
Action["REJECT"] = "REJECT";
|
|
30
|
+
Action["SIGN"] = "SIGN";
|
|
31
|
+
Action["VERIFY"] = "VERIFY";
|
|
32
|
+
// Medical service specific
|
|
33
|
+
Action["SET_MEDICAL_SERVICE_STATUS"] = "SET_MEDICAL_SERVICE_STATUS";
|
|
34
|
+
Action["SET_MEDICAL_SERVICE_FEES"] = "SET_MEDICAL_SERVICE_FEES";
|
|
35
|
+
// Patient specific
|
|
36
|
+
Action["UPDATE_STATUS"] = "UPDATE_STATUS";
|
|
37
|
+
Action["VIEW_PATIENTS"] = "VIEW_PATIENTS";
|
|
38
|
+
Action["PUT_PATIENT_PAYMENT"] = "PUT_PATIENT_PAYMENT";
|
|
39
|
+
Action["DELETE_PATIENT_PAYMENT"] = "DELETE_PATIENT_PAYMENT";
|
|
40
|
+
// Data operations
|
|
41
|
+
Action["EXPORT"] = "EXPORT";
|
|
42
|
+
Action["IMPORT"] = "IMPORT";
|
|
43
|
+
Action["ARCHIVE"] = "ARCHIVE";
|
|
44
|
+
Action["RESTORE"] = "RESTORE";
|
|
45
|
+
Action["SHARE"] = "SHARE";
|
|
46
|
+
Action["DOWNLOAD"] = "DOWNLOAD";
|
|
47
|
+
Action["UPLOAD"] = "UPLOAD";
|
|
48
|
+
// System operations
|
|
49
|
+
Action["LOGIN"] = "LOGIN";
|
|
50
|
+
Action["LOGOUT"] = "LOGOUT";
|
|
51
|
+
Action["CONFIGURE"] = "CONFIGURE";
|
|
52
|
+
Action["AUDIT"] = "AUDIT";
|
|
53
|
+
})(Action || (exports.Action = Action = {}));
|
|
54
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vcGVyYXRpb25zL2FjdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUE7O0dBRUc7QUFDSCxJQUFZLE1Bb0RYO0FBcERELFdBQVksTUFBTTtJQUNoQixrQkFBa0I7SUFDbEIsMkJBQWlCLENBQUE7SUFDakIsdUJBQWEsQ0FBQTtJQUNiLDJCQUFpQixDQUFBO0lBQ2pCLDJCQUFpQixDQUFBO0lBQ2pCLHFCQUFXLENBQUE7SUFDWCx1QkFBYSxDQUFBO0lBRWIsa0JBQWtCO0lBQ2xCLDJCQUFpQixDQUFBO0lBQ2pCLHVCQUFhLENBQUE7SUFDYiwyQkFBaUIsQ0FBQTtJQUVqQixpQkFBaUI7SUFDakIseUJBQWUsQ0FBQTtJQUNmLDJCQUFpQixDQUFBO0lBRWpCLG1CQUFtQjtJQUNuQixpQ0FBdUIsQ0FBQTtJQUN2QiwrQkFBcUIsQ0FBQTtJQUNyQiwrQkFBcUIsQ0FBQTtJQUNyQiwyQkFBaUIsQ0FBQTtJQUNqQiw2QkFBbUIsQ0FBQTtJQUNuQiwyQkFBaUIsQ0FBQTtJQUNqQix1QkFBYSxDQUFBO0lBQ2IsMkJBQWlCLENBQUE7SUFFakIsMkJBQTJCO0lBQzNCLG1FQUF5RCxDQUFBO0lBQ3pELCtEQUFxRCxDQUFBO0lBRXJELG1CQUFtQjtJQUNuQix5Q0FBK0IsQ0FBQTtJQUMvQix5Q0FBK0IsQ0FBQTtJQUMvQixxREFBMkMsQ0FBQTtJQUMzQywyREFBaUQsQ0FBQTtJQUVqRCxrQkFBa0I7SUFDbEIsMkJBQWlCLENBQUE7SUFDakIsMkJBQWlCLENBQUE7SUFDakIsNkJBQW1CLENBQUE7SUFDbkIsNkJBQW1CLENBQUE7SUFDbkIseUJBQWUsQ0FBQTtJQUNmLCtCQUFxQixDQUFBO0lBQ3JCLDJCQUFpQixDQUFBO0lBRWpCLG9CQUFvQjtJQUNwQix5QkFBZSxDQUFBO0lBQ2YsMkJBQWlCLENBQUE7SUFDakIsaUNBQXVCLENBQUE7SUFDdkIseUJBQWUsQ0FBQTtBQUNqQixDQUFDLEVBcERXLE1BQU0sc0JBQU4sTUFBTSxRQW9EakIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEFjdGlvbiB0eXBlcyBmb3Igb3BlcmF0aW9uc1xuICovXG5leHBvcnQgZW51bSBBY3Rpb24ge1xuICAvLyBDUlVEIG9wZXJhdGlvbnNcbiAgQ1JFQVRFID0gXCJDUkVBVEVcIixcbiAgUkVBRCA9IFwiUkVBRFwiLFxuICBVUERBVEUgPSBcIlVQREFURVwiLFxuICBERUxFVEUgPSBcIkRFTEVURVwiLFxuICBQVVQgPSBcIlBVVFwiLFxuICBMSVNUID0gXCJMSVNUXCIsXG5cbiAgLy8gR2VuZXJhbCBhY3Rpb25zXG4gIE1BTkFHRSA9IFwiTUFOQUdFXCIsXG4gIFZJRVcgPSBcIlZJRVdcIixcbiAgU0VBUkNIID0gXCJTRUFSQ0hcIixcblxuICAvLyBBY2Nlc3MgY29udHJvbFxuICBHUkFOVCA9IFwiR1JBTlRcIixcbiAgUkVWT0tFID0gXCJSRVZPS0VcIixcblxuICAvLyBNZWRpY2FsIHNwZWNpZmljXG4gIFBSRVNDUklCRSA9IFwiUFJFU0NSSUJFXCIsXG4gIERJQUdOT1NFID0gXCJESUFHTk9TRVwiLFxuICBTQ0hFRFVMRSA9IFwiU0NIRURVTEVcIixcbiAgQ0FOQ0VMID0gXCJDQU5DRUxcIixcbiAgQVBQUk9WRSA9IFwiQVBQUk9WRVwiLFxuICBSRUpFQ1QgPSBcIlJFSkVDVFwiLFxuICBTSUdOID0gXCJTSUdOXCIsXG4gIFZFUklGWSA9IFwiVkVSSUZZXCIsXG5cbiAgLy8gTWVkaWNhbCBzZXJ2aWNlIHNwZWNpZmljXG4gIFNFVF9NRURJQ0FMX1NFUlZJQ0VfU1RBVFVTID0gXCJTRVRfTUVESUNBTF9TRVJWSUNFX1NUQVRVU1wiLFxuICBTRVRfTUVESUNBTF9TRVJWSUNFX0ZFRVMgPSBcIlNFVF9NRURJQ0FMX1NFUlZJQ0VfRkVFU1wiLFxuXG4gIC8vIFBhdGllbnQgc3BlY2lmaWNcbiAgVVBEQVRFX1NUQVRVUyA9IFwiVVBEQVRFX1NUQVRVU1wiLFxuICBWSUVXX1BBVElFTlRTID0gXCJWSUVXX1BBVElFTlRTXCIsXG4gIFBVVF9QQVRJRU5UX1BBWU1FTlQgPSBcIlBVVF9QQVRJRU5UX1BBWU1FTlRcIixcbiAgREVMRVRFX1BBVElFTlRfUEFZTUVOVCA9IFwiREVMRVRFX1BBVElFTlRfUEFZTUVOVFwiLFxuXG4gIC8vIERhdGEgb3BlcmF0aW9uc1xuICBFWFBPUlQgPSBcIkVYUE9SVFwiLFxuICBJTVBPUlQgPSBcIklNUE9SVFwiLFxuICBBUkNISVZFID0gXCJBUkNISVZFXCIsXG4gIFJFU1RPUkUgPSBcIlJFU1RPUkVcIixcbiAgU0hBUkUgPSBcIlNIQVJFXCIsXG4gIERPV05MT0FEID0gXCJET1dOTE9BRFwiLFxuICBVUExPQUQgPSBcIlVQTE9BRFwiLFxuXG4gIC8vIFN5c3RlbSBvcGVyYXRpb25zXG4gIExPR0lOID0gXCJMT0dJTlwiLFxuICBMT0dPVVQgPSBcIkxPR09VVFwiLFxuICBDT05GSUdVUkUgPSBcIkNPTkZJR1VSRVwiLFxuICBBVURJVCA9IFwiQVVESVRcIixcbn1cbiJdfQ==
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { Resource, MEDICAL_RESOURCES, PUBLIC_RESOURCES, isMedicalResource, isPublicResource, } from "./resources";
|
|
2
|
+
export { Action } from "./actions";
|
|
3
|
+
export { Operation, OPERATION, getResourceFromOperation, getActionFromOperation, } from "./operation";
|
|
4
|
+
export { Operations, getAllOperations, getOperationsByResource, getOperationsByAction, } from "./predefined";
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getOperationsByAction = exports.getOperationsByResource = exports.getAllOperations = exports.Operations = exports.getActionFromOperation = exports.getResourceFromOperation = exports.Operation = exports.Action = exports.isPublicResource = exports.isMedicalResource = exports.PUBLIC_RESOURCES = exports.MEDICAL_RESOURCES = exports.Resource = void 0;
|
|
4
|
+
var resources_1 = require("./resources");
|
|
5
|
+
Object.defineProperty(exports, "Resource", { enumerable: true, get: function () { return resources_1.Resource; } });
|
|
6
|
+
Object.defineProperty(exports, "MEDICAL_RESOURCES", { enumerable: true, get: function () { return resources_1.MEDICAL_RESOURCES; } });
|
|
7
|
+
Object.defineProperty(exports, "PUBLIC_RESOURCES", { enumerable: true, get: function () { return resources_1.PUBLIC_RESOURCES; } });
|
|
8
|
+
Object.defineProperty(exports, "isMedicalResource", { enumerable: true, get: function () { return resources_1.isMedicalResource; } });
|
|
9
|
+
Object.defineProperty(exports, "isPublicResource", { enumerable: true, get: function () { return resources_1.isPublicResource; } });
|
|
10
|
+
var actions_1 = require("./actions");
|
|
11
|
+
Object.defineProperty(exports, "Action", { enumerable: true, get: function () { return actions_1.Action; } });
|
|
12
|
+
var operation_1 = require("./operation");
|
|
13
|
+
Object.defineProperty(exports, "Operation", { enumerable: true, get: function () { return operation_1.Operation; } });
|
|
14
|
+
Object.defineProperty(exports, "getResourceFromOperation", { enumerable: true, get: function () { return operation_1.getResourceFromOperation; } });
|
|
15
|
+
Object.defineProperty(exports, "getActionFromOperation", { enumerable: true, get: function () { return operation_1.getActionFromOperation; } });
|
|
16
|
+
var predefined_1 = require("./predefined");
|
|
17
|
+
Object.defineProperty(exports, "Operations", { enumerable: true, get: function () { return predefined_1.Operations; } });
|
|
18
|
+
Object.defineProperty(exports, "getAllOperations", { enumerable: true, get: function () { return predefined_1.getAllOperations; } });
|
|
19
|
+
Object.defineProperty(exports, "getOperationsByResource", { enumerable: true, get: function () { return predefined_1.getOperationsByResource; } });
|
|
20
|
+
Object.defineProperty(exports, "getOperationsByAction", { enumerable: true, get: function () { return predefined_1.getOperationsByAction; } });
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvb3BlcmF0aW9ucy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5Q0FNcUI7QUFMbkIscUdBQUEsUUFBUSxPQUFBO0FBQ1IsOEdBQUEsaUJBQWlCLE9BQUE7QUFDakIsNkdBQUEsZ0JBQWdCLE9BQUE7QUFDaEIsOEdBQUEsaUJBQWlCLE9BQUE7QUFDakIsNkdBQUEsZ0JBQWdCLE9BQUE7QUFFbEIscUNBQW1DO0FBQTFCLGlHQUFBLE1BQU0sT0FBQTtBQUNmLHlDQUtxQjtBQUpuQixzR0FBQSxTQUFTLE9BQUE7QUFFVCxxSEFBQSx3QkFBd0IsT0FBQTtBQUN4QixtSEFBQSxzQkFBc0IsT0FBQTtBQUV4QiwyQ0FLc0I7QUFKcEIsd0dBQUEsVUFBVSxPQUFBO0FBQ1YsOEdBQUEsZ0JBQWdCLE9BQUE7QUFDaEIscUhBQUEsdUJBQXVCLE9BQUE7QUFDdkIsbUhBQUEscUJBQXFCLE9BQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQge1xuICBSZXNvdXJjZSxcbiAgTUVESUNBTF9SRVNPVVJDRVMsXG4gIFBVQkxJQ19SRVNPVVJDRVMsXG4gIGlzTWVkaWNhbFJlc291cmNlLFxuICBpc1B1YmxpY1Jlc291cmNlLFxufSBmcm9tIFwiLi9yZXNvdXJjZXNcIjtcbmV4cG9ydCB7IEFjdGlvbiB9IGZyb20gXCIuL2FjdGlvbnNcIjtcbmV4cG9ydCB7XG4gIE9wZXJhdGlvbixcbiAgT1BFUkFUSU9OLFxuICBnZXRSZXNvdXJjZUZyb21PcGVyYXRpb24sXG4gIGdldEFjdGlvbkZyb21PcGVyYXRpb24sXG59IGZyb20gXCIuL29wZXJhdGlvblwiO1xuZXhwb3J0IHtcbiAgT3BlcmF0aW9ucyxcbiAgZ2V0QWxsT3BlcmF0aW9ucyxcbiAgZ2V0T3BlcmF0aW9uc0J5UmVzb3VyY2UsXG4gIGdldE9wZXJhdGlvbnNCeUFjdGlvbixcbn0gZnJvbSBcIi4vcHJlZGVmaW5lZFwiO1xuIl19
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { Action } from "./actions";
|
|
2
|
+
import { Resource } from "./resources";
|
|
3
|
+
/**
|
|
4
|
+
* Operation string type in RESOURCE:ACTION format
|
|
5
|
+
*/
|
|
6
|
+
export type OPERATION = `${Resource}:${Action}`;
|
|
7
|
+
/**
|
|
8
|
+
* Operation in RESOURCE:ACTION format
|
|
9
|
+
*/
|
|
10
|
+
export declare class Operation {
|
|
11
|
+
readonly resource: Resource;
|
|
12
|
+
readonly action: Action;
|
|
13
|
+
/**
|
|
14
|
+
* Create operation from string
|
|
15
|
+
* @param operationString - String in RESOURCE:ACTION format
|
|
16
|
+
* @returns Operation instance or null if invalid
|
|
17
|
+
*/
|
|
18
|
+
static fromString(operationString: string): Operation | null;
|
|
19
|
+
constructor(resource: Resource, action: Action);
|
|
20
|
+
/**
|
|
21
|
+
* Get operation string in RESOURCE:ACTION format
|
|
22
|
+
*/
|
|
23
|
+
toString(): OPERATION;
|
|
24
|
+
/**
|
|
25
|
+
* Check if two operations are equal
|
|
26
|
+
*/
|
|
27
|
+
equals(other: Operation): boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Convert to JSON representation
|
|
30
|
+
*/
|
|
31
|
+
toJSON(): {
|
|
32
|
+
resource: Resource;
|
|
33
|
+
action: Action;
|
|
34
|
+
operation: OPERATION;
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Extract Resource from an OPERATION string
|
|
39
|
+
* @param operation - Operation string in RESOURCE:ACTION format
|
|
40
|
+
* @returns Resource or null if invalid
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* ```ts
|
|
44
|
+
* getResourceFromOperation("PATIENT:READ") // Returns: Resource.PATIENT
|
|
45
|
+
* getResourceFromOperation("INVALID:ACTION") // Returns: null
|
|
46
|
+
* ```
|
|
47
|
+
*/
|
|
48
|
+
export declare function getResourceFromOperation(operation: string): Resource | null;
|
|
49
|
+
/**
|
|
50
|
+
* Extract Action from an OPERATION string
|
|
51
|
+
* @param operation - Operation string in RESOURCE:ACTION format
|
|
52
|
+
* @returns Action or null if invalid
|
|
53
|
+
*
|
|
54
|
+
* @example
|
|
55
|
+
* ```ts
|
|
56
|
+
* getActionFromOperation("PATIENT:READ") // Returns: Action.READ
|
|
57
|
+
* getActionFromOperation("PATIENT:INVALID") // Returns: null
|
|
58
|
+
* ```
|
|
59
|
+
*/
|
|
60
|
+
export declare function getActionFromOperation(operation: string): Action | null;
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Operation = void 0;
|
|
4
|
+
exports.getResourceFromOperation = getResourceFromOperation;
|
|
5
|
+
exports.getActionFromOperation = getActionFromOperation;
|
|
6
|
+
const actions_1 = require("./actions");
|
|
7
|
+
const resources_1 = require("./resources");
|
|
8
|
+
/**
|
|
9
|
+
* Operation in RESOURCE:ACTION format
|
|
10
|
+
*/
|
|
11
|
+
class Operation {
|
|
12
|
+
resource;
|
|
13
|
+
action;
|
|
14
|
+
/**
|
|
15
|
+
* Create operation from string
|
|
16
|
+
* @param operationString - String in RESOURCE:ACTION format
|
|
17
|
+
* @returns Operation instance or null if invalid
|
|
18
|
+
*/
|
|
19
|
+
static fromString(operationString) {
|
|
20
|
+
const parts = operationString.split(":");
|
|
21
|
+
if (parts.length !== 2) {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
const [resourceStr, actionStr] = parts;
|
|
25
|
+
// Validate resource
|
|
26
|
+
if (!Object.values(resources_1.Resource).includes(resourceStr)) {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
// Validate action
|
|
30
|
+
if (!Object.values(actions_1.Action).includes(actionStr)) {
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
return new Operation(resourceStr, actionStr);
|
|
34
|
+
}
|
|
35
|
+
constructor(resource, action) {
|
|
36
|
+
this.resource = resource;
|
|
37
|
+
this.action = action;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Get operation string in RESOURCE:ACTION format
|
|
41
|
+
*/
|
|
42
|
+
toString() {
|
|
43
|
+
return `${this.resource}:${this.action}`;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Check if two operations are equal
|
|
47
|
+
*/
|
|
48
|
+
equals(other) {
|
|
49
|
+
return this.resource === other.resource && this.action === other.action;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Convert to JSON representation
|
|
53
|
+
*/
|
|
54
|
+
toJSON() {
|
|
55
|
+
return {
|
|
56
|
+
resource: this.resource,
|
|
57
|
+
action: this.action,
|
|
58
|
+
operation: this.toString(),
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
exports.Operation = Operation;
|
|
63
|
+
/**
|
|
64
|
+
* Extract Resource from an OPERATION string
|
|
65
|
+
* @param operation - Operation string in RESOURCE:ACTION format
|
|
66
|
+
* @returns Resource or null if invalid
|
|
67
|
+
*
|
|
68
|
+
* @example
|
|
69
|
+
* ```ts
|
|
70
|
+
* getResourceFromOperation("PATIENT:READ") // Returns: Resource.PATIENT
|
|
71
|
+
* getResourceFromOperation("INVALID:ACTION") // Returns: null
|
|
72
|
+
* ```
|
|
73
|
+
*/
|
|
74
|
+
function getResourceFromOperation(operation) {
|
|
75
|
+
const parts = operation.split(":");
|
|
76
|
+
if (parts.length !== 2) {
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
const [resourceStr] = parts;
|
|
80
|
+
// Validate resource
|
|
81
|
+
if (Object.values(resources_1.Resource).includes(resourceStr)) {
|
|
82
|
+
return resourceStr;
|
|
83
|
+
}
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Extract Action from an OPERATION string
|
|
88
|
+
* @param operation - Operation string in RESOURCE:ACTION format
|
|
89
|
+
* @returns Action or null if invalid
|
|
90
|
+
*
|
|
91
|
+
* @example
|
|
92
|
+
* ```ts
|
|
93
|
+
* getActionFromOperation("PATIENT:READ") // Returns: Action.READ
|
|
94
|
+
* getActionFromOperation("PATIENT:INVALID") // Returns: null
|
|
95
|
+
* ```
|
|
96
|
+
*/
|
|
97
|
+
function getActionFromOperation(operation) {
|
|
98
|
+
const parts = operation.split(":");
|
|
99
|
+
if (parts.length !== 2) {
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
const [, actionStr] = parts;
|
|
103
|
+
// Validate action
|
|
104
|
+
if (Object.values(actions_1.Action).includes(actionStr)) {
|
|
105
|
+
return actionStr;
|
|
106
|
+
}
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlcmF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL29wZXJhdGlvbnMvb3BlcmF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQWdGQSw0REFjQztBQWFELHdEQWNDO0FBekhELHVDQUFtQztBQUNuQywyQ0FBdUM7QUFPdkM7O0dBRUc7QUFDSCxNQUFhLFNBQVM7SUE0QkY7SUFDQTtJQTVCbEI7Ozs7T0FJRztJQUNILE1BQU0sQ0FBQyxVQUFVLENBQUMsZUFBdUI7UUFDdkMsTUFBTSxLQUFLLEdBQUcsZUFBZSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN6QyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDdkIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQsTUFBTSxDQUFDLFdBQVcsRUFBRSxTQUFTLENBQUMsR0FBRyxLQUFLLENBQUM7UUFFdkMsb0JBQW9CO1FBQ3BCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLG9CQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsV0FBdUIsQ0FBQyxFQUFFLENBQUM7WUFDL0QsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQsa0JBQWtCO1FBQ2xCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLGdCQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBbUIsQ0FBQyxFQUFFLENBQUM7WUFDekQsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQsT0FBTyxJQUFJLFNBQVMsQ0FBQyxXQUF1QixFQUFFLFNBQW1CLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRUQsWUFDa0IsUUFBa0IsRUFDbEIsTUFBYztRQURkLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDbEIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtJQUM3QixDQUFDO0lBRUo7O09BRUc7SUFDSCxRQUFRO1FBQ04sT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBZSxDQUFDO0lBQ3hELENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxLQUFnQjtRQUNyQixPQUFPLElBQUksQ0FBQyxRQUFRLEtBQUssS0FBSyxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFDMUUsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTTtRQUNKLE9BQU87WUFDTCxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7WUFDdkIsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO1lBQ25CLFNBQVMsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFO1NBQzNCLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUF4REQsOEJBd0RDO0FBRUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILFNBQWdCLHdCQUF3QixDQUFDLFNBQWlCO0lBQ3hELE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbkMsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELE1BQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxLQUFLLENBQUM7SUFFNUIsb0JBQW9CO0lBQ3BCLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxvQkFBUSxDQUFDLENBQUMsUUFBUSxDQUFDLFdBQXVCLENBQUMsRUFBRSxDQUFDO1FBQzlELE9BQU8sV0FBdUIsQ0FBQztJQUNqQyxDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILFNBQWdCLHNCQUFzQixDQUFDLFNBQWlCO0lBQ3RELE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbkMsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELE1BQU0sQ0FBQyxFQUFFLFNBQVMsQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUU1QixrQkFBa0I7SUFDbEIsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLGdCQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBbUIsQ0FBQyxFQUFFLENBQUM7UUFDeEQsT0FBTyxTQUFtQixDQUFDO0lBQzdCLENBQUM7SUFFRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBY3Rpb24gfSBmcm9tIFwiLi9hY3Rpb25zXCI7XG5pbXBvcnQgeyBSZXNvdXJjZSB9IGZyb20gXCIuL3Jlc291cmNlc1wiO1xuXG4vKipcbiAqIE9wZXJhdGlvbiBzdHJpbmcgdHlwZSBpbiBSRVNPVVJDRTpBQ1RJT04gZm9ybWF0XG4gKi9cbmV4cG9ydCB0eXBlIE9QRVJBVElPTiA9IGAke1Jlc291cmNlfToke0FjdGlvbn1gO1xuXG4vKipcbiAqIE9wZXJhdGlvbiBpbiBSRVNPVVJDRTpBQ1RJT04gZm9ybWF0XG4gKi9cbmV4cG9ydCBjbGFzcyBPcGVyYXRpb24ge1xuICAvKipcbiAgICogQ3JlYXRlIG9wZXJhdGlvbiBmcm9tIHN0cmluZ1xuICAgKiBAcGFyYW0gb3BlcmF0aW9uU3RyaW5nIC0gU3RyaW5nIGluIFJFU09VUkNFOkFDVElPTiBmb3JtYXRcbiAgICogQHJldHVybnMgT3BlcmF0aW9uIGluc3RhbmNlIG9yIG51bGwgaWYgaW52YWxpZFxuICAgKi9cbiAgc3RhdGljIGZyb21TdHJpbmcob3BlcmF0aW9uU3RyaW5nOiBzdHJpbmcpOiBPcGVyYXRpb24gfCBudWxsIHtcbiAgICBjb25zdCBwYXJ0cyA9IG9wZXJhdGlvblN0cmluZy5zcGxpdChcIjpcIik7XG4gICAgaWYgKHBhcnRzLmxlbmd0aCAhPT0gMikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgW3Jlc291cmNlU3RyLCBhY3Rpb25TdHJdID0gcGFydHM7XG5cbiAgICAvLyBWYWxpZGF0ZSByZXNvdXJjZVxuICAgIGlmICghT2JqZWN0LnZhbHVlcyhSZXNvdXJjZSkuaW5jbHVkZXMocmVzb3VyY2VTdHIgYXMgUmVzb3VyY2UpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBhY3Rpb25cbiAgICBpZiAoIU9iamVjdC52YWx1ZXMoQWN0aW9uKS5pbmNsdWRlcyhhY3Rpb25TdHIgYXMgQWN0aW9uKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBPcGVyYXRpb24ocmVzb3VyY2VTdHIgYXMgUmVzb3VyY2UsIGFjdGlvblN0ciBhcyBBY3Rpb24pO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHJlYWRvbmx5IHJlc291cmNlOiBSZXNvdXJjZSxcbiAgICBwdWJsaWMgcmVhZG9ubHkgYWN0aW9uOiBBY3Rpb24sXG4gICkge31cblxuICAvKipcbiAgICogR2V0IG9wZXJhdGlvbiBzdHJpbmcgaW4gUkVTT1VSQ0U6QUNUSU9OIGZvcm1hdFxuICAgKi9cbiAgdG9TdHJpbmcoKTogT1BFUkFUSU9OIHtcbiAgICByZXR1cm4gYCR7dGhpcy5yZXNvdXJjZX06JHt0aGlzLmFjdGlvbn1gIGFzIE9QRVJBVElPTjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0d28gb3BlcmF0aW9ucyBhcmUgZXF1YWxcbiAgICovXG4gIGVxdWFscyhvdGhlcjogT3BlcmF0aW9uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmVzb3VyY2UgPT09IG90aGVyLnJlc291cmNlICYmIHRoaXMuYWN0aW9uID09PSBvdGhlci5hY3Rpb247XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCB0byBKU09OIHJlcHJlc2VudGF0aW9uXG4gICAqL1xuICB0b0pTT04oKTogeyByZXNvdXJjZTogUmVzb3VyY2U7IGFjdGlvbjogQWN0aW9uOyBvcGVyYXRpb246IE9QRVJBVElPTiB9IHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVzb3VyY2U6IHRoaXMucmVzb3VyY2UsXG4gICAgICBhY3Rpb246IHRoaXMuYWN0aW9uLFxuICAgICAgb3BlcmF0aW9uOiB0aGlzLnRvU3RyaW5nKCksXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIEV4dHJhY3QgUmVzb3VyY2UgZnJvbSBhbiBPUEVSQVRJT04gc3RyaW5nXG4gKiBAcGFyYW0gb3BlcmF0aW9uIC0gT3BlcmF0aW9uIHN0cmluZyBpbiBSRVNPVVJDRTpBQ1RJT04gZm9ybWF0XG4gKiBAcmV0dXJucyBSZXNvdXJjZSBvciBudWxsIGlmIGludmFsaWRcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGdldFJlc291cmNlRnJvbU9wZXJhdGlvbihcIlBBVElFTlQ6UkVBRFwiKSAvLyBSZXR1cm5zOiBSZXNvdXJjZS5QQVRJRU5UXG4gKiBnZXRSZXNvdXJjZUZyb21PcGVyYXRpb24oXCJJTlZBTElEOkFDVElPTlwiKSAvLyBSZXR1cm5zOiBudWxsXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJlc291cmNlRnJvbU9wZXJhdGlvbihvcGVyYXRpb246IHN0cmluZyk6IFJlc291cmNlIHwgbnVsbCB7XG4gIGNvbnN0IHBhcnRzID0gb3BlcmF0aW9uLnNwbGl0KFwiOlwiKTtcbiAgaWYgKHBhcnRzLmxlbmd0aCAhPT0gMikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgW3Jlc291cmNlU3RyXSA9IHBhcnRzO1xuXG4gIC8vIFZhbGlkYXRlIHJlc291cmNlXG4gIGlmIChPYmplY3QudmFsdWVzKFJlc291cmNlKS5pbmNsdWRlcyhyZXNvdXJjZVN0ciBhcyBSZXNvdXJjZSkpIHtcbiAgICByZXR1cm4gcmVzb3VyY2VTdHIgYXMgUmVzb3VyY2U7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBFeHRyYWN0IEFjdGlvbiBmcm9tIGFuIE9QRVJBVElPTiBzdHJpbmdcbiAqIEBwYXJhbSBvcGVyYXRpb24gLSBPcGVyYXRpb24gc3RyaW5nIGluIFJFU09VUkNFOkFDVElPTiBmb3JtYXRcbiAqIEByZXR1cm5zIEFjdGlvbiBvciBudWxsIGlmIGludmFsaWRcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGdldEFjdGlvbkZyb21PcGVyYXRpb24oXCJQQVRJRU5UOlJFQURcIikgLy8gUmV0dXJuczogQWN0aW9uLlJFQURcbiAqIGdldEFjdGlvbkZyb21PcGVyYXRpb24oXCJQQVRJRU5UOklOVkFMSURcIikgLy8gUmV0dXJuczogbnVsbFxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRBY3Rpb25Gcm9tT3BlcmF0aW9uKG9wZXJhdGlvbjogc3RyaW5nKTogQWN0aW9uIHwgbnVsbCB7XG4gIGNvbnN0IHBhcnRzID0gb3BlcmF0aW9uLnNwbGl0KFwiOlwiKTtcbiAgaWYgKHBhcnRzLmxlbmd0aCAhPT0gMikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgWywgYWN0aW9uU3RyXSA9IHBhcnRzO1xuXG4gIC8vIFZhbGlkYXRlIGFjdGlvblxuICBpZiAoT2JqZWN0LnZhbHVlcyhBY3Rpb24pLmluY2x1ZGVzKGFjdGlvblN0ciBhcyBBY3Rpb24pKSB7XG4gICAgcmV0dXJuIGFjdGlvblN0ciBhcyBBY3Rpb247XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { Action } from "./actions";
|
|
2
|
+
import { Operation } from "./operation";
|
|
3
|
+
import { Resource } from "./resources";
|
|
4
|
+
/**
|
|
5
|
+
* Predefined common operations for convenience
|
|
6
|
+
*/
|
|
7
|
+
export declare const Operations: {
|
|
8
|
+
readonly ACCOUNT_CREATE: Operation;
|
|
9
|
+
readonly ACCOUNT_READ: Operation;
|
|
10
|
+
readonly ACCOUNT_UPDATE: Operation;
|
|
11
|
+
readonly ACCOUNT_DELETE: Operation;
|
|
12
|
+
readonly ACCOUNT_MANAGE: Operation;
|
|
13
|
+
readonly PATIENT_CREATE: Operation;
|
|
14
|
+
readonly PATIENT_READ: Operation;
|
|
15
|
+
readonly PATIENT_UPDATE: Operation;
|
|
16
|
+
readonly PATIENT_DELETE: Operation;
|
|
17
|
+
readonly PATIENT_LIST: Operation;
|
|
18
|
+
readonly PATIENT_VIEW: Operation;
|
|
19
|
+
readonly PATIENT_UPDATE_STATUS: Operation;
|
|
20
|
+
readonly PATIENT_PAYMENT_PUT: Operation;
|
|
21
|
+
readonly PATIENT_PAYMENT_DELETE: Operation;
|
|
22
|
+
readonly MEDICAL_SERVICE_CREATE: Operation;
|
|
23
|
+
readonly MEDICAL_SERVICE_READ: Operation;
|
|
24
|
+
readonly MEDICAL_SERVICE_UPDATE: Operation;
|
|
25
|
+
readonly MEDICAL_SERVICE_DELETE: Operation;
|
|
26
|
+
readonly MEDICAL_SERVICE_MANAGE: Operation;
|
|
27
|
+
readonly MEDICAL_SERVICE_SET_STATUS: Operation;
|
|
28
|
+
readonly MEDICAL_SERVICE_SET_FEES: Operation;
|
|
29
|
+
readonly MEDICAL_RECORD_CREATE: Operation;
|
|
30
|
+
readonly MEDICAL_RECORD_READ: Operation;
|
|
31
|
+
readonly MEDICAL_RECORD_UPDATE: Operation;
|
|
32
|
+
readonly MEDICAL_RECORD_DELETE: Operation;
|
|
33
|
+
readonly MEDICAL_RECORD_SHARE: Operation;
|
|
34
|
+
readonly MEDICAL_RECORD_EXPORT: Operation;
|
|
35
|
+
readonly PRESCRIPTION_CREATE: Operation;
|
|
36
|
+
readonly PRESCRIPTION_READ: Operation;
|
|
37
|
+
readonly PRESCRIPTION_UPDATE: Operation;
|
|
38
|
+
readonly PRESCRIPTION_SIGN: Operation;
|
|
39
|
+
readonly PRESCRIPTION_PRESCRIBE: Operation;
|
|
40
|
+
readonly DIAGNOSIS_CREATE: Operation;
|
|
41
|
+
readonly DIAGNOSIS_READ: Operation;
|
|
42
|
+
readonly DIAGNOSIS_UPDATE: Operation;
|
|
43
|
+
readonly DIAGNOSIS_DIAGNOSE: Operation;
|
|
44
|
+
readonly DIAGNOSIS_VERIFY: Operation;
|
|
45
|
+
readonly MEDICAL_HISTORY_CREATE: Operation;
|
|
46
|
+
readonly MEDICAL_HISTORY_READ: Operation;
|
|
47
|
+
readonly MEDICAL_HISTORY_UPDATE: Operation;
|
|
48
|
+
readonly UPLOADED_DOCUMENT_CREATE: Operation;
|
|
49
|
+
readonly UPLOADED_DOCUMENT_READ: Operation;
|
|
50
|
+
readonly UPLOADED_DOCUMENT_DELETE: Operation;
|
|
51
|
+
readonly GENERATED_DOCUMENT_CREATE: Operation;
|
|
52
|
+
readonly GENERATED_DOCUMENT_READ: Operation;
|
|
53
|
+
readonly MEDICAL_SERVICE_SCHEDULE: Operation;
|
|
54
|
+
readonly MEDICAL_SERVICE_CANCEL: Operation;
|
|
55
|
+
readonly MEDICAL_SERVICE_LIST: Operation;
|
|
56
|
+
readonly USER_CREATE: Operation;
|
|
57
|
+
readonly USER_READ: Operation;
|
|
58
|
+
readonly USER_UPDATE: Operation;
|
|
59
|
+
readonly USER_DELETE: Operation;
|
|
60
|
+
readonly USER_LIST: Operation;
|
|
61
|
+
readonly USER_LOGIN: Operation;
|
|
62
|
+
readonly USER_LOGOUT: Operation;
|
|
63
|
+
readonly MEMBERSHIP_CREATE: Operation;
|
|
64
|
+
readonly MEMBERSHIP_READ: Operation;
|
|
65
|
+
readonly MEMBERSHIP_UPDATE: Operation;
|
|
66
|
+
readonly MEMBERSHIP_DELETE: Operation;
|
|
67
|
+
readonly AUDIT_LOG_CREATE: Operation;
|
|
68
|
+
readonly AUDIT_LOG_READ: Operation;
|
|
69
|
+
readonly AUDIT_LOG_LIST: Operation;
|
|
70
|
+
readonly AUDIT_LOG_AUDIT: Operation;
|
|
71
|
+
readonly SYSTEM_CONFIGURE: Operation;
|
|
72
|
+
readonly SYSTEM_AUDIT: Operation;
|
|
73
|
+
};
|
|
74
|
+
/**
|
|
75
|
+
* Get all predefined operations as an array
|
|
76
|
+
*/
|
|
77
|
+
export declare function getAllOperations(): Operation[];
|
|
78
|
+
/**
|
|
79
|
+
* Get all operations for a specific resource
|
|
80
|
+
*/
|
|
81
|
+
export declare function getOperationsByResource(resource: Resource): Operation[];
|
|
82
|
+
/**
|
|
83
|
+
* Get all operations for a specific action
|
|
84
|
+
*/
|
|
85
|
+
export declare function getOperationsByAction(action: Action): Operation[];
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Operations = void 0;
|
|
4
|
+
exports.getAllOperations = getAllOperations;
|
|
5
|
+
exports.getOperationsByResource = getOperationsByResource;
|
|
6
|
+
exports.getOperationsByAction = getOperationsByAction;
|
|
7
|
+
const actions_1 = require("./actions");
|
|
8
|
+
const operation_1 = require("./operation");
|
|
9
|
+
const resources_1 = require("./resources");
|
|
10
|
+
/**
|
|
11
|
+
* Predefined common operations for convenience
|
|
12
|
+
*/
|
|
13
|
+
exports.Operations = {
|
|
14
|
+
// Account operations
|
|
15
|
+
ACCOUNT_CREATE: new operation_1.Operation(resources_1.Resource.ACCOUNT, actions_1.Action.CREATE),
|
|
16
|
+
ACCOUNT_READ: new operation_1.Operation(resources_1.Resource.ACCOUNT, actions_1.Action.READ),
|
|
17
|
+
ACCOUNT_UPDATE: new operation_1.Operation(resources_1.Resource.ACCOUNT, actions_1.Action.UPDATE),
|
|
18
|
+
ACCOUNT_DELETE: new operation_1.Operation(resources_1.Resource.ACCOUNT, actions_1.Action.DELETE),
|
|
19
|
+
ACCOUNT_MANAGE: new operation_1.Operation(resources_1.Resource.ACCOUNT, actions_1.Action.MANAGE),
|
|
20
|
+
// Patient operations
|
|
21
|
+
PATIENT_CREATE: new operation_1.Operation(resources_1.Resource.PATIENT, actions_1.Action.CREATE),
|
|
22
|
+
PATIENT_READ: new operation_1.Operation(resources_1.Resource.PATIENT, actions_1.Action.READ),
|
|
23
|
+
PATIENT_UPDATE: new operation_1.Operation(resources_1.Resource.PATIENT, actions_1.Action.UPDATE),
|
|
24
|
+
PATIENT_DELETE: new operation_1.Operation(resources_1.Resource.PATIENT, actions_1.Action.DELETE),
|
|
25
|
+
PATIENT_LIST: new operation_1.Operation(resources_1.Resource.PATIENT, actions_1.Action.LIST),
|
|
26
|
+
PATIENT_VIEW: new operation_1.Operation(resources_1.Resource.PATIENT, actions_1.Action.VIEW_PATIENTS),
|
|
27
|
+
PATIENT_UPDATE_STATUS: new operation_1.Operation(resources_1.Resource.PATIENT, actions_1.Action.UPDATE_STATUS),
|
|
28
|
+
// Patient payment operations
|
|
29
|
+
PATIENT_PAYMENT_PUT: new operation_1.Operation(resources_1.Resource.PATIENT_PAYMENT, actions_1.Action.PUT_PATIENT_PAYMENT),
|
|
30
|
+
PATIENT_PAYMENT_DELETE: new operation_1.Operation(resources_1.Resource.PATIENT_PAYMENT, actions_1.Action.DELETE_PATIENT_PAYMENT),
|
|
31
|
+
// Medical service operations
|
|
32
|
+
MEDICAL_SERVICE_CREATE: new operation_1.Operation(resources_1.Resource.MEDICAL_SERVICE, actions_1.Action.CREATE),
|
|
33
|
+
MEDICAL_SERVICE_READ: new operation_1.Operation(resources_1.Resource.MEDICAL_SERVICE, actions_1.Action.READ),
|
|
34
|
+
MEDICAL_SERVICE_UPDATE: new operation_1.Operation(resources_1.Resource.MEDICAL_SERVICE, actions_1.Action.UPDATE),
|
|
35
|
+
MEDICAL_SERVICE_DELETE: new operation_1.Operation(resources_1.Resource.MEDICAL_SERVICE, actions_1.Action.DELETE),
|
|
36
|
+
MEDICAL_SERVICE_MANAGE: new operation_1.Operation(resources_1.Resource.MEDICAL_SERVICE, actions_1.Action.MANAGE),
|
|
37
|
+
MEDICAL_SERVICE_SET_STATUS: new operation_1.Operation(resources_1.Resource.MEDICAL_SERVICE_STATUS, actions_1.Action.SET_MEDICAL_SERVICE_STATUS),
|
|
38
|
+
MEDICAL_SERVICE_SET_FEES: new operation_1.Operation(resources_1.Resource.MEDICAL_SERVICE_FEES, actions_1.Action.SET_MEDICAL_SERVICE_FEES),
|
|
39
|
+
// Medical record operations
|
|
40
|
+
MEDICAL_RECORD_CREATE: new operation_1.Operation(resources_1.Resource.MEDICAL_RECORD, actions_1.Action.CREATE),
|
|
41
|
+
MEDICAL_RECORD_READ: new operation_1.Operation(resources_1.Resource.MEDICAL_RECORD, actions_1.Action.READ),
|
|
42
|
+
MEDICAL_RECORD_UPDATE: new operation_1.Operation(resources_1.Resource.MEDICAL_RECORD, actions_1.Action.UPDATE),
|
|
43
|
+
MEDICAL_RECORD_DELETE: new operation_1.Operation(resources_1.Resource.MEDICAL_RECORD, actions_1.Action.DELETE),
|
|
44
|
+
MEDICAL_RECORD_SHARE: new operation_1.Operation(resources_1.Resource.MEDICAL_RECORD, actions_1.Action.SHARE),
|
|
45
|
+
MEDICAL_RECORD_EXPORT: new operation_1.Operation(resources_1.Resource.MEDICAL_RECORD, actions_1.Action.EXPORT),
|
|
46
|
+
// Prescription operations
|
|
47
|
+
PRESCRIPTION_CREATE: new operation_1.Operation(resources_1.Resource.PRESCRIPTION, actions_1.Action.CREATE),
|
|
48
|
+
PRESCRIPTION_READ: new operation_1.Operation(resources_1.Resource.PRESCRIPTION, actions_1.Action.READ),
|
|
49
|
+
PRESCRIPTION_UPDATE: new operation_1.Operation(resources_1.Resource.PRESCRIPTION, actions_1.Action.UPDATE),
|
|
50
|
+
PRESCRIPTION_SIGN: new operation_1.Operation(resources_1.Resource.PRESCRIPTION, actions_1.Action.SIGN),
|
|
51
|
+
PRESCRIPTION_PRESCRIBE: new operation_1.Operation(resources_1.Resource.PRESCRIPTION, actions_1.Action.PRESCRIBE),
|
|
52
|
+
// Diagnosis operations
|
|
53
|
+
DIAGNOSIS_CREATE: new operation_1.Operation(resources_1.Resource.DIAGNOSIS, actions_1.Action.CREATE),
|
|
54
|
+
DIAGNOSIS_READ: new operation_1.Operation(resources_1.Resource.DIAGNOSIS, actions_1.Action.READ),
|
|
55
|
+
DIAGNOSIS_UPDATE: new operation_1.Operation(resources_1.Resource.DIAGNOSIS, actions_1.Action.UPDATE),
|
|
56
|
+
DIAGNOSIS_DIAGNOSE: new operation_1.Operation(resources_1.Resource.DIAGNOSIS, actions_1.Action.DIAGNOSE),
|
|
57
|
+
DIAGNOSIS_VERIFY: new operation_1.Operation(resources_1.Resource.DIAGNOSIS, actions_1.Action.VERIFY),
|
|
58
|
+
// Medical history operations
|
|
59
|
+
MEDICAL_HISTORY_CREATE: new operation_1.Operation(resources_1.Resource.MEDICAL_HISTORY, actions_1.Action.CREATE),
|
|
60
|
+
MEDICAL_HISTORY_READ: new operation_1.Operation(resources_1.Resource.MEDICAL_HISTORY, actions_1.Action.READ),
|
|
61
|
+
MEDICAL_HISTORY_UPDATE: new operation_1.Operation(resources_1.Resource.MEDICAL_HISTORY, actions_1.Action.UPDATE),
|
|
62
|
+
// Document operations
|
|
63
|
+
UPLOADED_DOCUMENT_CREATE: new operation_1.Operation(resources_1.Resource.UPLOADED_DOCUMENT, actions_1.Action.CREATE),
|
|
64
|
+
UPLOADED_DOCUMENT_READ: new operation_1.Operation(resources_1.Resource.UPLOADED_DOCUMENT, actions_1.Action.READ),
|
|
65
|
+
UPLOADED_DOCUMENT_DELETE: new operation_1.Operation(resources_1.Resource.UPLOADED_DOCUMENT, actions_1.Action.DELETE),
|
|
66
|
+
GENERATED_DOCUMENT_CREATE: new operation_1.Operation(resources_1.Resource.GENERATED_DOCUMENT, actions_1.Action.CREATE),
|
|
67
|
+
GENERATED_DOCUMENT_READ: new operation_1.Operation(resources_1.Resource.GENERATED_DOCUMENT, actions_1.Action.READ),
|
|
68
|
+
// Medical service scheduling operations (appointments)
|
|
69
|
+
MEDICAL_SERVICE_SCHEDULE: new operation_1.Operation(resources_1.Resource.MEDICAL_SERVICE, actions_1.Action.SCHEDULE),
|
|
70
|
+
MEDICAL_SERVICE_CANCEL: new operation_1.Operation(resources_1.Resource.MEDICAL_SERVICE, actions_1.Action.CANCEL),
|
|
71
|
+
MEDICAL_SERVICE_LIST: new operation_1.Operation(resources_1.Resource.MEDICAL_SERVICE, actions_1.Action.LIST),
|
|
72
|
+
// User operations
|
|
73
|
+
USER_CREATE: new operation_1.Operation(resources_1.Resource.USER, actions_1.Action.CREATE),
|
|
74
|
+
USER_READ: new operation_1.Operation(resources_1.Resource.USER, actions_1.Action.READ),
|
|
75
|
+
USER_UPDATE: new operation_1.Operation(resources_1.Resource.USER, actions_1.Action.UPDATE),
|
|
76
|
+
USER_DELETE: new operation_1.Operation(resources_1.Resource.USER, actions_1.Action.DELETE),
|
|
77
|
+
USER_LIST: new operation_1.Operation(resources_1.Resource.USER, actions_1.Action.LIST),
|
|
78
|
+
USER_LOGIN: new operation_1.Operation(resources_1.Resource.USER, actions_1.Action.LOGIN),
|
|
79
|
+
USER_LOGOUT: new operation_1.Operation(resources_1.Resource.USER, actions_1.Action.LOGOUT),
|
|
80
|
+
// Membership operations
|
|
81
|
+
MEMBERSHIP_CREATE: new operation_1.Operation(resources_1.Resource.MEMBERSHIP, actions_1.Action.CREATE),
|
|
82
|
+
MEMBERSHIP_READ: new operation_1.Operation(resources_1.Resource.MEMBERSHIP, actions_1.Action.READ),
|
|
83
|
+
MEMBERSHIP_UPDATE: new operation_1.Operation(resources_1.Resource.MEMBERSHIP, actions_1.Action.UPDATE),
|
|
84
|
+
MEMBERSHIP_DELETE: new operation_1.Operation(resources_1.Resource.MEMBERSHIP, actions_1.Action.DELETE),
|
|
85
|
+
// Audit log operations
|
|
86
|
+
AUDIT_LOG_CREATE: new operation_1.Operation(resources_1.Resource.AUDIT_LOG, actions_1.Action.CREATE),
|
|
87
|
+
AUDIT_LOG_READ: new operation_1.Operation(resources_1.Resource.AUDIT_LOG, actions_1.Action.READ),
|
|
88
|
+
AUDIT_LOG_LIST: new operation_1.Operation(resources_1.Resource.AUDIT_LOG, actions_1.Action.LIST),
|
|
89
|
+
AUDIT_LOG_AUDIT: new operation_1.Operation(resources_1.Resource.AUDIT_LOG, actions_1.Action.AUDIT),
|
|
90
|
+
// System operations
|
|
91
|
+
SYSTEM_CONFIGURE: new operation_1.Operation(resources_1.Resource.SYSTEM, actions_1.Action.CONFIGURE),
|
|
92
|
+
SYSTEM_AUDIT: new operation_1.Operation(resources_1.Resource.SYSTEM, actions_1.Action.AUDIT),
|
|
93
|
+
};
|
|
94
|
+
/**
|
|
95
|
+
* Get all predefined operations as an array
|
|
96
|
+
*/
|
|
97
|
+
function getAllOperations() {
|
|
98
|
+
return Object.values(exports.Operations);
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Get all operations for a specific resource
|
|
102
|
+
*/
|
|
103
|
+
function getOperationsByResource(resource) {
|
|
104
|
+
return getAllOperations().filter((op) => op.resource === resource);
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Get all operations for a specific action
|
|
108
|
+
*/
|
|
109
|
+
function getOperationsByAction(action) {
|
|
110
|
+
return getAllOperations().filter((op) => op.action === action);
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlZGVmaW5lZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vcGVyYXRpb25zL3ByZWRlZmluZWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBK0pBLDRDQUVDO0FBS0QsMERBRUM7QUFLRCxzREFFQztBQS9LRCx1Q0FBbUM7QUFDbkMsMkNBQXdDO0FBQ3hDLDJDQUF1QztBQUV2Qzs7R0FFRztBQUNVLFFBQUEsVUFBVSxHQUFHO0lBQ3hCLHFCQUFxQjtJQUNyQixjQUFjLEVBQUUsSUFBSSxxQkFBUyxDQUFDLG9CQUFRLENBQUMsT0FBTyxFQUFFLGdCQUFNLENBQUMsTUFBTSxDQUFDO0lBQzlELFlBQVksRUFBRSxJQUFJLHFCQUFTLENBQUMsb0JBQVEsQ0FBQyxPQUFPLEVBQUUsZ0JBQU0sQ0FBQyxJQUFJLENBQUM7SUFDMUQsY0FBYyxFQUFFLElBQUkscUJBQVMsQ0FBQyxvQkFBUSxDQUFDLE9BQU8sRUFBRSxnQkFBTSxDQUFDLE1BQU0sQ0FBQztJQUM5RCxjQUFjLEVBQUUsSUFBSSxxQkFBUyxDQUFDLG9CQUFRLENBQUMsT0FBTyxFQUFFLGdCQUFNLENBQUMsTUFBTSxDQUFDO0lBQzlELGNBQWMsRUFBRSxJQUFJLHFCQUFTLENBQUMsb0JBQVEsQ0FBQyxPQUFPLEVBQUUsZ0JBQU0sQ0FBQyxNQUFNLENBQUM7SUFFOUQscUJBQXFCO0lBQ3JCLGNBQWMsRUFBRSxJQUFJLHFCQUFTLENBQUMsb0JBQVEsQ0FBQyxPQUFPLEVBQUUsZ0JBQU0sQ0FBQyxNQUFNLENBQUM7SUFDOUQsWUFBWSxFQUFFLElBQUkscUJBQVMsQ0FBQyxvQkFBUSxDQUFDLE9BQU8sRUFBRSxnQkFBTSxDQUFDLElBQUksQ0FBQztJQUMxRCxjQUFjLEVBQUUsSUFBSSxxQkFBUyxDQUFDLG9CQUFRLENBQUMsT0FBTyxFQUFFLGdCQUFNLENBQUMsTUFBTSxDQUFDO0lBQzlELGNBQWMsRUFBRSxJQUFJLHFCQUFTLENBQUMsb0JBQVEsQ0FBQyxPQUFPLEVB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QU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxrQkFBVSxDQUFDLENBQUM7QUFDbkMsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBZ0IsdUJBQXVCLENBQUMsUUFBa0I7SUFDeEQsT0FBTyxnQkFBZ0IsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLFFBQVEsS0FBSyxRQUFRLENBQUMsQ0FBQztBQUNyRSxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQixxQkFBcUIsQ0FBQyxNQUFjO0lBQ2xELE9BQU8sZ0JBQWdCLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEtBQUssTUFBTSxDQUFDLENBQUM7QUFDakUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFjdGlvbiB9IGZyb20gXCIuL2FjdGlvbnNcIjtcbmltcG9ydCB7IE9wZXJhdGlvbiB9IGZyb20gXCIuL29wZXJhdGlvblwiO1xuaW1wb3J0IHsgUmVzb3VyY2UgfSBmcm9tIFwiLi9yZXNvdXJjZXNcIjtcblxuLyoqXG4gKiBQcmVkZWZpbmVkIGNvbW1vbiBvcGVyYXRpb25zIGZvciBjb252ZW5pZW5jZVxuICovXG5leHBvcnQgY29uc3QgT3BlcmF0aW9ucyA9IHtcbiAgLy8gQWNjb3VudCBvcGVyYXRpb25zXG4gIEFDQ09VTlRfQ1JFQVRFOiBuZXcgT3BlcmF0aW9uKFJlc291cmNlLkFDQ09VTlQsIEFjdGlvbi5DUkVBVEUpLFxuICBBQ0NPVU5UX1JFQUQ6IG5ldyBPcGVyYXRpb24oUmVzb3VyY2UuQUNDT1VOVCwgQWN0aW9uLlJFQUQpLFxuICBBQ0NPVU5UX1VQREFURTogbmV3IE9wZXJhdGlvbihSZXNvdXJjZS5BQ0NPVU5ULCBBY3Rpb24uVVBEQVRFKSxcbiAgQUNDT1VOVF9ERUxFVEU6IG5ldyBPcGVyYXRpb24oUmVzb3VyY2UuQUNDT1VOVCwgQWN0aW9uLkRFTEVURSksXG4gIEFDQ09VTlRfTUFOQUdFOiBuZXcgT3BlcmF0aW9uKFJlc291cmNlLkFDQ09VTlQsIEFjdGlvbi5NQU5BR0UpLFxuXG4gIC8vIFBhdGllbnQgb3BlcmF0aW9uc1xuICBQQVRJRU5UX0NSRUFURTogbmV3IE9wZXJhdGlvbihSZXNvdXJjZS5QQVRJRU5ULCBBY3Rpb24uQ1JFQVRFKSxcbiAgUEFUSUVOVF9SRUFEOiBuZXcgT3BlcmF0aW9uKFJlc291cmNlLlBBVElFTlQsIEFjdGlvbi5SRUFEKSxcbiAgUEFUSUVOVF9VUERBVEU6IG5ldyBPcGVyYXRpb24oUmVzb3VyY2UuUEFUSUVOVCwgQWN0aW9uLlVQREFURSksXG4gIFBBVElFTlRfREVMRVRFOiBuZXcgT3BlcmF0aW9uKFJlc291cmNlLlBBVElFTlQsIEFjdGlvbi5ERUxFVEUpLFxuICBQQVRJRU5UX0xJU1Q6IG5ldyBPcGVyYXRpb24oUmVzb3VyY2UuUEFUSUVOVCwgQWN0aW9uLkxJU1QpLFxuICBQQVRJRU5UX1ZJRVc6IG5ldyBPcGVyYXRpb24oUmVzb3VyY2UuUEFUSUVOVCwgQWN0aW9uLlZJRVdfUEFUSUVOVFMpLFxuICBQQVRJRU5UX1VQREFURV9TVEFUVVM6IG5ldyBPcGVyYXRpb24oUmVzb3VyY2UuUEFUSUVOVCwgQWN0aW9uLlVQREFURV9TVEFUVVMpLFxuXG4gIC8vIFBhdGllbnQgcGF5bWVudCBvcGVyYXRpb25zXG4gIFBBVElFTlRfUEFZTUVOVF9QVVQ6IG5ldyBPcGVyYXRpb24oXG4gICAgUmVzb3VyY2UuUEFUSUVOVF9QQVlNRU5ULFxuICAgIEFjdGlvbi5QVVRfUEFUSUVOVF9QQVlNRU5ULFxuICApLFxuICBQQVRJRU5UX1BBWU1FTlRfREVMRVRFOiBuZXcgT3BlcmF0aW9uKFxuICAgIFJlc291cmNlLlBBVElFTlRfUEFZTUVOVCxcbiAgICBBY3Rpb24uREVMRVRFX1BBVElFTlRfUEFZTUVOVCxcbiAgKSxcblxuICAvLyBNZWRpY2FsIHNlcnZpY2Ugb3BlcmF0aW9uc1xuICBNRURJQ0FMX1NFUlZJQ0VfQ1JFQVRFOiBuZXcgT3BlcmF0aW9uKFxuICAgIFJlc291cmNlLk1FRElDQUxfU0VSVklDRSxcbiAgICBBY3Rpb24uQ1JFQVRFLFxuICApLFxuICBNRURJQ0FMX1NFUlZJQ0VfUkVBRDogbmV3IE9wZXJhdGlvbihSZXNvdXJjZS5NRURJQ0FMX1NFUlZJQ0UsIEFjdGlvbi5SRUFEKSxcbiAgTUVESUNBTF9TRVJWSUNFX1VQREFURTogbmV3IE9wZXJhdGlvbihcbiAgICBSZXNvdXJjZS5NRURJQ0FMX1NFUlZJQ0UsXG4gICAgQWN0aW9uLlVQREFURSxcbiAgKSxcbiAgTUVESUNBTF9TRVJWSUNFX0RFTEVURTogbmV3IE9wZXJhdGlvbihcbiAgICBSZXNvdXJjZS5NRURJQ0FMX1NFUlZJQ0UsXG4gICAgQWN0aW9uLkRFTEVURSxcbiAgKSxcbiAgTUVESUNBTF9TRVJWSUNFX01BTkFHRTogbmV3IE9wZXJhdGlvbihcbiAgICBSZXNvdXJjZS5NRURJQ0FMX1NFUlZJQ0UsXG4gICAgQWN0aW9uLk1BTkFHRSxcbiAgKSxcbiAgTUVESUNBTF9TRVJWSUNFX1NFVF9TVEFUVVM6IG5ldyBPcGVyYXRpb24oXG4gICAgUmVzb3VyY2UuTUVESUNBTF9TRVJWSUNFX1NUQVRVUyxcbiAgICBBY3Rpb24uU0VUX01FRElDQUxfU0VSVklDRV9TVEFUVVMsXG4gICksXG4gIE1FRElDQUxfU0VSVklDRV9TRVRfRkVFUzogbmV3IE9wZXJhdGlvbihcbiAgICBSZXNvdXJjZS5NRURJQ0FMX1NFUlZJQ0VfRkVFUyxcbiAgICBBY3Rpb24uU0VUX01FRElDQUxfU0VSVklDRV9GRUVTLFxuICApLFxuXG4gIC8vIE1lZGljYWwgcmVjb3JkIG9wZXJhdGlvbnNcbiAgTUVESUNBTF9SRUNPUkRfQ1JFQVRFOiBuZXcgT3BlcmF0aW9uKFJlc291cmNlLk1FRElDQUxfUkVDT1JELCBBY3Rpb24uQ1JFQVRFKSxcbiAgTUVESUNBTF9SRUNPUkRfUkVBRDogbmV3IE9wZXJhdGlvbihSZXNvdXJjZS5NRURJQ0FMX1JFQ09SRCwgQWN0aW9uLlJFQUQpLFxuICBNRURJQ0FMX1JFQ09SRF9VUERBVEU6IG5ldyBPcGVyYXRpb24oUmVzb3VyY2UuTUVESUNBTF9SRUNPUkQsIEFjdGlvbi5VUERBVEUpLFxuICBNRURJQ0FMX1JFQ09SRF9ERUxFVEU6IG5ldyBPcGVyYXRpb24oUmVzb3VyY2UuTUVESUNBTF9SRUNPUkQsIEFjdGlvbi5ERUxFVEUpLFxuICBNRURJQ0FMX1JFQ09SRF9TSEFSRTogbmV3IE9wZXJhdGlvbihSZXNvdXJjZS5NRURJQ0FMX1JFQ09SRCwgQWN0aW9uLlNIQVJFKSxcbiAgTUVESUNBTF9SRUNPUkRfRVhQT1JUOiBuZXcgT3BlcmF0aW9uKFJlc291cmNlLk1FRElDQUxfUkVDT1JELCBBY3Rpb24uRVhQT1JUKSxcblxuICAvLyBQcmVzY3JpcHRpb24gb3BlcmF0aW9uc1xuICBQUkVTQ1JJUFRJT05fQ1JFQVRFOiBuZXcgT3BlcmF0aW9uKFJlc291cmNlLlBSRVNDUklQVElPTiwgQWN0aW9uLkNSRUFURSksXG4gIFBSRVNDUklQVElPTl9SRUFEOiBuZXcgT3BlcmF0aW9uKFJlc291cmNlLlBSRVNDUklQVElPTiwgQWN0aW9uLlJFQUQpLFxuICBQUkVTQ1JJUFRJT05fVVBEQVRFOiBuZXcgT3BlcmF0aW9uKFJlc291cmNlLlBSRVNDUklQVElPTiwgQWN0aW9uLlVQREFURSksXG4gIFBSRVNDUklQVElPTl9TSUdOOiBuZXcgT3BlcmF0aW9uKFJlc291cmNlLlBSRVNDUklQVElPTiwgQWN0aW9uLlNJR04pLFxuICBQUkVTQ1JJUFRJT05fUFJFU0NSSUJFOiBuZXcgT3BlcmF0aW9uKFxuICAgIFJlc291cmNlLlBSRVNDUklQVElPTixcbiAgICBBY3Rpb24uUFJFU0NSSUJFLFxuICApLFxuXG4gIC8vIERpYWdub3NpcyBvcGVyYXRpb25zXG4gIERJQUdOT1NJU19DUkVBVEU6IG5ldyBPcGVyYXRpb24oUmVzb3VyY2UuRElBR05PU0lTLCBBY3Rpb24uQ1JFQVRFKSxcbiAgRElBR05PU0lTX1JFQUQ6IG5ldyBPcGVyYXRpb24oUmVzb3VyY2UuRElBR05PU0lTLCBBY3Rpb24uUkVBRCksXG4gIERJQUdOT1NJU19VUERBVEU6IG5ldyBPcGVyYXRpb24oUmVzb3VyY2UuRElBR05PU0lTLCBBY3Rpb24uVVBEQVRFKSxcbiAgRElBR05PU0lTX0RJQUdOT1NFOiBuZXcgT3BlcmF0aW9uKFJlc291cmNlLkRJQUdOT1NJUywgQWN0aW9uLkRJQUdOT1NFKSxcbiAgRElBR05PU0lTX1ZFUklGWTogbmV3IE9wZXJhdGlvbihSZXNvdXJjZS5ESUFHTk9TSVMsIEFjdGlvbi5WRVJJRlkpLFxuXG4gIC8vIE1lZGljYWwgaGlzdG9yeSBvcGVyYXRpb25zXG4gIE1FRElDQUxfSElTVE9SWV9DUkVBVEU6IG5ldyBPcGVyYXRpb24oXG4gICAgUmVzb3VyY2UuTUVESUNBTF9ISVNUT1JZLFxuICAgIEFjdGlvbi5DUkVBVEUsXG4gICksXG4gIE1FRElDQUxfSElTVE9SWV9SRUFEOiBuZXcgT3BlcmF0aW9uKFJlc291cmNlLk1FRElDQUxfSElTVE9SWSwgQWN0aW9uLlJFQUQpLFxuICBNRURJQ0FMX0hJU1RPUllfVVBEQVRFOiBuZXcgT3BlcmF0aW9uKFxuICAgIFJlc291cmNlLk1FRElDQUxfSElTVE9SWSxcbiAgICBBY3Rpb24uVVBEQVRFLFxuICApLFxuXG4gIC8vIERvY3VtZW50IG9wZXJhdGlvbnNcbiAgVVBMT0FERURfRE9DVU1FTlRfQ1JFQVRFOiBuZXcgT3BlcmF0aW9uKFxuICAgIFJlc291cmNlLlVQTE9BREVEX0RPQ1VNRU5ULFxuICAgIEFjdGlvbi5DUkVBVEUsXG4gICksXG4gIFVQTE9BREVEX0RPQ1VNRU5UX1JFQUQ6IG5ldyBPcGVyYXRpb24oXG4gICAgUmVzb3VyY2UuVVBMT0FERURfRE9DVU1FTlQsXG4gICAgQWN0aW9uLlJFQUQsXG4gICksXG4gIFVQTE9BREVEX0RPQ1VNRU5UX0RFTEVURTogbmV3IE9wZXJhdGlvbihcbiAgICBSZXNvdXJjZS5VUExPQURFRF9ET0NVTUVOVCxcbiAgICBBY3Rpb24uREVMRVRFLFxuICApLFxuICBHRU5FUkFURURfRE9DVU1FTlRfQ1JFQVRFOiBuZXcgT3BlcmF0aW9uKFxuICAgIFJlc291cmNlLkdFTkVSQVRFRF9ET0NVTUVOVCxcbiAgICBBY3Rpb24uQ1JFQVRFLFxuICApLFxuICBHRU5FUkFURURfRE9DVU1FTlRfUkVBRDogbmV3IE9wZXJhdGlvbihcbiAgICBSZXNvdXJjZS5HRU5FUkFURURfRE9DVU1FTlQsXG4gICAgQWN0aW9uLlJFQUQsXG4gICksXG5cbiAgLy8gTWVkaWNhbCBzZXJ2aWNlIHNjaGVkdWxpbmcgb3BlcmF0aW9ucyAoYXBwb2ludG1lbnRzKVxuICBNRURJQ0FMX1NFUlZJQ0VfU0NIRURVTEU6IG5ldyBPcGVyYXRpb24oXG4gICAgUmVzb3VyY2UuTUVESUNBTF9TRVJWSUNFLFxuICAgIEFjdGlvbi5TQ0hFRFVMRSxcbiAgKSxcbiAgTUVESUNBTF9TRVJWSUNFX0NBTkNFTDogbmV3IE9wZXJhdGlvbihcbiAgICBSZXNvdXJjZS5NRURJQ0FMX1NFUlZJQ0UsXG4gICAgQWN0aW9uLkNBTkNFTCxcbiAgKSxcbiAgTUVESUNBTF9TRVJWSUNFX0xJU1Q6IG5ldyBPcGVyYXRpb24oUmVzb3VyY2UuTUVESUNBTF9TRVJWSUNFLCBBY3Rpb24uTElTVCksXG5cbiAgLy8gVXNlciBvcGVyYXRpb25zXG4gIFVTRVJfQ1JFQVRFOiBuZXcgT3BlcmF0aW9uKFJlc291cmNlLlVTRVIsIEFjdGlvbi5DUkVBVEUpLFxuICBVU0VSX1JFQUQ6IG5ldyBPcGVyYXRpb24oUmVzb3VyY2UuVVNFUiwgQWN0aW9uLlJFQUQpLFxuICBVU0VSX1VQREFURTogbmV3IE9wZXJhdGlvbihSZXNvdXJjZS5VU0VSLCBBY3Rpb24uVVBEQVRFKSxcbiAgVVNFUl9ERUxFVEU6IG5ldyBPcGVyYXRpb24oUmVzb3VyY2UuVVNFUiwgQWN0aW9uLkRFTEVURSksXG4gIFVTRVJfTElTVDogbmV3IE9wZXJhdGlvbihSZXNvdXJjZS5VU0VSLCBBY3Rpb24uTElTVCksXG4gIFVTRVJfTE9HSU46IG5ldyBPcGVyYXRpb24oUmVzb3VyY2UuVVNFUiwgQWN0aW9uLkxPR0lOKSxcbiAgVVNFUl9MT0dPVVQ6IG5ldyBPcGVyYXRpb24oUmVzb3VyY2UuVVNFUiwgQWN0aW9uLkxPR09VVCksXG5cbiAgLy8gTWVtYmVyc2hpcCBvcGVyYXRpb25zXG4gIE1FTUJFUlNISVBfQ1JFQVRFOiBuZXcgT3BlcmF0aW9uKFJlc291cmNlLk1FTUJFUlNISVAsIEFjdGlvbi5DUkVBVEUpLFxuICBNRU1CRVJTSElQX1JFQUQ6IG5ldyBPcGVyYXRpb24oUmVzb3VyY2UuTUVNQkVSU0hJUCwgQWN0aW9uLlJFQUQpLFxuICBNRU1CRVJTSElQX1VQREFURTogbmV3IE9wZXJhdGlvbihSZXNvdXJjZS5NRU1CRVJTSElQLCBBY3Rpb24uVVBEQVRFKSxcbiAgTUVNQkVSU0hJUF9ERUxFVEU6IG5ldyBPcGVyYXRpb24oUmVzb3VyY2UuTUVNQkVSU0hJUCwgQWN0aW9uLkRFTEVURSksXG5cbiAgLy8gQXVkaXQgbG9nIG9wZXJhdGlvbnNcbiAgQVVESVRfTE9HX0NSRUFURTogbmV3IE9wZXJhdGlvbihSZXNvdXJjZS5BVURJVF9MT0csIEFjdGlvbi5DUkVBVEUpLFxuICBBVURJVF9MT0dfUkVBRDogbmV3IE9wZXJhdGlvbihSZXNvdXJjZS5BVURJVF9MT0csIEFjdGlvbi5SRUFEKSxcbiAgQVVESVRfTE9HX0xJU1Q6IG5ldyBPcGVyYXRpb24oUmVzb3VyY2UuQVVESVRfTE9HLCBBY3Rpb24uTElTVCksXG4gIEFVRElUX0xPR19BVURJVDogbmV3IE9wZXJhdGlvbihSZXNvdXJjZS5BVURJVF9MT0csIEFjdGlvbi5BVURJVCksXG5cbiAgLy8gU3lzdGVtIG9wZXJhdGlvbnNcbiAgU1lTVEVNX0NPTkZJR1VSRTogbmV3IE9wZXJhdGlvbihSZXNvdXJjZS5TWVNURU0sIEFjdGlvbi5DT05GSUdVUkUpLFxuICBTWVNURU1fQVVESVQ6IG5ldyBPcGVyYXRpb24oUmVzb3VyY2UuU1lTVEVNLCBBY3Rpb24uQVVESVQpLFxufSBhcyBjb25zdDtcblxuLyoqXG4gKiBHZXQgYWxsIHByZWRlZmluZWQgb3BlcmF0aW9ucyBhcyBhbiBhcnJheVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWxsT3BlcmF0aW9ucygpOiBPcGVyYXRpb25bXSB7XG4gIHJldHVybiBPYmplY3QudmFsdWVzKE9wZXJhdGlvbnMpO1xufVxuXG4vKipcbiAqIEdldCBhbGwgb3BlcmF0aW9ucyBmb3IgYSBzcGVjaWZpYyByZXNvdXJjZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0T3BlcmF0aW9uc0J5UmVzb3VyY2UocmVzb3VyY2U6IFJlc291cmNlKTogT3BlcmF0aW9uW10ge1xuICByZXR1cm4gZ2V0QWxsT3BlcmF0aW9ucygpLmZpbHRlcigob3ApID0+IG9wLnJlc291cmNlID09PSByZXNvdXJjZSk7XG59XG5cbi8qKlxuICogR2V0IGFsbCBvcGVyYXRpb25zIGZvciBhIHNwZWNpZmljIGFjdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0T3BlcmF0aW9uc0J5QWN0aW9uKGFjdGlvbjogQWN0aW9uKTogT3BlcmF0aW9uW10ge1xuICByZXR1cm4gZ2V0QWxsT3BlcmF0aW9ucygpLmZpbHRlcigob3ApID0+IG9wLmFjdGlvbiA9PT0gYWN0aW9uKTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resource types for operations
|
|
3
|
+
*/
|
|
4
|
+
export declare enum Resource {
|
|
5
|
+
ACCOUNT = "ACCOUNT",
|
|
6
|
+
ACCOUNT_OWNERSHIP = "ACCOUNT_OWNERSHIP",
|
|
7
|
+
ACCOUNT_PREFERENCES = "ACCOUNT_PREFERENCES",
|
|
8
|
+
USER = "USER",
|
|
9
|
+
CONTACT = "CONTACT",
|
|
10
|
+
PATIENT = "PATIENT",
|
|
11
|
+
PATIENT_MEDICAL_NOTES = "PATIENT_MEDICAL_NOTES",
|
|
12
|
+
PATIENT_MEDICAL_PROPERTIES = "PATIENT_MEDICAL_PROPERTIES",
|
|
13
|
+
PATIENT_PUBLIC_PROPERTIES = "PATIENT_PUBLIC_PROPERTIES",
|
|
14
|
+
PATIENT_PAYMENT = "PATIENT_PAYMENT",
|
|
15
|
+
MEDICAL_SERVICE = "MEDICAL_SERVICE",
|
|
16
|
+
MEDICAL_SERVICE_NOTE = "MEDICAL_SERVICE_NOTE",
|
|
17
|
+
MEDICAL_SERVICE_SCHEDULE = "MEDICAL_SERVICE_SCHEDULE",
|
|
18
|
+
MEDICAL_SERVICE_FEES = "MEDICAL_SERVICE_FEES",
|
|
19
|
+
MEDICAL_SERVICE_STATUS = "MEDICAL_SERVICE_STATUS",
|
|
20
|
+
MEDICAL_NOTE = "MEDICAL_NOTE",
|
|
21
|
+
MEDICAL_RECORD = "MEDICAL_RECORD",
|
|
22
|
+
MEDICAL_HISTORY = "MEDICAL_HISTORY",
|
|
23
|
+
MEDICAL_HISTORY_MODEL = "MEDICAL_HISTORY_MODEL",
|
|
24
|
+
PRESCRIPTION = "PRESCRIPTION",
|
|
25
|
+
DIAGNOSIS = "DIAGNOSIS",
|
|
26
|
+
OBSERVATION = "OBSERVATION",
|
|
27
|
+
MEDICATION = "MEDICATION",
|
|
28
|
+
ALLERGY = "ALLERGY",
|
|
29
|
+
IMMUNIZATION = "IMMUNIZATION",
|
|
30
|
+
PROCEDURE = "PROCEDURE",
|
|
31
|
+
CLINICAL_NOTE = "CLINICAL_NOTE",
|
|
32
|
+
VITAL_SIGNS = "VITAL_SIGNS",
|
|
33
|
+
MEASURE_MODEL = "MEASURE_MODEL",
|
|
34
|
+
CALCULATED_MEASURE_MODEL = "CALCULATED_MEASURE_MODEL",
|
|
35
|
+
UPLOADED_DOCUMENT = "UPLOADED_DOCUMENT",
|
|
36
|
+
DOCUMENT_LAYOUT = "DOCUMENT_LAYOUT",
|
|
37
|
+
GENERATED_DOCUMENT = "GENERATED_DOCUMENT",
|
|
38
|
+
DOCUMENT_MODEL = "DOCUMENT_MODEL",
|
|
39
|
+
SNIPPET = "SNIPPET",
|
|
40
|
+
LOCATION = "LOCATION",
|
|
41
|
+
TASK_TYPE = "TASK_TYPE",
|
|
42
|
+
LAB_RESULT = "LAB_RESULT",
|
|
43
|
+
IMAGING = "IMAGING",
|
|
44
|
+
MEMBERSHIP = "MEMBERSHIP",
|
|
45
|
+
SETTINGS = "SETTINGS",
|
|
46
|
+
NOTIFICATION = "NOTIFICATION",
|
|
47
|
+
REPORT = "REPORT",
|
|
48
|
+
AUDIT_LOG = "AUDIT_LOG",
|
|
49
|
+
SYSTEM = "SYSTEM",
|
|
50
|
+
PUBLIC_RESOURCE = "PUBLIC_RESOURCE",
|
|
51
|
+
MEDICAL_RESOURCE = "MEDICAL_RESOURCE"
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Medical resources - require special access control
|
|
55
|
+
*/
|
|
56
|
+
export declare const MEDICAL_RESOURCES: Resource[];
|
|
57
|
+
/**
|
|
58
|
+
* Public resources - standard access control
|
|
59
|
+
*/
|
|
60
|
+
export declare const PUBLIC_RESOURCES: Resource[];
|
|
61
|
+
/**
|
|
62
|
+
* Check if a resource is medical
|
|
63
|
+
*/
|
|
64
|
+
export declare function isMedicalResource(resource: Resource): boolean;
|
|
65
|
+
/**
|
|
66
|
+
* Check if a resource is public
|
|
67
|
+
*/
|
|
68
|
+
export declare function isPublicResource(resource: Resource): boolean;
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PUBLIC_RESOURCES = exports.MEDICAL_RESOURCES = exports.Resource = void 0;
|
|
4
|
+
exports.isMedicalResource = isMedicalResource;
|
|
5
|
+
exports.isPublicResource = isPublicResource;
|
|
6
|
+
/**
|
|
7
|
+
* Resource types for operations
|
|
8
|
+
*/
|
|
9
|
+
var Resource;
|
|
10
|
+
(function (Resource) {
|
|
11
|
+
// Account & Ownership
|
|
12
|
+
Resource["ACCOUNT"] = "ACCOUNT";
|
|
13
|
+
Resource["ACCOUNT_OWNERSHIP"] = "ACCOUNT_OWNERSHIP";
|
|
14
|
+
Resource["ACCOUNT_PREFERENCES"] = "ACCOUNT_PREFERENCES";
|
|
15
|
+
// User & Contact
|
|
16
|
+
Resource["USER"] = "USER";
|
|
17
|
+
Resource["CONTACT"] = "CONTACT";
|
|
18
|
+
// Patient resources
|
|
19
|
+
Resource["PATIENT"] = "PATIENT";
|
|
20
|
+
Resource["PATIENT_MEDICAL_NOTES"] = "PATIENT_MEDICAL_NOTES";
|
|
21
|
+
Resource["PATIENT_MEDICAL_PROPERTIES"] = "PATIENT_MEDICAL_PROPERTIES";
|
|
22
|
+
Resource["PATIENT_PUBLIC_PROPERTIES"] = "PATIENT_PUBLIC_PROPERTIES";
|
|
23
|
+
Resource["PATIENT_PAYMENT"] = "PATIENT_PAYMENT";
|
|
24
|
+
// Medical Service
|
|
25
|
+
Resource["MEDICAL_SERVICE"] = "MEDICAL_SERVICE";
|
|
26
|
+
Resource["MEDICAL_SERVICE_NOTE"] = "MEDICAL_SERVICE_NOTE";
|
|
27
|
+
Resource["MEDICAL_SERVICE_SCHEDULE"] = "MEDICAL_SERVICE_SCHEDULE";
|
|
28
|
+
Resource["MEDICAL_SERVICE_FEES"] = "MEDICAL_SERVICE_FEES";
|
|
29
|
+
Resource["MEDICAL_SERVICE_STATUS"] = "MEDICAL_SERVICE_STATUS";
|
|
30
|
+
// Medical resources
|
|
31
|
+
Resource["MEDICAL_NOTE"] = "MEDICAL_NOTE";
|
|
32
|
+
Resource["MEDICAL_RECORD"] = "MEDICAL_RECORD";
|
|
33
|
+
Resource["MEDICAL_HISTORY"] = "MEDICAL_HISTORY";
|
|
34
|
+
Resource["MEDICAL_HISTORY_MODEL"] = "MEDICAL_HISTORY_MODEL";
|
|
35
|
+
Resource["PRESCRIPTION"] = "PRESCRIPTION";
|
|
36
|
+
Resource["DIAGNOSIS"] = "DIAGNOSIS";
|
|
37
|
+
Resource["OBSERVATION"] = "OBSERVATION";
|
|
38
|
+
Resource["MEDICATION"] = "MEDICATION";
|
|
39
|
+
Resource["ALLERGY"] = "ALLERGY";
|
|
40
|
+
Resource["IMMUNIZATION"] = "IMMUNIZATION";
|
|
41
|
+
Resource["PROCEDURE"] = "PROCEDURE";
|
|
42
|
+
// Clinical & Measurements
|
|
43
|
+
Resource["CLINICAL_NOTE"] = "CLINICAL_NOTE";
|
|
44
|
+
Resource["VITAL_SIGNS"] = "VITAL_SIGNS";
|
|
45
|
+
Resource["MEASURE_MODEL"] = "MEASURE_MODEL";
|
|
46
|
+
Resource["CALCULATED_MEASURE_MODEL"] = "CALCULATED_MEASURE_MODEL";
|
|
47
|
+
// Documents
|
|
48
|
+
Resource["UPLOADED_DOCUMENT"] = "UPLOADED_DOCUMENT";
|
|
49
|
+
Resource["DOCUMENT_LAYOUT"] = "DOCUMENT_LAYOUT";
|
|
50
|
+
Resource["GENERATED_DOCUMENT"] = "GENERATED_DOCUMENT";
|
|
51
|
+
Resource["DOCUMENT_MODEL"] = "DOCUMENT_MODEL";
|
|
52
|
+
Resource["SNIPPET"] = "SNIPPET";
|
|
53
|
+
// Scheduling & Location
|
|
54
|
+
Resource["LOCATION"] = "LOCATION";
|
|
55
|
+
Resource["TASK_TYPE"] = "TASK_TYPE";
|
|
56
|
+
// Diagnostic
|
|
57
|
+
Resource["LAB_RESULT"] = "LAB_RESULT";
|
|
58
|
+
Resource["IMAGING"] = "IMAGING";
|
|
59
|
+
// Membership & Settings
|
|
60
|
+
Resource["MEMBERSHIP"] = "MEMBERSHIP";
|
|
61
|
+
Resource["SETTINGS"] = "SETTINGS";
|
|
62
|
+
// System
|
|
63
|
+
Resource["NOTIFICATION"] = "NOTIFICATION";
|
|
64
|
+
Resource["REPORT"] = "REPORT";
|
|
65
|
+
Resource["AUDIT_LOG"] = "AUDIT_LOG";
|
|
66
|
+
Resource["SYSTEM"] = "SYSTEM";
|
|
67
|
+
// Generic resources
|
|
68
|
+
Resource["PUBLIC_RESOURCE"] = "PUBLIC_RESOURCE";
|
|
69
|
+
Resource["MEDICAL_RESOURCE"] = "MEDICAL_RESOURCE";
|
|
70
|
+
})(Resource || (exports.Resource = Resource = {}));
|
|
71
|
+
/**
|
|
72
|
+
* Medical resources - require special access control
|
|
73
|
+
*/
|
|
74
|
+
exports.MEDICAL_RESOURCES = [
|
|
75
|
+
Resource.PATIENT,
|
|
76
|
+
Resource.PATIENT_MEDICAL_NOTES,
|
|
77
|
+
Resource.PATIENT_MEDICAL_PROPERTIES,
|
|
78
|
+
Resource.PATIENT_PAYMENT,
|
|
79
|
+
Resource.MEDICAL_SERVICE,
|
|
80
|
+
Resource.MEDICAL_SERVICE_NOTE,
|
|
81
|
+
Resource.MEDICAL_SERVICE_SCHEDULE,
|
|
82
|
+
Resource.MEDICAL_SERVICE_FEES,
|
|
83
|
+
Resource.MEDICAL_SERVICE_STATUS,
|
|
84
|
+
Resource.MEDICAL_NOTE,
|
|
85
|
+
Resource.MEDICAL_RECORD,
|
|
86
|
+
Resource.MEDICAL_HISTORY,
|
|
87
|
+
Resource.MEDICAL_HISTORY_MODEL,
|
|
88
|
+
Resource.PRESCRIPTION,
|
|
89
|
+
Resource.DIAGNOSIS,
|
|
90
|
+
Resource.OBSERVATION,
|
|
91
|
+
Resource.MEDICATION,
|
|
92
|
+
Resource.ALLERGY,
|
|
93
|
+
Resource.IMMUNIZATION,
|
|
94
|
+
Resource.PROCEDURE,
|
|
95
|
+
Resource.CLINICAL_NOTE,
|
|
96
|
+
Resource.VITAL_SIGNS,
|
|
97
|
+
Resource.MEASURE_MODEL,
|
|
98
|
+
Resource.CALCULATED_MEASURE_MODEL,
|
|
99
|
+
Resource.LAB_RESULT,
|
|
100
|
+
Resource.IMAGING,
|
|
101
|
+
Resource.MEDICAL_RESOURCE,
|
|
102
|
+
];
|
|
103
|
+
/**
|
|
104
|
+
* Public resources - standard access control
|
|
105
|
+
*/
|
|
106
|
+
exports.PUBLIC_RESOURCES = [
|
|
107
|
+
Resource.ACCOUNT,
|
|
108
|
+
Resource.ACCOUNT_OWNERSHIP,
|
|
109
|
+
Resource.ACCOUNT_PREFERENCES,
|
|
110
|
+
Resource.USER,
|
|
111
|
+
Resource.CONTACT,
|
|
112
|
+
Resource.PATIENT_PUBLIC_PROPERTIES,
|
|
113
|
+
Resource.UPLOADED_DOCUMENT,
|
|
114
|
+
Resource.DOCUMENT_LAYOUT,
|
|
115
|
+
Resource.GENERATED_DOCUMENT,
|
|
116
|
+
Resource.DOCUMENT_MODEL,
|
|
117
|
+
Resource.SNIPPET,
|
|
118
|
+
Resource.LOCATION,
|
|
119
|
+
Resource.TASK_TYPE,
|
|
120
|
+
Resource.MEMBERSHIP,
|
|
121
|
+
Resource.SETTINGS,
|
|
122
|
+
Resource.NOTIFICATION,
|
|
123
|
+
Resource.REPORT,
|
|
124
|
+
Resource.AUDIT_LOG,
|
|
125
|
+
Resource.SYSTEM,
|
|
126
|
+
Resource.PUBLIC_RESOURCE,
|
|
127
|
+
];
|
|
128
|
+
/**
|
|
129
|
+
* Check if a resource is medical
|
|
130
|
+
*/
|
|
131
|
+
function isMedicalResource(resource) {
|
|
132
|
+
return exports.MEDICAL_RESOURCES.includes(resource);
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Check if a resource is public
|
|
136
|
+
*/
|
|
137
|
+
function isPublicResource(resource) {
|
|
138
|
+
return exports.PUBLIC_RESOURCES.includes(resource);
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb3VyY2VzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL29wZXJhdGlvbnMvcmVzb3VyY2VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQTBJQSw4Q0FFQztBQUtELDRDQUVDO0FBbkpEOztHQUVHO0FBQ0gsSUFBWSxRQXVFWDtBQXZFRCxXQUFZLFFBQVE7SUFDbEIsc0JBQXNCO0lBQ3RCLCtCQUFtQixDQUFBO0lBQ25CLG1EQUF1QyxDQUFBO0lBQ3ZDLHVEQUEyQyxDQUFBO0lBRTNDLGlCQUFpQjtJQUNqQix5QkFBYSxDQUFBO0lBQ2IsK0JBQW1CLENBQUE7SUFFbkIsb0JBQW9CO0lBQ3BCLCtCQUFtQixDQUFBO0lBQ25CLDJEQUErQyxDQUFBO0lBQy9DLHFFQUF5RCxDQUFBO0lBQ3pELG1FQUF1RCxDQUFBO0lBQ3ZELCtDQUFtQyxDQUFBO0lBRW5DLGtCQUFrQjtJQUNsQiwrQ0FBbUMsQ0FBQTtJQUNuQyx5REFBNkMsQ0FBQTtJQUM3QyxpRUFBcUQsQ0FBQTtJQUNyRCx5REFBNkMsQ0FBQTtJQUM3Qyw2REFBaUQsQ0FBQTtJQUVqRCxvQkFBb0I7SUFDcEIseUNBQTZCLENBQUE7SUFDN0IsNkNBQWlDLENBQUE7SUFDakMsK0NBQW1DLENBQUE7SUFDbkMsMkRBQStDLENBQUE7SUFDL0MseUNBQTZCLENBQUE7SUFDN0IsbUNBQXVCLENBQUE7SUFDdkIsdUNBQTJCLENBQUE7SUFDM0IscUNBQXlCLENBQUE7SUFDekIsK0JBQW1CLENBQUE7SUFDbkIseUNBQTZCLENBQUE7SUFDN0IsbUNBQXVCLENBQUE7SUFFdkIsMEJBQTBCO0lBQzFCLDJDQUErQixDQUFBO0lBQy9CLHVDQUEyQixDQUFBO0lBQzNCLDJDQUErQixDQUFBO0lBQy9CLGlFQUFxRCxDQUFBO0lBRXJELFlBQVk7SUFDWixtREFBdUMsQ0FBQTtJQUN2QywrQ0FBbUMsQ0FBQTtJQUNuQyxxREFBeUMsQ0FBQTtJQUN6Qyw2Q0FBaUMsQ0FBQTtJQUNqQywrQkFBbUIsQ0FBQTtJQUVuQix3QkFBd0I7SUFDeEIsaUNBQXFCLENBQUE7SUFDckIsbUNBQXVCLENBQUE7SUFFdkIsYUFBYTtJQUNiLHFDQUF5QixDQUFBO0lBQ3pCLCtCQUFtQixDQUFBO0lBRW5CLHdCQUF3QjtJQUN4QixxQ0FBeUIsQ0FBQTtJQUN6QixpQ0FBcUIsQ0FBQTtJQUVyQixTQUFTO0lBQ1QseUNBQTZCLENBQUE7SUFDN0IsNkJBQWlCLENBQUE7SUFDakIsbUNBQXVCLENBQUE7SUFDdkIsNkJBQWlCLENBQUE7SUFFakIsb0JBQW9CO0lBQ3BCLCtDQUFtQyxDQUFBO0lBQ25DLGlEQUFxQyxDQUFBO0FBQ3ZDLENBQUMsRUF2RVcsUUFBUSx3QkFBUixRQUFRLFFBdUVuQjtBQUVEOztHQUVHO0FBQ1UsUUFBQSxpQkFBaUIsR0FBZTtJQUMzQyxRQUFRLENBQUMsT0FBTztJQUNoQixRQUFRLENBQUMscUJBQXFCO0lBQzlCLFFBQVEsQ0FBQywwQkFBMEI7SUFDbkMsUUFBUSxDQUFDLGVBQWU7SUFDeEIsUUFBUSxDQUFDLGVBQWU7SUFDeEIsUUFBUSxDQUFDLG9CQUFvQjtJQUM3QixRQUFRLENBQUMsd0JBQXdCO0lBQ2pDLFFBQVEsQ0FBQyxvQkFBb0I7SUFDN0IsUUFBUSxDQUFDLHNCQUFzQjtJQUMvQixRQUFRLENBQUMsWUFBWTtJQUNyQixRQUFRLENBQUMsY0FBYztJQUN2QixRQUFRLENBQUMsZUFBZTtJQUN4QixRQUFRLENBQUMscUJBQXFCO0lBQzlCLFFBQVEsQ0FBQyxZQUFZO0lBQ3JCLFFBQVEsQ0FBQyxTQUFTO0lBQ2xCLFFBQVEsQ0FBQyxXQUFXO0lBQ3BCLFFBQVEsQ0FBQyxVQUFVO0lBQ25CLFFBQVEsQ0FBQyxPQUFPO0lBQ2hCLFFBQVEsQ0FBQyxZQUFZO0lBQ3JCLFFBQVEsQ0FBQyxTQUFTO0lBQ2xCLFFBQVEsQ0FBQyxhQUFhO0lBQ3RCLFFBQVEsQ0FBQyxXQUFXO0lBQ3BCLFFBQVEsQ0FBQyxhQUFhO0lBQ3RCLFFBQVEsQ0FBQyx3QkFBd0I7SUFDakMsUUFBUSxDQUFDLFVBQVU7SUFDbkIsUUFBUSxDQUFDLE9BQU87SUFDaEIsUUFBUSxDQUFDLGdCQUFnQjtDQUMxQixDQUFDO0FBRUY7O0dBRUc7QUFDVSxRQUFBLGdCQUFnQixHQUFlO0lBQzFDLFFBQVEsQ0FBQyxPQUFPO0lBQ2hCLFFBQVEsQ0FBQyxpQkFBaUI7SUFDMUIsUUFBUSxDQUFDLG1CQUFtQjtJQUM1QixRQUFRLENBQUMsSUFBSTtJQUNiLFFBQVEsQ0FBQyxPQUFPO0lBQ2hCLFFBQVEsQ0FBQyx5QkFBeUI7SUFDbEMsUUFBUSxDQUFDLGlCQUFpQjtJQUMxQixRQUFRLENBQUMsZUFBZTtJQUN4QixRQUFRLENBQUMsa0JBQWtCO0lBQzNCLFFBQVEsQ0FBQyxjQUFjO0lBQ3ZCLFFBQVEsQ0FBQyxPQUFPO0lBQ2hCLFFBQVEsQ0FBQyxRQUFRO0lBQ2pCLFFBQVEsQ0FBQyxTQUFTO0lBQ2xCLFFBQVEsQ0FBQyxVQUFVO0lBQ25CLFFBQVEsQ0FBQyxRQUFRO0lBQ2pCLFFBQVEsQ0FBQyxZQUFZO0lBQ3JCLFFBQVEsQ0FBQyxNQUFNO0lBQ2YsUUFBUSxDQUFDLFNBQVM7SUFDbEIsUUFBUSxDQUFDLE1BQU07SUFDZixRQUFRLENBQUMsZUFBZTtDQUN6QixDQUFDO0FBRUY7O0dBRUc7QUFDSCxTQUFnQixpQkFBaUIsQ0FBQyxRQUFrQjtJQUNsRCxPQUFPLHlCQUFpQixDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUM5QyxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQixnQkFBZ0IsQ0FBQyxRQUFrQjtJQUNqRCxPQUFPLHdCQUFnQixDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUM3QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSZXNvdXJjZSB0eXBlcyBmb3Igb3BlcmF0aW9uc1xuICovXG5leHBvcnQgZW51bSBSZXNvdXJjZSB7XG4gIC8vIEFjY291bnQgJiBPd25lcnNoaXBcbiAgQUNDT1VOVCA9IFwiQUNDT1VOVFwiLFxuICBBQ0NPVU5UX09XTkVSU0hJUCA9IFwiQUNDT1VOVF9PV05FUlNISVBcIixcbiAgQUNDT1VOVF9QUkVGRVJFTkNFUyA9IFwiQUNDT1VOVF9QUkVGRVJFTkNFU1wiLFxuXG4gIC8vIFVzZXIgJiBDb250YWN0XG4gIFVTRVIgPSBcIlVTRVJcIixcbiAgQ09OVEFDVCA9IFwiQ09OVEFDVFwiLFxuXG4gIC8vIFBhdGllbnQgcmVzb3VyY2VzXG4gIFBBVElFTlQgPSBcIlBBVElFTlRcIixcbiAgUEFUSUVOVF9NRURJQ0FMX05PVEVTID0gXCJQQVRJRU5UX01FRElDQUxfTk9URVNcIixcbiAgUEFUSUVOVF9NRURJQ0FMX1BST1BFUlRJRVMgPSBcIlBBVElFTlRfTUVESUNBTF9QUk9QRVJUSUVTXCIsXG4gIFBBVElFTlRfUFVCTElDX1BST1BFUlRJRVMgPSBcIlBBVElFTlRfUFVCTElDX1BST1BFUlRJRVNcIixcbiAgUEFUSUVOVF9QQVlNRU5UID0gXCJQQVRJRU5UX1BBWU1FTlRcIixcblxuICAvLyBNZWRpY2FsIFNlcnZpY2VcbiAgTUVESUNBTF9TRVJWSUNFID0gXCJNRURJQ0FMX1NFUlZJQ0VcIixcbiAgTUVESUNBTF9TRVJWSUNFX05PVEUgPSBcIk1FRElDQUxfU0VSVklDRV9OT1RFXCIsXG4gIE1FRElDQUxfU0VSVklDRV9TQ0hFRFVMRSA9IFwiTUVESUNBTF9TRVJWSUNFX1NDSEVEVUxFXCIsXG4gIE1FRElDQUxfU0VSVklDRV9GRUVTID0gXCJNRURJQ0FMX1NFUlZJQ0VfRkVFU1wiLFxuICBNRURJQ0FMX1NFUlZJQ0VfU1RBVFVTID0gXCJNRURJQ0FMX1NFUlZJQ0VfU1RBVFVTXCIsXG5cbiAgLy8gTWVkaWNhbCByZXNvdXJjZXNcbiAgTUVESUNBTF9OT1RFID0gXCJNRURJQ0FMX05PVEVcIixcbiAgTUVESUNBTF9SRUNPUkQgPSBcIk1FRElDQUxfUkVDT1JEXCIsXG4gIE1FRElDQUxfSElTVE9SWSA9IFwiTUVESUNBTF9ISVNUT1JZXCIsXG4gIE1FRElDQUxfSElTVE9SWV9NT0RFTCA9IFwiTUVESUNBTF9ISVNUT1JZX01PREVMXCIsXG4gIFBSRVNDUklQVElPTiA9IFwiUFJFU0NSSVBUSU9OXCIsXG4gIERJQUdOT1NJUyA9IFwiRElBR05PU0lTXCIsXG4gIE9CU0VSVkFUSU9OID0gXCJPQlNFUlZBVElPTlwiLFxuICBNRURJQ0FUSU9OID0gXCJNRURJQ0FUSU9OXCIsXG4gIEFMTEVSR1kgPSBcIkFMTEVSR1lcIixcbiAgSU1NVU5JWkFUSU9OID0gXCJJTU1VTklaQVRJT05cIixcbiAgUFJPQ0VEVVJFID0gXCJQUk9DRURVUkVcIixcblxuICAvLyBDbGluaWNhbCAmIE1lYXN1cmVtZW50c1xuICBDTElOSUNBTF9OT1RFID0gXCJDTElOSUNBTF9OT1RFXCIsXG4gIFZJVEFMX1NJR05TID0gXCJWSVRBTF9TSUdOU1wiLFxuICBNRUFTVVJFX01PREVMID0gXCJNRUFTVVJFX01PREVMXCIsXG4gIENBTENVTEFURURfTUVBU1VSRV9NT0RFTCA9IFwiQ0FMQ1VMQVRFRF9NRUFTVVJFX01PREVMXCIsXG5cbiAgLy8gRG9jdW1lbnRzXG4gIFVQTE9BREVEX0RPQ1VNRU5UID0gXCJVUExPQURFRF9ET0NVTUVOVFwiLFxuICBET0NVTUVOVF9MQVlPVVQgPSBcIkRPQ1VNRU5UX0xBWU9VVFwiLFxuICBHRU5FUkFURURfRE9DVU1FTlQgPSBcIkdFTkVSQVRFRF9ET0NVTUVOVFwiLFxuICBET0NVTUVOVF9NT0RFTCA9IFwiRE9DVU1FTlRfTU9ERUxcIixcbiAgU05JUFBFVCA9IFwiU05JUFBFVFwiLFxuXG4gIC8vIFNjaGVkdWxpbmcgJiBMb2NhdGlvblxuICBMT0NBVElPTiA9IFwiTE9DQVRJT05cIixcbiAgVEFTS19UWVBFID0gXCJUQVNLX1RZUEVcIixcblxuICAvLyBEaWFnbm9zdGljXG4gIExBQl9SRVNVTFQgPSBcIkxBQl9SRVNVTFRcIixcbiAgSU1BR0lORyA9IFwiSU1BR0lOR1wiLFxuXG4gIC8vIE1lbWJlcnNoaXAgJiBTZXR0aW5nc1xuICBNRU1CRVJTSElQID0gXCJNRU1CRVJTSElQXCIsXG4gIFNFVFRJTkdTID0gXCJTRVRUSU5HU1wiLFxuXG4gIC8vIFN5c3RlbVxuICBOT1RJRklDQVRJT04gPSBcIk5PVElGSUNBVElPTlwiLFxuICBSRVBPUlQgPSBcIlJFUE9SVFwiLFxuICBBVURJVF9MT0cgPSBcIkFVRElUX0xPR1wiLFxuICBTWVNURU0gPSBcIlNZU1RFTVwiLFxuXG4gIC8vIEdlbmVyaWMgcmVzb3VyY2VzXG4gIFBVQkxJQ19SRVNPVVJDRSA9IFwiUFVCTElDX1JFU09VUkNFXCIsXG4gIE1FRElDQUxfUkVTT1VSQ0UgPSBcIk1FRElDQUxfUkVTT1VSQ0VcIixcbn1cblxuLyoqXG4gKiBNZWRpY2FsIHJlc291cmNlcyAtIHJlcXVpcmUgc3BlY2lhbCBhY2Nlc3MgY29udHJvbFxuICovXG5leHBvcnQgY29uc3QgTUVESUNBTF9SRVNPVVJDRVM6IFJlc291cmNlW10gPSBbXG4gIFJlc291cmNlLlBBVElFTlQsXG4gIFJlc291cmNlLlBBVElFTlRfTUVESUNBTF9OT1RFUyxcbiAgUmVzb3VyY2UuUEFUSUVOVF9NRURJQ0FMX1BST1BFUlRJRVMsXG4gIFJlc291cmNlLlBBVElFTlRfUEFZTUVOVCxcbiAgUmVzb3VyY2UuTUVESUNBTF9TRVJWSUNFLFxuICBSZXNvdXJjZS5NRURJQ0FMX1NFUlZJQ0VfTk9URSxcbiAgUmVzb3VyY2UuTUVESUNBTF9TRVJWSUNFX1NDSEVEVUxFLFxuICBSZXNvdXJjZS5NRURJQ0FMX1NFUlZJQ0VfRkVFUyxcbiAgUmVzb3VyY2UuTUVESUNBTF9TRVJWSUNFX1NUQVRVUyxcbiAgUmVzb3VyY2UuTUVESUNBTF9OT1RFLFxuICBSZXNvdXJjZS5NRURJQ0FMX1JFQ09SRCxcbiAgUmVzb3VyY2UuTUVESUNBTF9ISVNUT1JZLFxuICBSZXNvdXJjZS5NRURJQ0FMX0hJU1RPUllfTU9ERUwsXG4gIFJlc291cmNlLlBSRVNDUklQVElPTixcbiAgUmVzb3VyY2UuRElBR05PU0lTLFxuICBSZXNvdXJjZS5PQlNFUlZBVElPTixcbiAgUmVzb3VyY2UuTUVESUNBVElPTixcbiAgUmVzb3VyY2UuQUxMRVJHWSxcbiAgUmVzb3VyY2UuSU1NVU5JWkFUSU9OLFxuICBSZXNvdXJjZS5QUk9DRURVUkUsXG4gIFJlc291cmNlLkNMSU5JQ0FMX05PVEUsXG4gIFJlc291cmNlLlZJVEFMX1NJR05TLFxuICBSZXNvdXJjZS5NRUFTVVJFX01PREVMLFxuICBSZXNvdXJjZS5DQUxDVUxBVEVEX01FQVNVUkVfTU9ERUwsXG4gIFJlc291cmNlLkxBQl9SRVNVTFQsXG4gIFJlc291cmNlLklNQUdJTkcsXG4gIFJlc291cmNlLk1FRElDQUxfUkVTT1VSQ0UsXG5dO1xuXG4vKipcbiAqIFB1YmxpYyByZXNvdXJjZXMgLSBzdGFuZGFyZCBhY2Nlc3MgY29udHJvbFxuICovXG5leHBvcnQgY29uc3QgUFVCTElDX1JFU09VUkNFUzogUmVzb3VyY2VbXSA9IFtcbiAgUmVzb3VyY2UuQUNDT1VOVCxcbiAgUmVzb3VyY2UuQUNDT1VOVF9PV05FUlNISVAsXG4gIFJlc291cmNlLkFDQ09VTlRfUFJFRkVSRU5DRVMsXG4gIFJlc291cmNlLlVTRVIsXG4gIFJlc291cmNlLkNPTlRBQ1QsXG4gIFJlc291cmNlLlBBVElFTlRfUFVCTElDX1BST1BFUlRJRVMsXG4gIFJlc291cmNlLlVQTE9BREVEX0RPQ1VNRU5ULFxuICBSZXNvdXJjZS5ET0NVTUVOVF9MQVlPVVQsXG4gIFJlc291cmNlLkdFTkVSQVRFRF9ET0NVTUVOVCxcbiAgUmVzb3VyY2UuRE9DVU1FTlRfTU9ERUwsXG4gIFJlc291cmNlLlNOSVBQRVQsXG4gIFJlc291cmNlLkxPQ0FUSU9OLFxuICBSZXNvdXJjZS5UQVNLX1RZUEUsXG4gIFJlc291cmNlLk1FTUJFUlNISVAsXG4gIFJlc291cmNlLlNFVFRJTkdTLFxuICBSZXNvdXJjZS5OT1RJRklDQVRJT04sXG4gIFJlc291cmNlLlJFUE9SVCxcbiAgUmVzb3VyY2UuQVVESVRfTE9HLFxuICBSZXNvdXJjZS5TWVNURU0sXG4gIFJlc291cmNlLlBVQkxJQ19SRVNPVVJDRSxcbl07XG5cbi8qKlxuICogQ2hlY2sgaWYgYSByZXNvdXJjZSBpcyBtZWRpY2FsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc01lZGljYWxSZXNvdXJjZShyZXNvdXJjZTogUmVzb3VyY2UpOiBib29sZWFuIHtcbiAgcmV0dXJuIE1FRElDQUxfUkVTT1VSQ0VTLmluY2x1ZGVzKHJlc291cmNlKTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhIHJlc291cmNlIGlzIHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNQdWJsaWNSZXNvdXJjZShyZXNvdXJjZTogUmVzb3VyY2UpOiBib29sZWFuIHtcbiAgcmV0dXJuIFBVQkxJQ19SRVNPVVJDRVMuaW5jbHVkZXMocmVzb3VyY2UpO1xufVxuIl19
|