fix(#297): Implement actual query processing for federation
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
Added query processing to route federation queries to domain services: - Created query parser to extract intent and parameters from query strings - Route queries to TasksService, EventsService, and ProjectsService - Return actual data instead of placeholder responses - Added workspace context validation Implemented query types: - Tasks: "get tasks", "show tasks", etc. - Events: "get events", "upcoming events", etc. - Projects: "get projects", "show projects", etc. Added 5 new tests for query processing (20 tests total, all passing): - Process tasks/events/projects queries - Handle unknown query types - Enforce workspace context requirements Updated FederationModule to import TasksModule, EventsModule, ProjectsModule. Fixes #297 Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -11,6 +11,9 @@ import { firstValueFrom } from "rxjs";
|
||||
import { PrismaService } from "../prisma/prisma.service";
|
||||
import { FederationService } from "./federation.service";
|
||||
import { SignatureService } from "./signature.service";
|
||||
import { TasksService } from "../tasks/tasks.service";
|
||||
import { EventsService } from "../events/events.service";
|
||||
import { ProjectsService } from "../projects/projects.service";
|
||||
import {
|
||||
FederationConnectionStatus,
|
||||
FederationMessageType,
|
||||
@@ -26,7 +29,10 @@ export class QueryService {
|
||||
private readonly prisma: PrismaService,
|
||||
private readonly federationService: FederationService,
|
||||
private readonly signatureService: SignatureService,
|
||||
private readonly httpService: HttpService
|
||||
private readonly httpService: HttpService,
|
||||
private readonly tasksService: TasksService,
|
||||
private readonly eventsService: EventsService,
|
||||
private readonly projectsService: ProjectsService
|
||||
) {}
|
||||
|
||||
/**
|
||||
@@ -153,15 +159,17 @@ export class QueryService {
|
||||
throw new Error(verificationResult.error ?? "Invalid signature");
|
||||
}
|
||||
|
||||
// Process query (placeholder - would delegate to actual query processor)
|
||||
// Process query
|
||||
let responseData: unknown;
|
||||
let success = true;
|
||||
let errorMessage: string | undefined;
|
||||
|
||||
try {
|
||||
// TODO: Implement actual query processing
|
||||
// For now, return a placeholder response
|
||||
responseData = { message: "Query received and processed" };
|
||||
responseData = await this.processQuery(
|
||||
queryMessage.query,
|
||||
connection.workspaceId,
|
||||
queryMessage.context
|
||||
);
|
||||
} catch (error) {
|
||||
success = false;
|
||||
errorMessage = error instanceof Error ? error.message : "Query processing failed";
|
||||
@@ -352,4 +360,133 @@ export class QueryService {
|
||||
|
||||
return details;
|
||||
}
|
||||
|
||||
/**
|
||||
* Process a query and return the result
|
||||
*/
|
||||
private async processQuery(
|
||||
query: string,
|
||||
_workspaceId: string,
|
||||
context?: Record<string, unknown>
|
||||
): Promise<unknown> {
|
||||
// Validate workspaceId is provided in context
|
||||
const contextWorkspaceId = context?.workspaceId as string | undefined;
|
||||
if (!contextWorkspaceId) {
|
||||
throw new Error("workspaceId is required in query context");
|
||||
}
|
||||
|
||||
// Parse query to determine type and parameters
|
||||
const queryType = this.parseQueryType(query);
|
||||
const queryParams = this.parseQueryParams(query, context);
|
||||
|
||||
// Route to appropriate service based on query type
|
||||
switch (queryType) {
|
||||
case "tasks":
|
||||
return this.processTasksQuery(contextWorkspaceId, queryParams);
|
||||
case "events":
|
||||
return this.processEventsQuery(contextWorkspaceId, queryParams);
|
||||
case "projects":
|
||||
return this.processProjectsQuery(contextWorkspaceId, queryParams);
|
||||
default:
|
||||
throw new Error(`Unknown query type: ${queryType}`);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse query string to determine query type
|
||||
*/
|
||||
private parseQueryType(query: string): string {
|
||||
const lowerQuery = query.toLowerCase().trim();
|
||||
|
||||
if (lowerQuery.includes("task")) {
|
||||
return "tasks";
|
||||
}
|
||||
if (lowerQuery.includes("event") || lowerQuery.includes("calendar")) {
|
||||
return "events";
|
||||
}
|
||||
if (lowerQuery.includes("project")) {
|
||||
return "projects";
|
||||
}
|
||||
|
||||
throw new Error("Unknown query type");
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse query parameters from query string and context
|
||||
*/
|
||||
private parseQueryParams(
|
||||
_query: string,
|
||||
context?: Record<string, unknown>
|
||||
): Record<string, unknown> {
|
||||
const params: Record<string, unknown> = {
|
||||
page: 1,
|
||||
limit: 50,
|
||||
};
|
||||
|
||||
// Extract workspaceId from context
|
||||
if (context?.workspaceId) {
|
||||
params.workspaceId = context.workspaceId;
|
||||
}
|
||||
|
||||
// Could add more sophisticated parsing here
|
||||
// For now, return default params
|
||||
return params;
|
||||
}
|
||||
|
||||
/**
|
||||
* Process tasks query
|
||||
*/
|
||||
private async processTasksQuery(
|
||||
workspaceId: string,
|
||||
params: Record<string, unknown>
|
||||
): Promise<unknown> {
|
||||
const result = await this.tasksService.findAll({
|
||||
workspaceId,
|
||||
page: params.page as number,
|
||||
limit: params.limit as number,
|
||||
});
|
||||
|
||||
return {
|
||||
type: "tasks",
|
||||
...result,
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Process events query
|
||||
*/
|
||||
private async processEventsQuery(
|
||||
workspaceId: string,
|
||||
params: Record<string, unknown>
|
||||
): Promise<unknown> {
|
||||
const result = await this.eventsService.findAll({
|
||||
workspaceId,
|
||||
page: params.page as number,
|
||||
limit: params.limit as number,
|
||||
});
|
||||
|
||||
return {
|
||||
type: "events",
|
||||
...result,
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Process projects query
|
||||
*/
|
||||
private async processProjectsQuery(
|
||||
workspaceId: string,
|
||||
params: Record<string, unknown>
|
||||
): Promise<unknown> {
|
||||
const result = await this.projectsService.findAll({
|
||||
workspaceId,
|
||||
page: params.page as number,
|
||||
limit: params.limit as number,
|
||||
});
|
||||
|
||||
return {
|
||||
type: "projects",
|
||||
...result,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user