Документація / Моделі

Моделі

Один файл визначає таблицю, тип рядка та валідатор.

Модель — це один файл. Він визначає таблицю, валідацію, TypeScript-тип рядка і (опційно) REST-ендпоїнти.

// app/models/post.ts
import { model, text, boolean, belongsTo } from '@hopak/core';

export default model('post', {
  title: text().required().min(3).max(200),
  content: text().required(),
  published: boolean().default(false),
  author: belongsTo('user'),
});

Типи полів

ТипПримітки
text()Довільний рядок (обмежуйте через .min/.max/.pattern)
email()Рядок із валідацією email-формату
url()Рядок із валідацією URL-формату
phone()Рядок — вбудованого regex немає; для суворих форматів додайте .pattern(...)
number(), money()Числа з min/max (money зберігається як real)
boolean()Скаляр
date(), timestamp()Приводяться з ISO-рядків; відхиляють некоректні дати
enumOf('a', 'b')Літеральний union у TypeScript, enum у БД
json<T>()Типізована JSON-колонка
belongsTo('user'), hasOne('profile'), hasMany('post')Зв’язки
password(), secret(), token()Автоматично виключаються з JSON-відповідей
file(), image()Зберігаються як JSON-метадані { url, mimeType, size, name? }

Модифікатори

Ланцюжок на будь-якому полі:

text().required().min(3).max(200).unique().index()
number().required().min(0).max(100).default(0)
text().pattern(/^[a-z]+$/)
date().default('now')
file().maxSize('5MB')
image().maxSize(2_097_152)   // у байтах також приймається

Параметри

model('post', { /* fields */ }, {
  timestamps: true,   // add createdAt + updatedAt columns (default: true)
});