@mu-cabin/opms-permission 0.8.35 → 0.9.1
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/dist/index.cjs +220 -116
- package/dist/index.d.mts +161 -41
- package/dist/index.d.ts +161 -41
- package/dist/index.mjs +210 -115
- package/package.json +1 -1
package/dist/index.mjs
CHANGED
@@ -1,8 +1,29 @@
|
|
1
1
|
// src/utils/storage.ts
|
2
2
|
var Storage = class {
|
3
|
+
constructor() {
|
4
|
+
this.currentVersion = "1.0.0";
|
5
|
+
}
|
3
6
|
setSystemId(systemId) {
|
4
7
|
this.systemId = systemId;
|
5
8
|
}
|
9
|
+
/**
|
10
|
+
* Set the current version for new data
|
11
|
+
* If version changes, all existing data for this systemId will be cleared
|
12
|
+
*/
|
13
|
+
setVersion(version) {
|
14
|
+
if (this.currentVersion !== version) {
|
15
|
+
this.clear();
|
16
|
+
this.currentVersion = version;
|
17
|
+
} else {
|
18
|
+
this.currentVersion = version;
|
19
|
+
}
|
20
|
+
}
|
21
|
+
/**
|
22
|
+
* Get the current version
|
23
|
+
*/
|
24
|
+
getVersion() {
|
25
|
+
return this.currentVersion;
|
26
|
+
}
|
6
27
|
prefixKey(key) {
|
7
28
|
return this.systemId !== void 0 ? `systemId-${this.systemId}-${key}` : key;
|
8
29
|
}
|
@@ -12,24 +33,35 @@ var Storage = class {
|
|
12
33
|
setItem(key, value, expireMinutes) {
|
13
34
|
const data = {
|
14
35
|
value,
|
15
|
-
expire: expireMinutes ? Date.now() + expireMinutes * 60 * 1e3 : null
|
36
|
+
expire: expireMinutes ? Date.now() + expireMinutes * 60 * 1e3 : null,
|
37
|
+
version: this.currentVersion,
|
38
|
+
timestamp: Date.now()
|
16
39
|
};
|
17
40
|
localStorage.setItem(this.prefixKey(key), JSON.stringify(data));
|
18
41
|
}
|
19
42
|
/**
|
20
43
|
* Get an item from localStorage, returns undefined if expired or not found
|
44
|
+
* Automatically expires data if version is different
|
21
45
|
*/
|
22
46
|
getItem(key) {
|
23
47
|
const raw = localStorage.getItem(this.prefixKey(key));
|
24
48
|
if (!raw) return void 0;
|
25
49
|
try {
|
26
50
|
const data = JSON.parse(raw);
|
51
|
+
if (!data.version) {
|
52
|
+
data.version = "0.0.0";
|
53
|
+
}
|
27
54
|
if (data.expire && Date.now() > data.expire) {
|
28
55
|
localStorage.removeItem(this.prefixKey(key));
|
29
56
|
return void 0;
|
30
57
|
}
|
58
|
+
if (data.version !== this.currentVersion) {
|
59
|
+
localStorage.removeItem(this.prefixKey(key));
|
60
|
+
return void 0;
|
61
|
+
}
|
31
62
|
return data.value;
|
32
|
-
} catch {
|
63
|
+
} catch (error) {
|
64
|
+
console.error("Error parsing stored data:", error);
|
33
65
|
return void 0;
|
34
66
|
}
|
35
67
|
}
|
@@ -39,6 +71,44 @@ var Storage = class {
|
|
39
71
|
removeItem(key) {
|
40
72
|
localStorage.removeItem(this.prefixKey(key));
|
41
73
|
}
|
74
|
+
/**
|
75
|
+
* Clear all data for the current systemId
|
76
|
+
*/
|
77
|
+
clear() {
|
78
|
+
if (this.systemId !== void 0) {
|
79
|
+
const prefix = `systemId-${this.systemId}-`;
|
80
|
+
Object.keys(localStorage).filter((key) => key.startsWith(prefix)).forEach((key) => localStorage.removeItem(key));
|
81
|
+
}
|
82
|
+
}
|
83
|
+
/**
|
84
|
+
* Get all keys for the current systemId
|
85
|
+
*/
|
86
|
+
getKeys() {
|
87
|
+
if (this.systemId === void 0) {
|
88
|
+
return Object.keys(localStorage);
|
89
|
+
}
|
90
|
+
const prefix = `systemId-${this.systemId}-`;
|
91
|
+
return Object.keys(localStorage).filter((key) => key.startsWith(prefix)).map((key) => key.substring(prefix.length));
|
92
|
+
}
|
93
|
+
/**
|
94
|
+
* Check if a key exists
|
95
|
+
*/
|
96
|
+
hasKey(key) {
|
97
|
+
return localStorage.getItem(this.prefixKey(key)) !== null;
|
98
|
+
}
|
99
|
+
/**
|
100
|
+
* Get storage info for debugging
|
101
|
+
*/
|
102
|
+
getStorageInfo() {
|
103
|
+
const totalKeys = Object.keys(localStorage).length;
|
104
|
+
const systemKeys = this.getKeys().length;
|
105
|
+
return {
|
106
|
+
systemId: this.systemId,
|
107
|
+
currentVersion: this.currentVersion,
|
108
|
+
totalKeys,
|
109
|
+
systemKeys
|
110
|
+
};
|
111
|
+
}
|
42
112
|
};
|
43
113
|
var storage = new Storage();
|
44
114
|
|
@@ -194,8 +264,6 @@ import axios from "axios";
|
|
194
264
|
var USER_INFO_KEY = "opms_user_info";
|
195
265
|
var RESOURCE_KEY = "opms_resources";
|
196
266
|
var TOKEN_KEY = "omps_authorization";
|
197
|
-
var ORG_COMPANY_KEY = "opms_org_company";
|
198
|
-
var USER_ORG_KEY = "opms_user_org";
|
199
267
|
|
200
268
|
// src/api.ts
|
201
269
|
var axiosClient = axios.create();
|
@@ -222,6 +290,17 @@ axiosClient.interceptors.response.use(
|
|
222
290
|
return Promise.reject(error);
|
223
291
|
}
|
224
292
|
);
|
293
|
+
var EnumOrgQueryMode = /* @__PURE__ */ ((EnumOrgQueryMode2) => {
|
294
|
+
EnumOrgQueryMode2["BY_ROLES"] = "BY_ROLES";
|
295
|
+
EnumOrgQueryMode2["BY_DEPT"] = "BY_DEPT";
|
296
|
+
return EnumOrgQueryMode2;
|
297
|
+
})(EnumOrgQueryMode || {});
|
298
|
+
var EnumOrgQueryScope = /* @__PURE__ */ ((EnumOrgQueryScope2) => {
|
299
|
+
EnumOrgQueryScope2["ONLY_BRANCH"] = "ONLY_BRANCH";
|
300
|
+
EnumOrgQueryScope2["STEWARD_UNIT"] = "STEWARD_UNIT";
|
301
|
+
EnumOrgQueryScope2["WITH_DEPARTMENT"] = "WITH_DEPARTMENT";
|
302
|
+
return EnumOrgQueryScope2;
|
303
|
+
})(EnumOrgQueryScope || {});
|
225
304
|
async function login(baseUrl, authorizationCode) {
|
226
305
|
return await axiosClient.get(
|
227
306
|
`${baseUrl}/opmsDefaultAuth/oauthLogin`,
|
@@ -247,9 +326,16 @@ async function queryResource(baseUrl, params) {
|
|
247
326
|
params
|
248
327
|
);
|
249
328
|
}
|
250
|
-
async function
|
329
|
+
async function getOrgTree(baseUrl, params) {
|
330
|
+
return await axiosClient.post(
|
331
|
+
`${baseUrl}/opmsDefaultUser/orgTree`,
|
332
|
+
params
|
333
|
+
);
|
334
|
+
}
|
335
|
+
async function getUserOrgTree(baseUrl, params) {
|
251
336
|
return await axiosClient.post(
|
252
|
-
`${baseUrl}/
|
337
|
+
`${baseUrl}/opmsDefaultUser/userOrgTree`,
|
338
|
+
params
|
253
339
|
);
|
254
340
|
}
|
255
341
|
async function queryOrgCompanies(baseUrl, params) {
|
@@ -324,8 +410,6 @@ var DataHandler = {
|
|
324
410
|
var Permission = class {
|
325
411
|
constructor(options) {
|
326
412
|
this._userInfo = null;
|
327
|
-
this._orgTree = null;
|
328
|
-
this._orgCompany = null;
|
329
413
|
this.resources = [];
|
330
414
|
this.resourceMap = {};
|
331
415
|
this.widgetMap = {};
|
@@ -334,6 +418,7 @@ var Permission = class {
|
|
334
418
|
this.baseUrl = options.baseUrl;
|
335
419
|
this.systemId = options.systemId;
|
336
420
|
storage.setSystemId(this.systemId);
|
421
|
+
storage.setVersion("1.0.0");
|
337
422
|
}
|
338
423
|
/**
|
339
424
|
* Login using code from URL, save userInfo
|
@@ -371,25 +456,12 @@ var Permission = class {
|
|
371
456
|
clearData && this.clear();
|
372
457
|
}
|
373
458
|
clear() {
|
374
|
-
|
375
|
-
this._orgTree = null;
|
376
|
-
this._orgCompany = null;
|
377
|
-
this.resources = [];
|
378
|
-
this.resourceMap = {};
|
379
|
-
this.widgetMap = {};
|
380
|
-
this.menuList = [];
|
381
|
-
this.menuMap = {};
|
382
|
-
storage.removeItem(RESOURCE_KEY);
|
383
|
-
storage.removeItem(TOKEN_KEY);
|
384
|
-
storage.removeItem(USER_INFO_KEY);
|
385
|
-
storage.removeItem(ORG_COMPANY_KEY);
|
386
|
-
storage.removeItem(USER_ORG_KEY);
|
459
|
+
storage.clear();
|
387
460
|
}
|
388
461
|
async getUserInfo() {
|
389
462
|
const data = await getUserInfo(this.baseUrl);
|
390
463
|
const { obj, success, msg, code } = data;
|
391
|
-
|
392
|
-
return this.userInfo;
|
464
|
+
return obj;
|
393
465
|
}
|
394
466
|
/**
|
395
467
|
* Get resources and process to menuList, menuMap, widgetMap (matches app store logic)
|
@@ -410,17 +482,12 @@ var Permission = class {
|
|
410
482
|
storage.setItem(
|
411
483
|
RESOURCE_KEY,
|
412
484
|
resources,
|
413
|
-
60 *
|
414
|
-
//
|
485
|
+
60 * 12
|
486
|
+
// 12 hours
|
415
487
|
);
|
416
488
|
}
|
417
489
|
const { resourceMap, widgetMap } = createResourceMap(resources);
|
418
490
|
const { menuList, menuMap } = createMenuList(resources);
|
419
|
-
this.resources = resources;
|
420
|
-
this.resourceMap = resourceMap;
|
421
|
-
this.widgetMap = widgetMap;
|
422
|
-
this.menuList = menuList;
|
423
|
-
this.menuMap = menuMap;
|
424
491
|
return {
|
425
492
|
resources,
|
426
493
|
resourceMap,
|
@@ -430,13 +497,28 @@ var Permission = class {
|
|
430
497
|
};
|
431
498
|
}
|
432
499
|
/**
|
433
|
-
*
|
500
|
+
* Generate cache key for user orgs query
|
434
501
|
*/
|
435
|
-
|
502
|
+
generateUserOrgsCacheKey(params) {
|
503
|
+
const sortedParams = Object.keys(params).sort().reduce((acc, key) => {
|
504
|
+
acc[key] = params[key];
|
505
|
+
return acc;
|
506
|
+
}, {});
|
507
|
+
return `user_orgs_${JSON.stringify(sortedParams)}`;
|
508
|
+
}
|
509
|
+
/**
|
510
|
+
* Query and process organization tree with caching
|
511
|
+
*/
|
512
|
+
async queryUserOrgs(params, config = { force: false, cacheTimeout: 2 }) {
|
436
513
|
try {
|
437
|
-
|
514
|
+
const { force, cacheTimeout = 2 } = config;
|
515
|
+
let orgTreeData = null;
|
516
|
+
if (!force) {
|
517
|
+
const cacheKey = this.generateUserOrgsCacheKey(params);
|
518
|
+
orgTreeData = storage.getItem(cacheKey) || null;
|
519
|
+
}
|
438
520
|
if (!orgTreeData) {
|
439
|
-
const res = await getUserOrgTree(this.baseUrl);
|
521
|
+
const res = await getUserOrgTree(this.baseUrl, params);
|
440
522
|
const { obj } = res;
|
441
523
|
orgTreeData = iterateNestedArray(obj, (item) => {
|
442
524
|
return {
|
@@ -451,33 +533,33 @@ var Permission = class {
|
|
451
533
|
orgId: item.orgId
|
452
534
|
};
|
453
535
|
});
|
454
|
-
|
536
|
+
const cacheKey = this.generateUserOrgsCacheKey(params);
|
537
|
+
storage.setItem(cacheKey, orgTreeData, cacheTimeout);
|
455
538
|
}
|
456
539
|
const data = handlePermissionTree(orgTreeData, "orgId");
|
457
|
-
const {
|
458
|
-
|
459
|
-
|
460
|
-
|
461
|
-
|
462
|
-
|
463
|
-
return { orgTree: orgTreeData, orgNoAuthMap: noAuthMap, authOrgTree: tree };
|
540
|
+
const { tree } = data;
|
541
|
+
return {
|
542
|
+
orgTree: tree
|
543
|
+
// orgNoAuthMap: noAuthMap,
|
544
|
+
// authOrgTree: tree,
|
545
|
+
};
|
464
546
|
} catch (error) {
|
465
547
|
console.log(error);
|
466
548
|
return null;
|
467
549
|
}
|
468
550
|
}
|
469
|
-
async queryCompanies() {
|
470
|
-
|
471
|
-
|
472
|
-
|
473
|
-
|
474
|
-
|
475
|
-
|
476
|
-
|
477
|
-
|
478
|
-
|
479
|
-
|
480
|
-
}
|
551
|
+
// async queryCompanies(): Promise<OrgRecord[]> {
|
552
|
+
// let orgCompanyList: OrgRecord[] | undefined =
|
553
|
+
// storage.getItem(ORG_COMPANY_KEY);
|
554
|
+
// if (!orgCompanyList) {
|
555
|
+
// const { obj } = await queryOrgCompanies(this.baseUrl, {
|
556
|
+
// queryAllBranches: true,
|
557
|
+
// });
|
558
|
+
// orgCompanyList = obj;
|
559
|
+
// storage.setItem(ORG_COMPANY_KEY, orgCompanyList);
|
560
|
+
// }
|
561
|
+
// return orgCompanyList;
|
562
|
+
// }
|
481
563
|
isLogin() {
|
482
564
|
return !!storage.getItem(TOKEN_KEY);
|
483
565
|
}
|
@@ -488,70 +570,74 @@ var Permission = class {
|
|
488
570
|
storage.setItem(TOKEN_KEY, token);
|
489
571
|
}
|
490
572
|
// --- Getters ---
|
491
|
-
get userInfo() {
|
492
|
-
|
493
|
-
|
494
|
-
|
495
|
-
|
496
|
-
|
497
|
-
|
498
|
-
}
|
499
|
-
get hasRootAuth() {
|
500
|
-
|
501
|
-
|
502
|
-
|
503
|
-
|
504
|
-
}
|
505
|
-
get userOrganizations() {
|
506
|
-
|
507
|
-
}
|
508
|
-
|
509
|
-
|
510
|
-
|
511
|
-
|
512
|
-
|
513
|
-
|
514
|
-
|
515
|
-
|
516
|
-
|
517
|
-
|
518
|
-
|
519
|
-
|
520
|
-
|
521
|
-
|
522
|
-
|
523
|
-
|
524
|
-
|
525
|
-
|
526
|
-
|
527
|
-
|
528
|
-
|
529
|
-
|
530
|
-
|
531
|
-
return this.companyOptions?.[0]?.value ?? "";
|
573
|
+
// get userInfo(): UserInfo | null {
|
574
|
+
// if (!this._userInfo) {
|
575
|
+
// this._userInfo = storage.getItem(USER_INFO_KEY);
|
576
|
+
// }
|
577
|
+
// if (!this._userInfo) return null;
|
578
|
+
// const { account, name, ehrId, crewCode, crewId } = this._userInfo;
|
579
|
+
// return { account, name, ehrId, crewCode, crewId };
|
580
|
+
// }
|
581
|
+
// get hasRootAuth() {
|
582
|
+
// const orgs = this._userInfo?.organizations || [];
|
583
|
+
// const first = orgs[0];
|
584
|
+
// if (!first) return false;
|
585
|
+
// return first.searchPath === '#1';
|
586
|
+
// }
|
587
|
+
// get userOrganizations(): UserOrganization[] {
|
588
|
+
// return this._userInfo?.userOrganizations || [];
|
589
|
+
// }
|
590
|
+
/**
|
591
|
+
* Get storage information for debugging and monitoring
|
592
|
+
*/
|
593
|
+
getStorageInfo() {
|
594
|
+
const keys = storage.getKeys();
|
595
|
+
const userOrgsCacheKeys = keys.filter((key) => key.startsWith("user_orgs_"));
|
596
|
+
return {
|
597
|
+
...storage.getStorageInfo(),
|
598
|
+
permissionKeys: {
|
599
|
+
resourceKey: RESOURCE_KEY,
|
600
|
+
tokenKey: TOKEN_KEY,
|
601
|
+
userInfoKey: USER_INFO_KEY
|
602
|
+
},
|
603
|
+
hasData: {
|
604
|
+
resources: storage.hasKey(RESOURCE_KEY),
|
605
|
+
token: storage.hasKey(TOKEN_KEY),
|
606
|
+
userInfo: storage.hasKey(USER_INFO_KEY)
|
607
|
+
},
|
608
|
+
cacheInfo: {
|
609
|
+
userOrgsCacheCount: userOrgsCacheKeys.length,
|
610
|
+
userOrgsCacheKeys
|
611
|
+
}
|
612
|
+
};
|
532
613
|
}
|
533
|
-
|
534
|
-
|
535
|
-
|
536
|
-
|
614
|
+
/**
|
615
|
+
* Get current storage version
|
616
|
+
*/
|
617
|
+
getStorageVersion() {
|
618
|
+
return storage.getVersion();
|
537
619
|
}
|
538
|
-
|
539
|
-
|
540
|
-
|
541
|
-
|
620
|
+
/**
|
621
|
+
* Clear all storage data for this system
|
622
|
+
*/
|
623
|
+
clearStorage() {
|
624
|
+
storage.clear();
|
542
625
|
}
|
543
|
-
|
544
|
-
|
545
|
-
|
626
|
+
/**
|
627
|
+
* Clear user orgs cache for specific parameters or all
|
628
|
+
*/
|
629
|
+
clearUserOrgsCache(params) {
|
630
|
+
if (params) {
|
631
|
+
const cacheKey = this.generateUserOrgsCacheKey(params);
|
632
|
+
storage.removeItem(cacheKey);
|
633
|
+
} else {
|
634
|
+
const keys = storage.getKeys();
|
635
|
+
keys.forEach((key) => {
|
636
|
+
if (key.startsWith("user_orgs_")) {
|
637
|
+
storage.removeItem(key);
|
638
|
+
}
|
639
|
+
});
|
546
640
|
}
|
547
|
-
const orgTree = this._orgTree;
|
548
|
-
if (!orgTree) return "";
|
549
|
-
return findFirstEnableCode(orgTree) ?? "";
|
550
|
-
}
|
551
|
-
get topLevelUnitOrgCodes() {
|
552
|
-
const orgTree = this._orgTree;
|
553
|
-
if (!orgTree) return [];
|
554
|
-
return DataHandler.topLevelUnitOrgCodes(orgTree);
|
555
641
|
}
|
556
642
|
};
|
557
643
|
|
@@ -591,7 +677,16 @@ function jumpToSSOLogout({
|
|
591
677
|
}
|
592
678
|
export {
|
593
679
|
DataHandler,
|
680
|
+
EnumOrgQueryMode,
|
681
|
+
EnumOrgQueryScope,
|
594
682
|
Permission as OpmsPermission,
|
683
|
+
getOrgTree,
|
684
|
+
getUserInfo,
|
685
|
+
getUserOrgTree,
|
595
686
|
jumpToSSOLogin,
|
596
|
-
jumpToSSOLogout
|
687
|
+
jumpToSSOLogout,
|
688
|
+
login,
|
689
|
+
logout,
|
690
|
+
queryOrgCompanies,
|
691
|
+
queryResource
|
597
692
|
};
|