@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/.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
|
@@ -1,5 +1,23 @@
|
|
|
1
1
|
# @objectstack/objectql
|
|
2
2
|
|
|
3
|
+
## 3.0.9
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies [15e0df6]
|
|
8
|
+
- @objectstack/spec@3.0.9
|
|
9
|
+
- @objectstack/core@3.0.9
|
|
10
|
+
- @objectstack/types@3.0.9
|
|
11
|
+
|
|
12
|
+
## 3.0.8
|
|
13
|
+
|
|
14
|
+
### Patch Changes
|
|
15
|
+
|
|
16
|
+
- Updated dependencies [5a968a2]
|
|
17
|
+
- @objectstack/spec@3.0.8
|
|
18
|
+
- @objectstack/core@3.0.8
|
|
19
|
+
- @objectstack/types@3.0.8
|
|
20
|
+
|
|
3
21
|
## 3.0.7
|
|
4
22
|
|
|
5
23
|
### Patch Changes
|
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
|
|
@@ -220,6 +221,7 @@ declare class SchemaRegistry {
|
|
|
220
221
|
label?: string | undefined;
|
|
221
222
|
description?: string | undefined;
|
|
222
223
|
format?: string | undefined;
|
|
224
|
+
columnName?: string | undefined;
|
|
223
225
|
defaultValue?: unknown;
|
|
224
226
|
maxLength?: number | undefined;
|
|
225
227
|
minLength?: number | undefined;
|
|
@@ -482,6 +484,24 @@ declare class SchemaRegistry {
|
|
|
482
484
|
favicon?: string | undefined;
|
|
483
485
|
} | undefined;
|
|
484
486
|
navigation?: any[] | undefined;
|
|
487
|
+
areas?: {
|
|
488
|
+
id: string;
|
|
489
|
+
label: string | {
|
|
490
|
+
key: string;
|
|
491
|
+
defaultValue?: string | undefined;
|
|
492
|
+
params?: Record<string, string | number | boolean> | undefined;
|
|
493
|
+
};
|
|
494
|
+
navigation: any[];
|
|
495
|
+
icon?: string | undefined;
|
|
496
|
+
order?: number | undefined;
|
|
497
|
+
description?: string | {
|
|
498
|
+
key: string;
|
|
499
|
+
defaultValue?: string | undefined;
|
|
500
|
+
params?: Record<string, string | number | boolean> | undefined;
|
|
501
|
+
} | undefined;
|
|
502
|
+
visible?: string | undefined;
|
|
503
|
+
requiredPermissions?: string[] | undefined;
|
|
504
|
+
}[] | undefined;
|
|
485
505
|
homePageId?: string | undefined;
|
|
486
506
|
requiredPermissions?: string[] | undefined;
|
|
487
507
|
objects?: unknown[] | undefined;
|
|
@@ -687,7 +707,7 @@ declare class SchemaRegistry {
|
|
|
687
707
|
preload?: {
|
|
688
708
|
enabled: boolean;
|
|
689
709
|
priority: number;
|
|
690
|
-
resources?: ("dependencies" | "code" | "metadata" | "
|
|
710
|
+
resources?: ("dependencies" | "code" | "metadata" | "assets" | "services")[] | undefined;
|
|
691
711
|
conditions?: {
|
|
692
712
|
routes?: string[] | undefined;
|
|
693
713
|
roles?: string[] | undefined;
|
|
@@ -821,6 +841,9 @@ declare class SchemaRegistry {
|
|
|
821
841
|
} | undefined;
|
|
822
842
|
} | undefined;
|
|
823
843
|
} | undefined;
|
|
844
|
+
engine?: {
|
|
845
|
+
objectstack: string;
|
|
846
|
+
} | undefined;
|
|
824
847
|
};
|
|
825
848
|
status: "error" | "disabled" | "installed" | "installing" | "upgrading" | "uninstalling";
|
|
826
849
|
enabled: boolean;
|
|
@@ -831,6 +854,14 @@ declare class SchemaRegistry {
|
|
|
831
854
|
statusChangedAt?: string | undefined;
|
|
832
855
|
errorMessage?: string | undefined;
|
|
833
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;
|
|
834
865
|
} | {
|
|
835
866
|
id: string;
|
|
836
867
|
version: string;
|
|
@@ -1001,7 +1032,7 @@ declare class SchemaRegistry {
|
|
|
1001
1032
|
preload?: {
|
|
1002
1033
|
enabled: boolean;
|
|
1003
1034
|
priority: number;
|
|
1004
|
-
resources?: ("dependencies" | "code" | "metadata" | "
|
|
1035
|
+
resources?: ("dependencies" | "code" | "metadata" | "assets" | "services")[] | undefined;
|
|
1005
1036
|
conditions?: {
|
|
1006
1037
|
routes?: string[] | undefined;
|
|
1007
1038
|
roles?: string[] | undefined;
|
|
@@ -1135,6 +1166,9 @@ declare class SchemaRegistry {
|
|
|
1135
1166
|
} | undefined;
|
|
1136
1167
|
} | undefined;
|
|
1137
1168
|
} | undefined;
|
|
1169
|
+
engine?: {
|
|
1170
|
+
objectstack: string;
|
|
1171
|
+
} | undefined;
|
|
1138
1172
|
};
|
|
1139
1173
|
/**
|
|
1140
1174
|
* Universal Unregister Method
|
|
@@ -1180,7 +1214,9 @@ declare class SchemaRegistry {
|
|
|
1180
1214
|
declare class ObjectStackProtocolImplementation implements ObjectStackProtocol {
|
|
1181
1215
|
private engine;
|
|
1182
1216
|
private getServicesRegistry?;
|
|
1183
|
-
|
|
1217
|
+
private getFeedService?;
|
|
1218
|
+
constructor(engine: IDataEngine, getServicesRegistry?: () => Map<string, any>, getFeedService?: () => IFeedService | undefined);
|
|
1219
|
+
private requireFeedService;
|
|
1184
1220
|
getDiscovery(): Promise<{
|
|
1185
1221
|
version: string;
|
|
1186
1222
|
apiName: string;
|
|
@@ -1205,8 +1241,24 @@ declare class ObjectStackProtocolImplementation implements ObjectStackProtocol {
|
|
|
1205
1241
|
status: "degraded" | "stub" | "available" | "unavailable";
|
|
1206
1242
|
route?: string | undefined;
|
|
1207
1243
|
provider?: string | undefined;
|
|
1244
|
+
version?: string | undefined;
|
|
1208
1245
|
message?: string | undefined;
|
|
1246
|
+
rateLimit?: {
|
|
1247
|
+
requestsPerMinute?: number | undefined;
|
|
1248
|
+
requestsPerHour?: number | undefined;
|
|
1249
|
+
burstLimit?: number | undefined;
|
|
1250
|
+
retryAfterMs?: number | undefined;
|
|
1251
|
+
} | undefined;
|
|
1209
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
|
+
};
|
|
1210
1262
|
}>;
|
|
1211
1263
|
getMetaTypes(): Promise<{
|
|
1212
1264
|
types: string[];
|
|
@@ -1334,6 +1386,20 @@ declare class ObjectStackProtocolImplementation implements ObjectStackProtocol {
|
|
|
1334
1386
|
success: boolean;
|
|
1335
1387
|
message: string;
|
|
1336
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>;
|
|
1337
1403
|
}
|
|
1338
1404
|
|
|
1339
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
|
|
@@ -220,6 +221,7 @@ declare class SchemaRegistry {
|
|
|
220
221
|
label?: string | undefined;
|
|
221
222
|
description?: string | undefined;
|
|
222
223
|
format?: string | undefined;
|
|
224
|
+
columnName?: string | undefined;
|
|
223
225
|
defaultValue?: unknown;
|
|
224
226
|
maxLength?: number | undefined;
|
|
225
227
|
minLength?: number | undefined;
|
|
@@ -482,6 +484,24 @@ declare class SchemaRegistry {
|
|
|
482
484
|
favicon?: string | undefined;
|
|
483
485
|
} | undefined;
|
|
484
486
|
navigation?: any[] | undefined;
|
|
487
|
+
areas?: {
|
|
488
|
+
id: string;
|
|
489
|
+
label: string | {
|
|
490
|
+
key: string;
|
|
491
|
+
defaultValue?: string | undefined;
|
|
492
|
+
params?: Record<string, string | number | boolean> | undefined;
|
|
493
|
+
};
|
|
494
|
+
navigation: any[];
|
|
495
|
+
icon?: string | undefined;
|
|
496
|
+
order?: number | undefined;
|
|
497
|
+
description?: string | {
|
|
498
|
+
key: string;
|
|
499
|
+
defaultValue?: string | undefined;
|
|
500
|
+
params?: Record<string, string | number | boolean> | undefined;
|
|
501
|
+
} | undefined;
|
|
502
|
+
visible?: string | undefined;
|
|
503
|
+
requiredPermissions?: string[] | undefined;
|
|
504
|
+
}[] | undefined;
|
|
485
505
|
homePageId?: string | undefined;
|
|
486
506
|
requiredPermissions?: string[] | undefined;
|
|
487
507
|
objects?: unknown[] | undefined;
|
|
@@ -687,7 +707,7 @@ declare class SchemaRegistry {
|
|
|
687
707
|
preload?: {
|
|
688
708
|
enabled: boolean;
|
|
689
709
|
priority: number;
|
|
690
|
-
resources?: ("dependencies" | "code" | "metadata" | "
|
|
710
|
+
resources?: ("dependencies" | "code" | "metadata" | "assets" | "services")[] | undefined;
|
|
691
711
|
conditions?: {
|
|
692
712
|
routes?: string[] | undefined;
|
|
693
713
|
roles?: string[] | undefined;
|
|
@@ -821,6 +841,9 @@ declare class SchemaRegistry {
|
|
|
821
841
|
} | undefined;
|
|
822
842
|
} | undefined;
|
|
823
843
|
} | undefined;
|
|
844
|
+
engine?: {
|
|
845
|
+
objectstack: string;
|
|
846
|
+
} | undefined;
|
|
824
847
|
};
|
|
825
848
|
status: "error" | "disabled" | "installed" | "installing" | "upgrading" | "uninstalling";
|
|
826
849
|
enabled: boolean;
|
|
@@ -831,6 +854,14 @@ declare class SchemaRegistry {
|
|
|
831
854
|
statusChangedAt?: string | undefined;
|
|
832
855
|
errorMessage?: string | undefined;
|
|
833
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;
|
|
834
865
|
} | {
|
|
835
866
|
id: string;
|
|
836
867
|
version: string;
|
|
@@ -1001,7 +1032,7 @@ declare class SchemaRegistry {
|
|
|
1001
1032
|
preload?: {
|
|
1002
1033
|
enabled: boolean;
|
|
1003
1034
|
priority: number;
|
|
1004
|
-
resources?: ("dependencies" | "code" | "metadata" | "
|
|
1035
|
+
resources?: ("dependencies" | "code" | "metadata" | "assets" | "services")[] | undefined;
|
|
1005
1036
|
conditions?: {
|
|
1006
1037
|
routes?: string[] | undefined;
|
|
1007
1038
|
roles?: string[] | undefined;
|
|
@@ -1135,6 +1166,9 @@ declare class SchemaRegistry {
|
|
|
1135
1166
|
} | undefined;
|
|
1136
1167
|
} | undefined;
|
|
1137
1168
|
} | undefined;
|
|
1169
|
+
engine?: {
|
|
1170
|
+
objectstack: string;
|
|
1171
|
+
} | undefined;
|
|
1138
1172
|
};
|
|
1139
1173
|
/**
|
|
1140
1174
|
* Universal Unregister Method
|
|
@@ -1180,7 +1214,9 @@ declare class SchemaRegistry {
|
|
|
1180
1214
|
declare class ObjectStackProtocolImplementation implements ObjectStackProtocol {
|
|
1181
1215
|
private engine;
|
|
1182
1216
|
private getServicesRegistry?;
|
|
1183
|
-
|
|
1217
|
+
private getFeedService?;
|
|
1218
|
+
constructor(engine: IDataEngine, getServicesRegistry?: () => Map<string, any>, getFeedService?: () => IFeedService | undefined);
|
|
1219
|
+
private requireFeedService;
|
|
1184
1220
|
getDiscovery(): Promise<{
|
|
1185
1221
|
version: string;
|
|
1186
1222
|
apiName: string;
|
|
@@ -1205,8 +1241,24 @@ declare class ObjectStackProtocolImplementation implements ObjectStackProtocol {
|
|
|
1205
1241
|
status: "degraded" | "stub" | "available" | "unavailable";
|
|
1206
1242
|
route?: string | undefined;
|
|
1207
1243
|
provider?: string | undefined;
|
|
1244
|
+
version?: string | undefined;
|
|
1208
1245
|
message?: string | undefined;
|
|
1246
|
+
rateLimit?: {
|
|
1247
|
+
requestsPerMinute?: number | undefined;
|
|
1248
|
+
requestsPerHour?: number | undefined;
|
|
1249
|
+
burstLimit?: number | undefined;
|
|
1250
|
+
retryAfterMs?: number | undefined;
|
|
1251
|
+
} | undefined;
|
|
1209
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
|
+
};
|
|
1210
1262
|
}>;
|
|
1211
1263
|
getMetaTypes(): Promise<{
|
|
1212
1264
|
types: string[];
|
|
@@ -1334,6 +1386,20 @@ declare class ObjectStackProtocolImplementation implements ObjectStackProtocol {
|
|
|
1334
1386
|
success: boolean;
|
|
1335
1387
|
message: string;
|
|
1336
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>;
|
|
1337
1403
|
}
|
|
1338
1404
|
|
|
1339
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
|