@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.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,25 +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);
|
425
|
-
storage.removeItem(USER_ORG_KEY);
|
507
|
+
storage.clear();
|
426
508
|
}
|
427
509
|
async getUserInfo() {
|
428
510
|
const data = await getUserInfo(this.baseUrl);
|
429
511
|
const { obj, success, msg, code } = data;
|
430
|
-
|
431
|
-
return this.userInfo;
|
512
|
+
return obj;
|
432
513
|
}
|
433
514
|
/**
|
434
515
|
* Get resources and process to menuList, menuMap, widgetMap (matches app store logic)
|
@@ -449,17 +530,12 @@ var Permission = class {
|
|
449
530
|
storage.setItem(
|
450
531
|
RESOURCE_KEY,
|
451
532
|
resources,
|
452
|
-
60 *
|
453
|
-
//
|
533
|
+
60 * 12
|
534
|
+
// 12 hours
|
454
535
|
);
|
455
536
|
}
|
456
537
|
const { resourceMap, widgetMap } = createResourceMap(resources);
|
457
538
|
const { menuList, menuMap } = createMenuList(resources);
|
458
|
-
this.resources = resources;
|
459
|
-
this.resourceMap = resourceMap;
|
460
|
-
this.widgetMap = widgetMap;
|
461
|
-
this.menuList = menuList;
|
462
|
-
this.menuMap = menuMap;
|
463
539
|
return {
|
464
540
|
resources,
|
465
541
|
resourceMap,
|
@@ -469,13 +545,28 @@ var Permission = class {
|
|
469
545
|
};
|
470
546
|
}
|
471
547
|
/**
|
472
|
-
*
|
548
|
+
* Generate cache key for user orgs query
|
473
549
|
*/
|
474
|
-
|
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 }) {
|
475
561
|
try {
|
476
|
-
|
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
|
+
}
|
477
568
|
if (!orgTreeData) {
|
478
|
-
const res = await getUserOrgTree(this.baseUrl);
|
569
|
+
const res = await getUserOrgTree(this.baseUrl, params);
|
479
570
|
const { obj } = res;
|
480
571
|
orgTreeData = iterateNestedArray(obj, (item) => {
|
481
572
|
return {
|
@@ -490,33 +581,33 @@ var Permission = class {
|
|
490
581
|
orgId: item.orgId
|
491
582
|
};
|
492
583
|
});
|
493
|
-
|
584
|
+
const cacheKey = this.generateUserOrgsCacheKey(params);
|
585
|
+
storage.setItem(cacheKey, orgTreeData, cacheTimeout);
|
494
586
|
}
|
495
587
|
const data = handlePermissionTree(orgTreeData, "orgId");
|
496
|
-
const {
|
497
|
-
|
498
|
-
|
499
|
-
|
500
|
-
|
501
|
-
|
502
|
-
return { orgTree: orgTreeData, orgNoAuthMap: noAuthMap, authOrgTree: tree };
|
588
|
+
const { tree } = data;
|
589
|
+
return {
|
590
|
+
orgTree: tree
|
591
|
+
// orgNoAuthMap: noAuthMap,
|
592
|
+
// authOrgTree: tree,
|
593
|
+
};
|
503
594
|
} catch (error) {
|
504
595
|
console.log(error);
|
505
596
|
return null;
|
506
597
|
}
|
507
598
|
}
|
508
|
-
async queryCompanies() {
|
509
|
-
|
510
|
-
|
511
|
-
|
512
|
-
|
513
|
-
|
514
|
-
|
515
|
-
|
516
|
-
|
517
|
-
|
518
|
-
|
519
|
-
}
|
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
|
+
// }
|
520
611
|
isLogin() {
|
521
612
|
return !!storage.getItem(TOKEN_KEY);
|
522
613
|
}
|
@@ -527,70 +618,74 @@ var Permission = class {
|
|
527
618
|
storage.setItem(TOKEN_KEY, token);
|
528
619
|
}
|
529
620
|
// --- Getters ---
|
530
|
-
get userInfo() {
|
531
|
-
|
532
|
-
|
533
|
-
|
534
|
-
|
535
|
-
|
536
|
-
|
537
|
-
}
|
538
|
-
get hasRootAuth() {
|
539
|
-
|
540
|
-
|
541
|
-
|
542
|
-
|
543
|
-
}
|
544
|
-
get userOrganizations() {
|
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
|
-
|
570
|
-
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
|
+
};
|
571
661
|
}
|
572
|
-
|
573
|
-
|
574
|
-
|
575
|
-
|
662
|
+
/**
|
663
|
+
* Get current storage version
|
664
|
+
*/
|
665
|
+
getStorageVersion() {
|
666
|
+
return storage.getVersion();
|
576
667
|
}
|
577
|
-
|
578
|
-
|
579
|
-
|
580
|
-
|
668
|
+
/**
|
669
|
+
* Clear all storage data for this system
|
670
|
+
*/
|
671
|
+
clearStorage() {
|
672
|
+
storage.clear();
|
581
673
|
}
|
582
|
-
|
583
|
-
|
584
|
-
|
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
|
+
});
|
585
688
|
}
|
586
|
-
const orgTree = this._orgTree;
|
587
|
-
if (!orgTree) return "";
|
588
|
-
return findFirstEnableCode(orgTree) ?? "";
|
589
|
-
}
|
590
|
-
get topLevelUnitOrgCodes() {
|
591
|
-
const orgTree = this._orgTree;
|
592
|
-
if (!orgTree) return [];
|
593
|
-
return DataHandler.topLevelUnitOrgCodes(orgTree);
|
594
689
|
}
|
595
690
|
};
|
596
691
|
|
@@ -631,7 +726,16 @@ function jumpToSSOLogout({
|
|
631
726
|
// Annotate the CommonJS export names for ESM import in node:
|
632
727
|
0 && (module.exports = {
|
633
728
|
DataHandler,
|
729
|
+
EnumOrgQueryMode,
|
730
|
+
EnumOrgQueryScope,
|
634
731
|
OpmsPermission,
|
732
|
+
getOrgTree,
|
733
|
+
getUserInfo,
|
734
|
+
getUserOrgTree,
|
635
735
|
jumpToSSOLogin,
|
636
|
-
jumpToSSOLogout
|
736
|
+
jumpToSSOLogout,
|
737
|
+
login,
|
738
|
+
logout,
|
739
|
+
queryOrgCompanies,
|
740
|
+
queryResource
|
637
741
|
});
|