Mixins
KosameではMixin機構自体の独自実装はしておらず、素のTypeScriptのMixin関数パターンを使用し実現します。
Mixinsの仕組み
TypeScriptのMixin
Kosame独自のmixin機構自体は独自実装されておらず、TypeScriptのMixinパターンがそのまま使うことができます。
ts
function WithTimestamp<TBase extends Constructor<Model>>(Base: TBase) {
abstract class WithTimestampMixin extends Base {
get createdAtLabel() {
return "作成日時";
}
}
return WithTimestampMixin;
}Constructor<T>
通常のmixinパターンの型はnew (...args) => Tですが、Model自体がabstract classのためこの型では噛み合いません。なのでKosameではConstructor<T>(abstract new (...args: any[]) => T)という専用の型を提供することでこの問題を解決しています。
SoftDeletable
SoftDeletableはDBから完全削除をするのではなくdeletedAtのようなカラムに日時を入れ、削除したかのように見せる機能です。
適用方法
テーブルにdeletedAtColumn()でdeletedAtカラムを定義し、SoftDeletable(Model)でModelに適用します。deletedAtColumn()はdialectごとにkosame/pgなどからimportします。
ts
import { Model, SoftDeletable } from "kosame";
import { deletedAtColumn } from "kosame/pg";
export const usersTable = pgTable("users", {
id: serial("id").primaryKey(),
name: text("name").notNull(),
deletedAt: deletedAtColumn(),
});
class User extends SoftDeletable(Model) {
static table = usersTable;
}delete()とhardDelete()
delete()は実際には削除せずdeletedAtに日時をUPDATEします。本来の完全削除をしたい場合はhardDelete()を使います。
取得時の自動除外
SoftDeletableを適用したModelは、find()とincludeによるリレーション取得の両方で、削除済みの行が自動的に除外されます。カラム名がdeletedAtというだけでは除外されず、SoftDeletableを適用した場合のみ有効です。
