@mu-cabin/opms-permission 0.8.34 → 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 -115
- package/dist/index.d.mts +161 -41
- package/dist/index.d.ts +161 -41
- package/dist/index.mjs +210 -114
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
@@ -31,17 +31,47 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
31
31
|
var index_exports = {};
|
32
32
|
__export(index_exports, {
|
33
33
|
DataHandler: () => DataHandler,
|
34
|
+
EnumOrgQueryMode: () => EnumOrgQueryMode,
|
35
|
+
EnumOrgQueryScope: () => EnumOrgQueryScope,
|
34
36
|
OpmsPermission: () => Permission,
|
37
|
+
getOrgTree: () => getOrgTree,
|
38
|
+
getUserInfo: () => getUserInfo,
|
39
|
+
getUserOrgTree: () => getUserOrgTree,
|
35
40
|
jumpToSSOLogin: () => jumpToSSOLogin,
|
36
|
-
jumpToSSOLogout: () => jumpToSSOLogout
|
41
|
+
jumpToSSOLogout: () => jumpToSSOLogout,
|
42
|
+
login: () => login,
|
43
|
+
logout: () => logout,
|
44
|
+
queryOrgCompanies: () => queryOrgCompanies,
|
45
|
+
queryResource: () => queryResource
|
37
46
|
});
|
38
47
|
module.exports = __toCommonJS(index_exports);
|
39
48
|
|
40
49
|
// src/utils/storage.ts
|
41
50
|
var Storage = class {
|
51
|
+
constructor() {
|
52
|
+
this.currentVersion = "1.0.0";
|
53
|
+
}
|
42
54
|
setSystemId(systemId) {
|
43
55
|
this.systemId = systemId;
|
44
56
|
}
|
57
|
+
/**
|
58
|
+
* Set the current version for new data
|
59
|
+
* If version changes, all existing data for this systemId will be cleared
|
60
|
+
*/
|
61
|
+
setVersion(version) {
|
62
|
+
if (this.currentVersion !== version) {
|
63
|
+
this.clear();
|
64
|
+
this.currentVersion = version;
|
65
|
+
} else {
|
66
|
+
this.currentVersion = version;
|
67
|
+
}
|
68
|
+
}
|
69
|
+
/**
|
70
|
+
* Get the current version
|
71
|
+
*/
|
72
|
+
getVersion() {
|
73
|
+
return this.currentVersion;
|
74
|
+
}
|
45
75
|
prefixKey(key) {
|
46
76
|
return this.systemId !== void 0 ? `systemId-${this.systemId}-${key}` : key;
|
47
77
|
}
|
@@ -51,24 +81,35 @@ var Storage = class {
|
|
51
81
|
setItem(key, value, expireMinutes) {
|
52
82
|
const data = {
|
53
83
|
value,
|
54
|
-
expire: expireMinutes ? Date.now() + expireMinutes * 60 * 1e3 : null
|
84
|
+
expire: expireMinutes ? Date.now() + expireMinutes * 60 * 1e3 : null,
|
85
|
+
version: this.currentVersion,
|
86
|
+
timestamp: Date.now()
|
55
87
|
};
|
56
88
|
localStorage.setItem(this.prefixKey(key), JSON.stringify(data));
|
57
89
|
}
|
58
90
|
/**
|
59
91
|
* Get an item from localStorage, returns undefined if expired or not found
|
92
|
+
* Automatically expires data if version is different
|
60
93
|
*/
|
61
94
|
getItem(key) {
|
62
95
|
const raw = localStorage.getItem(this.prefixKey(key));
|
63
96
|
if (!raw) return void 0;
|
64
97
|
try {
|
65
98
|
const data = JSON.parse(raw);
|
99
|
+
if (!data.version) {
|
100
|
+
data.version = "0.0.0";
|
101
|
+
}
|
66
102
|
if (data.expire && Date.now() > data.expire) {
|
67
103
|
localStorage.removeItem(this.prefixKey(key));
|
68
104
|
return void 0;
|
69
105
|
}
|
106
|
+
if (data.version !== this.currentVersion) {
|
107
|
+
localStorage.removeItem(this.prefixKey(key));
|
108
|
+
return void 0;
|
109
|
+
}
|
70
110
|
return data.value;
|
71
|
-
} catch {
|
111
|
+
} catch (error) {
|
112
|
+
console.error("Error parsing stored data:", error);
|
72
113
|
return void 0;
|
73
114
|
}
|
74
115
|
}
|
@@ -78,6 +119,44 @@ var Storage = class {
|
|
78
119
|
removeItem(key) {
|
79
120
|
localStorage.removeItem(this.prefixKey(key));
|
80
121
|
}
|
122
|
+
/**
|
123
|
+
* Clear all data for the current systemId
|
124
|
+
*/
|
125
|
+
clear() {
|
126
|
+
if (this.systemId !== void 0) {
|
127
|
+
const prefix = `systemId-${this.systemId}-`;
|
128
|
+
Object.keys(localStorage).filter((key) => key.startsWith(prefix)).forEach((key) => localStorage.removeItem(key));
|
129
|
+
}
|
130
|
+
}
|
131
|
+
/**
|
132
|
+
* Get all keys for the current systemId
|
133
|
+
*/
|
134
|
+
getKeys() {
|
135
|
+
if (this.systemId === void 0) {
|
136
|
+
return Object.keys(localStorage);
|
137
|
+
}
|
138
|
+
const prefix = `systemId-${this.systemId}-`;
|
139
|
+
return Object.keys(localStorage).filter((key) => key.startsWith(prefix)).map((key) => key.substring(prefix.length));
|
140
|
+
}
|
141
|
+
/**
|
142
|
+
* Check if a key exists
|
143
|
+
*/
|
144
|
+
hasKey(key) {
|
145
|
+
return localStorage.getItem(this.prefixKey(key)) !== null;
|
146
|
+
}
|
147
|
+
/**
|
148
|
+
* Get storage info for debugging
|
149
|
+
*/
|
150
|
+
getStorageInfo() {
|
151
|
+
const totalKeys = Object.keys(localStorage).length;
|
152
|
+
const systemKeys = this.getKeys().length;
|
153
|
+
return {
|
154
|
+
systemId: this.systemId,
|
155
|
+
currentVersion: this.currentVersion,
|
156
|
+
totalKeys,
|
157
|
+
systemKeys
|
158
|
+
};
|
159
|
+
}
|
81
160
|
};
|
82
161
|
var storage = new Storage();
|
83
162
|
|
@@ -233,8 +312,6 @@ var import_axios = __toESM(require("axios"));
|
|
233
312
|
var USER_INFO_KEY = "opms_user_info";
|
234
313
|
var RESOURCE_KEY = "opms_resources";
|
235
314
|
var TOKEN_KEY = "omps_authorization";
|
236
|
-
var ORG_COMPANY_KEY = "opms_org_company";
|
237
|
-
var USER_ORG_KEY = "opms_user_org";
|
238
315
|
|
239
316
|
// src/api.ts
|
240
317
|
var axiosClient = import_axios.default.create();
|
@@ -261,6 +338,17 @@ axiosClient.interceptors.response.use(
|
|
261
338
|
return Promise.reject(error);
|
262
339
|
}
|
263
340
|
);
|
341
|
+
var EnumOrgQueryMode = /* @__PURE__ */ ((EnumOrgQueryMode2) => {
|
342
|
+
EnumOrgQueryMode2["BY_ROLES"] = "BY_ROLES";
|
343
|
+
EnumOrgQueryMode2["BY_DEPT"] = "BY_DEPT";
|
344
|
+
return EnumOrgQueryMode2;
|
345
|
+
})(EnumOrgQueryMode || {});
|
346
|
+
var EnumOrgQueryScope = /* @__PURE__ */ ((EnumOrgQueryScope2) => {
|
347
|
+
EnumOrgQueryScope2["ONLY_BRANCH"] = "ONLY_BRANCH";
|
348
|
+
EnumOrgQueryScope2["STEWARD_UNIT"] = "STEWARD_UNIT";
|
349
|
+
EnumOrgQueryScope2["WITH_DEPARTMENT"] = "WITH_DEPARTMENT";
|
350
|
+
return EnumOrgQueryScope2;
|
351
|
+
})(EnumOrgQueryScope || {});
|
264
352
|
async function login(baseUrl, authorizationCode) {
|
265
353
|
return await axiosClient.get(
|
266
354
|
`${baseUrl}/opmsDefaultAuth/oauthLogin`,
|
@@ -286,9 +374,16 @@ async function queryResource(baseUrl, params) {
|
|
286
374
|
params
|
287
375
|
);
|
288
376
|
}
|
289
|
-
async function
|
377
|
+
async function getOrgTree(baseUrl, params) {
|
378
|
+
return await axiosClient.post(
|
379
|
+
`${baseUrl}/opmsDefaultUser/orgTree`,
|
380
|
+
params
|
381
|
+
);
|
382
|
+
}
|
383
|
+
async function getUserOrgTree(baseUrl, params) {
|
290
384
|
return await axiosClient.post(
|
291
|
-
`${baseUrl}/
|
385
|
+
`${baseUrl}/opmsDefaultUser/userOrgTree`,
|
386
|
+
params
|
292
387
|
);
|
293
388
|
}
|
294
389
|
async function queryOrgCompanies(baseUrl, params) {
|
@@ -363,8 +458,6 @@ var DataHandler = {
|
|
363
458
|
var Permission = class {
|
364
459
|
constructor(options) {
|
365
460
|
this._userInfo = null;
|
366
|
-
this._orgTree = null;
|
367
|
-
this._orgCompany = null;
|
368
461
|
this.resources = [];
|
369
462
|
this.resourceMap = {};
|
370
463
|
this.widgetMap = {};
|
@@ -373,6 +466,7 @@ var Permission = class {
|
|
373
466
|
this.baseUrl = options.baseUrl;
|
374
467
|
this.systemId = options.systemId;
|
375
468
|
storage.setSystemId(this.systemId);
|
469
|
+
storage.setVersion("1.0.0");
|
376
470
|
}
|
377
471
|
/**
|
378
472
|
* Login using code from URL, save userInfo
|
@@ -410,24 +504,12 @@ var Permission = class {
|
|
410
504
|
clearData && this.clear();
|
411
505
|
}
|
412
506
|
clear() {
|
413
|
-
|
414
|
-
this._orgTree = null;
|
415
|
-
this._orgCompany = null;
|
416
|
-
this.resources = [];
|
417
|
-
this.resourceMap = {};
|
418
|
-
this.widgetMap = {};
|
419
|
-
this.menuList = [];
|
420
|
-
this.menuMap = {};
|
421
|
-
storage.removeItem(RESOURCE_KEY);
|
422
|
-
storage.removeItem(TOKEN_KEY);
|
423
|
-
storage.removeItem(USER_INFO_KEY);
|
424
|
-
storage.removeItem(ORG_COMPANY_KEY);
|
507
|
+
storage.clear();
|
425
508
|
}
|
426
509
|
async getUserInfo() {
|
427
510
|
const data = await getUserInfo(this.baseUrl);
|
428
511
|
const { obj, success, msg, code } = data;
|
429
|
-
|
430
|
-
return this.userInfo;
|
512
|
+
return obj;
|
431
513
|
}
|
432
514
|
/**
|
433
515
|
* Get resources and process to menuList, menuMap, widgetMap (matches app store logic)
|
@@ -448,17 +530,12 @@ var Permission = class {
|
|
448
530
|
storage.setItem(
|
449
531
|
RESOURCE_KEY,
|
450
532
|
resources,
|
451
|
-
60 *
|
452
|
-
//
|
533
|
+
60 * 12
|
534
|
+
// 12 hours
|
453
535
|
);
|
454
536
|
}
|
455
537
|
const { resourceMap, widgetMap } = createResourceMap(resources);
|
456
538
|
const { menuList, menuMap } = createMenuList(resources);
|
457
|
-
this.resources = resources;
|
458
|
-
this.resourceMap = resourceMap;
|
459
|
-
this.widgetMap = widgetMap;
|
460
|
-
this.menuList = menuList;
|
461
|
-
this.menuMap = menuMap;
|
462
539
|
return {
|
463
540
|
resources,
|
464
541
|
resourceMap,
|
@@ -468,13 +545,28 @@ var Permission = class {
|
|
468
545
|
};
|
469
546
|
}
|
470
547
|
/**
|
471
|
-
*
|
548
|
+
* Generate cache key for user orgs query
|
472
549
|
*/
|
473
|
-
|
550
|
+
generateUserOrgsCacheKey(params) {
|
551
|
+
const sortedParams = Object.keys(params).sort().reduce((acc, key) => {
|
552
|
+
acc[key] = params[key];
|
553
|
+
return acc;
|
554
|
+
}, {});
|
555
|
+
return `user_orgs_${JSON.stringify(sortedParams)}`;
|
556
|
+
}
|
557
|
+
/**
|
558
|
+
* Query and process organization tree with caching
|
559
|
+
*/
|
560
|
+
async queryUserOrgs(params, config = { force: false, cacheTimeout: 2 }) {
|
474
561
|
try {
|
475
|
-
|
562
|
+
const { force, cacheTimeout = 2 } = config;
|
563
|
+
let orgTreeData = null;
|
564
|
+
if (!force) {
|
565
|
+
const cacheKey = this.generateUserOrgsCacheKey(params);
|
566
|
+
orgTreeData = storage.getItem(cacheKey) || null;
|
567
|
+
}
|
476
568
|
if (!orgTreeData) {
|
477
|
-
const res = await getUserOrgTree(this.baseUrl);
|
569
|
+
const res = await getUserOrgTree(this.baseUrl, params);
|
478
570
|
const { obj } = res;
|
479
571
|
orgTreeData = iterateNestedArray(obj, (item) => {
|
480
572
|
return {
|
@@ -489,33 +581,33 @@ var Permission = class {
|
|
489
581
|
orgId: item.orgId
|
490
582
|
};
|
491
583
|
});
|
492
|
-
|
584
|
+
const cacheKey = this.generateUserOrgsCacheKey(params);
|
585
|
+
storage.setItem(cacheKey, orgTreeData, cacheTimeout);
|
493
586
|
}
|
494
587
|
const data = handlePermissionTree(orgTreeData, "orgId");
|
495
|
-
const {
|
496
|
-
|
497
|
-
|
498
|
-
|
499
|
-
|
500
|
-
|
501
|
-
return { orgTree: orgTreeData, orgNoAuthMap: noAuthMap, authOrgTree: tree };
|
588
|
+
const { tree } = data;
|
589
|
+
return {
|
590
|
+
orgTree: tree
|
591
|
+
// orgNoAuthMap: noAuthMap,
|
592
|
+
// authOrgTree: tree,
|
593
|
+
};
|
502
594
|
} catch (error) {
|
503
595
|
console.log(error);
|
504
596
|
return null;
|
505
597
|
}
|
506
598
|
}
|
507
|
-
async queryCompanies() {
|
508
|
-
|
509
|
-
|
510
|
-
|
511
|
-
|
512
|
-
|
513
|
-
|
514
|
-
|
515
|
-
|
516
|
-
|
517
|
-
|
518
|
-
}
|
599
|
+
// async queryCompanies(): Promise<OrgRecord[]> {
|
600
|
+
// let orgCompanyList: OrgRecord[] | undefined =
|
601
|
+
// storage.getItem(ORG_COMPANY_KEY);
|
602
|
+
// if (!orgCompanyList) {
|
603
|
+
// const { obj } = await queryOrgCompanies(this.baseUrl, {
|
604
|
+
// queryAllBranches: true,
|
605
|
+
// });
|
606
|
+
// orgCompanyList = obj;
|
607
|
+
// storage.setItem(ORG_COMPANY_KEY, orgCompanyList);
|
608
|
+
// }
|
609
|
+
// return orgCompanyList;
|
610
|
+
// }
|
519
611
|
isLogin() {
|
520
612
|
return !!storage.getItem(TOKEN_KEY);
|
521
613
|
}
|
@@ -526,70 +618,74 @@ var Permission = class {
|
|
526
618
|
storage.setItem(TOKEN_KEY, token);
|
527
619
|
}
|
528
620
|
// --- Getters ---
|
529
|
-
get userInfo() {
|
530
|
-
|
531
|
-
|
532
|
-
|
533
|
-
|
534
|
-
|
535
|
-
|
536
|
-
}
|
537
|
-
get hasRootAuth() {
|
538
|
-
|
539
|
-
|
540
|
-
|
541
|
-
|
542
|
-
}
|
543
|
-
get userOrganizations() {
|
544
|
-
|
545
|
-
}
|
546
|
-
|
547
|
-
|
548
|
-
|
549
|
-
|
550
|
-
|
551
|
-
|
552
|
-
|
553
|
-
|
554
|
-
|
555
|
-
|
556
|
-
|
557
|
-
|
558
|
-
|
559
|
-
|
560
|
-
|
561
|
-
|
562
|
-
|
563
|
-
|
564
|
-
|
565
|
-
|
566
|
-
|
567
|
-
|
568
|
-
|
569
|
-
return this.companyOptions?.[0]?.value ?? "";
|
621
|
+
// get userInfo(): UserInfo | null {
|
622
|
+
// if (!this._userInfo) {
|
623
|
+
// this._userInfo = storage.getItem(USER_INFO_KEY);
|
624
|
+
// }
|
625
|
+
// if (!this._userInfo) return null;
|
626
|
+
// const { account, name, ehrId, crewCode, crewId } = this._userInfo;
|
627
|
+
// return { account, name, ehrId, crewCode, crewId };
|
628
|
+
// }
|
629
|
+
// get hasRootAuth() {
|
630
|
+
// const orgs = this._userInfo?.organizations || [];
|
631
|
+
// const first = orgs[0];
|
632
|
+
// if (!first) return false;
|
633
|
+
// return first.searchPath === '#1';
|
634
|
+
// }
|
635
|
+
// get userOrganizations(): UserOrganization[] {
|
636
|
+
// return this._userInfo?.userOrganizations || [];
|
637
|
+
// }
|
638
|
+
/**
|
639
|
+
* Get storage information for debugging and monitoring
|
640
|
+
*/
|
641
|
+
getStorageInfo() {
|
642
|
+
const keys = storage.getKeys();
|
643
|
+
const userOrgsCacheKeys = keys.filter((key) => key.startsWith("user_orgs_"));
|
644
|
+
return {
|
645
|
+
...storage.getStorageInfo(),
|
646
|
+
permissionKeys: {
|
647
|
+
resourceKey: RESOURCE_KEY,
|
648
|
+
tokenKey: TOKEN_KEY,
|
649
|
+
userInfoKey: USER_INFO_KEY
|
650
|
+
},
|
651
|
+
hasData: {
|
652
|
+
resources: storage.hasKey(RESOURCE_KEY),
|
653
|
+
token: storage.hasKey(TOKEN_KEY),
|
654
|
+
userInfo: storage.hasKey(USER_INFO_KEY)
|
655
|
+
},
|
656
|
+
cacheInfo: {
|
657
|
+
userOrgsCacheCount: userOrgsCacheKeys.length,
|
658
|
+
userOrgsCacheKeys
|
659
|
+
}
|
660
|
+
};
|
570
661
|
}
|
571
|
-
|
572
|
-
|
573
|
-
|
574
|
-
|
662
|
+
/**
|
663
|
+
* Get current storage version
|
664
|
+
*/
|
665
|
+
getStorageVersion() {
|
666
|
+
return storage.getVersion();
|
575
667
|
}
|
576
|
-
|
577
|
-
|
578
|
-
|
579
|
-
|
668
|
+
/**
|
669
|
+
* Clear all storage data for this system
|
670
|
+
*/
|
671
|
+
clearStorage() {
|
672
|
+
storage.clear();
|
580
673
|
}
|
581
|
-
|
582
|
-
|
583
|
-
|
674
|
+
/**
|
675
|
+
* Clear user orgs cache for specific parameters or all
|
676
|
+
*/
|
677
|
+
clearUserOrgsCache(params) {
|
678
|
+
if (params) {
|
679
|
+
const cacheKey = this.generateUserOrgsCacheKey(params);
|
680
|
+
storage.removeItem(cacheKey);
|
681
|
+
} else {
|
682
|
+
const keys = storage.getKeys();
|
683
|
+
keys.forEach((key) => {
|
684
|
+
if (key.startsWith("user_orgs_")) {
|
685
|
+
storage.removeItem(key);
|
686
|
+
}
|
687
|
+
});
|
584
688
|
}
|
585
|
-
const orgTree = this._orgTree;
|
586
|
-
if (!orgTree) return "";
|
587
|
-
return findFirstEnableCode(orgTree) ?? "";
|
588
|
-
}
|
589
|
-
get topLevelUnitOrgCodes() {
|
590
|
-
const orgTree = this._orgTree;
|
591
|
-
if (!orgTree) return [];
|
592
|
-
return DataHandler.topLevelUnitOrgCodes(orgTree);
|
593
689
|
}
|
594
690
|
};
|
595
691
|
|
@@ -630,7 +726,16 @@ function jumpToSSOLogout({
|
|
630
726
|
// Annotate the CommonJS export names for ESM import in node:
|
631
727
|
0 && (module.exports = {
|
632
728
|
DataHandler,
|
729
|
+
EnumOrgQueryMode,
|
730
|
+
EnumOrgQueryScope,
|
633
731
|
OpmsPermission,
|
732
|
+
getOrgTree,
|
733
|
+
getUserInfo,
|
734
|
+
getUserOrgTree,
|
634
735
|
jumpToSSOLogin,
|
635
|
-
jumpToSSOLogout
|
736
|
+
jumpToSSOLogout,
|
737
|
+
login,
|
738
|
+
logout,
|
739
|
+
queryOrgCompanies,
|
740
|
+
queryResource
|
636
741
|
});
|