@memberjunction/ng-list-management 0.0.1 → 3.0.0
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/lib/components/list-management-dialog/list-management-dialog.component.d.ts +170 -0
- package/dist/lib/components/list-management-dialog/list-management-dialog.component.d.ts.map +1 -0
- package/dist/lib/components/list-management-dialog/list-management-dialog.component.js +943 -0
- package/dist/lib/components/list-management-dialog/list-management-dialog.component.js.map +1 -0
- package/dist/lib/components/list-share-dialog/list-share-dialog.component.d.ts +137 -0
- package/dist/lib/components/list-share-dialog/list-share-dialog.component.d.ts.map +1 -0
- package/dist/lib/components/list-share-dialog/list-share-dialog.component.js +658 -0
- package/dist/lib/components/list-share-dialog/list-share-dialog.component.js.map +1 -0
- package/dist/lib/models/list-management.models.d.ts +206 -0
- package/dist/lib/models/list-management.models.d.ts.map +1 -0
- package/dist/lib/models/list-management.models.js +2 -0
- package/dist/lib/models/list-management.models.js.map +1 -0
- package/dist/lib/models/list-sharing.models.d.ts +193 -0
- package/dist/lib/models/list-sharing.models.d.ts.map +1 -0
- package/dist/lib/models/list-sharing.models.js +2 -0
- package/dist/lib/models/list-sharing.models.js.map +1 -0
- package/dist/lib/module.d.ts +44 -0
- package/dist/lib/module.d.ts.map +1 -0
- package/dist/lib/module.js +101 -0
- package/dist/lib/module.js.map +1 -0
- package/dist/lib/services/list-management.service.d.ts +69 -0
- package/dist/lib/services/list-management.service.d.ts.map +1 -0
- package/dist/lib/services/list-management.service.js +411 -0
- package/dist/lib/services/list-management.service.js.map +1 -0
- package/dist/lib/services/list-sharing.service.d.ts +98 -0
- package/dist/lib/services/list-sharing.service.d.ts.map +1 -0
- package/dist/lib/services/list-sharing.service.js +483 -0
- package/dist/lib/services/list-sharing.service.js.map +1 -0
- package/dist/public-api.d.ts +13 -0
- package/dist/public-api.d.ts.map +1 -0
- package/dist/public-api.js +23 -0
- package/dist/public-api.js.map +1 -0
- package/package.json +48 -6
- package/README.md +0 -45
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-management.service.d.ts","sourceRoot":"","sources":["../../../src/lib/services/list-management.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAoB,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACjG,OAAO,EAAmB,UAAU,EAAE,MAAM,MAAM,CAAC;AACnD,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EAEpB,gBAAgB,EACjB,MAAM,kCAAkC,CAAC;;AAO1C;;;GAGG;AACH,qBAGa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAiB;IAG9C,OAAO,CAAC,SAAS,CAA+C;IAChE,OAAO,CAAC,aAAa,CAAiD;IACtE,OAAO,CAAC,eAAe,CAAwD;IAG/E,OAAO,CAAC,cAAc,CAAuC;IACtD,QAAQ,EAAE,UAAU,CAAC,OAAO,CAAC,CAAsC;;IAI1E;;OAEG;IACG,iBAAiB,CACrB,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,MAAM,EACf,YAAY,GAAE,OAAe,GAC5B,OAAO,CAAC,UAAU,EAAE,CAAC;IA4CxB;;OAEG;IACG,iBAAiB,CAAC,YAAY,GAAE,OAAe,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAuBrF;;;OAGG;IACG,mBAAmB,CACvB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EAAE,GAClB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAiDjC;;OAEG;IACG,iBAAiB,CACrB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,UAAU,EAAE,CAAC;IA2BxB;;OAEG;IACG,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAWvD;;OAEG;IACG,mBAAmB,CACvB,KAAK,EAAE,UAAU,EAAE,EACnB,SAAS,EAAE,MAAM,EAAE,EACnB,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAChC,OAAO,CAAC,iBAAiB,EAAE,CAAC;IA+C/B;;OAEG;IACG,iBAAiB,CACrB,OAAO,EAAE,MAAM,EAAE,EACjB,SAAS,EAAE,MAAM,EAAE,EACnB,cAAc,GAAE,OAAc,GAC7B,OAAO,CAAC,oBAAoB,CAAC;IAkGhC;;OAEG;IACG,sBAAsB,CAC1B,OAAO,EAAE,MAAM,EAAE,EACjB,SAAS,EAAE,MAAM,EAAE,GAClB,OAAO,CAAC,oBAAoB,CAAC;IAiDhC;;OAEG;IACG,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IA6BtE;;OAEG;IACH,OAAO,CAAC,YAAY;IAMpB;;OAEG;IACH,eAAe,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;IAUxC;;OAEG;IACH,OAAO,CAAC,mBAAmB;yCAjdhB,qBAAqB;6CAArB,qBAAqB;CAydjC"}
|
|
@@ -0,0 +1,411 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { Metadata, RunView } from '@memberjunction/core';
|
|
3
|
+
import { BehaviorSubject } from 'rxjs';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
/**
|
|
6
|
+
* Service for managing list operations including data loading, caching,
|
|
7
|
+
* and batch add/remove operations.
|
|
8
|
+
*/
|
|
9
|
+
export class ListManagementService {
|
|
10
|
+
CACHE_TTL_MS = 5 * 60 * 1000; // 5 minutes
|
|
11
|
+
// Cache storage
|
|
12
|
+
listCache = new Map();
|
|
13
|
+
categoryCache = null;
|
|
14
|
+
membershipCache = new Map();
|
|
15
|
+
// Loading state subjects
|
|
16
|
+
loadingSubject = new BehaviorSubject(false);
|
|
17
|
+
loading$ = this.loadingSubject.asObservable();
|
|
18
|
+
constructor() { }
|
|
19
|
+
/**
|
|
20
|
+
* Get lists for a specific entity, with optional caching
|
|
21
|
+
*/
|
|
22
|
+
async getListsForEntity(entityId, userId, forceRefresh = false) {
|
|
23
|
+
const cacheKey = `${entityId}_${userId || 'all'}`;
|
|
24
|
+
// Check cache first
|
|
25
|
+
if (!forceRefresh) {
|
|
26
|
+
const cached = this.listCache.get(cacheKey);
|
|
27
|
+
if (cached && this.isCacheValid(cached)) {
|
|
28
|
+
return cached.data;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
this.loadingSubject.next(true);
|
|
32
|
+
try {
|
|
33
|
+
const rv = new RunView();
|
|
34
|
+
let filter = `EntityID = '${entityId}'`;
|
|
35
|
+
if (userId) {
|
|
36
|
+
filter += ` AND UserID = '${userId}'`;
|
|
37
|
+
}
|
|
38
|
+
const result = await rv.RunView({
|
|
39
|
+
EntityName: 'Lists',
|
|
40
|
+
ExtraFilter: filter,
|
|
41
|
+
OrderBy: 'Name',
|
|
42
|
+
ResultType: 'entity_object'
|
|
43
|
+
});
|
|
44
|
+
if (result.Success) {
|
|
45
|
+
const lists = result.Results || [];
|
|
46
|
+
this.listCache.set(cacheKey, {
|
|
47
|
+
data: lists,
|
|
48
|
+
timestamp: new Date()
|
|
49
|
+
});
|
|
50
|
+
return lists;
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
console.error('Failed to load lists:', result.ErrorMessage);
|
|
54
|
+
return [];
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
finally {
|
|
58
|
+
this.loadingSubject.next(false);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Get all list categories
|
|
63
|
+
*/
|
|
64
|
+
async getListCategories(forceRefresh = false) {
|
|
65
|
+
if (!forceRefresh && this.categoryCache && this.isCacheValid(this.categoryCache)) {
|
|
66
|
+
return this.categoryCache.data;
|
|
67
|
+
}
|
|
68
|
+
const rv = new RunView();
|
|
69
|
+
const result = await rv.RunView({
|
|
70
|
+
EntityName: 'List Categories',
|
|
71
|
+
OrderBy: 'Name',
|
|
72
|
+
ResultType: 'entity_object'
|
|
73
|
+
});
|
|
74
|
+
if (result.Success) {
|
|
75
|
+
this.categoryCache = {
|
|
76
|
+
data: result.Results || [],
|
|
77
|
+
timestamp: new Date()
|
|
78
|
+
};
|
|
79
|
+
return this.categoryCache.data;
|
|
80
|
+
}
|
|
81
|
+
return [];
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Get membership information for a set of records
|
|
85
|
+
* Returns a Map where key is listId and value is array of recordIds that are members
|
|
86
|
+
*/
|
|
87
|
+
async getRecordMembership(entityId, recordIds) {
|
|
88
|
+
if (recordIds.length === 0) {
|
|
89
|
+
return new Map();
|
|
90
|
+
}
|
|
91
|
+
const cacheKey = `${entityId}_${recordIds.sort().join(',')}`;
|
|
92
|
+
// Check cache
|
|
93
|
+
const cached = this.membershipCache.get(cacheKey);
|
|
94
|
+
if (cached && this.isCacheValid(cached)) {
|
|
95
|
+
return cached.data;
|
|
96
|
+
}
|
|
97
|
+
this.loadingSubject.next(true);
|
|
98
|
+
try {
|
|
99
|
+
const rv = new RunView();
|
|
100
|
+
// Get all list details for these records
|
|
101
|
+
const recordIdFilter = recordIds.map(id => `'${id}'`).join(',');
|
|
102
|
+
const result = await rv.RunView({
|
|
103
|
+
EntityName: 'List Details',
|
|
104
|
+
ExtraFilter: `RecordID IN (${recordIdFilter})`,
|
|
105
|
+
ResultType: 'entity_object'
|
|
106
|
+
});
|
|
107
|
+
const membership = new Map();
|
|
108
|
+
if (result.Success && result.Results) {
|
|
109
|
+
for (const detail of result.Results) {
|
|
110
|
+
const existingRecords = membership.get(detail.ListID) || [];
|
|
111
|
+
if (!existingRecords.includes(detail.RecordID)) {
|
|
112
|
+
existingRecords.push(detail.RecordID);
|
|
113
|
+
}
|
|
114
|
+
membership.set(detail.ListID, existingRecords);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
this.membershipCache.set(cacheKey, {
|
|
118
|
+
data: membership,
|
|
119
|
+
timestamp: new Date()
|
|
120
|
+
});
|
|
121
|
+
return membership;
|
|
122
|
+
}
|
|
123
|
+
finally {
|
|
124
|
+
this.loadingSubject.next(false);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Get lists that contain a specific record
|
|
129
|
+
*/
|
|
130
|
+
async getListsForRecord(entityId, recordId) {
|
|
131
|
+
const rv = new RunView();
|
|
132
|
+
// Get list details for this record
|
|
133
|
+
const detailsResult = await rv.RunView({
|
|
134
|
+
EntityName: 'List Details',
|
|
135
|
+
ExtraFilter: `RecordID = '${recordId}'`,
|
|
136
|
+
ResultType: 'entity_object'
|
|
137
|
+
});
|
|
138
|
+
if (!detailsResult.Success || !detailsResult.Results || detailsResult.Results.length === 0) {
|
|
139
|
+
return [];
|
|
140
|
+
}
|
|
141
|
+
const listIds = [...new Set(detailsResult.Results.map((d) => d.ListID))];
|
|
142
|
+
// Get the lists filtered by entity
|
|
143
|
+
const listIdFilter = listIds.map(id => `'${id}'`).join(',');
|
|
144
|
+
const listsResult = await rv.RunView({
|
|
145
|
+
EntityName: 'Lists',
|
|
146
|
+
ExtraFilter: `ID IN (${listIdFilter}) AND EntityID = '${entityId}'`,
|
|
147
|
+
ResultType: 'entity_object'
|
|
148
|
+
});
|
|
149
|
+
return listsResult.Success ? (listsResult.Results || []) : [];
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Get item count for a list
|
|
153
|
+
*/
|
|
154
|
+
async getListItemCount(listId) {
|
|
155
|
+
const rv = new RunView();
|
|
156
|
+
const result = await rv.RunView({
|
|
157
|
+
EntityName: 'List Details',
|
|
158
|
+
ExtraFilter: `ListID = '${listId}'`,
|
|
159
|
+
ResultType: 'count_only'
|
|
160
|
+
});
|
|
161
|
+
return result.Success ? result.TotalRowCount : 0;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Build view models for lists with membership information
|
|
165
|
+
*/
|
|
166
|
+
async buildListViewModels(lists, recordIds, membership) {
|
|
167
|
+
const viewModels = [];
|
|
168
|
+
const rv = new RunView();
|
|
169
|
+
// Get item counts for all lists in one batch query
|
|
170
|
+
const listIds = lists.map(l => l.ID);
|
|
171
|
+
const listIdFilter = listIds.map(id => `'${id}'`).join(',');
|
|
172
|
+
// Get counts grouped by list - using a regular query since we need aggregation
|
|
173
|
+
const countsResult = await rv.RunView({
|
|
174
|
+
EntityName: 'List Details',
|
|
175
|
+
ExtraFilter: listIds.length > 0 ? `ListID IN (${listIdFilter})` : '1=0',
|
|
176
|
+
ResultType: 'entity_object'
|
|
177
|
+
});
|
|
178
|
+
// Build count map
|
|
179
|
+
const countMap = new Map();
|
|
180
|
+
if (countsResult.Success && countsResult.Results) {
|
|
181
|
+
for (const detail of countsResult.Results) {
|
|
182
|
+
const current = countMap.get(detail.ListID) || 0;
|
|
183
|
+
countMap.set(detail.ListID, current + 1);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
for (const list of lists) {
|
|
187
|
+
const memberRecordIds = membership.get(list.ID) || [];
|
|
188
|
+
const membershipCount = memberRecordIds.length;
|
|
189
|
+
const totalSelected = recordIds.length;
|
|
190
|
+
viewModels.push({
|
|
191
|
+
list,
|
|
192
|
+
itemCount: countMap.get(list.ID) || 0,
|
|
193
|
+
membershipCount,
|
|
194
|
+
totalSelectedRecords: totalSelected,
|
|
195
|
+
isFullMember: membershipCount === totalSelected && totalSelected > 0,
|
|
196
|
+
isPartialMember: membershipCount > 0 && membershipCount < totalSelected,
|
|
197
|
+
isNotMember: membershipCount === 0,
|
|
198
|
+
lastUpdated: list.Get('__mj_UpdatedAt') || new Date(),
|
|
199
|
+
category: undefined, // Can be populated separately if needed
|
|
200
|
+
isSelectedForAdd: false,
|
|
201
|
+
isSelectedForRemove: false
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
return viewModels;
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Add records to one or more lists
|
|
208
|
+
*/
|
|
209
|
+
async addRecordsToLists(listIds, recordIds, skipDuplicates = true) {
|
|
210
|
+
console.log(`[ListManagementService] addRecordsToLists called:`);
|
|
211
|
+
console.log(` - listIds (${listIds.length}):`, listIds);
|
|
212
|
+
console.log(` - recordIds (${recordIds.length}):`, recordIds);
|
|
213
|
+
console.log(` - skipDuplicates:`, skipDuplicates);
|
|
214
|
+
const result = {
|
|
215
|
+
success: 0,
|
|
216
|
+
failed: 0,
|
|
217
|
+
skipped: 0,
|
|
218
|
+
errors: []
|
|
219
|
+
};
|
|
220
|
+
const md = new Metadata();
|
|
221
|
+
// Get existing membership to skip duplicates
|
|
222
|
+
let existingMembership = new Map();
|
|
223
|
+
if (skipDuplicates) {
|
|
224
|
+
const rv = new RunView();
|
|
225
|
+
const listIdFilter = listIds.map(id => `'${id}'`).join(',');
|
|
226
|
+
const recordIdFilter = recordIds.map(id => `'${id}'`).join(',');
|
|
227
|
+
const existing = await rv.RunView({
|
|
228
|
+
EntityName: 'List Details',
|
|
229
|
+
ExtraFilter: `ListID IN (${listIdFilter}) AND RecordID IN (${recordIdFilter})`,
|
|
230
|
+
ResultType: 'entity_object'
|
|
231
|
+
}, md.CurrentUser);
|
|
232
|
+
if (existing.Success && existing.Results) {
|
|
233
|
+
for (const detail of existing.Results) {
|
|
234
|
+
const recordSet = existingMembership.get(detail.ListID) || new Set();
|
|
235
|
+
recordSet.add(detail.RecordID);
|
|
236
|
+
existingMembership.set(detail.ListID, recordSet);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
// Build list of records to add (excluding duplicates)
|
|
241
|
+
const recordsToAdd = [];
|
|
242
|
+
for (const listId of listIds) {
|
|
243
|
+
const existingRecords = existingMembership.get(listId) || new Set();
|
|
244
|
+
for (const recordId of recordIds) {
|
|
245
|
+
if (skipDuplicates && existingRecords.has(recordId)) {
|
|
246
|
+
result.skipped++;
|
|
247
|
+
}
|
|
248
|
+
else {
|
|
249
|
+
recordsToAdd.push({ listId, recordId });
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
if (recordsToAdd.length === 0) {
|
|
254
|
+
console.log(`[ListManagementService] No records to add (all skipped as duplicates)`);
|
|
255
|
+
return result;
|
|
256
|
+
}
|
|
257
|
+
// Use transaction group for bulk insert
|
|
258
|
+
const tg = await md.CreateTransactionGroup();
|
|
259
|
+
for (const { listId, recordId } of recordsToAdd) {
|
|
260
|
+
try {
|
|
261
|
+
const listDetail = await md.GetEntityObject('List Details', md.CurrentUser);
|
|
262
|
+
listDetail.ListID = listId;
|
|
263
|
+
listDetail.RecordID = recordId;
|
|
264
|
+
listDetail.TransactionGroup = tg;
|
|
265
|
+
const saveResult = await listDetail.Save();
|
|
266
|
+
if (!saveResult) {
|
|
267
|
+
console.error(`[ListManagementService] Failed to queue record ${recordId} for list ${listId}:`, listDetail.LatestResult?.Message);
|
|
268
|
+
result.errors.push(`Failed to add record ${recordId} to list ${listId}: ${listDetail.LatestResult?.Message || 'Unknown error'}`);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
catch (error) {
|
|
272
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
273
|
+
console.error(`[ListManagementService] Exception adding record:`, error);
|
|
274
|
+
result.errors.push(`Error adding record ${recordId} to list ${listId}: ${errorMessage}`);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
// Submit the transaction
|
|
278
|
+
console.log(`[ListManagementService] Submitting transaction with ${recordsToAdd.length} records...`);
|
|
279
|
+
const success = await tg.Submit();
|
|
280
|
+
if (success) {
|
|
281
|
+
result.success = recordsToAdd.length - result.errors.length;
|
|
282
|
+
result.failed = result.errors.length;
|
|
283
|
+
console.log(`[ListManagementService] Transaction succeeded. Added ${result.success} records.`);
|
|
284
|
+
}
|
|
285
|
+
else {
|
|
286
|
+
result.failed = recordsToAdd.length;
|
|
287
|
+
result.success = 0;
|
|
288
|
+
console.error(`[ListManagementService] Transaction failed`);
|
|
289
|
+
result.errors.push('Transaction failed to submit');
|
|
290
|
+
}
|
|
291
|
+
// Invalidate membership cache
|
|
292
|
+
this.membershipCache.clear();
|
|
293
|
+
console.log(`[ListManagementService] addRecordsToLists final result:`, result);
|
|
294
|
+
return result;
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* Remove records from one or more lists
|
|
298
|
+
*/
|
|
299
|
+
async removeRecordsFromLists(listIds, recordIds) {
|
|
300
|
+
const result = {
|
|
301
|
+
success: 0,
|
|
302
|
+
failed: 0,
|
|
303
|
+
skipped: 0,
|
|
304
|
+
errors: []
|
|
305
|
+
};
|
|
306
|
+
const md = new Metadata();
|
|
307
|
+
const rv = new RunView();
|
|
308
|
+
// Find existing list details to delete
|
|
309
|
+
const listIdFilter = listIds.map(id => `'${id}'`).join(',');
|
|
310
|
+
const recordIdFilter = recordIds.map(id => `'${id}'`).join(',');
|
|
311
|
+
const existingResult = await rv.RunView({
|
|
312
|
+
EntityName: 'List Details',
|
|
313
|
+
ExtraFilter: `ListID IN (${listIdFilter}) AND RecordID IN (${recordIdFilter})`,
|
|
314
|
+
ResultType: 'entity_object'
|
|
315
|
+
});
|
|
316
|
+
if (!existingResult.Success) {
|
|
317
|
+
result.errors.push('Failed to query existing list details');
|
|
318
|
+
return result;
|
|
319
|
+
}
|
|
320
|
+
// Delete each matching detail
|
|
321
|
+
for (const detail of existingResult.Results || []) {
|
|
322
|
+
try {
|
|
323
|
+
const deleteResult = await detail.Delete();
|
|
324
|
+
if (deleteResult) {
|
|
325
|
+
result.success++;
|
|
326
|
+
}
|
|
327
|
+
else {
|
|
328
|
+
result.failed++;
|
|
329
|
+
result.errors.push(`Failed to remove record ${detail.RecordID} from list ${detail.ListID}`);
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
catch (error) {
|
|
333
|
+
result.failed++;
|
|
334
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
335
|
+
result.errors.push(`Error removing record: ${errorMessage}`);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
// Invalidate caches
|
|
339
|
+
this.membershipCache.clear();
|
|
340
|
+
return result;
|
|
341
|
+
}
|
|
342
|
+
/**
|
|
343
|
+
* Create a new list
|
|
344
|
+
*/
|
|
345
|
+
async createList(config) {
|
|
346
|
+
const md = new Metadata();
|
|
347
|
+
try {
|
|
348
|
+
const list = await md.GetEntityObject('Lists');
|
|
349
|
+
list.NewRecord();
|
|
350
|
+
list.Name = config.name;
|
|
351
|
+
list.Description = config.description || '';
|
|
352
|
+
list.EntityID = config.entityId;
|
|
353
|
+
list.UserID = md.CurrentUser.ID;
|
|
354
|
+
if (config.categoryId) {
|
|
355
|
+
list.CategoryID = config.categoryId;
|
|
356
|
+
}
|
|
357
|
+
const saveResult = await list.Save();
|
|
358
|
+
if (saveResult) {
|
|
359
|
+
// Invalidate list cache
|
|
360
|
+
this.invalidateListCache(config.entityId);
|
|
361
|
+
return list;
|
|
362
|
+
}
|
|
363
|
+
return null;
|
|
364
|
+
}
|
|
365
|
+
catch (error) {
|
|
366
|
+
console.error('Error creating list:', error);
|
|
367
|
+
return null;
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
/**
|
|
371
|
+
* Check if a cache entry is still valid
|
|
372
|
+
*/
|
|
373
|
+
isCacheValid(entry) {
|
|
374
|
+
const now = new Date().getTime();
|
|
375
|
+
const entryTime = entry.timestamp.getTime();
|
|
376
|
+
return (now - entryTime) < this.CACHE_TTL_MS;
|
|
377
|
+
}
|
|
378
|
+
/**
|
|
379
|
+
* Invalidate cache for a specific entity or all caches
|
|
380
|
+
*/
|
|
381
|
+
invalidateCache(entityId) {
|
|
382
|
+
if (entityId) {
|
|
383
|
+
this.invalidateListCache(entityId);
|
|
384
|
+
}
|
|
385
|
+
else {
|
|
386
|
+
this.listCache.clear();
|
|
387
|
+
this.categoryCache = null;
|
|
388
|
+
this.membershipCache.clear();
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
/**
|
|
392
|
+
* Invalidate list cache for a specific entity
|
|
393
|
+
*/
|
|
394
|
+
invalidateListCache(entityId) {
|
|
395
|
+
// Remove all cache entries that start with this entityId
|
|
396
|
+
for (const key of this.listCache.keys()) {
|
|
397
|
+
if (key.startsWith(entityId)) {
|
|
398
|
+
this.listCache.delete(key);
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
static ɵfac = function ListManagementService_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ListManagementService)(); };
|
|
403
|
+
static ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: ListManagementService, factory: ListManagementService.ɵfac, providedIn: 'root' });
|
|
404
|
+
}
|
|
405
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ListManagementService, [{
|
|
406
|
+
type: Injectable,
|
|
407
|
+
args: [{
|
|
408
|
+
providedIn: 'root'
|
|
409
|
+
}]
|
|
410
|
+
}], () => [], null); })();
|
|
411
|
+
//# sourceMappingURL=list-management.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-management.service.js","sourceRoot":"","sources":["../../../src/lib/services/list-management.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { UserEntity, RoleEntity } from '@memberjunction/core-entities';
|
|
2
|
+
import { Observable } from 'rxjs';
|
|
3
|
+
import { ListShareInfo, ListPermissionLevel, ShareRecipient, ListShareResult } from '../models/list-sharing.models';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
/**
|
|
6
|
+
* Service for managing list sharing using the existing ResourcePermission system.
|
|
7
|
+
* Lists are already registered as a ResourceType, so we use ResourcePermissions
|
|
8
|
+
* to share lists with users and roles.
|
|
9
|
+
*/
|
|
10
|
+
export declare class ListSharingService {
|
|
11
|
+
private loadingSubject;
|
|
12
|
+
loading$: Observable<boolean>;
|
|
13
|
+
private usersCache;
|
|
14
|
+
private rolesCache;
|
|
15
|
+
constructor();
|
|
16
|
+
/**
|
|
17
|
+
* Get the ResourceType ID for Lists
|
|
18
|
+
*/
|
|
19
|
+
getListResourceTypeId(): string;
|
|
20
|
+
/**
|
|
21
|
+
* Get all shares for a specific list
|
|
22
|
+
*/
|
|
23
|
+
getListShares(listId: string): Promise<ListShareInfo[]>;
|
|
24
|
+
/**
|
|
25
|
+
* Get permission level for a specific user on a specific list
|
|
26
|
+
*/
|
|
27
|
+
getUserPermissionLevel(listId: string, userId: string): Promise<ListPermissionLevel | null>;
|
|
28
|
+
/**
|
|
29
|
+
* Share a list with a user
|
|
30
|
+
*/
|
|
31
|
+
shareListWithUser(listId: string, userId: string, permissionLevel: ListPermissionLevel, sharedByUserId: string): Promise<ListShareResult>;
|
|
32
|
+
/**
|
|
33
|
+
* Share a list with a role
|
|
34
|
+
*/
|
|
35
|
+
shareListWithRole(listId: string, roleId: string, permissionLevel: ListPermissionLevel, sharedByUserId: string): Promise<ListShareResult>;
|
|
36
|
+
/**
|
|
37
|
+
* Update permission level for an existing share
|
|
38
|
+
*/
|
|
39
|
+
updateSharePermission(shareId: string, newPermissionLevel: ListPermissionLevel): Promise<ListShareResult>;
|
|
40
|
+
/**
|
|
41
|
+
* Remove a share (revoke access)
|
|
42
|
+
*/
|
|
43
|
+
removeShare(shareId: string): Promise<ListShareResult>;
|
|
44
|
+
/**
|
|
45
|
+
* Get lists shared with the current user (that they don't own)
|
|
46
|
+
*/
|
|
47
|
+
getListsSharedWithUser(userId: string): Promise<string[]>;
|
|
48
|
+
/**
|
|
49
|
+
* Get lists that the user has shared with others
|
|
50
|
+
*/
|
|
51
|
+
getListsSharedByUser(userId: string): Promise<Map<string, number>>;
|
|
52
|
+
/**
|
|
53
|
+
* Check if user can share a list (must be owner or have Owner permission)
|
|
54
|
+
*/
|
|
55
|
+
canUserShareList(listId: string, userId: string): Promise<boolean>;
|
|
56
|
+
/**
|
|
57
|
+
* Search users for sharing autocomplete
|
|
58
|
+
*/
|
|
59
|
+
searchUsers(searchTerm: string, limit?: number): Promise<ShareRecipient[]>;
|
|
60
|
+
/**
|
|
61
|
+
* Search roles for sharing autocomplete
|
|
62
|
+
*/
|
|
63
|
+
searchRoles(searchTerm: string, limit?: number): Promise<ShareRecipient[]>;
|
|
64
|
+
/**
|
|
65
|
+
* Get all available users (cached)
|
|
66
|
+
*/
|
|
67
|
+
getAllUsers(forceRefresh?: boolean): Promise<UserEntity[]>;
|
|
68
|
+
/**
|
|
69
|
+
* Get all available roles (cached)
|
|
70
|
+
*/
|
|
71
|
+
getAllRoles(forceRefresh?: boolean): Promise<RoleEntity[]>;
|
|
72
|
+
/**
|
|
73
|
+
* Helper to find existing share
|
|
74
|
+
*/
|
|
75
|
+
private findExistingShare;
|
|
76
|
+
/**
|
|
77
|
+
* Convert ResourcePermissionEntity to ListShareInfo
|
|
78
|
+
*/
|
|
79
|
+
private convertToListShareInfo;
|
|
80
|
+
/**
|
|
81
|
+
* Get sharing summary for a single list
|
|
82
|
+
*/
|
|
83
|
+
getListSharingSummary(listId: string): Promise<{
|
|
84
|
+
listId: string;
|
|
85
|
+
totalShares: number;
|
|
86
|
+
userShares: number;
|
|
87
|
+
roleShares: number;
|
|
88
|
+
isSharedWithMe: boolean;
|
|
89
|
+
isSharedByMe: boolean;
|
|
90
|
+
}>;
|
|
91
|
+
/**
|
|
92
|
+
* Clear internal caches
|
|
93
|
+
*/
|
|
94
|
+
clearCache(): void;
|
|
95
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<ListSharingService, never>;
|
|
96
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<ListSharingService>;
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=list-sharing.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-sharing.service.d.ts","sourceRoot":"","sources":["../../../src/lib/services/list-sharing.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,UAAU,EACV,UAAU,EACX,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAmB,UAAU,EAAE,MAAM,MAAM,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;;AAOpH;;;;GAIG;AACH,qBAGa,kBAAkB;IAC7B,OAAO,CAAC,cAAc,CAAuC;IACtD,QAAQ,EAAE,UAAU,CAAC,OAAO,CAAC,CAAsC;IAG1E,OAAO,CAAC,UAAU,CAA6B;IAC/C,OAAO,CAAC,UAAU,CAA6B;;IAI/C;;OAEG;IACH,qBAAqB,IAAI,MAAM;IAI/B;;OAEG;IACG,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IA+B7D;;OAEG;IACG,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC;IAmBjG;;OAEG;IACG,iBAAiB,CACrB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,mBAAmB,EACpC,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,eAAe,CAAC;IA4C3B;;OAEG;IACG,iBAAiB,CACrB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,mBAAmB,EACpC,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,eAAe,CAAC;IA4C3B;;OAEG;IACG,qBAAqB,CACzB,OAAO,EAAE,MAAM,EACf,kBAAkB,EAAE,mBAAmB,GACtC,OAAO,CAAC,eAAe,CAAC;IA8B3B;;OAEG;IACG,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IA4B5D;;OAEG;IACG,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAiB/D;;OAEG;IACG,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAuCxE;;OAEG;IACG,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAmBxE;;OAEG;IACG,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAuBpF;;OAEG;IACG,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAsBpF;;OAEG;IACG,WAAW,CAAC,YAAY,GAAE,OAAe,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAqBvE;;OAEG;IACG,WAAW,CAAC,YAAY,GAAE,OAAe,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAoBvE;;OAEG;YACW,iBAAiB;IAqB/B;;OAEG;YACW,sBAAsB;IAmDpC;;OAEG;IACG,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,OAAO,CAAC;QAAC,YAAY,EAAE,OAAO,CAAA;KAAE,CAAC;IAkCrL;;OAEG;IACH,UAAU,IAAI,IAAI;yCAhiBP,kBAAkB;6CAAlB,kBAAkB;CAoiB9B"}
|