Dzisiaj dodałem do Sealiousa wsparcie dla pisania własnej logiki walidacji pól w kolekcji. Przyda się, gdy np. poprawność wartości zależy od kilku wartości pól jednocześnie, a nie od jednego pola.
Dotychczas trzeba było korzystać z dosyć nieporęcznej konstrukcji Hooków:
export class CollectionWithComplexValidation extends Collection {
fields = {
color: new FieldTypes.Color(),
};
async init(app: App, name: string): Promise<void> {
await super.init(app, name);
this.on("before:create", async ([context, item]) => {
// item.body.raw_input - contains all fields passed during creation
if (project.body.raw_input.name.includes("green")) {
throw new ValidationError("Green is not a creative color");
}
});
this.on("before:edit", async ([context, project]) => {
// item.body.raw_input - contains all fields passed to PUT or PATCH. If empty then it means that the user did not change the value
if (project.body.raw_input.name.includes("green")) {
throw new ValidationError("Green is not a creative color");
}
});
}
defaultPolicy = new Policies.Public();
}
Teraz można po prostu nadpisać metodę validate
w kolekcji:
export class CollectionWithComplexValidation extends Collection {
fields = {
color: new FieldTypes.Color(),
};
async validate(_: Context, body: CollectionItemBody) {
if ((body.getInput("color") as string).includes("green")) {
return [{
error: "Green is not a creative color",
fields: ["color"],
}];
}
return [];
}
defaultPolicy = new Policies.Public();
}
Validation przyjmuje context
- ale należy używać tam go ostrożnie, tzn tylko do robienia rzeczy, na które nie pozwalałoby tworzenie własnego Policy
.
Zmiany są opublikowane w 0.14.6. Jutro zbackportuję to także do wersji 0.13.x, abyśmy mogli tego użyć w projektach zbudowanych przed 0.14. Zaktualizowałem dokumentację i dodałem testy, które mogą posłużyć za przykład kodu:
https://hub.sealcode.org/source/sealious/browse/dev/src/chip-types/collection-item.test.ts$67-169
Tak swoją drogą, Hooki coraz rzadziej bywają przydatne i myślę, czy by ich się nie pozbyć. Sprawa do przemyślenia