Skip to content

Commit

Permalink
Add non comparable operations for custom actions (#49)
Browse files Browse the repository at this point in the history
  • Loading branch information
pijng authored Jan 5, 2025
1 parent d7196a1 commit 9b914e7
Show file tree
Hide file tree
Showing 7 changed files with 60 additions and 10 deletions.
26 changes: 26 additions & 0 deletions internal/entities/action.go
Original file line number Diff line number Diff line change
Expand Up @@ -94,3 +94,29 @@ var AppropriateActions = []string{
}

var AppropriateActionsInfo = strings.Join(AppropriateActions, ", ")

type ConditionOperation string

const (
EQ ConditionOperation = "=="
NE ConditionOperation = "!="
LT ConditionOperation = "<"
LTE ConditionOperation = "<="
GT ConditionOperation = ">"
GTE ConditionOperation = ">="
EXISTS ConditionOperation = "EXISTS"
EMPTY ConditionOperation = "EMPTY"
)

var AppropriateOperations = []string{
string(EQ),
string(NE),
string(LT),
string(LTE),
string(GT),
string(GTE),
string(EXISTS),
string(EMPTY),
}

var AppropriateOperationsInfo = strings.Join(AppropriateOperations, ", ")
7 changes: 6 additions & 1 deletion internal/usecases/action_usecase.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,15 @@ func (uc *ActionUseCase) CreateAction(ctx context.Context, action entities.Actio
for _, condition := range action.Conditions {
var formattedCondition entities.Condition

if condition.Attribute == "" || condition.Operation == "" || condition.Value == "" {
if condition.Attribute == "" || condition.Operation == "" || (condition.Value == "" && !slices.Contains([]string{"EXISTS", "EMPTY"}, condition.Operation)) {
return nil, fmt.Errorf("failed creating action: `attribute`, `operation` and `value` attributes must be present for each `condition` object")
}

isValidOperation := slices.Contains(entities.AppropriateOperations, string(condition.Operation))
if !isValidOperation {
return nil, fmt.Errorf("failed creating action: `condition[].operation` field should be one of: %v", entities.AppropriateOperationsInfo)
}

formattedCondition.Attribute = condition.Attribute
formattedCondition.Operation = condition.Operation
formattedCondition.Value = condition.Value
Expand Down
12 changes: 7 additions & 5 deletions web/src/features/action-create/ui.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,9 @@ import { Button, ErrorHint, Input, Label, Multiselect, PlusIcon, Select, Text, T
import { h, list, remap, spec } from "forest";
import { $creationError, events, actionForm } from "./model";
import { combine, createEvent, createStore, sample } from "effector";
import { intersection, trigger } from "@/shared/lib";
import { i18n } from "@/shared/lib";
import { intersection, trigger, i18n } from "@/shared/lib";
import { schemaModel } from "@/entities/schema";
import { ActionToCreate, Condition } from "@/shared/api";
import { ActionToCreate, Condition, nonCmpOperations, operations } from "@/shared/api";

export const NewActionForm = () => {
h("form", () => {
Expand Down Expand Up @@ -135,7 +134,9 @@ export const NewActionForm = () => {
spec({
classList: ["grid", "gap-3", "place-items-stretch"],
style: {
gridTemplateColumns: "14fr 1fr 14fr 1fr",
gridTemplateColumns: conditionField.map((f) => {
return nonCmpOperations.includes(f.operation) ? "14fr 1fr 1fr" : "14fr 1fr 14fr 1fr";
}),
},
});

Expand All @@ -159,7 +160,7 @@ export const NewActionForm = () => {
text: i18n("actions.form.conditions.fields.operation.label"),
hint: i18n("actions.form.conditions.fields.operation.hint"),
value: remap(conditionField, "operation"),
options: createStore<Condition["operation"][]>(["==", "!=", "<", "<=", ">", ">="]),
options: createStore<Condition["operation"][]>(operations),
optionSelected: operationChanged,
withBlank: createStore(false),
});
Expand All @@ -171,6 +172,7 @@ export const NewActionForm = () => {
required: true,
value: remap(conditionField, "value"),
inputChanged: valueChanged,
visible: conditionField.map((f) => !nonCmpOperations.includes(f.operation)),
errorText: actionForm.fields.conditions.$errorText,
hint: i18n("actions.form.conditions.fields.value.hint"),
});
Expand Down
11 changes: 8 additions & 3 deletions web/src/features/action-edit/ui.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { h, list, remap, spec } from "forest";
import { $editError, events, actionForm, deleteActionClicked } from "./model";
import { combine, createEvent, createStore, sample } from "effector";
import { intersection, trigger, i18n } from "@/shared/lib";
import { ActionToCreate, Condition } from "@/shared/api";
import { ActionToCreate, Condition, nonCmpOperations, operations } from "@/shared/api";
import { schemaModel } from "@/entities/schema";

export const EditActionForm = () => {
Expand Down Expand Up @@ -130,7 +130,9 @@ export const EditActionForm = () => {
spec({
classList: ["grid", "gap-3", "place-items-stretch"],
style: {
gridTemplateColumns: "14fr 1fr 14fr 1fr",
gridTemplateColumns: conditionField.map((f) => {
return nonCmpOperations.includes(f.operation) ? "14fr 1fr 1fr" : "14fr 1fr 14fr 1fr";
}),
},
});

Expand All @@ -139,6 +141,7 @@ export const EditActionForm = () => {

Select({
text: i18n("actions.form.conditions.fields.attribute.label"),
hint: i18n("actions.form.conditions.fields.attribute.hint"),
value: remap(conditionField, "attribute"),
options: $attributeList,
optionSelected: attributeChanged,
Expand All @@ -151,8 +154,9 @@ export const EditActionForm = () => {

Select({
text: i18n("actions.form.conditions.fields.operation.label"),
hint: i18n("actions.form.conditions.fields.operation.hint"),
value: remap(conditionField, "operation"),
options: createStore<Condition["operation"][]>(["==", "!=", "<", "<=", ">", ">="]),
options: createStore<Condition["operation"][]>(operations),
optionSelected: operationChanged,
withBlank: createStore(false),
});
Expand All @@ -164,6 +168,7 @@ export const EditActionForm = () => {
required: true,
value: remap(conditionField, "value"),
inputChanged: valueChanged,
visible: conditionField.map((f) => !nonCmpOperations.includes(f.operation)),
errorText: actionForm.fields.conditions.$errorText,
hint: i18n("actions.form.conditions.fields.value.hint"),
});
Expand Down
7 changes: 7 additions & 0 deletions web/src/features/log-group-action/model.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,13 @@ export const createLogGroupAction = (action: Store<Action>, logGroup: Store<Log[
attrValue = log[condition.attribute as "kind" | "level"];
}

switch (condition.operation) {
case "EXISTS":
return !!attrValue;
case "EMPTY":
return !attrValue;
}

const result: boolean = eval(`"${attrValue}" ${condition.operation} "${condition.value}"`);

return result;
Expand Down
5 changes: 4 additions & 1 deletion web/src/shared/api/actions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,13 @@ export type Action = {

export type Condition = {
attribute: string;
operation: "==" | "!=" | ">" | ">=" | "<" | "<=";
operation: "==" | "!=" | ">" | ">=" | "<" | "<=" | "EXISTS" | "EMPTY";
value: string;
};

export const operations: Condition["operation"][] = ["==", "!=", ">", ">=", "<", "<=", "EXISTS", "EMPTY"];
export const nonCmpOperations: Condition["operation"][] = ["EXISTS", "EMPTY"];

export type ActionToCreate = {
name: string;
pattern: string;
Expand Down
2 changes: 2 additions & 0 deletions web/src/shared/api/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ export {
editAction,
createAction,
deleteAction,
operations,
nonCmpOperations,
} from "./actions";
export { type Log, type Level, type LogsGroup, getLogs, getLogGroup } from "./logs";
export {
Expand Down

0 comments on commit 9b914e7

Please # to comment.