@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.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 getUserOrgTree(baseUrl) {
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}/user/orgTree`
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
- this._userInfo = null;
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
- this._userInfo = obj;
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 * 24
414
- // 24 hours
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
- * Query and process organization tree
500
+ * Generate cache key for user orgs query
434
501
  */
435
- async queryUserOrgs() {
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
- let orgTreeData = storage.getItem(USER_ORG_KEY) || null;
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
- storage.setItem(USER_ORG_KEY, orgTreeData);
536
+ const cacheKey = this.generateUserOrgsCacheKey(params);
537
+ storage.setItem(cacheKey, orgTreeData, cacheTimeout);
455
538
  }
456
539
  const data = handlePermissionTree(orgTreeData, "orgId");
457
- const { noAuthMap } = data;
458
- let { tree } = data;
459
- if (tree.length === 1 && tree[0].orgType === "HEAD" && tree[0].disabled) {
460
- tree = tree[0].children || [];
461
- }
462
- this._orgTree = orgTreeData;
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
- let orgCompanyList = storage.getItem(ORG_COMPANY_KEY);
471
- if (!orgCompanyList) {
472
- const { obj } = await queryOrgCompanies(this.baseUrl, {
473
- queryAllBranches: true
474
- });
475
- orgCompanyList = obj;
476
- storage.setItem(ORG_COMPANY_KEY, orgCompanyList);
477
- }
478
- this._orgCompany = orgCompanyList;
479
- return orgCompanyList;
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
- if (!this._userInfo) {
493
- this._userInfo = storage.getItem(USER_INFO_KEY);
494
- }
495
- if (!this._userInfo) return null;
496
- const { account, name, ehrId, crewCode, crewId } = this._userInfo;
497
- return { account, name, ehrId, crewCode, crewId };
498
- }
499
- get hasRootAuth() {
500
- const orgs = this._userInfo?.organizations || [];
501
- const first = orgs[0];
502
- if (!first) return false;
503
- return first.searchPath === "#1";
504
- }
505
- get userOrganizations() {
506
- return this._userInfo?.userOrganizations || [];
507
- }
508
- get allCompanyOptions() {
509
- const orgCompany = this._orgCompany;
510
- if (!orgCompany) return [];
511
- const list = orgCompany.map((v) => ({
512
- label: v.orgName,
513
- value: v.orgCode
514
- }));
515
- list.unshift({ label: "\u5168\u516C\u53F8", value: "EA" });
516
- return list;
517
- }
518
- get companyOptions() {
519
- const orgTree = this._orgTree;
520
- if (!orgTree) return [];
521
- const list = orgTree.map(({ children, ...others }) => ({
522
- ...others,
523
- disabled: false
524
- }));
525
- if (this.hasRootAuth) {
526
- list.unshift({ ...orgTree, label: "\u5168\u516C\u53F8", children: [] });
527
- }
528
- return list;
529
- }
530
- get firstCompanyOrgCode() {
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
- get unitOptions() {
534
- const orgTree = this._orgTree;
535
- if (!orgTree) return [];
536
- return orgTree;
614
+ /**
615
+ * Get current storage version
616
+ */
617
+ getStorageVersion() {
618
+ return storage.getVersion();
537
619
  }
538
- get allUnitOptions() {
539
- const orgTree = this._orgTree;
540
- if (!orgTree) return [];
541
- return DataHandler.getAllUnitOptions(orgTree);
620
+ /**
621
+ * Clear all storage data for this system
622
+ */
623
+ clearStorage() {
624
+ storage.clear();
542
625
  }
543
- get firstUnitOrgCode() {
544
- if (this.hasRootAuth) {
545
- return this.companyOptions[1]?.value ?? "";
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
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mu-cabin/opms-permission",
3
- "version": "0.8.35",
3
+ "version": "0.9.1",
4
4
  "description": "Frontend SDK for OPMS permission and auth management.",
5
5
  "main": "./dist/index.cjs",
6
6
  "module": "./dist/index.mjs",