@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/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