feat(orchestrator): add SSE events, queue controls, and mosaic rails sync
This commit is contained in:
11
apps/orchestrator/src/api/queue/queue-api.module.ts
Normal file
11
apps/orchestrator/src/api/queue/queue-api.module.ts
Normal file
@@ -0,0 +1,11 @@
|
||||
import { Module } from "@nestjs/common";
|
||||
import { QueueController } from "./queue.controller";
|
||||
import { QueueModule } from "../../queue/queue.module";
|
||||
import { OrchestratorApiKeyGuard } from "../../common/guards/api-key.guard";
|
||||
|
||||
@Module({
|
||||
imports: [QueueModule],
|
||||
controllers: [QueueController],
|
||||
providers: [OrchestratorApiKeyGuard],
|
||||
})
|
||||
export class QueueApiModule {}
|
||||
65
apps/orchestrator/src/api/queue/queue.controller.spec.ts
Normal file
65
apps/orchestrator/src/api/queue/queue.controller.spec.ts
Normal file
@@ -0,0 +1,65 @@
|
||||
import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
|
||||
import { QueueController } from "./queue.controller";
|
||||
import { QueueService } from "../../queue/queue.service";
|
||||
|
||||
describe("QueueController", () => {
|
||||
let controller: QueueController;
|
||||
let queueService: {
|
||||
getStats: ReturnType<typeof vi.fn>;
|
||||
pause: ReturnType<typeof vi.fn>;
|
||||
resume: ReturnType<typeof vi.fn>;
|
||||
};
|
||||
|
||||
beforeEach(() => {
|
||||
queueService = {
|
||||
getStats: vi.fn(),
|
||||
pause: vi.fn(),
|
||||
resume: vi.fn(),
|
||||
};
|
||||
|
||||
controller = new QueueController(queueService as unknown as QueueService);
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
vi.clearAllMocks();
|
||||
});
|
||||
|
||||
it("should return queue stats", async () => {
|
||||
queueService.getStats.mockResolvedValue({
|
||||
pending: 5,
|
||||
active: 1,
|
||||
completed: 10,
|
||||
failed: 2,
|
||||
delayed: 0,
|
||||
});
|
||||
|
||||
const result = await controller.getStats();
|
||||
|
||||
expect(queueService.getStats).toHaveBeenCalledOnce();
|
||||
expect(result).toEqual({
|
||||
pending: 5,
|
||||
active: 1,
|
||||
completed: 10,
|
||||
failed: 2,
|
||||
delayed: 0,
|
||||
});
|
||||
});
|
||||
|
||||
it("should pause queue processing", async () => {
|
||||
queueService.pause.mockResolvedValue(undefined);
|
||||
|
||||
const result = await controller.pause();
|
||||
|
||||
expect(queueService.pause).toHaveBeenCalledOnce();
|
||||
expect(result).toEqual({ message: "Queue processing paused" });
|
||||
});
|
||||
|
||||
it("should resume queue processing", async () => {
|
||||
queueService.resume.mockResolvedValue(undefined);
|
||||
|
||||
const result = await controller.resume();
|
||||
|
||||
expect(queueService.resume).toHaveBeenCalledOnce();
|
||||
expect(result).toEqual({ message: "Queue processing resumed" });
|
||||
});
|
||||
});
|
||||
39
apps/orchestrator/src/api/queue/queue.controller.ts
Normal file
39
apps/orchestrator/src/api/queue/queue.controller.ts
Normal file
@@ -0,0 +1,39 @@
|
||||
import { Controller, Get, HttpCode, Post, UseGuards } from "@nestjs/common";
|
||||
import { Throttle } from "@nestjs/throttler";
|
||||
import { QueueService } from "../../queue/queue.service";
|
||||
import { OrchestratorApiKeyGuard } from "../../common/guards/api-key.guard";
|
||||
import { OrchestratorThrottlerGuard } from "../../common/guards/throttler.guard";
|
||||
|
||||
@Controller("queue")
|
||||
@UseGuards(OrchestratorApiKeyGuard, OrchestratorThrottlerGuard)
|
||||
export class QueueController {
|
||||
constructor(private readonly queueService: QueueService) {}
|
||||
|
||||
@Get("stats")
|
||||
@Throttle({ status: { limit: 200, ttl: 60000 } })
|
||||
async getStats(): Promise<{
|
||||
pending: number;
|
||||
active: number;
|
||||
completed: number;
|
||||
failed: number;
|
||||
delayed: number;
|
||||
}> {
|
||||
return this.queueService.getStats();
|
||||
}
|
||||
|
||||
@Post("pause")
|
||||
@Throttle({ strict: { limit: 10, ttl: 60000 } })
|
||||
@HttpCode(200)
|
||||
async pause(): Promise<{ message: string }> {
|
||||
await this.queueService.pause();
|
||||
return { message: "Queue processing paused" };
|
||||
}
|
||||
|
||||
@Post("resume")
|
||||
@Throttle({ strict: { limit: 10, ttl: 60000 } })
|
||||
@HttpCode(200)
|
||||
async resume(): Promise<{ message: string }> {
|
||||
await this.queueService.resume();
|
||||
return { message: "Queue processing resumed" };
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user