@objectstack/objectql 3.0.7 → 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 +18 -0
- package/dist/index.d.mts +69 -3
- package/dist/index.d.ts +69 -3
- 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/dist/index.mjs
CHANGED
|
@@ -518,9 +518,17 @@ var SERVICE_CONFIG = {
|
|
|
518
518
|
search: { route: "/api/v1/search", plugin: "plugin-search" }
|
|
519
519
|
};
|
|
520
520
|
var ObjectStackProtocolImplementation = class {
|
|
521
|
-
constructor(engine, getServicesRegistry) {
|
|
521
|
+
constructor(engine, getServicesRegistry, getFeedService) {
|
|
522
522
|
this.engine = engine;
|
|
523
523
|
this.getServicesRegistry = getServicesRegistry;
|
|
524
|
+
this.getFeedService = getFeedService;
|
|
525
|
+
}
|
|
526
|
+
requireFeedService() {
|
|
527
|
+
const svc = this.getFeedService?.();
|
|
528
|
+
if (!svc) {
|
|
529
|
+
throw new Error("Feed service not available. Install and register service-feed to enable feed operations.");
|
|
530
|
+
}
|
|
531
|
+
return svc;
|
|
524
532
|
}
|
|
525
533
|
async getDiscovery() {
|
|
526
534
|
const registeredServices = this.getServicesRegistry ? this.getServicesRegistry() : /* @__PURE__ */ new Map();
|
|
@@ -569,16 +577,40 @@ var ObjectStackProtocolImplementation = class {
|
|
|
569
577
|
}
|
|
570
578
|
}
|
|
571
579
|
}
|
|
580
|
+
if (registeredServices.has("feed")) {
|
|
581
|
+
services["feed"] = {
|
|
582
|
+
enabled: true,
|
|
583
|
+
status: "available",
|
|
584
|
+
route: "/api/v1/data",
|
|
585
|
+
provider: "service-feed"
|
|
586
|
+
};
|
|
587
|
+
} else {
|
|
588
|
+
services["feed"] = {
|
|
589
|
+
enabled: false,
|
|
590
|
+
status: "unavailable",
|
|
591
|
+
message: "Install service-feed to enable"
|
|
592
|
+
};
|
|
593
|
+
}
|
|
572
594
|
const routes = {
|
|
573
595
|
data: "/api/v1/data",
|
|
574
596
|
metadata: "/api/v1/meta",
|
|
575
597
|
...optionalRoutes
|
|
576
598
|
};
|
|
599
|
+
const capabilities = {
|
|
600
|
+
feed: registeredServices.has("feed"),
|
|
601
|
+
comments: registeredServices.has("feed"),
|
|
602
|
+
automation: registeredServices.has("automation"),
|
|
603
|
+
cron: registeredServices.has("job"),
|
|
604
|
+
search: registeredServices.has("search"),
|
|
605
|
+
export: registeredServices.has("automation") || registeredServices.has("queue"),
|
|
606
|
+
chunkedUpload: registeredServices.has("file-storage")
|
|
607
|
+
};
|
|
577
608
|
return {
|
|
578
609
|
version: "1.0",
|
|
579
610
|
apiName: "ObjectStack API",
|
|
580
611
|
routes,
|
|
581
|
-
services
|
|
612
|
+
services,
|
|
613
|
+
capabilities
|
|
582
614
|
};
|
|
583
615
|
}
|
|
584
616
|
async getMetaTypes() {
|
|
@@ -1060,6 +1092,137 @@ var ObjectStackProtocolImplementation = class {
|
|
|
1060
1092
|
message: "Saved to memory registry"
|
|
1061
1093
|
};
|
|
1062
1094
|
}
|
|
1095
|
+
// ==========================================
|
|
1096
|
+
// Feed Operations
|
|
1097
|
+
// ==========================================
|
|
1098
|
+
async listFeed(request) {
|
|
1099
|
+
const svc = this.requireFeedService();
|
|
1100
|
+
const result = await svc.listFeed({
|
|
1101
|
+
object: request.object,
|
|
1102
|
+
recordId: request.recordId,
|
|
1103
|
+
filter: request.type,
|
|
1104
|
+
limit: request.limit,
|
|
1105
|
+
cursor: request.cursor
|
|
1106
|
+
});
|
|
1107
|
+
return { success: true, data: result };
|
|
1108
|
+
}
|
|
1109
|
+
async createFeedItem(request) {
|
|
1110
|
+
const svc = this.requireFeedService();
|
|
1111
|
+
const item = await svc.createFeedItem({
|
|
1112
|
+
object: request.object,
|
|
1113
|
+
recordId: request.recordId,
|
|
1114
|
+
type: request.type,
|
|
1115
|
+
actor: { type: "user", id: "current_user" },
|
|
1116
|
+
body: request.body,
|
|
1117
|
+
mentions: request.mentions,
|
|
1118
|
+
parentId: request.parentId,
|
|
1119
|
+
visibility: request.visibility
|
|
1120
|
+
});
|
|
1121
|
+
return { success: true, data: item };
|
|
1122
|
+
}
|
|
1123
|
+
async updateFeedItem(request) {
|
|
1124
|
+
const svc = this.requireFeedService();
|
|
1125
|
+
const item = await svc.updateFeedItem(request.feedId, {
|
|
1126
|
+
body: request.body,
|
|
1127
|
+
mentions: request.mentions,
|
|
1128
|
+
visibility: request.visibility
|
|
1129
|
+
});
|
|
1130
|
+
return { success: true, data: item };
|
|
1131
|
+
}
|
|
1132
|
+
async deleteFeedItem(request) {
|
|
1133
|
+
const svc = this.requireFeedService();
|
|
1134
|
+
await svc.deleteFeedItem(request.feedId);
|
|
1135
|
+
return { success: true, data: { feedId: request.feedId } };
|
|
1136
|
+
}
|
|
1137
|
+
async addReaction(request) {
|
|
1138
|
+
const svc = this.requireFeedService();
|
|
1139
|
+
const reactions = await svc.addReaction(request.feedId, request.emoji, "current_user");
|
|
1140
|
+
return { success: true, data: { reactions } };
|
|
1141
|
+
}
|
|
1142
|
+
async removeReaction(request) {
|
|
1143
|
+
const svc = this.requireFeedService();
|
|
1144
|
+
const reactions = await svc.removeReaction(request.feedId, request.emoji, "current_user");
|
|
1145
|
+
return { success: true, data: { reactions } };
|
|
1146
|
+
}
|
|
1147
|
+
async pinFeedItem(request) {
|
|
1148
|
+
const svc = this.requireFeedService();
|
|
1149
|
+
const item = await svc.getFeedItem(request.feedId);
|
|
1150
|
+
if (!item) throw new Error(`Feed item ${request.feedId} not found`);
|
|
1151
|
+
await svc.updateFeedItem(request.feedId, { visibility: item.visibility });
|
|
1152
|
+
return { success: true, data: { feedId: request.feedId, pinned: true, pinnedAt: (/* @__PURE__ */ new Date()).toISOString() } };
|
|
1153
|
+
}
|
|
1154
|
+
async unpinFeedItem(request) {
|
|
1155
|
+
const svc = this.requireFeedService();
|
|
1156
|
+
const item = await svc.getFeedItem(request.feedId);
|
|
1157
|
+
if (!item) throw new Error(`Feed item ${request.feedId} not found`);
|
|
1158
|
+
await svc.updateFeedItem(request.feedId, { visibility: item.visibility });
|
|
1159
|
+
return { success: true, data: { feedId: request.feedId, pinned: false } };
|
|
1160
|
+
}
|
|
1161
|
+
async starFeedItem(request) {
|
|
1162
|
+
const svc = this.requireFeedService();
|
|
1163
|
+
const item = await svc.getFeedItem(request.feedId);
|
|
1164
|
+
if (!item) throw new Error(`Feed item ${request.feedId} not found`);
|
|
1165
|
+
await svc.updateFeedItem(request.feedId, { visibility: item.visibility });
|
|
1166
|
+
return { success: true, data: { feedId: request.feedId, starred: true, starredAt: (/* @__PURE__ */ new Date()).toISOString() } };
|
|
1167
|
+
}
|
|
1168
|
+
async unstarFeedItem(request) {
|
|
1169
|
+
const svc = this.requireFeedService();
|
|
1170
|
+
const item = await svc.getFeedItem(request.feedId);
|
|
1171
|
+
if (!item) throw new Error(`Feed item ${request.feedId} not found`);
|
|
1172
|
+
await svc.updateFeedItem(request.feedId, { visibility: item.visibility });
|
|
1173
|
+
return { success: true, data: { feedId: request.feedId, starred: false } };
|
|
1174
|
+
}
|
|
1175
|
+
async searchFeed(request) {
|
|
1176
|
+
const svc = this.requireFeedService();
|
|
1177
|
+
const result = await svc.listFeed({
|
|
1178
|
+
object: request.object,
|
|
1179
|
+
recordId: request.recordId,
|
|
1180
|
+
filter: request.type,
|
|
1181
|
+
limit: request.limit,
|
|
1182
|
+
cursor: request.cursor
|
|
1183
|
+
});
|
|
1184
|
+
const queryLower = (request.query || "").toLowerCase();
|
|
1185
|
+
const filtered = result.items.filter(
|
|
1186
|
+
(item) => item.body?.toLowerCase().includes(queryLower)
|
|
1187
|
+
);
|
|
1188
|
+
return { success: true, data: { items: filtered, total: filtered.length, hasMore: false } };
|
|
1189
|
+
}
|
|
1190
|
+
async getChangelog(request) {
|
|
1191
|
+
const svc = this.requireFeedService();
|
|
1192
|
+
const result = await svc.listFeed({
|
|
1193
|
+
object: request.object,
|
|
1194
|
+
recordId: request.recordId,
|
|
1195
|
+
filter: "changes_only",
|
|
1196
|
+
limit: request.limit,
|
|
1197
|
+
cursor: request.cursor
|
|
1198
|
+
});
|
|
1199
|
+
const entries = result.items.map((item) => ({
|
|
1200
|
+
id: item.id,
|
|
1201
|
+
object: item.object,
|
|
1202
|
+
recordId: item.recordId,
|
|
1203
|
+
actor: item.actor,
|
|
1204
|
+
changes: item.changes || [],
|
|
1205
|
+
timestamp: item.createdAt,
|
|
1206
|
+
source: item.source
|
|
1207
|
+
}));
|
|
1208
|
+
return { success: true, data: { entries, total: result.total, nextCursor: result.nextCursor, hasMore: result.hasMore } };
|
|
1209
|
+
}
|
|
1210
|
+
async feedSubscribe(request) {
|
|
1211
|
+
const svc = this.requireFeedService();
|
|
1212
|
+
const subscription = await svc.subscribe({
|
|
1213
|
+
object: request.object,
|
|
1214
|
+
recordId: request.recordId,
|
|
1215
|
+
userId: "current_user",
|
|
1216
|
+
events: request.events,
|
|
1217
|
+
channels: request.channels
|
|
1218
|
+
});
|
|
1219
|
+
return { success: true, data: subscription };
|
|
1220
|
+
}
|
|
1221
|
+
async feedUnsubscribe(request) {
|
|
1222
|
+
const svc = this.requireFeedService();
|
|
1223
|
+
const unsubscribed = await svc.unsubscribe(request.object, request.recordId, "current_user");
|
|
1224
|
+
return { success: true, data: { object: request.object, recordId: request.recordId, unsubscribed } };
|
|
1225
|
+
}
|
|
1063
1226
|
};
|
|
1064
1227
|
|
|
1065
1228
|
// src/engine.ts
|