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, }), );
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,
}),
);