@objectstack/objectql 3.0.8 → 3.0.9
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/.turbo/turbo-build.log +10 -10
- package/CHANGELOG.md +9 -0
- package/dist/index.d.mts +48 -1
- package/dist/index.d.ts +48 -1
- package/dist/index.js +165 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +165 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +4 -4
- package/src/protocol-discovery.test.ts +65 -5
- package/src/protocol-feed.test.ts +303 -0
- package/src/protocol.ts +192 -2
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
> @objectstack/objectql@3.0.
|
|
2
|
+
> @objectstack/objectql@3.0.9 build /home/runner/work/spec/spec/packages/objectql
|
|
3
3
|
> tsup --config ../../tsup.config.ts
|
|
4
4
|
|
|
5
5
|
[34mCLI[39m Building entry: src/index.ts
|
|
@@ -10,13 +10,13 @@
|
|
|
10
10
|
[34mCLI[39m Cleaning output folder
|
|
11
11
|
[34mESM[39m Build start
|
|
12
12
|
[34mCJS[39m Build start
|
|
13
|
-
[
|
|
14
|
-
[
|
|
15
|
-
[
|
|
16
|
-
[
|
|
17
|
-
[
|
|
18
|
-
[
|
|
13
|
+
[32mESM[39m [1mdist/index.mjs [22m[32m88.87 KB[39m
|
|
14
|
+
[32mESM[39m [1mdist/index.mjs.map [22m[32m182.19 KB[39m
|
|
15
|
+
[32mESM[39m ⚡️ Build success in 230ms
|
|
16
|
+
[32mCJS[39m [1mdist/index.js [22m[32m90.59 KB[39m
|
|
17
|
+
[32mCJS[39m [1mdist/index.js.map [22m[32m183.48 KB[39m
|
|
18
|
+
[32mCJS[39m ⚡️ Build success in 230ms
|
|
19
19
|
[34mDTS[39m Build start
|
|
20
|
-
[32mDTS[39m ⚡️ Build success in
|
|
21
|
-
[32mDTS[39m [1mdist/index.d.mts [22m[
|
|
22
|
-
[32mDTS[39m [1mdist/index.d.ts [22m[
|
|
20
|
+
[32mDTS[39m ⚡️ Build success in 20591ms
|
|
21
|
+
[32mDTS[39m [1mdist/index.d.mts [22m[32m73.43 KB[39m
|
|
22
|
+
[32mDTS[39m [1mdist/index.d.ts [22m[32m73.43 KB[39m
|
package/CHANGELOG.md
CHANGED
package/dist/index.d.mts
CHANGED
|
@@ -4,6 +4,7 @@ import { ServiceObject, ObjectOwnership, HookContext, QueryAST, DataEngineQueryO
|
|
|
4
4
|
import { ObjectStackManifest, InstalledPackage, ExecutionContext } from '@objectstack/spec/kernel';
|
|
5
5
|
import { ObjectStackProtocol, MetadataCacheRequest, MetadataCacheResponse, BatchUpdateRequest, BatchUpdateResponse, UpdateManyDataRequest, DeleteManyDataRequest } from '@objectstack/spec/api';
|
|
6
6
|
import { IDataEngine, DriverInterface, Logger, Plugin, PluginContext, ObjectKernel } from '@objectstack/core';
|
|
7
|
+
import { IFeedService } from '@objectstack/spec/contracts';
|
|
7
8
|
|
|
8
9
|
/**
|
|
9
10
|
* XState-inspired State Machine Protocol
|
|
@@ -840,6 +841,9 @@ declare class SchemaRegistry {
|
|
|
840
841
|
} | undefined;
|
|
841
842
|
} | undefined;
|
|
842
843
|
} | undefined;
|
|
844
|
+
engine?: {
|
|
845
|
+
objectstack: string;
|
|
846
|
+
} | undefined;
|
|
843
847
|
};
|
|
844
848
|
status: "error" | "disabled" | "installed" | "installing" | "upgrading" | "uninstalling";
|
|
845
849
|
enabled: boolean;
|
|
@@ -850,6 +854,14 @@ declare class SchemaRegistry {
|
|
|
850
854
|
statusChangedAt?: string | undefined;
|
|
851
855
|
errorMessage?: string | undefined;
|
|
852
856
|
settings?: Record<string, unknown> | undefined;
|
|
857
|
+
upgradeHistory?: {
|
|
858
|
+
fromVersion: string;
|
|
859
|
+
toVersion: string;
|
|
860
|
+
upgradedAt: string;
|
|
861
|
+
status: "success" | "failed" | "rolled_back";
|
|
862
|
+
migrationLog?: string[] | undefined;
|
|
863
|
+
}[] | undefined;
|
|
864
|
+
registeredNamespaces?: string[] | undefined;
|
|
853
865
|
} | {
|
|
854
866
|
id: string;
|
|
855
867
|
version: string;
|
|
@@ -1154,6 +1166,9 @@ declare class SchemaRegistry {
|
|
|
1154
1166
|
} | undefined;
|
|
1155
1167
|
} | undefined;
|
|
1156
1168
|
} | undefined;
|
|
1169
|
+
engine?: {
|
|
1170
|
+
objectstack: string;
|
|
1171
|
+
} | undefined;
|
|
1157
1172
|
};
|
|
1158
1173
|
/**
|
|
1159
1174
|
* Universal Unregister Method
|
|
@@ -1199,7 +1214,9 @@ declare class SchemaRegistry {
|
|
|
1199
1214
|
declare class ObjectStackProtocolImplementation implements ObjectStackProtocol {
|
|
1200
1215
|
private engine;
|
|
1201
1216
|
private getServicesRegistry?;
|
|
1202
|
-
|
|
1217
|
+
private getFeedService?;
|
|
1218
|
+
constructor(engine: IDataEngine, getServicesRegistry?: () => Map<string, any>, getFeedService?: () => IFeedService | undefined);
|
|
1219
|
+
private requireFeedService;
|
|
1203
1220
|
getDiscovery(): Promise<{
|
|
1204
1221
|
version: string;
|
|
1205
1222
|
apiName: string;
|
|
@@ -1224,8 +1241,24 @@ declare class ObjectStackProtocolImplementation implements ObjectStackProtocol {
|
|
|
1224
1241
|
status: "degraded" | "stub" | "available" | "unavailable";
|
|
1225
1242
|
route?: string | undefined;
|
|
1226
1243
|
provider?: string | undefined;
|
|
1244
|
+
version?: string | undefined;
|
|
1227
1245
|
message?: string | undefined;
|
|
1246
|
+
rateLimit?: {
|
|
1247
|
+
requestsPerMinute?: number | undefined;
|
|
1248
|
+
requestsPerHour?: number | undefined;
|
|
1249
|
+
burstLimit?: number | undefined;
|
|
1250
|
+
retryAfterMs?: number | undefined;
|
|
1251
|
+
} | undefined;
|
|
1228
1252
|
}>;
|
|
1253
|
+
capabilities: {
|
|
1254
|
+
feed: boolean;
|
|
1255
|
+
comments: boolean;
|
|
1256
|
+
automation: boolean;
|
|
1257
|
+
cron: boolean;
|
|
1258
|
+
search: boolean;
|
|
1259
|
+
export: boolean;
|
|
1260
|
+
chunkedUpload: boolean;
|
|
1261
|
+
};
|
|
1229
1262
|
}>;
|
|
1230
1263
|
getMetaTypes(): Promise<{
|
|
1231
1264
|
types: string[];
|
|
@@ -1353,6 +1386,20 @@ declare class ObjectStackProtocolImplementation implements ObjectStackProtocol {
|
|
|
1353
1386
|
success: boolean;
|
|
1354
1387
|
message: string;
|
|
1355
1388
|
}>;
|
|
1389
|
+
listFeed(request: any): Promise<any>;
|
|
1390
|
+
createFeedItem(request: any): Promise<any>;
|
|
1391
|
+
updateFeedItem(request: any): Promise<any>;
|
|
1392
|
+
deleteFeedItem(request: any): Promise<any>;
|
|
1393
|
+
addReaction(request: any): Promise<any>;
|
|
1394
|
+
removeReaction(request: any): Promise<any>;
|
|
1395
|
+
pinFeedItem(request: any): Promise<any>;
|
|
1396
|
+
unpinFeedItem(request: any): Promise<any>;
|
|
1397
|
+
starFeedItem(request: any): Promise<any>;
|
|
1398
|
+
unstarFeedItem(request: any): Promise<any>;
|
|
1399
|
+
searchFeed(request: any): Promise<any>;
|
|
1400
|
+
getChangelog(request: any): Promise<any>;
|
|
1401
|
+
feedSubscribe(request: any): Promise<any>;
|
|
1402
|
+
feedUnsubscribe(request: any): Promise<any>;
|
|
1356
1403
|
}
|
|
1357
1404
|
|
|
1358
1405
|
type HookHandler = (context: HookContext) => Promise<void> | void;
|
package/dist/index.d.ts
CHANGED
|
@@ -4,6 +4,7 @@ import { ServiceObject, ObjectOwnership, HookContext, QueryAST, DataEngineQueryO
|
|
|
4
4
|
import { ObjectStackManifest, InstalledPackage, ExecutionContext } from '@objectstack/spec/kernel';
|
|
5
5
|
import { ObjectStackProtocol, MetadataCacheRequest, MetadataCacheResponse, BatchUpdateRequest, BatchUpdateResponse, UpdateManyDataRequest, DeleteManyDataRequest } from '@objectstack/spec/api';
|
|
6
6
|
import { IDataEngine, DriverInterface, Logger, Plugin, PluginContext, ObjectKernel } from '@objectstack/core';
|
|
7
|
+
import { IFeedService } from '@objectstack/spec/contracts';
|
|
7
8
|
|
|
8
9
|
/**
|
|
9
10
|
* XState-inspired State Machine Protocol
|
|
@@ -840,6 +841,9 @@ declare class SchemaRegistry {
|
|
|
840
841
|
} | undefined;
|
|
841
842
|
} | undefined;
|
|
842
843
|
} | undefined;
|
|
844
|
+
engine?: {
|
|
845
|
+
objectstack: string;
|
|
846
|
+
} | undefined;
|
|
843
847
|
};
|
|
844
848
|
status: "error" | "disabled" | "installed" | "installing" | "upgrading" | "uninstalling";
|
|
845
849
|
enabled: boolean;
|
|
@@ -850,6 +854,14 @@ declare class SchemaRegistry {
|
|
|
850
854
|
statusChangedAt?: string | undefined;
|
|
851
855
|
errorMessage?: string | undefined;
|
|
852
856
|
settings?: Record<string, unknown> | undefined;
|
|
857
|
+
upgradeHistory?: {
|
|
858
|
+
fromVersion: string;
|
|
859
|
+
toVersion: string;
|
|
860
|
+
upgradedAt: string;
|
|
861
|
+
status: "success" | "failed" | "rolled_back";
|
|
862
|
+
migrationLog?: string[] | undefined;
|
|
863
|
+
}[] | undefined;
|
|
864
|
+
registeredNamespaces?: string[] | undefined;
|
|
853
865
|
} | {
|
|
854
866
|
id: string;
|
|
855
867
|
version: string;
|
|
@@ -1154,6 +1166,9 @@ declare class SchemaRegistry {
|
|
|
1154
1166
|
} | undefined;
|
|
1155
1167
|
} | undefined;
|
|
1156
1168
|
} | undefined;
|
|
1169
|
+
engine?: {
|
|
1170
|
+
objectstack: string;
|
|
1171
|
+
} | undefined;
|
|
1157
1172
|
};
|
|
1158
1173
|
/**
|
|
1159
1174
|
* Universal Unregister Method
|
|
@@ -1199,7 +1214,9 @@ declare class SchemaRegistry {
|
|
|
1199
1214
|
declare class ObjectStackProtocolImplementation implements ObjectStackProtocol {
|
|
1200
1215
|
private engine;
|
|
1201
1216
|
private getServicesRegistry?;
|
|
1202
|
-
|
|
1217
|
+
private getFeedService?;
|
|
1218
|
+
constructor(engine: IDataEngine, getServicesRegistry?: () => Map<string, any>, getFeedService?: () => IFeedService | undefined);
|
|
1219
|
+
private requireFeedService;
|
|
1203
1220
|
getDiscovery(): Promise<{
|
|
1204
1221
|
version: string;
|
|
1205
1222
|
apiName: string;
|
|
@@ -1224,8 +1241,24 @@ declare class ObjectStackProtocolImplementation implements ObjectStackProtocol {
|
|
|
1224
1241
|
status: "degraded" | "stub" | "available" | "unavailable";
|
|
1225
1242
|
route?: string | undefined;
|
|
1226
1243
|
provider?: string | undefined;
|
|
1244
|
+
version?: string | undefined;
|
|
1227
1245
|
message?: string | undefined;
|
|
1246
|
+
rateLimit?: {
|
|
1247
|
+
requestsPerMinute?: number | undefined;
|
|
1248
|
+
requestsPerHour?: number | undefined;
|
|
1249
|
+
burstLimit?: number | undefined;
|
|
1250
|
+
retryAfterMs?: number | undefined;
|
|
1251
|
+
} | undefined;
|
|
1228
1252
|
}>;
|
|
1253
|
+
capabilities: {
|
|
1254
|
+
feed: boolean;
|
|
1255
|
+
comments: boolean;
|
|
1256
|
+
automation: boolean;
|
|
1257
|
+
cron: boolean;
|
|
1258
|
+
search: boolean;
|
|
1259
|
+
export: boolean;
|
|
1260
|
+
chunkedUpload: boolean;
|
|
1261
|
+
};
|
|
1229
1262
|
}>;
|
|
1230
1263
|
getMetaTypes(): Promise<{
|
|
1231
1264
|
types: string[];
|
|
@@ -1353,6 +1386,20 @@ declare class ObjectStackProtocolImplementation implements ObjectStackProtocol {
|
|
|
1353
1386
|
success: boolean;
|
|
1354
1387
|
message: string;
|
|
1355
1388
|
}>;
|
|
1389
|
+
listFeed(request: any): Promise<any>;
|
|
1390
|
+
createFeedItem(request: any): Promise<any>;
|
|
1391
|
+
updateFeedItem(request: any): Promise<any>;
|
|
1392
|
+
deleteFeedItem(request: any): Promise<any>;
|
|
1393
|
+
addReaction(request: any): Promise<any>;
|
|
1394
|
+
removeReaction(request: any): Promise<any>;
|
|
1395
|
+
pinFeedItem(request: any): Promise<any>;
|
|
1396
|
+
unpinFeedItem(request: any): Promise<any>;
|
|
1397
|
+
starFeedItem(request: any): Promise<any>;
|
|
1398
|
+
unstarFeedItem(request: any): Promise<any>;
|
|
1399
|
+
searchFeed(request: any): Promise<any>;
|
|
1400
|
+
getChangelog(request: any): Promise<any>;
|
|
1401
|
+
feedSubscribe(request: any): Promise<any>;
|
|
1402
|
+
feedUnsubscribe(request: any): Promise<any>;
|
|
1356
1403
|
}
|
|
1357
1404
|
|
|
1358
1405
|
type HookHandler = (context: HookContext) => Promise<void> | void;
|
package/dist/index.js
CHANGED
|
@@ -558,9 +558,17 @@ var SERVICE_CONFIG = {
|
|
|
558
558
|
search: { route: "/api/v1/search", plugin: "plugin-search" }
|
|
559
559
|
};
|
|
560
560
|
var ObjectStackProtocolImplementation = class {
|
|
561
|
-
constructor(engine, getServicesRegistry) {
|
|
561
|
+
constructor(engine, getServicesRegistry, getFeedService) {
|
|
562
562
|
this.engine = engine;
|
|
563
563
|
this.getServicesRegistry = getServicesRegistry;
|
|
564
|
+
this.getFeedService = getFeedService;
|
|
565
|
+
}
|
|
566
|
+
requireFeedService() {
|
|
567
|
+
const svc = this.getFeedService?.();
|
|
568
|
+
if (!svc) {
|
|
569
|
+
throw new Error("Feed service not available. Install and register service-feed to enable feed operations.");
|
|
570
|
+
}
|
|
571
|
+
return svc;
|
|
564
572
|
}
|
|
565
573
|
async getDiscovery() {
|
|
566
574
|
const registeredServices = this.getServicesRegistry ? this.getServicesRegistry() : /* @__PURE__ */ new Map();
|
|
@@ -609,16 +617,40 @@ var ObjectStackProtocolImplementation = class {
|
|
|
609
617
|
}
|
|
610
618
|
}
|
|
611
619
|
}
|
|
620
|
+
if (registeredServices.has("feed")) {
|
|
621
|
+
services["feed"] = {
|
|
622
|
+
enabled: true,
|
|
623
|
+
status: "available",
|
|
624
|
+
route: "/api/v1/data",
|
|
625
|
+
provider: "service-feed"
|
|
626
|
+
};
|
|
627
|
+
} else {
|
|
628
|
+
services["feed"] = {
|
|
629
|
+
enabled: false,
|
|
630
|
+
status: "unavailable",
|
|
631
|
+
message: "Install service-feed to enable"
|
|
632
|
+
};
|
|
633
|
+
}
|
|
612
634
|
const routes = {
|
|
613
635
|
data: "/api/v1/data",
|
|
614
636
|
metadata: "/api/v1/meta",
|
|
615
637
|
...optionalRoutes
|
|
616
638
|
};
|
|
639
|
+
const capabilities = {
|
|
640
|
+
feed: registeredServices.has("feed"),
|
|
641
|
+
comments: registeredServices.has("feed"),
|
|
642
|
+
automation: registeredServices.has("automation"),
|
|
643
|
+
cron: registeredServices.has("job"),
|
|
644
|
+
search: registeredServices.has("search"),
|
|
645
|
+
export: registeredServices.has("automation") || registeredServices.has("queue"),
|
|
646
|
+
chunkedUpload: registeredServices.has("file-storage")
|
|
647
|
+
};
|
|
617
648
|
return {
|
|
618
649
|
version: "1.0",
|
|
619
650
|
apiName: "ObjectStack API",
|
|
620
651
|
routes,
|
|
621
|
-
services
|
|
652
|
+
services,
|
|
653
|
+
capabilities
|
|
622
654
|
};
|
|
623
655
|
}
|
|
624
656
|
async getMetaTypes() {
|
|
@@ -1100,6 +1132,137 @@ var ObjectStackProtocolImplementation = class {
|
|
|
1100
1132
|
message: "Saved to memory registry"
|
|
1101
1133
|
};
|
|
1102
1134
|
}
|
|
1135
|
+
// ==========================================
|
|
1136
|
+
// Feed Operations
|
|
1137
|
+
// ==========================================
|
|
1138
|
+
async listFeed(request) {
|
|
1139
|
+
const svc = this.requireFeedService();
|
|
1140
|
+
const result = await svc.listFeed({
|
|
1141
|
+
object: request.object,
|
|
1142
|
+
recordId: request.recordId,
|
|
1143
|
+
filter: request.type,
|
|
1144
|
+
limit: request.limit,
|
|
1145
|
+
cursor: request.cursor
|
|
1146
|
+
});
|
|
1147
|
+
return { success: true, data: result };
|
|
1148
|
+
}
|
|
1149
|
+
async createFeedItem(request) {
|
|
1150
|
+
const svc = this.requireFeedService();
|
|
1151
|
+
const item = await svc.createFeedItem({
|
|
1152
|
+
object: request.object,
|
|
1153
|
+
recordId: request.recordId,
|
|
1154
|
+
type: request.type,
|
|
1155
|
+
actor: { type: "user", id: "current_user" },
|
|
1156
|
+
body: request.body,
|
|
1157
|
+
mentions: request.mentions,
|
|
1158
|
+
parentId: request.parentId,
|
|
1159
|
+
visibility: request.visibility
|
|
1160
|
+
});
|
|
1161
|
+
return { success: true, data: item };
|
|
1162
|
+
}
|
|
1163
|
+
async updateFeedItem(request) {
|
|
1164
|
+
const svc = this.requireFeedService();
|
|
1165
|
+
const item = await svc.updateFeedItem(request.feedId, {
|
|
1166
|
+
body: request.body,
|
|
1167
|
+
mentions: request.mentions,
|
|
1168
|
+
visibility: request.visibility
|
|
1169
|
+
});
|
|
1170
|
+
return { success: true, data: item };
|
|
1171
|
+
}
|
|
1172
|
+
async deleteFeedItem(request) {
|
|
1173
|
+
const svc = this.requireFeedService();
|
|
1174
|
+
await svc.deleteFeedItem(request.feedId);
|
|
1175
|
+
return { success: true, data: { feedId: request.feedId } };
|
|
1176
|
+
}
|
|
1177
|
+
async addReaction(request) {
|
|
1178
|
+
const svc = this.requireFeedService();
|
|
1179
|
+
const reactions = await svc.addReaction(request.feedId, request.emoji, "current_user");
|
|
1180
|
+
return { success: true, data: { reactions } };
|
|
1181
|
+
}
|
|
1182
|
+
async removeReaction(request) {
|
|
1183
|
+
const svc = this.requireFeedService();
|
|
1184
|
+
const reactions = await svc.removeReaction(request.feedId, request.emoji, "current_user");
|
|
1185
|
+
return { success: true, data: { reactions } };
|
|
1186
|
+
}
|
|
1187
|
+
async pinFeedItem(request) {
|
|
1188
|
+
const svc = this.requireFeedService();
|
|
1189
|
+
const item = await svc.getFeedItem(request.feedId);
|
|
1190
|
+
if (!item) throw new Error(`Feed item ${request.feedId} not found`);
|
|
1191
|
+
await svc.updateFeedItem(request.feedId, { visibility: item.visibility });
|
|
1192
|
+
return { success: true, data: { feedId: request.feedId, pinned: true, pinnedAt: (/* @__PURE__ */ new Date()).toISOString() } };
|
|
1193
|
+
}
|
|
1194
|
+
async unpinFeedItem(request) {
|
|
1195
|
+
const svc = this.requireFeedService();
|
|
1196
|
+
const item = await svc.getFeedItem(request.feedId);
|
|
1197
|
+
if (!item) throw new Error(`Feed item ${request.feedId} not found`);
|
|
1198
|
+
await svc.updateFeedItem(request.feedId, { visibility: item.visibility });
|
|
1199
|
+
return { success: true, data: { feedId: request.feedId, pinned: false } };
|
|
1200
|
+
}
|
|
1201
|
+
async starFeedItem(request) {
|
|
1202
|
+
const svc = this.requireFeedService();
|
|
1203
|
+
const item = await svc.getFeedItem(request.feedId);
|
|
1204
|
+
if (!item) throw new Error(`Feed item ${request.feedId} not found`);
|
|
1205
|
+
await svc.updateFeedItem(request.feedId, { visibility: item.visibility });
|
|
1206
|
+
return { success: true, data: { feedId: request.feedId, starred: true, starredAt: (/* @__PURE__ */ new Date()).toISOString() } };
|
|
1207
|
+
}
|
|
1208
|
+
async unstarFeedItem(request) {
|
|
1209
|
+
const svc = this.requireFeedService();
|
|
1210
|
+
const item = await svc.getFeedItem(request.feedId);
|
|
1211
|
+
if (!item) throw new Error(`Feed item ${request.feedId} not found`);
|
|
1212
|
+
await svc.updateFeedItem(request.feedId, { visibility: item.visibility });
|
|
1213
|
+
return { success: true, data: { feedId: request.feedId, starred: false } };
|
|
1214
|
+
}
|
|
1215
|
+
async searchFeed(request) {
|
|
1216
|
+
const svc = this.requireFeedService();
|
|
1217
|
+
const result = await svc.listFeed({
|
|
1218
|
+
object: request.object,
|
|
1219
|
+
recordId: request.recordId,
|
|
1220
|
+
filter: request.type,
|
|
1221
|
+
limit: request.limit,
|
|
1222
|
+
cursor: request.cursor
|
|
1223
|
+
});
|
|
1224
|
+
const queryLower = (request.query || "").toLowerCase();
|
|
1225
|
+
const filtered = result.items.filter(
|
|
1226
|
+
(item) => item.body?.toLowerCase().includes(queryLower)
|
|
1227
|
+
);
|
|
1228
|
+
return { success: true, data: { items: filtered, total: filtered.length, hasMore: false } };
|
|
1229
|
+
}
|
|
1230
|
+
async getChangelog(request) {
|
|
1231
|
+
const svc = this.requireFeedService();
|
|
1232
|
+
const result = await svc.listFeed({
|
|
1233
|
+
object: request.object,
|
|
1234
|
+
recordId: request.recordId,
|
|
1235
|
+
filter: "changes_only",
|
|
1236
|
+
limit: request.limit,
|
|
1237
|
+
cursor: request.cursor
|
|
1238
|
+
});
|
|
1239
|
+
const entries = result.items.map((item) => ({
|
|
1240
|
+
id: item.id,
|
|
1241
|
+
object: item.object,
|
|
1242
|
+
recordId: item.recordId,
|
|
1243
|
+
actor: item.actor,
|
|
1244
|
+
changes: item.changes || [],
|
|
1245
|
+
timestamp: item.createdAt,
|
|
1246
|
+
source: item.source
|
|
1247
|
+
}));
|
|
1248
|
+
return { success: true, data: { entries, total: result.total, nextCursor: result.nextCursor, hasMore: result.hasMore } };
|
|
1249
|
+
}
|
|
1250
|
+
async feedSubscribe(request) {
|
|
1251
|
+
const svc = this.requireFeedService();
|
|
1252
|
+
const subscription = await svc.subscribe({
|
|
1253
|
+
object: request.object,
|
|
1254
|
+
recordId: request.recordId,
|
|
1255
|
+
userId: "current_user",
|
|
1256
|
+
events: request.events,
|
|
1257
|
+
channels: request.channels
|
|
1258
|
+
});
|
|
1259
|
+
return { success: true, data: subscription };
|
|
1260
|
+
}
|
|
1261
|
+
async feedUnsubscribe(request) {
|
|
1262
|
+
const svc = this.requireFeedService();
|
|
1263
|
+
const unsubscribed = await svc.unsubscribe(request.object, request.recordId, "current_user");
|
|
1264
|
+
return { success: true, data: { object: request.object, recordId: request.recordId, unsubscribed } };
|
|
1265
|
+
}
|
|
1103
1266
|
};
|
|
1104
1267
|
|
|
1105
1268
|
// src/engine.ts
|