@rytass/bpm-core-nestjs-module 0.4.0 → 0.5.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/CHANGELOG.md CHANGED
@@ -9,6 +9,52 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
9
9
  Releases are managed by [`nx release`](https://nx.dev/recipes/nx-release) with
10
10
  Conventional Commits — see `nx.json` for the release config.
11
11
 
12
+ ## 0.5.1 — 2026-07-06
13
+
14
+ ### Fixed
15
+
16
+ - **Broken 0.5.0 tarball.** 0.5.0 was published from the project source root, so
17
+ the npm tarball shipped only TypeScript sources (`src/*.ts`, tsconfig, jest
18
+ config) with no compiled `.js`/`.d.ts`, while `main`/`exports` point at
19
+ `./src/index.js` — downstream installs failed with webpack
20
+ `Module not found` and NestJS `require` errors. 0.5.1 is republished from the
21
+ build output (`dist/libs/bpm-core`), which contains the compiled `.js` +
22
+ `.d.ts` and a `generatePackageJson` manifest.
23
+
24
+ ### Changed
25
+
26
+ - Configured the `nx-release-publish` target with
27
+ `packageRoot: dist/libs/bpm-core` so `nx release publish` always publishes the
28
+ build artifacts instead of the source root, preventing a recurrence. No API or
29
+ runtime source changes from 0.5.0.
30
+
31
+ ## 0.5.0 — 2026-07-06
32
+
33
+ ### Added
34
+
35
+ - Optional `searchPaged(searchText, { page, pageSize })` on `BPMMemberResolver`
36
+ (returning `{ items, total }`) and the matching optional `searchMembersPaged`
37
+ on `BPMMemberBaseDirectory`. When a host implements it, BPM delegates
38
+ pagination and total counting to the host's source (e.g. DB `LIMIT/OFFSET` +
39
+ `COUNT`) instead of pulling everything through the ~50-cap member-picker
40
+ `search` and paginating in memory. New exported types `BPMMemberSearchPage`,
41
+ `BPMMemberSearchPageOptions`, and `BPMMemberBaseSearchPage`.
42
+
43
+ ### Changed
44
+
45
+ - `searchMembers` and `memberCount` (via `IdentityService`) now detect the new
46
+ `searchPaged` capability: present → real paged delegation with an accurate
47
+ total and per-id `member_metadata_cache` backfill of the returned page;
48
+ absent → the pre-0.5.0 `search`-and-slice-in-memory path, unchanged. The
49
+ `search?` contract is clarified as member-picker-only (~50 matches, not
50
+ paginated).
51
+ - Peer dependency `@rytass/bpm-core-shared` now requires ^0.5.0.
52
+
53
+ > Behavior note: hosts that have **not** implemented `searchMembersPaged` still
54
+ > see the admin members list (`admin/users`) capped by whatever their `search()`
55
+ > returns (~50 rows) with a matching total. Implement `searchMembersPaged` to
56
+ > page a larger directory and report the true total.
57
+
12
58
  ## 0.4.0 — 2026-07-02
13
59
 
14
60
  ### Added
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rytass/bpm-core-nestjs-module",
3
- "version": "0.4.0",
3
+ "version": "0.5.1",
4
4
  "description": "Embeddable NestJS BPM approval workflow module: workflow engine, approval templates, forms, organization/member contracts, attachments, signatures, notifications, delegation, and TypeORM migrations.",
