Skip to content

Commit c91d76d

Browse files
Adds recap ability (WIP, not enabled) (#137)
* scheduler wip * Update frontend/src/components/RecapManager.tsx Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * Update backend/src/routes/api/recap.ts Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * Update backend/src/routes/api/recap.ts Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * rename internal to trigger * add target * fmt * comment out scheduler for now --------- Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
1 parent d707066 commit c91d76d

32 files changed

+3399
-161
lines changed

.clinerules

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,14 @@
7878
4. DistributionService → Distributor-specific transforms
7979
5. Distribution to configured channels
8080

81+
### Recap Flow
82+
1. Scheduler service creates jobs based on feed configuration
83+
2. External scheduler triggers recap job via HTTP endpoint
84+
3. Recap job fetches approved submissions since last run
85+
4. ProcessorService applies batch transformations
86+
5. Distribution to configured channels
87+
6. Update last successful completion timestamp
88+
8189
### Plugin System
8290
1. PluginService loads plugins at runtime via module federation
8391
2. Plugins register with appropriate service
@@ -89,9 +97,19 @@
8997
2. Transaction support with retry logic
9098
3. Error handling and connection management
9199
4. Type-safe queries with Drizzle ORM
100+
5. Repository pattern for domain-specific operations
101+
6. State tracking for external scheduled jobs
92102

93103
## Current Focus Areas
94104

105+
### Recap Scheduling System
106+
- Implementing reliable recap generation for feeds
107+
- Using external scheduler service for job management
108+
- Tracking job state in the database for resilience
109+
- Supporting both cron expressions and interval-based schedules
110+
- Providing UI for managing recap configurations
111+
- Handling process restarts and maintaining job consistency
112+
95113
### Comprehensive Error Handling
96114
- Implementing granular error types across the application
97115
- Developing consistent error recovery mechanisms

backend/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
"zod": "^3.22.4"
4444
},
4545
"dependencies": {
46+
"@crosspost/scheduler-sdk": "^0.1.1",
4647
"@hono/node-server": "^1.8.2",
4748
"@hono/zod-openapi": "^0.9.5",
4849
"@hono/zod-validator": "^0.1.11",

backend/pnpm-lock.yaml

Lines changed: 12 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

backend/src/app.ts

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
1+
import { SchedulerClient } from "@crosspost/scheduler-sdk";
12
import { cors } from "hono/cors";
23
import { secureHeaders } from "hono/secure-headers";
34
import path from "path";
4-
import { apiRoutes } from "./routes/api";
55
import { mockTwitterService } from "./routes/api/test";
66
import { configureStaticRoutes, staticRoutes } from "./routes/static";
77
import { ConfigService, isProduction } from "./services/config/config.service";
8+
import { feedRepository } from "./services/db/repositories";
89
import { DistributionService } from "./services/distribution/distribution.service";
910
import { PluginService } from "./services/plugins/plugin.service";
1011
import { ProcessorService } from "./services/processor/processor.service";
12+
import { SchedulerService } from "./services/scheduler/scheduler.service";
1113
import { SubmissionService } from "./services/submissions/submission.service";
1214
import { TransformationService } from "./services/transformation/transformation.service";
1315
import { TwitterService } from "./services/twitter/client";
@@ -57,12 +59,35 @@ export async function createApp(): Promise<AppInstance> {
5759
submissionService.initialize();
5860
}
5961

62+
// Initialize scheduler service
63+
const schedulerClient = new SchedulerClient({
64+
baseUrl: process.env.SCHEDULER_BASE_URL || "http://localhost:3001",
65+
headers: {
66+
Authorization: `Bearer ${process.env.SCHEDULER_API_TOKEN || ""}`,
67+
},
68+
});
69+
70+
const backendUrl = process.env.CURATE_BACKEND_URL || "http://localhost:3000";
71+
const schedulerService = new SchedulerService(
72+
feedRepository,
73+
processorService,
74+
schedulerClient,
75+
backendUrl,
76+
);
77+
78+
// Initialize scheduler on startup (non-blocking)
79+
// schedulerService.initialize().catch((err) => {
80+
// console.error("Failed to initialize scheduler service:", err);
81+
// });
82+
6083
const context: AppContext = {
6184
twitterService,
6285
submissionService,
6386
distributionService,
6487
processorService,
6588
configService,
89+
schedulerService,
90+
feedRepository,
6691
};
6792

6893
// Create Hono app
@@ -99,9 +124,6 @@ export async function createApp(): Promise<AppInstance> {
99124
// import { logger } from "hono/logger";
100125
// if (!isProduction) app.use("*", logger());
101126

102-
// Mount API routes
103-
app.route("/api", apiRoutes);
104-
105127
// Configure static routes for production
106128
if (isProduction) {
107129
const publicDir = path.join(__dirname, "public");

backend/src/routes/api/index.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,10 @@ import configRoutes from "./config";
44
import feedRoutes from "./feed";
55
import leaderboardRoutes from "./leaderboard";
66
import pluginRoutes from "./plugin";
7-
import submissionRoutes from "./submission";
87
import { statsRoutes } from "./stats";
8+
import submissionRoutes from "./submission";
99
import { testRoutes } from "./test";
10+
import triggerRoutes from "./trigger";
1011
import twitterRoutes from "./twitter";
1112

1213
// Create main API router
@@ -26,3 +27,4 @@ apiRoutes.route("/config", configRoutes);
2627
apiRoutes.route("/plugins", pluginRoutes);
2728
apiRoutes.route("/leaderboard", leaderboardRoutes);
2829
apiRoutes.route("/stats", statsRoutes);
30+
apiRoutes.route("/trigger", triggerRoutes);

0 commit comments

Comments
 (0)