fix(api): widget throttling and orchestrator endpoints (#624)
All checks were successful
ci/woodpecker/push/ci Pipeline was successful
All checks were successful
ci/woodpecker/push/ci Pipeline was successful
Co-authored-by: Jason Woltje <jason@diversecanvas.com> Co-committed-by: Jason Woltje <jason@diversecanvas.com>
This commit was merged in pull request #624.
This commit is contained in:
31
apps/api/src/widgets/widgets.controller.throttler.spec.ts
Normal file
31
apps/api/src/widgets/widgets.controller.throttler.spec.ts
Normal file
@@ -0,0 +1,31 @@
|
||||
import { describe, expect, it } from "vitest";
|
||||
import { WidgetsController } from "./widgets.controller";
|
||||
|
||||
const THROTTLER_SKIP_DEFAULT_KEY = "THROTTLER:SKIPdefault";
|
||||
|
||||
describe("WidgetsController throttler metadata", () => {
|
||||
it("marks widget data polling endpoints to skip throttling", () => {
|
||||
const pollingHandlers = [
|
||||
WidgetsController.prototype.getStatCardData,
|
||||
WidgetsController.prototype.getChartData,
|
||||
WidgetsController.prototype.getListData,
|
||||
WidgetsController.prototype.getCalendarPreviewData,
|
||||
WidgetsController.prototype.getActiveProjectsData,
|
||||
WidgetsController.prototype.getAgentChainsData,
|
||||
];
|
||||
|
||||
for (const handler of pollingHandlers) {
|
||||
expect(Reflect.getMetadata(THROTTLER_SKIP_DEFAULT_KEY, handler)).toBe(true);
|
||||
}
|
||||
});
|
||||
|
||||
it("does not skip throttling for non-polling widget routes", () => {
|
||||
expect(
|
||||
Reflect.getMetadata(THROTTLER_SKIP_DEFAULT_KEY, WidgetsController.prototype.findAll)
|
||||
).toBe(undefined);
|
||||
|
||||
expect(
|
||||
Reflect.getMetadata(THROTTLER_SKIP_DEFAULT_KEY, WidgetsController.prototype.findByName)
|
||||
).toBe(undefined);
|
||||
});
|
||||
});
|
||||
@@ -1,4 +1,5 @@
|
||||
import { Controller, Get, Post, Body, Param, UseGuards, Request } from "@nestjs/common";
|
||||
import { SkipThrottle as SkipThrottler } from "@nestjs/throttler";
|
||||
import { WidgetsService } from "./widgets.service";
|
||||
import { WidgetDataService } from "./widget-data.service";
|
||||
import { AuthGuard } from "../auth/guards/auth.guard";
|
||||
@@ -43,6 +44,7 @@ export class WidgetsController {
|
||||
* Get stat card widget data
|
||||
*/
|
||||
@Post("data/stat-card")
|
||||
@SkipThrottler()
|
||||
@UseGuards(WorkspaceGuard)
|
||||
async getStatCardData(@Request() req: RequestWithWorkspace, @Body() query: StatCardQueryDto) {
|
||||
return this.widgetDataService.getStatCardData(req.workspace.id, query);
|
||||
@@ -53,6 +55,7 @@ export class WidgetsController {
|
||||
* Get chart widget data
|
||||
*/
|
||||
@Post("data/chart")
|
||||
@SkipThrottler()
|
||||
@UseGuards(WorkspaceGuard)
|
||||
async getChartData(@Request() req: RequestWithWorkspace, @Body() query: ChartQueryDto) {
|
||||
return this.widgetDataService.getChartData(req.workspace.id, query);
|
||||
@@ -63,6 +66,7 @@ export class WidgetsController {
|
||||
* Get list widget data
|
||||
*/
|
||||
@Post("data/list")
|
||||
@SkipThrottler()
|
||||
@UseGuards(WorkspaceGuard)
|
||||
async getListData(@Request() req: RequestWithWorkspace, @Body() query: ListQueryDto) {
|
||||
return this.widgetDataService.getListData(req.workspace.id, query);
|
||||
@@ -73,6 +77,7 @@ export class WidgetsController {
|
||||
* Get calendar preview widget data
|
||||
*/
|
||||
@Post("data/calendar-preview")
|
||||
@SkipThrottler()
|
||||
@UseGuards(WorkspaceGuard)
|
||||
async getCalendarPreviewData(
|
||||
@Request() req: RequestWithWorkspace,
|
||||
@@ -86,6 +91,7 @@ export class WidgetsController {
|
||||
* Get active projects widget data
|
||||
*/
|
||||
@Post("data/active-projects")
|
||||
@SkipThrottler()
|
||||
@UseGuards(WorkspaceGuard)
|
||||
async getActiveProjectsData(@Request() req: RequestWithWorkspace) {
|
||||
return this.widgetDataService.getActiveProjectsData(req.workspace.id);
|
||||
@@ -96,6 +102,7 @@ export class WidgetsController {
|
||||
* Get agent chains widget data (active agent sessions)
|
||||
*/
|
||||
@Post("data/agent-chains")
|
||||
@SkipThrottler()
|
||||
@UseGuards(WorkspaceGuard)
|
||||
async getAgentChainsData(@Request() req: RequestWithWorkspace) {
|
||||
return this.widgetDataService.getAgentChainsData(req.workspace.id);
|
||||
|
||||
Reference in New Issue
Block a user