Wsparcie dla customowej walidacji w Sealiousie

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

Backport zrobiony, siedzi w sealious@0.13.53