import { HttpApiEndpoint, HttpApiGroup } from "effect/unstable/httpapi"; import { Schema } from "effect"; import { ApiKeyAuthMethod, ApiKeyAuthTemplate } from "@executor-js/sdk/http-auth"; import { InternalError, IntegrationAlreadyExistsError, IntegrationNotFoundError, IntegrationSlug, } from "@executor-js/sdk/shared"; import { OpenApiExtractionError, OpenApiOAuthError, OpenApiParseError, } from "@executor-js/plugin-openapi"; const DomainErrors = [ InternalError, OpenApiParseError, OpenApiExtractionError, OpenApiOAuthError, IntegrationAlreadyExistsError, ] as const; const IntegrationNotFound = IntegrationNotFoundError.annotate({ httpApiStatus: 404 }); const UpdateErrors = [ InternalError, OpenApiParseError, OpenApiExtractionError, OpenApiOAuthError, IntegrationNotFound, ] as const; const SlugParams = { slug: Schema.String, }; const OAuthTemplatePayload = Schema.Struct({ slug: Schema.String, kind: Schema.Literal("oauth2"), authorizationUrl: Schema.String, tokenUrl: Schema.String, scopes: Schema.Array(Schema.String), }); const AuthenticationPayload = Schema.Union([OAuthTemplatePayload, ApiKeyAuthTemplate]); const AuthenticationResponse = Schema.Union([OAuthTemplatePayload, ApiKeyAuthMethod]); const AddPresetServicePayload = Schema.Struct({ presetId: Schema.String, slug: Schema.optional(Schema.String), name: Schema.optional(Schema.String), }); const AddCustomServicePayload = Schema.Struct({ custom: Schema.Struct({ urls: Schema.Array(Schema.String), slug: Schema.optional(Schema.String), name: Schema.optional(Schema.String), description: Schema.optional(Schema.String), }), }); const AddServicePayload = Schema.Union([AddPresetServicePayload, AddCustomServicePayload]); const AddServicesPayload = Schema.Struct({ services: Schema.Array(AddServicePayload), baseUrl: Schema.optional(Schema.String), }); const AddServicesResponse = Schema.Struct({ added: Schema.Array( Schema.Struct({ slug: IntegrationSlug, presetId: Schema.String, toolCount: Schema.Number, }), ), skipped: Schema.Array( Schema.Struct({ slug: IntegrationSlug, presetId: Schema.String, reason: Schema.Literal("already_exists"), }), ), failed: Schema.Array( Schema.Struct({ slug: IntegrationSlug, presetId: Schema.String, error: Schema.String, }), ), }); const UpdateBundlePayload = Schema.Struct({ urls: Schema.optional(Schema.Array(Schema.String)), }); const UpdateBundleResponse = Schema.Struct({ slug: IntegrationSlug, toolCount: Schema.Number, addedTools: Schema.Array(Schema.String), removedTools: Schema.Array(Schema.String), }); const IntegrationView = Schema.Struct({ slug: IntegrationSlug, description: Schema.String, kind: Schema.String, canRemove: Schema.Boolean, canRefresh: Schema.Boolean, }); const GoogleConfigView = Schema.Struct({ googleDiscoveryUrls: Schema.optional(Schema.Array(Schema.String)), baseUrl: Schema.optional(Schema.String), headers: Schema.optional(Schema.Record(Schema.String, Schema.String)), queryParams: Schema.optional(Schema.Record(Schema.String, Schema.String)), authenticationTemplate: Schema.optional(Schema.Array(AuthenticationResponse)), }); const ConfigurePayload = Schema.Struct({ authenticationTemplate: Schema.Array(AuthenticationPayload), mode: Schema.optional(Schema.Literals(["merge", "replace"])), }); const ConfigureResponse = Schema.Struct({ authenticationTemplate: Schema.Array(AuthenticationResponse), }); export const GoogleGroup = HttpApiGroup.make("google") .add( HttpApiEndpoint.post("addServices", "/google/services", { payload: AddServicesPayload, success: AddServicesResponse, error: DomainErrors, }), ) .add( HttpApiEndpoint.get("getIntegration", "/google/integrations/:slug", { params: SlugParams, success: Schema.NullOr(IntegrationView), error: DomainErrors, }), ) .add( HttpApiEndpoint.get("getConfig", "/google/integrations/:slug/config", { params: SlugParams, success: Schema.NullOr(GoogleConfigView), error: DomainErrors, }), ) .add( HttpApiEndpoint.post("configure", "/google/integrations/:slug/config", { params: SlugParams, payload: ConfigurePayload, success: ConfigureResponse, error: DomainErrors, }), ) .add( HttpApiEndpoint.post("updateBundle", "/google/integrations/:slug/bundle", { params: SlugParams, payload: UpdateBundlePayload, success: UpdateBundleResponse, error: UpdateErrors, }), ) .add( HttpApiEndpoint.delete("removeBundle", "/google/integrations/:slug", { params: SlugParams, success: Schema.Void, error: DomainErrors, }), );