Skip to content

Commit 2ab39a1

Browse files
authored
refactor: rename rules to automations everywhere (#1395)
1 parent 21ac4a9 commit 2ab39a1

File tree

36 files changed

+865
-574
lines changed

36 files changed

+865
-574
lines changed

core/actions/_lib/rules.tsx renamed to core/actions/_lib/automations.tsx

Lines changed: 25 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,16 @@ import {
88
} from "lucide-react";
99
import { z } from "zod";
1010

11-
import type { RulesId } from "db/public";
11+
import type { AutomationsId } from "db/public";
1212
import { Event } from "db/public";
1313
import { CopyButton } from "ui/copy-button";
1414

15-
import { defineRule } from "~/actions/types";
15+
import { defineAutomation } from "~/actions/types";
1616

1717
export const intervals = ["minute", "hour", "day", "week", "month", "year"] as const;
1818
export type Interval = (typeof intervals)[number];
1919

20-
export const pubInStageForDuration = defineRule({
20+
export const pubInStageForDuration = defineAutomation({
2121
event: Event.pubInStageForDuration,
2222
additionalConfig: z.object({
2323
duration: z.number().int().min(1),
@@ -32,7 +32,7 @@ export const pubInStageForDuration = defineRule({
3232
});
3333
export type PubInStageForDuration = typeof pubInStageForDuration;
3434

35-
export const pubLeftStage = defineRule({
35+
export const pubLeftStage = defineAutomation({
3636
event: Event.pubLeftStage,
3737
display: {
3838
icon: ArrowRightFromLine,
@@ -41,7 +41,7 @@ export const pubLeftStage = defineRule({
4141
});
4242
export type PubLeftStage = typeof pubLeftStage;
4343

44-
export const pubEnteredStage = defineRule({
44+
export const pubEnteredStage = defineAutomation({
4545
event: Event.pubEnteredStage,
4646
display: {
4747
icon: ArrowRightToLine,
@@ -50,7 +50,7 @@ export const pubEnteredStage = defineRule({
5050
});
5151
export type PubEnteredStage = typeof pubEnteredStage;
5252

53-
export const actionSucceeded = defineRule({
53+
export const actionSucceeded = defineAutomation({
5454
event: Event.actionSucceeded,
5555
display: {
5656
icon: CheckCircle,
@@ -60,7 +60,7 @@ export const actionSucceeded = defineRule({
6060
});
6161
export type ActionSucceeded = typeof actionSucceeded;
6262

63-
export const actionFailed = defineRule({
63+
export const actionFailed = defineAutomation({
6464
event: Event.actionFailed,
6565
display: {
6666
icon: XCircle,
@@ -70,25 +70,28 @@ export const actionFailed = defineRule({
7070
});
7171
export type ActionFailed = typeof actionFailed;
7272

73-
export const constructWebhookUrl = (ruleId: RulesId, communitySlug: string) =>
74-
`/api/v0/c/${communitySlug}/site/webhook/${ruleId}`;
73+
export const constructWebhookUrl = (automationId: AutomationsId, communitySlug: string) =>
74+
`/api/v0/c/${communitySlug}/site/webhook/${automationId}`;
7575

76-
export const webhook = defineRule({
76+
export const webhook = defineAutomation({
7777
event: Event.webhook,
7878
display: {
7979
icon: Globe,
8080
base: ({ community }) => (
8181
<span>
8282
a request is made to{" "}
83-
<code>{constructWebhookUrl("<ruleId>" as RulesId, community.slug)}</code>
83+
<code>
84+
{constructWebhookUrl("<automationId>" as AutomationsId, community.slug)}
85+
</code>
8486
</span>
8587
),
86-
hydrated: ({ rule, community }) => (
88+
hydrated: ({ automation: automation, community }) => (
8789
<span>
88-
a request is made to <code>{constructWebhookUrl(rule.id, community.slug)}</code>
90+
a request is made to{" "}
91+
<code>{constructWebhookUrl(automation.id, community.slug)}</code>
8992
<CopyButton
9093
value={new URL(
91-
constructWebhookUrl(rule.id, community.slug),
94+
constructWebhookUrl(automation.id, community.slug),
9295
window.location.origin
9396
).toString()}
9497
/>
@@ -97,7 +100,7 @@ export const webhook = defineRule({
97100
},
98101
});
99102

100-
export type Rules =
103+
export type Automation =
101104
| PubInStageForDuration
102105
| PubLeftStage
103106
| PubEnteredStage
@@ -109,13 +112,15 @@ export type SchedulableEvent =
109112
| Event.actionFailed
110113
| Event.actionSucceeded;
111114

112-
export type RuleForEvent<E extends Event> = E extends E ? Extract<Rules, { event: E }> : never;
115+
export type AutomationForEvent<E extends Event> = E extends E
116+
? Extract<Automation, { event: E }>
117+
: never;
113118

114-
export type SchedulableRule = RuleForEvent<SchedulableEvent>;
119+
export type SchedulableAutomation = AutomationForEvent<SchedulableEvent>;
115120

116-
export type RuleConfig<Rule extends Rules = Rules> = Rule extends Rule
121+
export type AutomationConfig<A extends Automation = Automation> = A extends A
117122
? {
118-
ruleConfig: NonNullable<Rule["additionalConfig"]>["_input"] extends infer RC
123+
automationConfig: NonNullable<A["additionalConfig"]>["_input"] extends infer RC
119124
? undefined extends RC
120125
? null
121126
: RC
@@ -124,4 +129,4 @@ export type RuleConfig<Rule extends Rules = Rules> = Rule extends Rule
124129
}
125130
: never;
126131

127-
export type RuleConfigs = RuleConfig | undefined;
132+
export type AutomationConfigs = AutomationConfig | undefined;

core/actions/_lib/runActionInstance.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,9 @@ import { env } from "~/lib/env/env";
2424
import { createLastModifiedBy } from "~/lib/lastModifiedBy";
2525
import { ApiError, getPubsWithRelatedValues } from "~/lib/server";
2626
import { getActionConfigDefaults } from "~/lib/server/actions";
27+
import { MAX_STACK_DEPTH } from "~/lib/server/automations";
2728
import { autoRevalidate } from "~/lib/server/cache/autoRevalidate";
2829
import { getCommunity } from "~/lib/server/community";
29-
import { MAX_STACK_DEPTH } from "~/lib/server/rules";
3030
import { isClientExceptionOptions } from "~/lib/serverActions";
3131
import { getActionByName } from "../api";
3232
import { ActionConfigBuilder } from "./ActionConfigBuilder";
@@ -375,13 +375,13 @@ export const runInstancesForEvent = async (
375375
) => {
376376
const instances = await trx
377377
.selectFrom("action_instances")
378-
.innerJoin("rules", "rules.actionInstanceId", "action_instances.id")
378+
.innerJoin("automations", "automations.actionInstanceId", "action_instances.id")
379379
.select([
380380
"action_instances.id as actionInstanceId",
381-
"rules.config as ruleConfig",
381+
"automations.config as automationConfig",
382382
"action_instances.name as actionInstanceName",
383383
])
384-
.where("rules.event", "=", event)
384+
.where("automations.event", "=", event)
385385
.where("action_instances.stageId", "=", stageId)
386386
.execute();
387387

@@ -396,7 +396,7 @@ export const runInstancesForEvent = async (
396396
communityId,
397397
actionInstanceId: instance.actionInstanceId,
398398
event,
399-
actionInstanceArgs: instance.ruleConfig ?? null,
399+
actionInstanceArgs: instance.automationConfig ?? null,
400400
stack,
401401
},
402402
trx

core/actions/_lib/scheduleActionInstance.ts

Lines changed: 37 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@ import type { ActionInstancesId, ActionRunsId, PubsId, StagesId } from "db/publi
33
import { ActionRunStatus, Event } from "db/public";
44
import { logger } from "logger";
55

6-
import type { SchedulableRule } from "./rules";
7-
import type { GetEventRuleOptions } from "~/lib/db/queries";
6+
import type { SchedulableAutomation } from "./automations";
7+
import type { GetEventAutomationOptions } from "~/lib/db/queries";
88
import { db } from "~/kysely/database";
99
import { addDuration } from "~/lib/dates";
10-
import { getStageRules } from "~/lib/db/queries";
10+
import { getStageAutomations } from "~/lib/db/queries";
1111
import { autoRevalidate } from "~/lib/server/cache/autoRevalidate";
1212
import { getCommunitySlug } from "~/lib/server/cache/getCommunitySlug";
1313
import { getJobsClient, getScheduledActionJobKey } from "~/lib/server/jobs";
@@ -17,7 +17,7 @@ type Shared = {
1717
stack: ActionRunsId[];
1818
/* Config for the action instance */
1919
config?: Record<string, unknown> | null;
20-
} & GetEventRuleOptions;
20+
} & GetEventAutomationOptions;
2121

2222
type ScheduleActionInstanceForPubOptions = Shared & {
2323
pubId: PubsId;
@@ -42,85 +42,85 @@ export const scheduleActionInstances = async (options: ScheduleActionInstanceOpt
4242
throw new Error("PubId or body is required");
4343
}
4444

45-
const [rules, jobsClient] = await Promise.all([
46-
getStageRules(options.stageId, options).execute(),
45+
const [automations, jobsClient] = await Promise.all([
46+
getStageAutomations(options.stageId, options).execute(),
4747
getJobsClient(),
4848
]);
4949

50-
if (!rules.length) {
50+
if (!automations.length) {
5151
logger.debug({
5252
msg: `No action instances found for stage ${options.stageId}. Most likely this is because a Pub is moved into a stage without action instances.`,
5353
pubId: options.pubId,
5454
stageId: options.stageId,
55-
rules,
55+
automations,
5656
});
5757
return;
5858
}
5959

60-
const validRules = rules
60+
const validAutomations = automations
6161
.filter(
62-
(rule): rule is typeof rule & SchedulableRule =>
63-
rule.event === Event.actionFailed ||
64-
rule.event === Event.actionSucceeded ||
65-
rule.event === Event.webhook ||
66-
(rule.event === Event.pubInStageForDuration &&
62+
(automation): automation is typeof automation & SchedulableAutomation =>
63+
automation.event === Event.actionFailed ||
64+
automation.event === Event.actionSucceeded ||
65+
automation.event === Event.webhook ||
66+
(automation.event === Event.pubInStageForDuration &&
6767
Boolean(
68-
typeof rule.config === "object" &&
69-
rule.config &&
70-
"duration" in rule.config &&
71-
rule.config.duration &&
72-
"interval" in rule.config &&
73-
rule.config.interval
68+
typeof automation.config === "object" &&
69+
automation.config &&
70+
"duration" in automation.config &&
71+
automation.config.duration &&
72+
"interval" in automation.config &&
73+
automation.config.interval
7474
))
7575
)
76-
.map((rule) => ({
77-
...rule,
78-
duration: rule.config?.ruleConfig?.duration || 0,
79-
interval: rule.config?.ruleConfig?.interval || "minute",
76+
.map((automation) => ({
77+
...automation,
78+
duration: automation.config?.automationConfig?.duration || 0,
79+
interval: automation.config?.automationConfig?.interval || "minute",
8080
}));
8181

8282
const results = await Promise.all(
83-
validRules.flatMap(async (rule) => {
83+
validAutomations.flatMap(async (automation) => {
8484
const runAt = addDuration({
85-
duration: rule.duration,
86-
interval: rule.interval,
85+
duration: automation.duration,
86+
interval: automation.interval,
8787
}).toISOString();
8888

8989
const scheduledActionRun = await autoRevalidate(
9090
db
9191
.insertInto("action_runs")
9292
.values({
93-
actionInstanceId: rule.actionInstance.id,
93+
actionInstanceId: automation.actionInstance.id,
9494
pubId: options.pubId,
9595
json: options.json,
9696
status: ActionRunStatus.scheduled,
97-
config: options.config ?? rule.actionInstance.config,
97+
config: options.config ?? automation.actionInstance.config,
9898
result: { scheduled: `Action scheduled for ${runAt}` },
99-
event: rule.event,
99+
event: automation.event,
100100
sourceActionRunId: options.stack.at(-1),
101101
})
102102
.returning("id")
103103
).executeTakeFirstOrThrow();
104104

105105
const job = await jobsClient.scheduleAction({
106-
actionInstanceId: rule.actionInstance.id,
107-
duration: rule.duration,
108-
interval: rule.interval,
106+
actionInstanceId: automation.actionInstance.id,
107+
duration: automation.duration,
108+
interval: automation.interval,
109109
stageId: options.stageId,
110110
community: {
111111
slug: await getCommunitySlug(),
112112
},
113113
stack: options.stack,
114114
scheduledActionRunId: scheduledActionRun.id,
115-
event: rule.event,
115+
event: automation.event,
116116
...(options.pubId ? { pubId: options.pubId } : { json: options.json! }),
117-
config: options.config ?? rule.actionInstance.config ?? null,
117+
config: options.config ?? automation.actionInstance.config ?? null,
118118
});
119119

120120
return {
121121
result: job,
122-
actionInstanceId: rule.actionInstance.id,
123-
actionInstanceName: rule.actionInstance.name,
122+
actionInstanceId: automation.actionInstance.id,
123+
actionInstanceName: automation.actionInstance.name,
124124
runAt,
125125
};
126126
})

0 commit comments

Comments
 (0)