5
5
  "keywords": [
6
6
  "bpm",
@@ -141,7 +141,7 @@
141
141
  "@nestjs/core": "^11.0.0",
142
142
  "@nestjs/graphql": "^13.4.0",
143
143
  "@nestjs/typeorm": "^11.0.1",
144
- "@rytass/bpm-core-shared": "^0.4.0",
144
+ "@rytass/bpm-core-shared": "^0.5.0",
145
145
  "@rytass/secret-adapter-vault-nestjs": "^0.4.5 || ^0.5.0",
146
146
  "express": "^4.0.0 || ^5.0.0",
147
147
  "graphql": "^16.0.0",
@@ -17,6 +17,15 @@ export declare class IdentityService {
17
17
  listCachedMembers(): Promise<readonly MemberMetadataCacheEntity[]>;
18
18
  countMembers(searchText: string): Promise<number>;
19
19
  searchMembers(searchText: string, options?: SearchMembersOptions): Promise<readonly MemberMetadata[]>;
20
+ /**
21
+ * Backfills the per-id `member_metadata_cache` rows for members
22
+ * returned by a paged search, reusing the same row entities and TTL as
23
+ * `resolveMany`. Unlike `resolveMany` (which only rewrites rows it had
24
+ * to re-fetch), every returned member is refreshed here since a paged
25
+ * search always carries authoritative host data. The page query itself
26
+ * is never row-cached; only the individual member metadata is.
27
+ */
28
+ private cacheMemberMetadata;
20
29
  private searchAllMembers;
21
30
  }
22
31
  export {};
@@ -103,16 +103,71 @@ let IdentityService = class IdentityService {
103
103
  return this.cacheRepository.find({ order: { memberId: 'ASC' } });
104
104
  }
105
105
  async countMembers(searchText) {
106
+ if (this.memberResolver.searchPaged) {
107
+ const page = await this.memberResolver.searchPaged(searchText, {
108
+ page: DEFAULT_MEMBER_PAGE,
109
+ pageSize: 1,
110
+ });
111
+ return page.total;
112
+ }
106
113
  const members = await this.searchAllMembers(searchText);
107
114
  return members.length;
108
115
  }
109
116
  async searchMembers(searchText, options = {}) {
117
+ const wantsPagination = options.page !== undefined || options.pageSize !== undefined;
118
+ if (wantsPagination && this.memberResolver.searchPaged) {
119
+ const page = await this.memberResolver.searchPaged(searchText, {
120
+ page: normalizePage(options.page),
121
+ pageSize: normalizePageSize(options.pageSize),
122
+ });
123
+ await this.cacheMemberMetadata(page.items);
124
+ return page.items;
125
+ }
110
126
  const members = await this.searchAllMembers(searchText);
111
- if (options.page === undefined && options.pageSize === undefined) {
127
+ if (!wantsPagination) {
112
128
  return members;
113
129
  }
114
130
  return paginateMembers(members, options);
115
131
  }
132
+ /**
133
+ * Backfills the per-id `member_metadata_cache` rows for members
134
+ * returned by a paged search, reusing the same row entities and TTL as
135
+ * `resolveMany`. Unlike `resolveMany` (which only rewrites rows it had
136
+ * to re-fetch), every returned member is refreshed here since a paged
137
+ * search always carries authoritative host data. The page query itself
138
+ * is never row-cached; only the individual member metadata is.
139
+ */
140
+ async cacheMemberMetadata(members) {
141
+ if (members.length === 0) {
142
+ return;
143
+ }
144
+ const now = new Date();
145
+ const expiresAt = new Date(now.getTime() + this.identityOptions.memberMetadataCacheTtlMs);
146
+ const memberIds = members.map((member) => member.memberId);
147
+ const existingRows = await this.cacheRepository.find({
148
+ where: { memberId: (0, typeorm_2.In)([...memberIds]) },
149
+ });
150
+ const existingRowByMemberId = new Map(existingRows.map((row) => [
151
+ row.memberId,
152
+ row,
153
+ ]));
154
+ const seenMemberIds = new Set();
155
+ const entitiesToSave = [];
156
+ for (const metadata of members) {
157
+ if (seenMemberIds.has(metadata.memberId)) {
158
+ continue;
159
+ }
160
+ seenMemberIds.add(metadata.memberId);
161
+ const cacheEntity = existingRowByMemberId.get(metadata.memberId) ??
162
+ new member_metadata_cache_entity_1.MemberMetadataCacheEntity();
163
+ cacheEntity.memberId = metadata.memberId;
164
+ cacheEntity.metadata = metadata;
165
+ cacheEntity.fetchedAt = now;
166
+ cacheEntity.expiresAt = expiresAt;
167
+ entitiesToSave.push(cacheEntity);
168
+ }
169
+ await this.cacheRepository.save(entitiesToSave);
170
+ }
116
171
  async searchAllMembers(searchText) {
117
172
  if (this.memberResolver.search) {
118
173
  return this.memberResolver.search(searchText);
@@ -1 +1 @@
1
- {"version":3,"file":"identity.service.js","sourceRoot":"","sources":["../../../../../../libs/bpm-core/src/lib/identity/identity.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"identity.service.js","sourceRoot":"","sources":["../../../../../../libs/bpm-core/src/lib/identity/identity.service.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { InjectionToken, Provider } from '@nestjs/common';
2
2
  import { MemberMetadata } from '@rytass/bpm-core-shared';
3
3
  import { BPMAuthContext } from '../bpm-auth';
4
- import { BPMMemberResolver } from './member-resolver.interface';
4
+ import { BPMMemberResolver, BPMMemberSearchPage, BPMMemberSearchPageOptions } from './member-resolver.interface';
5
5
  /**
6
6
  * Structural contract a host identity backend should implement (or a thin
7
7
  * adapter wrap) so BPM can be plugged into any `member-base`-style
@@ -15,6 +15,27 @@ export interface BPMMemberBaseDirectory<TMember> {
15
15
  readonly resolveMember: (memberId: string) => Promise<TMember | null>;
16
16
  readonly resolveMembers?: (memberIds: readonly string[]) => Promise<readonly TMember[]>;
17
17
  readonly searchMembers?: (searchText: string) => Promise<readonly TMember[]>;
18
+ /**
19
+ * Optional paged directory search. Implement this (in addition to, or
20
+ * instead of, `searchMembers`) to let BPM page through a directory
21
+ * larger than `searchMembers`' member-picker cap and report an
22
+ * accurate total on the admin members list. `page` is 1-based and
23
+ * already normalized/clamped by BPM. Return the requested slice as
24
+ * `items` and the full match count as `total`. When omitted, the
25
+ * adapter's `searchPaged` stays `undefined` and BPM falls back to the
26
+ * `searchMembers`-and-slice path.
27
+ */
28
+ readonly searchMembersPaged?: (searchText: string, options: BPMMemberSearchPageOptions) => Promise<BPMMemberBaseSearchPage<TMember>>;
29
+ }
30
+ /**
31
+ * Host-shaped page returned by
32
+ * {@link BPMMemberBaseDirectory.searchMembersPaged}. The adapter maps
33
+ * each `TMember` in `items` through the field readers into
34
+ * {@link MemberMetadata} and forwards `total` unchanged.
35
+ */
36
+ export interface BPMMemberBaseSearchPage<TMember> {
37
+ readonly items: readonly TMember[];
38
+ readonly total: number;
18
39
  }
19
40
  /**
20
41
  * Per-host field readers that tell the adapter how to extract canonical
@@ -44,6 +65,13 @@ export interface BPMMemberBaseResolverProviderOptions<TMember> {
44
65
  export declare class BPMMemberBaseResolverAdapter<TMember> implements BPMMemberResolver {
45
66
  private readonly directory;
46
67
  private readonly options;
68
+ /**
69
+ * Present only when the wrapped directory implements
70
+ * `searchMembersPaged`. Left `undefined` otherwise so `IdentityService`
71
+ * capability detection falls back to the `search`-and-slice path,
72
+ * preserving pre-0.5.0 behavior.
73
+ */
74
+ readonly searchPaged?: (searchText: string, options: BPMMemberSearchPageOptions) => Promise<BPMMemberSearchPage>;
47
75
  constructor(directory: BPMMemberBaseDirectory<TMember>, options?: BPMMemberBaseAdapterOptions<TMember>);
48
76
  resolve(memberId: string): Promise<MemberMetadata>;
49
77
  resolveMany(memberIds: readonly string[]): Promise<ReadonlyMap<string, MemberMetadata>>;
@@ -8,6 +8,16 @@ class BPMMemberBaseResolverAdapter {
8
8
  constructor(directory, options = {}) {
9
9
  this.directory = directory;
10
10
  this.options = options;
11
+ const searchMembersPaged = directory.searchMembersPaged;
12
+ if (searchMembersPaged) {
13
+ this.searchPaged = async (searchText, pageOptions) => {
14
+ const page = await searchMembersPaged(searchText, pageOptions);
15
+ return {
16
+ items: page.items.map((member) => readMemberMetadataFromMemberBaseMember(member, this.options)),
17
+ total: page.total,
18
+ };
19
+ };
20
+ }
11
21
  }
12
22
  async resolve(memberId) {
13
23
  const member = await this.directory.resolveMember(memberId);
@@ -1 +1 @@
1
- {"version":3,"file":"member-base.adapter.js","sourceRoot":"","sources":["../../../../../../libs/bpm-core/src/lib/identity/member-base.adapter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"member-base.adapter.js","sourceRoot":"","sources":["../../../../../../libs/bpm-core/src/lib/identity/member-base.adapter.ts"],"names":[],"mappings":"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"}
@@ -46,9 +46,20 @@ export declare const MEMBER_RESOLVER: symbol;
46
46
  * as deleted/anonymized members and renders a placeholder. Throwing
47
47
  * here aborts the entire batch and fails the GraphQL query — almost
48
48
  * never the right choice.
49
- * - `search(text)` is optional. When omitted, BPM's `searchMembers`
50
- * GraphQL query returns an empty array (the picker UI degrades to
51
- * id-only entry).
49
+ * - `search(text)` is the **member-picker** contract: an optional,
50
+ * non-paginated fuzzy search that returns up to ~50 best matches. When
51
+ * omitted, BPM's `searchMembers` GraphQL query returns an empty array
52
+ * (the picker UI degrades to id-only entry). It is **not** meant to
53
+ * back a full member-directory listing page — see `searchPaged`.
54
+ * - `searchPaged(text, { page, pageSize })` is the optional **directory
55
+ * listing** contract. When implemented, BPM delegates pagination and
56
+ * total counting to the host (typically DB-level `LIMIT/OFFSET` + `COUNT`)
57
+ * instead of fetching everything through `search` and paginating in
58
+ * memory. This is what the admin members list (`admin/users`) needs to
59
+ * page through a directory larger than `search`'s ~50-row cap and to
60
+ * report an accurate total. When omitted, BPM falls back to
61
+ * `search`-and-slice, so the listing page is capped by whatever `search`
62
+ * returns (backwards-compatible with pre-0.5.0 hosts).
52
63
  *
53
64
  * Implementations may de-duplicate within a single call freely.
54
65
  */
@@ -66,11 +77,47 @@ export interface BPMMemberResolver {
66
77
  */
67
78
  resolveMany(memberIds: readonly string[]): Promise<ReadonlyMap<string, MemberMetadata>>;
68
79
  /**
69
- * Optional free-text search. Return up to ~50 best matches; BPM does
70
- * not paginate the result. Omit the method entirely to disable
71
- * member-picker search.
80
+ * Optional **member-picker** free-text search. Return up to ~50 best
81
+ * matches; BPM does not paginate the result. Omit the method entirely
82
+ * to disable member-picker search. This contract is intentionally
83
+ * non-paginated — to back a full directory listing page implement
84
+ * {@link BPMMemberResolver.searchPaged} instead.
72
85
  */
73
86
  search?(searchText: string): Promise<readonly MemberMetadata[]>;
87
+ /**
88
+ * Optional **directory-listing** paged search. When present, BPM
89
+ * delegates both pagination and total counting to the host — the
90
+ * host is expected to page at the source (e.g. DB `LIMIT/OFFSET`) and
91
+ * return an accurate `total` — bypassing the `search`-and-slice-in-
92
+ * memory path that caps the listing at `search`'s ~50 rows.
93
+ *
94
+ * `page` is 1-based and `pageSize` is the number of rows per page;
95
+ * BPM normalizes and clamps both before calling (see the identity
96
+ * service pagination defaults). BPM row-caches the returned `items`
97
+ * under the same TTL as `resolve`/`resolveMany`, but never caches the
98
+ * page query itself. Omit the method to keep the pre-0.5.0
99
+ * `search`-backed behavior.
100
+ */
101
+ searchPaged?(searchText: string, options: BPMMemberSearchPageOptions): Promise<BPMMemberSearchPage>;
102
+ }
103
+ /**
104
+ * Pagination request passed to {@link BPMMemberResolver.searchPaged}.
105
+ * `page` is 1-based; `pageSize` is the page length. BPM normalizes both
106
+ * to sane, clamped values before delegating, so hosts can trust them.
107
+ */
108
+ export interface BPMMemberSearchPageOptions {
109
+ readonly page: number;
110
+ readonly pageSize: number;
111
+ }
112
+ /**
113
+ * A single page of member search results returned by
114
+ * {@link BPMMemberResolver.searchPaged}. `items` is the requested slice
115
+ * (already limited to `pageSize`); `total` is the full unpaginated match
116
+ * count used by the `memberCount` GraphQL query.
117
+ */
118
+ export interface BPMMemberSearchPage {
119
+ readonly items: readonly MemberMetadata[];
120
+ readonly total: number;
74
121
  }
75
122
  /**
76
123
  * @deprecated Use {@link BPMMemberResolver}. Kept as a backwards-compatible