Files
windmill/cli/settings.ts
HugoCasa bab67fe3ae feat: wmill sync workspace settings (#3425)
* feat: wmill sync workspace settings

* fix: build

* fix: nit
2024-03-15 20:07:48 +01:00

202 lines
6.4 KiB
TypeScript

import { WorkspaceService, log } from "./deps.ts";
import { isSuperset } from "./types.ts";
import { deepEqual } from "./utils.ts";
interface SimplifiedSettings {
// slack_team_id?: string;
// slack_name?: string;
// slack_command_script?: string;
// slack_email?: string;
auto_invite_enabled: boolean;
auto_invite_as: string;
auto_invite_mode: string;
webhook?: string;
deploy_to?: string;
error_handler?: string;
error_handler_extra_args?: any;
error_handler_muted_on_cancel?: boolean;
openai_resource_path?: string;
code_completion_enabled: boolean;
large_file_storage?: any;
git_sync?: any;
default_app?: string;
default_scripts?: any;
}
export async function pushWorkspaceSettings(
workspace: string,
_path: string,
settings: SimplifiedSettings | undefined,
localSettings: SimplifiedSettings
) {
try {
const remoteSettings = await WorkspaceService.getSettings({
workspace,
});
settings = {
// slack_team_id: remoteSettings.slack_team_id,
// slack_name: remoteSettings.slack_name,
// slack_command_script: remoteSettings.slack_command_script,
// slack_email: remoteSettings.slack_email,
auto_invite_enabled: remoteSettings.auto_invite_domain !== null,
auto_invite_as: remoteSettings.auto_invite_operator
? "operator"
: "developer",
auto_invite_mode: remoteSettings.auto_add ? "add" : "invite",
webhook: remoteSettings.webhook,
deploy_to: remoteSettings.deploy_to,
error_handler: remoteSettings.error_handler,
error_handler_extra_args: remoteSettings.error_handler_extra_args,
error_handler_muted_on_cancel:
remoteSettings.error_handler_muted_on_cancel,
openai_resource_path: remoteSettings.openai_resource_path,
code_completion_enabled: remoteSettings.code_completion_enabled,
large_file_storage: remoteSettings.large_file_storage,
git_sync: remoteSettings.git_sync,
default_app: remoteSettings.default_app,
default_scripts: remoteSettings.default_scripts,
};
} catch (err) {
throw new Error(`Failed to get workspace settings: ${err}`);
}
if (isSuperset(localSettings, settings)) {
log.debug(`Workspace settings are up to date`);
return;
}
log.debug(`Workspace settings are not up-to-date, updating...`);
if (localSettings.webhook !== settings.webhook) {
log.debug(`Updateing webhook...`);
await WorkspaceService.editWebhook({
workspace,
requestBody: {
webhook: localSettings.webhook,
},
});
}
if (
localSettings.auto_invite_as !== settings.auto_invite_as ||
localSettings.auto_invite_enabled !== settings.auto_invite_enabled ||
localSettings.auto_invite_mode !== settings.auto_invite_mode
) {
log.debug(`Updating auto invite...`);
if (!["operator", "developer"].includes(settings.auto_invite_as)) {
throw new Error(
`Invalid value for auto_invite_as. Valid values are "operator" and "developer"`
);
}
if (!["add", "invite"].includes(settings.auto_invite_mode)) {
throw new Error(
`Invalid value for auto_invite_mode. Valid values are "invite" and "add"`
);
}
try {
await WorkspaceService.editAutoInvite({
workspace,
requestBody: localSettings.auto_invite_enabled
? {
operator: localSettings.auto_invite_as === "operator",
invite_all: true,
auto_add: localSettings.auto_invite_mode === "add",
}
: {},
});
} catch (_) {
// on cloud
log.debug(
`Auto invite is not possible on cloud, only auto-inviting same domain...`
);
await WorkspaceService.editAutoInvite({
workspace,
requestBody: localSettings.auto_invite_enabled
? {
operator: localSettings.auto_invite_as === "operator",
invite_all: false,
auto_add: localSettings.auto_invite_mode === "add",
}
: {},
});
}
}
if (
localSettings.openai_resource_path !== settings.openai_resource_path ||
localSettings.code_completion_enabled !== settings.code_completion_enabled
) {
log.debug(`Updating openai settings...`);
await WorkspaceService.editCopilotConfig({
workspace,
requestBody: {
openai_resource_path: localSettings.openai_resource_path,
code_completion_enabled: localSettings.code_completion_enabled,
},
});
}
if (
localSettings.error_handler !== settings.error_handler ||
!deepEqual(
localSettings.error_handler_extra_args,
settings.error_handler_extra_args
) ||
localSettings.error_handler_muted_on_cancel !==
settings.error_handler_muted_on_cancel
) {
log.debug(`Updating error handler...`);
await WorkspaceService.editErrorHandler({
workspace,
requestBody: {
error_handler: localSettings.error_handler,
error_handler_extra_args: localSettings.error_handler_extra_args,
error_handler_muted_on_cancel:
localSettings.error_handler_muted_on_cancel,
},
});
}
if (localSettings.deploy_to !== settings.deploy_to) {
log.debug(`Updating deploy to...`);
await WorkspaceService.editDeployTo({
workspace,
requestBody: {
deploy_to: localSettings.deploy_to,
},
});
}
if (
!deepEqual(localSettings.large_file_storage, settings.large_file_storage)
) {
log.debug(`Updating large file storage...`);
await WorkspaceService.editLargeFileStorageConfig({
workspace,
requestBody: {
large_file_storage: localSettings.large_file_storage,
},
});
}
if (!deepEqual(localSettings.git_sync, settings.git_sync)) {
log.debug(`Updating git sync...`);
await WorkspaceService.editWorkspaceGitSyncConfig({
workspace,
requestBody: {
git_sync_settings: localSettings.git_sync,
},
});
}
if (!deepEqual(localSettings.default_scripts, settings.default_scripts)) {
log.debug(`Updating default scripts...`);
await WorkspaceService.editDefaultScripts({
workspace,
requestBody: localSettings.default_scripts,
});
}
if (localSettings.default_app !== settings.default_app) {
log.debug(`Updating default app...`);
await WorkspaceService.editWorkspaceDefaultApp({
workspace,
requestBody: {
default_app_path: localSettings.default_app,
},
});
}
}