Add Activepieces integration for workflow automation

- Add Activepieces fork with SmoothSchedule custom piece
- Create integrations app with Activepieces service layer
- Add embed token endpoint for iframe integration
- Create Automations page with embedded workflow builder
- Add sidebar visibility fix for embed mode
- Add list inactive customers endpoint to Public API
- Include SmoothSchedule triggers: event created/updated/cancelled
- Include SmoothSchedule actions: create/update/cancel events, list resources/services/customers

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
poduck
2025-12-18 22:59:37 -05:00
parent 9848268d34
commit 3aa7199503
16292 changed files with 1284892 additions and 4708 deletions

View File

@@ -0,0 +1,63 @@
import { test as base } from '@playwright/test';
import {
AuthenticationPage,
FlowsPage,
BuilderPage,
} from '../pages';
import { signUp, AuthenticationResponse } from './users';
import { DEFAULT_EMAIL, DEFAULT_PASSWORD } from '../global-setup';
type CustomFixtures = {
authenticationPage: AuthenticationPage;
flowsPage: FlowsPage;
builderPage: BuilderPage;
authenticatedPage: AuthenticationPage;
users: {
apiSignUp: () => Promise<AuthenticationResponse>;
}
};
export const test = base.extend<CustomFixtures>({
// Override page fixture to automatically authenticate before each test
page: async ({ page }, use) => {
const authPage = new AuthenticationPage(page);
if (process.env.E2E_EMAIL && process.env.E2E_PASSWORD) {
await authPage.signIn({
email: process.env.E2E_EMAIL,
password: process.env.E2E_PASSWORD,
});
} else {
await authPage.signIn({
email: DEFAULT_EMAIL,
password: DEFAULT_PASSWORD,
});
}
await use(page);
},
authenticationPage: async ({ page }, use) => {
await use(new AuthenticationPage(page));
},
flowsPage: async ({ page }, use) => {
await use(new FlowsPage(page));
},
builderPage: async ({ page }, use) => {
await use(new BuilderPage(page));
},
authenticatedPage: async ({ page }, use) => {
await use(new AuthenticationPage(page));
},
users: async ({ request, page }, use) => {
await use({
apiSignUp: async () => await signUp(request, page),
});
},
});
export { expect } from '@playwright/test';

View File

@@ -0,0 +1,50 @@
import { faker } from '@faker-js/faker';
import type { APIRequestContext, Page } from '@playwright/test';
export async function signUp(request: APIRequestContext, page: Page): Promise<AuthenticationResponse> {
const signUpPayload = {
email: faker.internet.email(),
password: '12345678',
firstName: 'Test',
lastName: 'User',
trackEvents: false,
platformId: null,
newsLetter: false,
provider: UserIdentityProvider.EMAIL,
};
const response = await request.post('/api/v1/authentication/sign-up', {
data: signUpPayload,
});
const authResponse = await response.json();
await page.addInitScript((tokenValue) => {
localStorage.setItem('token', tokenValue);
}, authResponse.token);
return authResponse;
}
// cant import from shared: https://www.checklyhq.com/docs/runtimes/#why-cant-i-import-any-npm-package-or-other-3rd-party-dependencies
export enum UserIdentityProvider {
EMAIL = 'EMAIL',
GOOGLE = 'GOOGLE',
SAML = 'SAML',
JWT = 'JWT',
}
export type AuthenticationResponse = {
id: string;
platformRole: string;
status: string;
externalId: string;
platformId: string;
verified: boolean;
firstName: string;
lastName: string;
email: string;
trackEvents: boolean;
newsLetter: boolean;
token: string;
projectId: string;
}