diff --git a/apps/rowboat/app/actions/composio.actions.ts b/apps/rowboat/app/actions/composio.actions.ts index 36741199..5609cf3c 100644 --- a/apps/rowboat/app/actions/composio.actions.ts +++ b/apps/rowboat/app/actions/composio.actions.ts @@ -135,7 +135,6 @@ export async function listComposioTriggerTypes(toolkitSlug: string, cursor?: str export async function createComposioTriggerDeployment(request: { projectId: string, - toolkitSlug: string, triggerTypeSlug: string, connectedAccountId: string, triggerConfig?: Record, @@ -146,9 +145,8 @@ export async function createComposioTriggerDeployment(request: { return await createComposioTriggerDeploymentController.execute({ caller: 'user', userId: user._id, + projectId: request.projectId, data: { - projectId: request.projectId, - toolkitSlug: request.toolkitSlug, triggerTypeSlug: request.triggerTypeSlug, connectedAccountId: request.connectedAccountId, triggerConfig: request.triggerConfig ?? {}, diff --git a/apps/rowboat/app/projects/[projectId]/job-rules/components/triggers-tab.tsx b/apps/rowboat/app/projects/[projectId]/job-rules/components/triggers-tab.tsx index 2ed1c3f3..a68594db 100644 --- a/apps/rowboat/app/projects/[projectId]/job-rules/components/triggers-tab.tsx +++ b/apps/rowboat/app/projects/[projectId]/job-rules/components/triggers-tab.tsx @@ -199,7 +199,6 @@ export function TriggersTab({ projectId }: { projectId: string }) { // Create the trigger deployment await createComposioTriggerDeployment({ projectId, - toolkitSlug: selectedToolkit.slug, triggerTypeSlug: selectedTriggerType.slug, connectedAccountId, triggerConfig, diff --git a/apps/rowboat/src/application/lib/composio/composio.ts b/apps/rowboat/src/application/lib/composio/composio.ts index 0b3e8a19..057a14cc 100644 --- a/apps/rowboat/src/application/lib/composio/composio.ts +++ b/apps/rowboat/src/application/lib/composio/composio.ts @@ -212,4 +212,9 @@ export async function listTriggersTypes(toolkitSlug: string, cursor?: string): P // fetch return composioApiCall(ZListResponse(ZTriggerType), url.toString()); +} + +export async function getTriggersType(triggerTypeSlug: string): Promise> { + const url = new URL(`${BASE_URL}/triggers_types/${triggerTypeSlug}`); + return composioApiCall(ZTriggerType, url.toString()); } \ No newline at end of file diff --git a/apps/rowboat/src/application/repositories/composio-trigger-deployments.repository.interface.ts b/apps/rowboat/src/application/repositories/composio-trigger-deployments.repository.interface.ts index 1bc60e72..a65fd18e 100644 --- a/apps/rowboat/src/application/repositories/composio-trigger-deployments.repository.interface.ts +++ b/apps/rowboat/src/application/repositories/composio-trigger-deployments.repository.interface.ts @@ -14,6 +14,7 @@ export const CreateDeploymentSchema = ComposioTriggerDeployment toolkitSlug: true, logo: true, triggerTypeSlug: true, + triggerTypeName: true, triggerConfig: true, }); diff --git a/apps/rowboat/src/application/use-cases/composio-trigger-deployments/create-composio-trigger-deployment.use-case.ts b/apps/rowboat/src/application/use-cases/composio-trigger-deployments/create-composio-trigger-deployment.use-case.ts index 57c804ee..fdd3bbfc 100644 --- a/apps/rowboat/src/application/use-cases/composio-trigger-deployments/create-composio-trigger-deployment.use-case.ts +++ b/apps/rowboat/src/application/use-cases/composio-trigger-deployments/create-composio-trigger-deployment.use-case.ts @@ -2,18 +2,20 @@ import { BadRequestError, NotFoundError } from '@/src/entities/errors/common'; import { z } from "zod"; import { IUsageQuotaPolicy } from '../../policies/usage-quota.policy.interface'; import { IProjectActionAuthorizationPolicy } from '../../policies/project-action-authorization.policy'; -import { CreateDeploymentSchema, IComposioTriggerDeploymentsRepository } from '../../repositories/composio-trigger-deployments.repository.interface'; +import { IComposioTriggerDeploymentsRepository } from '../../repositories/composio-trigger-deployments.repository.interface'; import { IProjectsRepository } from '../../repositories/projects.repository.interface'; -import { composio, getToolkit } from '../../lib/composio/composio'; +import { composio, getTriggersType } from '../../lib/composio/composio'; import { ComposioTriggerDeployment } from '@/src/entities/models/composio-trigger-deployment'; const inputSchema = z.object({ caller: z.enum(["user", "api"]), userId: z.string().optional(), apiKey: z.string().optional(), - data: CreateDeploymentSchema.omit({ - triggerId: true, - logo: true, + projectId: z.string(), + data: ComposioTriggerDeployment.pick({ + triggerTypeSlug: true, + connectedAccountId: true, + triggerConfig: true, }), }); @@ -46,7 +48,7 @@ export class CreateComposioTriggerDeploymentUseCase implements ICreateComposioTr async execute(request: z.infer): Promise> { // extract projectid from conversation - const { projectId } = request.data; + const { projectId } = request; // authz check await this.projectActionAuthorizationPolicy.authorize({ @@ -59,8 +61,11 @@ export class CreateComposioTriggerDeploymentUseCase implements ICreateComposioTr // assert and consume quota await this.usageQuotaPolicy.assertAndConsume(projectId); + // get trigger type info + const triggerType = await getTriggersType(request.data.triggerTypeSlug); + // get toolkit info - const toolkit = await getToolkit(request.data.toolkitSlug); + const toolkit = triggerType.toolkit; // ensure that connected account exists on project const project = await this.projectsRepository.fetch(projectId); @@ -69,7 +74,7 @@ export class CreateComposioTriggerDeploymentUseCase implements ICreateComposioTr } // ensure connected account exists - const account = project.composioConnectedAccounts?.[request.data.toolkitSlug]; + const account = project.composioConnectedAccounts?.[toolkit.slug]; if (!account || account.id !== request.data.connectedAccountId) { throw new BadRequestError('Invalid connected account'); } @@ -81,7 +86,7 @@ export class CreateComposioTriggerDeploymentUseCase implements ICreateComposioTr } // create trigger on composio - const result = await composio.triggers.create(request.data.projectId, request.data.triggerTypeSlug, { + const result = await composio.triggers.create(projectId, request.data.triggerTypeSlug, { connectedAccountId: request.data.connectedAccountId, triggerConfig: request.data.triggerConfig, }); @@ -89,11 +94,12 @@ export class CreateComposioTriggerDeploymentUseCase implements ICreateComposioTr // create trigger deployment in db return await this.composioTriggerDeploymentsRepository.create({ projectId, - toolkitSlug: request.data.toolkitSlug, - logo: toolkit.meta.logo, + toolkitSlug: toolkit.slug, + logo: toolkit.logo, triggerId: result.triggerId, connectedAccountId: request.data.connectedAccountId, triggerTypeSlug: request.data.triggerTypeSlug, + triggerTypeName: triggerType.name, triggerConfig: request.data.triggerConfig, }); } diff --git a/apps/rowboat/src/entities/models/composio-trigger-deployment.ts b/apps/rowboat/src/entities/models/composio-trigger-deployment.ts index b6ccc294..194b6842 100644 --- a/apps/rowboat/src/entities/models/composio-trigger-deployment.ts +++ b/apps/rowboat/src/entities/models/composio-trigger-deployment.ts @@ -6,6 +6,7 @@ export const ComposioTriggerDeployment = z.object({ triggerId: z.string(), toolkitSlug: z.string(), triggerTypeSlug: z.string(), + triggerTypeName: z.string(), connectedAccountId: z.string(), triggerConfig: z.record(z.string(), z.unknown()), logo: z.string(), diff --git a/apps/rowboat/src/interface-adapters/controllers/composio-trigger-deployments/create-composio-trigger-deployment.controller.ts b/apps/rowboat/src/interface-adapters/controllers/composio-trigger-deployments/create-composio-trigger-deployment.controller.ts index 275fdb32..d8e4c450 100644 --- a/apps/rowboat/src/interface-adapters/controllers/composio-trigger-deployments/create-composio-trigger-deployment.controller.ts +++ b/apps/rowboat/src/interface-adapters/controllers/composio-trigger-deployments/create-composio-trigger-deployment.controller.ts @@ -2,15 +2,16 @@ import { BadRequestError } from "@/src/entities/errors/common"; import z from "zod"; import { ICreateComposioTriggerDeploymentUseCase } from "@/src/application/use-cases/composio-trigger-deployments/create-composio-trigger-deployment.use-case"; import { ComposioTriggerDeployment } from "@/src/entities/models/composio-trigger-deployment"; -import { CreateDeploymentSchema } from "@/src/application/repositories/composio-trigger-deployments.repository.interface"; const inputSchema = z.object({ caller: z.enum(["user", "api"]), userId: z.string().optional(), apiKey: z.string().optional(), - data: CreateDeploymentSchema.omit({ - triggerId: true, - logo: true, + projectId: z.string(), + data: ComposioTriggerDeployment.pick({ + triggerTypeSlug: true, + connectedAccountId: true, + triggerConfig: true, }), }); @@ -35,13 +36,14 @@ export class CreateComposioTriggerDeploymentController implements ICreateComposi if (!result.success) { throw new BadRequestError(`Invalid request: ${JSON.stringify(result.error)}`); } - const { caller, userId, apiKey, data } = result.data; + const { caller, userId, apiKey, projectId, data } = result.data; // execute use case return await this.createComposioTriggerDeploymentUseCase.execute({ caller, userId, apiKey, + projectId, data, }); }