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