@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 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 getUserOrgTree(baseUrl) {
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}/user/orgTree`
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
- this._userInfo = null;
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
- this._userInfo = obj;
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 * 24
453
- // 24 hours
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
- * Query and process organization tree
548
+ * Generate cache key for user orgs query
473
549
  */
474
- async queryUserOrgs() {
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
- let orgTreeData = storage.getItem(USER_ORG_KEY) || null;
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
- storage.setItem(USER_ORG_KEY, orgTreeData);
584
+ const cacheKey = this.generateUserOrgsCacheKey(params);
585
+ storage.setItem(cacheKey, orgTreeData, cacheTimeout);
494
586
  }
495
587
  const data = handlePermissionTree(orgTreeData, "orgId");
496
- const { noAuthMap } = data;
497
- let { tree } = data;
498
- if (tree.length === 1 && tree[0].orgType === "HEAD" && tree[0].disabled) {
499
- tree = tree[0].children || [];
500
- }
501
- this._orgTree = orgTreeData;
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
- let orgCompanyList = storage.getItem(ORG_COMPANY_KEY);
510
- if (!orgCompanyList) {
511
- const { obj } = await queryOrgCompanies(this.baseUrl, {
512
- queryAllBranches: true
513
- });
514
- orgCompanyList = obj;
515
- storage.setItem(ORG_COMPANY_KEY, orgCompanyList);
516
- }
517
- this._orgCompany = orgCompanyList;
518
- return orgCompanyList;
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
- if (!this._userInfo) {
532
- this._userInfo = storage.getItem(USER_INFO_KEY);
533
- }
534
- if (!this._userInfo) return null;
535
- const { account, name, ehrId, crewCode, crewId } = this._userInfo;
536
- return { account, name, ehrId, crewCode, crewId };
537
- }
538
- get hasRootAuth() {
539
- const orgs = this._userInfo?.organizations || [];
540
- const first = orgs[0];
541
- if (!first) return false;
542
- return first.searchPath === "#1";
543
- }
544
- get userOrganizations() {
545
- return this._userInfo?.userOrganizations || [];
546
- }
547
- get allCompanyOptions() {
548
- const orgCompany = this._orgCompany;
549
- if (!orgCompany) return [];
550
- const list = orgCompany.map((v) => ({
551
- label: v.orgName,
552
- value: v.orgCode
553
- }));
554
- list.unshift({ label: "\u5168\u516C\u53F8", value: "EA" });
555
- return list;
556
- }
557
- get companyOptions() {
558
- const orgTree = this._orgTree;
559
- if (!orgTree) return [];
560
- const list = orgTree.map(({ children, ...others }) => ({
561
- ...others,
562
- disabled: false
563
- }));
564
- if (this.hasRootAuth) {
565
- list.unshift({ ...orgTree, label: "\u5168\u516C\u53F8", children: [] });
566
- }
567
- return list;
568
- }
569
- get firstCompanyOrgCode() {
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
- get unitOptions() {
573
- const orgTree = this._orgTree;
574
- if (!orgTree) return [];
575
- return orgTree;
662
+ /**
663
+ * Get current storage version
664
+ */
665
+ getStorageVersion() {
666
+ return storage.getVersion();
576
667
  }
577
- get allUnitOptions() {
578
- const orgTree = this._orgTree;
579
- if (!orgTree) return [];
580
- return DataHandler.getAllUnitOptions(orgTree);
668
+ /**
669
+ * Clear all storage data for this system
670
+ */
671
+ clearStorage() {
672
+ storage.clear();
581
673
  }
582
- get firstUnitOrgCode() {
583
- if (this.hasRootAuth) {
584
- return this.companyOptions[1]?.value ?? "";
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
  });