Files
directus/snapshots/schema.yaml
T
julian 6f376a479f Task 1.4 — Org-level catalog collections
Seven collections + 3 directus_users custom fields, captured as
snapshots/schema.yaml (53 KB, 2,159 lines).

Collections:
- organizations          — UUID PK, name, slug UNIQUE
- vehicles               — UUID PK, make/model required, year/cc/vin/plate optional
- devices                — UUID PK, imei UNIQUE, model required
- organization_users     — junction with role enum (org-admin, race-director,
                            marshal, timekeeper, participant, viewer)
- organization_vehicles  — junction with registered_at
- organization_devices   — junction with registered_at
- directus_users         — extended with phone, birth_date, nationality

Six M2O relations on the junctions, all ON DELETE RESTRICT (matching
the schema-draft decision: deletion of an org/vehicle/device/user
requires explicit cleanup of dependents).

db-init/004_junction_unique_constraints.sql adds the composite UNIQUE
constraints on the three junctions:
  organization_users  (organization_id, user_id)
  organization_vehicles (organization_id, vehicle_id)
  organization_devices (organization_id, device_id)

Composite uniqueness lives in db-init rather than the Directus snapshot
because Directus's snapshot YAML format only captures single-column
unique constraints (the field-level is_unique flag). The migration file
documents the split inline.

Driven via the directus-local MCP server rather than admin-UI clicking
— programmatic create-collection/create-field/create-relation calls
against the running Directus instance, then `pnpm run schema:snapshot`
to capture the canonical YAML.

Live-verified: db-init/004 applies cleanly on container restart
(0 rows in the empty junctions, no constraint violations); schema-apply
against a snapshot-empty boot still skips correctly; all seven new
collections show up in the admin UI's data model navigation.

Snapshot includes positions and migrations_applied as auto-discovered
ghost entries (Directus introspects all public-schema tables). Harmless
— db-init creates them before schema-apply runs, so snapshot apply just
finds them already present.

ROADMAP marks 1.4 done. Phase 1 progress: 6/9 tasks complete (1.1, 1.2,
1.3, 1.4, 1.6, 1.7); 1.5, 1.8, 1.9 remain.
2026-05-02 09:41:01 +02:00

2160 lines
52 KiB
YAML

version: 1
directus: 11.17.4
vendor: postgres
collections:
- collection: devices
meta:
accountability: all
archive_app_filter: true
archive_field: null
archive_value: null
collapse: open
collection: devices
color: null
display_template: '{{model}} — {{imei}}'
group: null
hidden: false
icon: gps_fixed
item_duplication_fields: null
note: >-
Durable GPS tracker catalog. IMEI is the canonical identifier. Belongs
to orgs via organization_devices.
preview_url: null
singleton: false
sort: 3
sort_field: null
translations: null
unarchive_value: null
versioning: false
schema:
name: devices
- collection: migrations_applied
meta:
accountability: all
archive_app_filter: true
archive_field: null
archive_value: null
collapse: open
collection: migrations_applied
color: null
display_template: null
group: null
hidden: false
icon: null
item_duplication_fields: null
note: null
preview_url: null
singleton: false
sort: null
sort_field: null
translations: null
unarchive_value: null
versioning: false
schema:
name: migrations_applied
- collection: organization_devices
meta:
accountability: all
archive_app_filter: true
archive_field: null
archive_value: null
collapse: open
collection: organization_devices
color: null
display_template: '{{device_id.model}} {{device_id.imei}} — {{organization_id.name}}'
group: null
hidden: false
icon: device_hub
item_duplication_fields: null
note: 'Junction: which devices belong to which orgs.'
preview_url: null
singleton: false
sort: 6
sort_field: null
translations: null
unarchive_value: null
versioning: false
schema:
name: organization_devices
- collection: organization_users
meta:
accountability: all
archive_app_filter: true
archive_field: null
archive_value: null
collapse: open
collection: organization_users
color: null
display_template: >-
{{user_id.first_name}} {{user_id.last_name}} — {{role}} —
{{organization_id.name}}
group: null
hidden: false
icon: person_add
item_duplication_fields: null
note: 'Junction: which users belong to which orgs and with what role.'
preview_url: null
singleton: false
sort: 4
sort_field: null
translations: null
unarchive_value: null
versioning: false
schema:
name: organization_users
- collection: organization_vehicles
meta:
accountability: all
archive_app_filter: true
archive_field: null
archive_value: null
collapse: open
collection: organization_vehicles
color: null
display_template: '{{vehicle_id.make}} {{vehicle_id.model}} — {{organization_id.name}}'
group: null
hidden: false
icon: garage
item_duplication_fields: null
note: 'Junction: which vehicles belong to which orgs.'
preview_url: null
singleton: false
sort: 5
sort_field: null
translations: null
unarchive_value: null
versioning: false
schema:
name: organization_vehicles
- collection: organizations
meta:
accountability: all
archive_app_filter: true
archive_field: null
archive_value: null
collapse: open
collection: organizations
color: null
display_template: '{{name}}'
group: null
hidden: false
icon: corporate_fare
item_duplication_fields: null
note: >-
Tenant root. Each event, vehicle, device and user belongs to one or more
organizations via junction tables.
preview_url: null
singleton: false
sort: 1
sort_field: null
translations: null
unarchive_value: null
versioning: false
schema:
name: organizations
- collection: positions
meta:
accountability: all
archive_app_filter: true
archive_field: null
archive_value: null
collapse: open
collection: positions
color: null
display_template: null
group: null
hidden: false
icon: null
item_duplication_fields: null
note: null
preview_url: null
singleton: false
sort: null
sort_field: null
translations: null
unarchive_value: null
versioning: false
schema:
name: positions
- collection: vehicles
meta:
accountability: all
archive_app_filter: true
archive_field: null
archive_value: null
collapse: open
collection: vehicles
color: null
display_template: '{{make}} {{model}} ({{year}})'
group: null
hidden: false
icon: directions_car
item_duplication_fields: null
note: >-
Durable vehicle catalog. Belongs to orgs via organization_vehicles. No
ownership modelling — vehicles are org-scoped only.
preview_url: null
singleton: false
sort: 2
sort_field: null
translations: null
unarchive_value: null
versioning: false
schema:
name: vehicles
fields:
- collection: devices
field: id
type: uuid
meta:
collection: devices
conditions: null
display: null
display_options: null
field: id
group: null
hidden: true
interface: input
note: null
options: null
readonly: true
required: false
searchable: true
sort: 1
special:
- uuid
translations: null
validation: null
validation_message: null
width: full
schema:
name: id
table: devices
data_type: uuid
default_value: null
max_length: null
numeric_precision: null
numeric_scale: null
is_nullable: false
is_unique: true
is_indexed: false
is_primary_key: true
is_generated: false
generation_expression: null
has_auto_increment: false
foreign_key_table: null
foreign_key_column: null
- collection: devices
field: imei
type: string
meta:
collection: devices
conditions: null
display: null
display_options: null
field: imei
group: null
hidden: false
interface: input
note: Canonical 15-digit IMEI. UNIQUE across the whole system.
options: null
readonly: false
required: true
searchable: true
sort: 2
special: null
translations: null
validation: null
validation_message: null
width: half
schema:
name: imei
table: devices
data_type: character varying
default_value: null
max_length: 255
numeric_precision: null
numeric_scale: null
is_nullable: false
is_unique: true
is_indexed: false
is_primary_key: false
is_generated: false
generation_expression: null
has_auto_increment: false
foreign_key_table: null
foreign_key_column: null
- collection: devices
field: model
type: string
meta:
collection: devices
conditions: null
display: null
display_options: null
field: model
group: null
hidden: false
interface: input
note: >-
Hardware model (e.g. "FMB920", "FMB003") — drives IO mapping in the
processor service.
options: null
readonly: false
required: true
searchable: true
sort: 3
special: null
translations: null
validation: null
validation_message: null
width: half
schema:
name: model
table: devices
data_type: character varying
default_value: null
max_length: 255
numeric_precision: null
numeric_scale: null
is_nullable: false
is_unique: false
is_indexed: false
is_primary_key: false
is_generated: false
generation_expression: null
has_auto_increment: false
foreign_key_table: null
foreign_key_column: null
- collection: devices
field: serial_number
type: string
meta:
collection: devices
conditions: null
display: null
display_options: null
field: serial_number
group: null
hidden: false
interface: input
note: Manufacturer serial number (optional)
options: null
readonly: false
required: false
searchable: true
sort: 4
special: null
translations: null
validation: null
validation_message: null
width: half
schema:
name: serial_number
table: devices
data_type: character varying
default_value: null
max_length: 255
numeric_precision: null
numeric_scale: null
is_nullable: true
is_unique: false
is_indexed: false
is_primary_key: false
is_generated: false
generation_expression: null
has_auto_increment: false
foreign_key_table: null
foreign_key_column: null
- collection: devices
field: notes
type: text
meta:
collection: devices
conditions: null
display: null
display_options: null
field: notes
group: null
hidden: false
interface: input-multiline
note: Free-form notes
options: null
readonly: false
required: false
searchable: true
sort: 5
special: null
translations: null
validation: null
validation_message: null
width: full
schema:
name: notes
table: devices
data_type: text
default_value: null
max_length: null
numeric_precision: null
numeric_scale: null
is_nullable: true
is_unique: false
is_indexed: false
is_primary_key: false
is_generated: false
generation_expression: null
has_auto_increment: false
foreign_key_table: null
foreign_key_column: null
- collection: devices
field: date_created
type: timestamp
meta:
collection: devices
conditions: null
display: null
display_options: null
field: date_created
group: null
hidden: true
interface: datetime
note: null
options: null
readonly: true
required: false
searchable: true
sort: 6
special:
- date-created
translations: null
validation: null
validation_message: null
width: half
schema:
name: date_created
table: devices
data_type: timestamp with time zone
default_value: null
max_length: null
numeric_precision: null
numeric_scale: null
is_nullable: true
is_unique: false
is_indexed: false
is_primary_key: false
is_generated: false
generation_expression: null
has_auto_increment: false
foreign_key_table: null
foreign_key_column: null
- collection: devices
field: date_updated
type: timestamp
meta:
collection: devices
conditions: null
display: null
display_options: null
field: date_updated
group: null
hidden: true
interface: datetime
note: null
options: null
readonly: true
required: false
searchable: true
sort: 7
special:
- date-updated
translations: null
validation: null
validation_message: null
width: half
schema:
name: date_updated
table: devices
data_type: timestamp with time zone
default_value: null
max_length: null
numeric_precision: null
numeric_scale: null
is_nullable: true
is_unique: false
is_indexed: false
is_primary_key: false
is_generated: false
generation_expression: null
has_auto_increment: false
foreign_key_table: null
foreign_key_column: null
- collection: directus_users
field: phone
type: string
meta:
collection: directus_users
conditions: null
display: null
display_options: null
field: phone
group: null
hidden: false
interface: input
note: Phone number (optional)
options: null
readonly: false
required: false
searchable: true
sort: 1
special: null
translations: null
validation: null
validation_message: null
width: half
schema:
name: phone
table: directus_users
data_type: character varying
default_value: null
max_length: 255
numeric_precision: null
numeric_scale: null
is_nullable: true
is_unique: false
is_indexed: false
is_primary_key: false
is_generated: false
generation_expression: null
has_auto_increment: false
foreign_key_table: null
foreign_key_column: null
- collection: directus_users
field: birth_date
type: date
meta:
collection: directus_users
conditions: null
display: null
display_options: null
field: birth_date
group: null
hidden: false
interface: datetime
note: >-
Used for age-derived class eligibility (e.g. M-5/M-6/M-7 senior/veteran
classes)
options: null
readonly: false
required: false
searchable: true
sort: 2
special: null
translations: null
validation: null
validation_message: null
width: half
schema:
name: birth_date
table: directus_users
data_type: date
default_value: null
max_length: null
numeric_precision: null
numeric_scale: null
is_nullable: true
is_unique: false
is_indexed: false
is_primary_key: false
is_generated: false
generation_expression: null
has_auto_increment: false
foreign_key_table: null
foreign_key_column: null
- collection: directus_users
field: nationality
type: string
meta:
collection: directus_users
conditions: null
display: null
display_options: null
field: nationality
group: null
hidden: false
interface: input
note: ISO 3166-1 alpha-2 country code (e.g. "AL", "IT")
options:
placeholder: AL
readonly: false
required: false
searchable: true
sort: 3
special: null
translations: null
validation: null
validation_message: null
width: half
schema:
name: nationality
table: directus_users
data_type: character varying
default_value: null
max_length: 255
numeric_precision: null
numeric_scale: null
is_nullable: true
is_unique: false
is_indexed: false
is_primary_key: false
is_generated: false
generation_expression: null
has_auto_increment: false
foreign_key_table: null
foreign_key_column: null
- collection: organization_devices
field: id
type: uuid
meta:
collection: organization_devices
conditions: null
display: null
display_options: null
field: id
group: null
hidden: true
interface: input
note: null
options: null
readonly: true
required: false
searchable: true
sort: 1
special:
- uuid
translations: null
validation: null
validation_message: null
width: full
schema:
name: id
table: organization_devices
data_type: uuid
default_value: null
max_length: null
numeric_precision: null
numeric_scale: null
is_nullable: false
is_unique: true
is_indexed: false
is_primary_key: true
is_generated: false
generation_expression: null
has_auto_increment: false
foreign_key_table: null
foreign_key_column: null
- collection: organization_devices
field: organization_id
type: uuid
meta:
collection: organization_devices
conditions: null
display: null
display_options: null
field: organization_id
group: null
hidden: false
interface: select-dropdown-m2o
note: null
options:
template: '{{name}}'
readonly: false
required: true
searchable: true
sort: 2
special:
- m2o
translations: null
validation: null
validation_message: null
width: half
schema:
name: organization_id
table: organization_devices
data_type: uuid
default_value: null
max_length: null
numeric_precision: null
numeric_scale: null
is_nullable: false
is_unique: false
is_indexed: false
is_primary_key: false
is_generated: false
generation_expression: null
has_auto_increment: false
foreign_key_table: organizations
foreign_key_column: id
- collection: organization_devices
field: device_id
type: uuid
meta:
collection: organization_devices
conditions: null
display: null
display_options: null
field: device_id
group: null
hidden: false
interface: select-dropdown-m2o
note: null
options:
template: '{{model}} {{imei}}'
readonly: false
required: true
searchable: true
sort: 3
special:
- m2o
translations: null
validation: null
validation_message: null
width: half
schema:
name: device_id
table: organization_devices
data_type: uuid
default_value: null
max_length: null
numeric_precision: null
numeric_scale: null
is_nullable: false
is_unique: false
is_indexed: false
is_primary_key: false
is_generated: false
generation_expression: null
has_auto_increment: false
foreign_key_table: devices
foreign_key_column: id
- collection: organization_devices
field: registered_at
type: timestamp
meta:
collection: organization_devices
conditions: null
display: null
display_options: null
field: registered_at
group: null
hidden: false
interface: datetime
note: When the device was registered with this org
options: null
readonly: false
required: false
searchable: true
sort: 4
special: null
translations: null
validation: null
validation_message: null
width: half
schema:
name: registered_at
table: organization_devices
data_type: timestamp with time zone
default_value: CURRENT_TIMESTAMP
max_length: null
numeric_precision: null
numeric_scale: null
is_nullable: true
is_unique: false
is_indexed: false
is_primary_key: false
is_generated: false
generation_expression: null
has_auto_increment: false
foreign_key_table: null
foreign_key_column: null
- collection: organization_devices
field: date_created
type: timestamp
meta:
collection: organization_devices
conditions: null
display: null
display_options: null
field: date_created
group: null
hidden: true
interface: datetime
note: null
options: null
readonly: true
required: false
searchable: true
sort: 5
special:
- date-created
translations: null
validation: null
validation_message: null
width: half
schema:
name: date_created
table: organization_devices
data_type: timestamp with time zone
default_value: null
max_length: null
numeric_precision: null
numeric_scale: null
is_nullable: true
is_unique: false
is_indexed: false
is_primary_key: false
is_generated: false
generation_expression: null
has_auto_increment: false
foreign_key_table: null
foreign_key_column: null
- collection: organization_devices
field: date_updated
type: timestamp
meta:
collection: organization_devices
conditions: null
display: null
display_options: null
field: date_updated
group: null
hidden: true
interface: datetime
note: null
options: null
readonly: true
required: false
searchable: true
sort: 6
special:
- date-updated
translations: null
validation: null
validation_message: null
width: half
schema:
name: date_updated
table: organization_devices
data_type: timestamp with time zone
default_value: null
max_length: null
numeric_precision: null
numeric_scale: null
is_nullable: true
is_unique: false
is_indexed: false
is_primary_key: false
is_generated: false
generation_expression: null
has_auto_increment: false
foreign_key_table: null
foreign_key_column: null
- collection: organization_users
field: id
type: uuid
meta:
collection: organization_users
conditions: null
display: null
display_options: null
field: id
group: null
hidden: true
interface: input
note: null
options: null
readonly: true
required: false
searchable: true
sort: 1
special:
- uuid
translations: null
validation: null
validation_message: null
width: full
schema:
name: id
table: organization_users
data_type: uuid
default_value: null
max_length: null
numeric_precision: null
numeric_scale: null
is_nullable: false
is_unique: true
is_indexed: false
is_primary_key: true
is_generated: false
generation_expression: null
has_auto_increment: false
foreign_key_table: null
foreign_key_column: null
- collection: organization_users
field: organization_id
type: uuid
meta:
collection: organization_users
conditions: null
display: null
display_options: null
field: organization_id
group: null
hidden: false
interface: select-dropdown-m2o
note: Tenant org
options:
template: '{{name}}'
readonly: false
required: true
searchable: true
sort: 2
special:
- m2o
translations: null
validation: null
validation_message: null
width: half
schema:
name: organization_id
table: organization_users
data_type: uuid
default_value: null
max_length: null
numeric_precision: null
numeric_scale: null
is_nullable: false
is_unique: false
is_indexed: false
is_primary_key: false
is_generated: false
generation_expression: null
has_auto_increment: false
foreign_key_table: organizations
foreign_key_column: id
- collection: organization_users
field: user_id
type: uuid
meta:
collection: organization_users
conditions: null
display: null
display_options: null
field: user_id
group: null
hidden: false
interface: select-dropdown-m2o
note: Directus user
options:
template: '{{first_name}} {{last_name}} ({{email}})'
readonly: false
required: true
searchable: true
sort: 3
special:
- m2o
translations: null
validation: null
validation_message: null
width: half
schema:
name: user_id
table: organization_users
data_type: uuid
default_value: null
max_length: null
numeric_precision: null
numeric_scale: null
is_nullable: false
is_unique: false
is_indexed: false
is_primary_key: false
is_generated: false
generation_expression: null
has_auto_increment: false
foreign_key_table: directus_users
foreign_key_column: id
- collection: organization_users
field: role
type: string
meta:
collection: organization_users
conditions: null
display: null
display_options: null
field: role
group: null
hidden: false
interface: select-dropdown
note: >-
Role for this user in this org. Drives Directus permission policies in
Phase 4.
options:
choices:
- text: Org Admin
value: org-admin
- text: Race Director
value: race-director
- text: Marshal
value: marshal
- text: Timekeeper
value: timekeeper
- text: Participant
value: participant
- text: Viewer
value: viewer
readonly: false
required: true
searchable: true
sort: 4
special: null
translations: null
validation: null
validation_message: null
width: half
schema:
name: role
table: organization_users
data_type: character varying
default_value: null
max_length: 255
numeric_precision: null
numeric_scale: null
is_nullable: false
is_unique: false
is_indexed: false
is_primary_key: false
is_generated: false
generation_expression: null
has_auto_increment: false
foreign_key_table: null
foreign_key_column: null
- collection: organization_users
field: joined_at
type: timestamp
meta:
collection: organization_users
conditions: null
display: null
display_options: null
field: joined_at
group: null
hidden: false
interface: datetime
note: When the user joined this org
options: null
readonly: false
required: false
searchable: true
sort: 5
special: null
translations: null
validation: null
validation_message: null
width: half
schema:
name: joined_at
table: organization_users
data_type: timestamp with time zone
default_value: CURRENT_TIMESTAMP
max_length: null
numeric_precision: null
numeric_scale: null
is_nullable: true
is_unique: false
is_indexed: false
is_primary_key: false
is_generated: false
generation_expression: null
has_auto_increment: false
foreign_key_table: null
foreign_key_column: null
- collection: organization_users
field: date_created
type: timestamp
meta:
collection: organization_users
conditions: null
display: null
display_options: null
field: date_created
group: null
hidden: true
interface: datetime
note: null
options: null
readonly: true
required: false
searchable: true
sort: 6
special:
- date-created
translations: null
validation: null
validation_message: null
width: half
schema:
name: date_created
table: organization_users
data_type: timestamp with time zone
default_value: null
max_length: null
numeric_precision: null
numeric_scale: null
is_nullable: true
is_unique: false
is_indexed: false
is_primary_key: false
is_generated: false
generation_expression: null
has_auto_increment: false
foreign_key_table: null
foreign_key_column: null
- collection: organization_users
field: date_updated
type: timestamp
meta:
collection: organization_users
conditions: null
display: null
display_options: null
field: date_updated
group: null
hidden: true
interface: datetime
note: null
options: null
readonly: true
required: false
searchable: true
sort: 7
special:
- date-updated
translations: null
validation: null
validation_message: null
width: half
schema:
name: date_updated
table: organization_users
data_type: timestamp with time zone
default_value: null
max_length: null
numeric_precision: null
numeric_scale: null
is_nullable: true
is_unique: false
is_indexed: false
is_primary_key: false
is_generated: false
generation_expression: null
has_auto_increment: false
foreign_key_table: null
foreign_key_column: null
- collection: organization_vehicles
field: id
type: uuid
meta:
collection: organization_vehicles
conditions: null
display: null
display_options: null
field: id
group: null
hidden: true
interface: input
note: null
options: null
readonly: true
required: false
searchable: true
sort: 1
special:
- uuid
translations: null
validation: null
validation_message: null
width: full
schema:
name: id
table: organization_vehicles
data_type: uuid
default_value: null
max_length: null
numeric_precision: null
numeric_scale: null
is_nullable: false
is_unique: true
is_indexed: false
is_primary_key: true
is_generated: false
generation_expression: null
has_auto_increment: false
foreign_key_table: null
foreign_key_column: null
- collection: organization_vehicles
field: organization_id
type: uuid
meta:
collection: organization_vehicles
conditions: null
display: null
display_options: null
field: organization_id
group: null
hidden: false
interface: select-dropdown-m2o
note: null
options:
template: '{{name}}'
readonly: false
required: true
searchable: true
sort: 2
special:
- m2o
translations: null
validation: null
validation_message: null
width: half
schema:
name: organization_id
table: organization_vehicles
data_type: uuid
default_value: null
max_length: null
numeric_precision: null
numeric_scale: null
is_nullable: false
is_unique: false
is_indexed: false
is_primary_key: false
is_generated: false
generation_expression: null
has_auto_increment: false
foreign_key_table: organizations
foreign_key_column: id
- collection: organization_vehicles
field: vehicle_id
type: uuid
meta:
collection: organization_vehicles
conditions: null
display: null
display_options: null
field: vehicle_id
group: null
hidden: false
interface: select-dropdown-m2o
note: null
options:
template: '{{make}} {{model}}'
readonly: false
required: true
searchable: true
sort: 3
special:
- m2o
translations: null
validation: null
validation_message: null
width: half
schema:
name: vehicle_id
table: organization_vehicles
data_type: uuid
default_value: null
max_length: null
numeric_precision: null
numeric_scale: null
is_nullable: false
is_unique: false
is_indexed: false
is_primary_key: false
is_generated: false
generation_expression: null
has_auto_increment: false
foreign_key_table: vehicles
foreign_key_column: id
- collection: organization_vehicles
field: registered_at
type: timestamp
meta:
collection: organization_vehicles
conditions: null
display: null
display_options: null
field: registered_at
group: null
hidden: false
interface: datetime
note: When the vehicle was registered with this org
options: null
readonly: false
required: false
searchable: true
sort: 4
special: null
translations: null
validation: null
validation_message: null
width: half
schema:
name: registered_at
table: organization_vehicles
data_type: timestamp with time zone
default_value: CURRENT_TIMESTAMP
max_length: null
numeric_precision: null
numeric_scale: null
is_nullable: true
is_unique: false
is_indexed: false
is_primary_key: false
is_generated: false
generation_expression: null
has_auto_increment: false
foreign_key_table: null
foreign_key_column: null
- collection: organization_vehicles
field: date_created
type: timestamp
meta:
collection: organization_vehicles
conditions: null
display: null
display_options: null
field: date_created
group: null
hidden: true
interface: datetime
note: null
options: null
readonly: true
required: false
searchable: true
sort: 5
special:
- date-created
translations: null
validation: null
validation_message: null
width: half
schema:
name: date_created
table: organization_vehicles
data_type: timestamp with time zone
default_value: null
max_length: null
numeric_precision: null
numeric_scale: null
is_nullable: true
is_unique: false
is_indexed: false
is_primary_key: false
is_generated: false
generation_expression: null
has_auto_increment: false
foreign_key_table: null
foreign_key_column: null
- collection: organization_vehicles
field: date_updated
type: timestamp
meta:
collection: organization_vehicles
conditions: null
display: null
display_options: null
field: date_updated
group: null
hidden: true
interface: datetime
note: null
options: null
readonly: true
required: false
searchable: true
sort: 6
special:
- date-updated
translations: null
validation: null
validation_message: null
width: half
schema:
name: date_updated
table: organization_vehicles
data_type: timestamp with time zone
default_value: null
max_length: null
numeric_precision: null
numeric_scale: null
is_nullable: true
is_unique: false
is_indexed: false
is_primary_key: false
is_generated: false
generation_expression: null
has_auto_increment: false
foreign_key_table: null
foreign_key_column: null
- collection: organizations
field: id
type: uuid
meta:
collection: organizations
conditions: null
display: null
display_options: null
field: id
group: null
hidden: true
interface: input
note: null
options: null
readonly: true
required: false
searchable: true
sort: 1
special:
- uuid
translations: null
validation: null
validation_message: null
width: full
schema:
name: id
table: organizations
data_type: uuid
default_value: null
max_length: null
numeric_precision: null
numeric_scale: null
is_nullable: false
is_unique: true
is_indexed: false
is_primary_key: true
is_generated: false
generation_expression: null
has_auto_increment: false
foreign_key_table: null
foreign_key_column: null
- collection: organizations
field: name
type: string
meta:
collection: organizations
conditions: null
display: null
display_options: null
field: name
group: null
hidden: false
interface: input
note: Display name (e.g. "Motorsport Club Albania")
options: null
readonly: false
required: true
searchable: true
sort: 2
special: null
translations: null
validation: null
validation_message: null
width: half
schema:
name: name
table: organizations
data_type: character varying
default_value: null
max_length: 255
numeric_precision: null
numeric_scale: null
is_nullable: false
is_unique: false
is_indexed: false
is_primary_key: false
is_generated: false
generation_expression: null
has_auto_increment: false
foreign_key_table: null
foreign_key_column: null
- collection: organizations
field: slug
type: string
meta:
collection: organizations
conditions: null
display: null
display_options: null
field: slug
group: null
hidden: false
interface: input
note: URL-friendly identifier, unique across all orgs
options:
slug: true
trim: true
readonly: false
required: true
searchable: true
sort: 3
special: null
translations: null
validation: null
validation_message: null
width: half
schema:
name: slug
table: organizations
data_type: character varying
default_value: null
max_length: 255
numeric_precision: null
numeric_scale: null
is_nullable: false
is_unique: true
is_indexed: false
is_primary_key: false
is_generated: false
generation_expression: null
has_auto_increment: false
foreign_key_table: null
foreign_key_column: null
- collection: organizations
field: date_created
type: timestamp
meta:
collection: organizations
conditions: null
display: datetime
display_options:
relative: true
field: date_created
group: null
hidden: true
interface: datetime
note: null
options: null
readonly: true
required: false
searchable: true
sort: 4
special:
- date-created
translations: null
validation: null
validation_message: null
width: half
schema:
name: date_created
table: organizations
data_type: timestamp with time zone
default_value: null
max_length: null
numeric_precision: null
numeric_scale: null
is_nullable: true
is_unique: false
is_indexed: false
is_primary_key: false
is_generated: false
generation_expression: null
has_auto_increment: false
foreign_key_table: null
foreign_key_column: null
- collection: organizations
field: date_updated
type: timestamp
meta:
collection: organizations
conditions: null
display: datetime
display_options:
relative: true
field: date_updated
group: null
hidden: true
interface: datetime
note: null
options: null
readonly: true
required: false
searchable: true
sort: 5
special:
- date-updated
translations: null
validation: null
validation_message: null
width: half
schema:
name: date_updated
table: organizations
data_type: timestamp with time zone
default_value: null
max_length: null
numeric_precision: null
numeric_scale: null
is_nullable: true
is_unique: false
is_indexed: false
is_primary_key: false
is_generated: false
generation_expression: null
has_auto_increment: false
foreign_key_table: null
foreign_key_column: null
- collection: vehicles
field: id
type: uuid
meta:
collection: vehicles
conditions: null
display: null
display_options: null
field: id
group: null
hidden: true
interface: input
note: null
options: null
readonly: true
required: false
searchable: true
sort: 1
special:
- uuid
translations: null
validation: null
validation_message: null
width: full
schema:
name: id
table: vehicles
data_type: uuid
default_value: null
max_length: null
numeric_precision: null
numeric_scale: null
is_nullable: false
is_unique: true
is_indexed: false
is_primary_key: true
is_generated: false
generation_expression: null
has_auto_increment: false
foreign_key_table: null
foreign_key_column: null
- collection: vehicles
field: make
type: string
meta:
collection: vehicles
conditions: null
display: null
display_options: null
field: make
group: null
hidden: false
interface: input
note: Manufacturer (e.g. "Toyota")
options: null
readonly: false
required: true
searchable: true
sort: 2
special: null
translations: null
validation: null
validation_message: null
width: half
schema:
name: make
table: vehicles
data_type: character varying
default_value: null
max_length: 255
numeric_precision: null
numeric_scale: null
is_nullable: false
is_unique: false
is_indexed: false
is_primary_key: false
is_generated: false
generation_expression: null
has_auto_increment: false
foreign_key_table: null
foreign_key_column: null
- collection: vehicles
field: model
type: string
meta:
collection: vehicles
conditions: null
display: null
display_options: null
field: model
group: null
hidden: false
interface: input
note: Model name (e.g. "Land Cruiser 70")
options: null
readonly: false
required: true
searchable: true
sort: 3
special: null
translations: null
validation: null
validation_message: null
width: half
schema:
name: model
table: vehicles
data_type: character varying
default_value: null
max_length: 255
numeric_precision: null
numeric_scale: null
is_nullable: false
is_unique: false
is_indexed: false
is_primary_key: false
is_generated: false
generation_expression: null
has_auto_increment: false
foreign_key_table: null
foreign_key_column: null
- collection: vehicles
field: year
type: integer
meta:
collection: vehicles
conditions: null
display: null
display_options: null
field: year
group: null
hidden: false
interface: input
note: Model year
options: null
readonly: false
required: false
searchable: true
sort: 4
special: null
translations: null
validation: null
validation_message: null
width: half
schema:
name: year
table: vehicles
data_type: integer
default_value: null
max_length: null
numeric_precision: 32
numeric_scale: 0
is_nullable: true
is_unique: false
is_indexed: false
is_primary_key: false
is_generated: false
generation_expression: null
has_auto_increment: false
foreign_key_table: null
foreign_key_column: null
- collection: vehicles
field: engine_cc
type: integer
meta:
collection: vehicles
conditions: null
display: null
display_options: null
field: engine_cc
group: null
hidden: false
interface: input
note: Engine displacement in cc — used for class assignment in rally events
options: null
readonly: false
required: false
searchable: true
sort: 5
special: null
translations: null
validation: null
validation_message: null
width: half
schema:
name: engine_cc
table: vehicles
data_type: integer
default_value: null
max_length: null
numeric_precision: 32
numeric_scale: 0
is_nullable: true
is_unique: false
is_indexed: false
is_primary_key: false
is_generated: false
generation_expression: null
has_auto_increment: false
foreign_key_table: null
foreign_key_column: null
- collection: vehicles
field: vin
type: string
meta:
collection: vehicles
conditions: null
display: null
display_options: null
field: vin
group: null
hidden: false
interface: input
note: Vehicle Identification Number (optional)
options: null
readonly: false
required: false
searchable: true
sort: 6
special: null
translations: null
validation: null
validation_message: null
width: half
schema:
name: vin
table: vehicles
data_type: character varying
default_value: null
max_length: 255
numeric_precision: null
numeric_scale: null
is_nullable: true
is_unique: false
is_indexed: false
is_primary_key: false
is_generated: false
generation_expression: null
has_auto_increment: false
foreign_key_table: null
foreign_key_column: null
- collection: vehicles
field: plate_number
type: string
meta:
collection: vehicles
conditions: null
display: null
display_options: null
field: plate_number
group: null
hidden: false
interface: input
note: License plate (optional)
options: null
readonly: false
required: false
searchable: true
sort: 7
special: null
translations: null
validation: null
validation_message: null
width: half
schema:
name: plate_number
table: vehicles
data_type: character varying
default_value: null
max_length: 255
numeric_precision: null
numeric_scale: null
is_nullable: true
is_unique: false
is_indexed: false
is_primary_key: false
is_generated: false
generation_expression: null
has_auto_increment: false
foreign_key_table: null
foreign_key_column: null
- collection: vehicles
field: notes
type: text
meta:
collection: vehicles
conditions: null
display: null
display_options: null
field: notes
group: null
hidden: false
interface: input-multiline
note: Free-form notes
options: null
readonly: false
required: false
searchable: true
sort: 8
special: null
translations: null
validation: null
validation_message: null
width: full
schema:
name: notes
table: vehicles
data_type: text
default_value: null
max_length: null
numeric_precision: null
numeric_scale: null
is_nullable: true
is_unique: false
is_indexed: false
is_primary_key: false
is_generated: false
generation_expression: null
has_auto_increment: false
foreign_key_table: null
foreign_key_column: null
- collection: vehicles
field: date_created
type: timestamp
meta:
collection: vehicles
conditions: null
display: null
display_options: null
field: date_created
group: null
hidden: true
interface: datetime
note: null
options: null
readonly: true
required: false
searchable: true
sort: 9
special:
- date-created
translations: null
validation: null
validation_message: null
width: half
schema:
name: date_created
table: vehicles
data_type: timestamp with time zone
default_value: null
max_length: null
numeric_precision: null
numeric_scale: null
is_nullable: true
is_unique: false
is_indexed: false
is_primary_key: false
is_generated: false
generation_expression: null
has_auto_increment: false
foreign_key_table: null
foreign_key_column: null
- collection: vehicles
field: date_updated
type: timestamp
meta:
collection: vehicles
conditions: null
display: null
display_options: null
field: date_updated
group: null
hidden: true
interface: datetime
note: null
options: null
readonly: true
required: false
searchable: true
sort: 10
special:
- date-updated
translations: null
validation: null
validation_message: null
width: half
schema:
name: date_updated
table: vehicles
data_type: timestamp with time zone
default_value: null
max_length: null
numeric_precision: null
numeric_scale: null
is_nullable: true
is_unique: false
is_indexed: false
is_primary_key: false
is_generated: false
generation_expression: null
has_auto_increment: false
foreign_key_table: null
foreign_key_column: null
systemFields:
- collection: directus_activity
field: timestamp
schema:
is_indexed: true
- collection: directus_revisions
field: activity
schema:
is_indexed: true
- collection: directus_revisions
field: parent
schema:
is_indexed: true
relations:
- collection: organization_devices
field: organization_id
related_collection: organizations
meta:
junction_field: null
many_collection: organization_devices
many_field: organization_id
one_allowed_collections: null
one_collection: organizations
one_collection_field: null
one_deselect_action: nullify
one_field: null
sort_field: null
schema:
table: organization_devices
column: organization_id
foreign_key_table: organizations
foreign_key_column: id
constraint_name: organization_devices_organization_id_foreign
on_update: NO ACTION
on_delete: RESTRICT
- collection: organization_devices
field: device_id
related_collection: devices
meta:
junction_field: null
many_collection: organization_devices
many_field: device_id
one_allowed_collections: null
one_collection: devices
one_collection_field: null
one_deselect_action: nullify
one_field: null
sort_field: null
schema:
table: organization_devices
column: device_id
foreign_key_table: devices
foreign_key_column: id
constraint_name: organization_devices_device_id_foreign
on_update: NO ACTION
on_delete: RESTRICT
- collection: organization_users
field: organization_id
related_collection: organizations
meta:
junction_field: null
many_collection: organization_users
many_field: organization_id
one_allowed_collections: null
one_collection: organizations
one_collection_field: null
one_deselect_action: nullify
one_field: null
sort_field: null
schema:
table: organization_users
column: organization_id
foreign_key_table: organizations
foreign_key_column: id
constraint_name: organization_users_organization_id_foreign
on_update: NO ACTION
on_delete: RESTRICT
- collection: organization_users
field: user_id
related_collection: directus_users
meta:
junction_field: null
many_collection: organization_users
many_field: user_id
one_allowed_collections: null
one_collection: directus_users
one_collection_field: null
one_deselect_action: nullify
one_field: null
sort_field: null
schema:
table: organization_users
column: user_id
foreign_key_table: directus_users
foreign_key_column: id
constraint_name: organization_users_user_id_foreign
on_update: NO ACTION
on_delete: RESTRICT
- collection: organization_vehicles
field: organization_id
related_collection: organizations
meta:
junction_field: null
many_collection: organization_vehicles
many_field: organization_id
one_allowed_collections: null
one_collection: organizations
one_collection_field: null
one_deselect_action: nullify
one_field: null
sort_field: null
schema:
table: organization_vehicles
column: organization_id
foreign_key_table: organizations
foreign_key_column: id
constraint_name: organization_vehicles_organization_id_foreign
on_update: NO ACTION
on_delete: RESTRICT
- collection: organization_vehicles
field: vehicle_id
related_collection: vehicles
meta:
junction_field: null
many_collection: organization_vehicles
many_field: vehicle_id
one_allowed_collections: null
one_collection: vehicles
one_collection_field: null
one_deselect_action: nullify
one_field: null
sort_field: null
schema:
table: organization_vehicles
column: vehicle_id
foreign_key_table: vehicles
foreign_key_column: id
constraint_name: organization_vehicles_vehicle_id_foreign
on_update: NO ACTION
on_delete: RESTRICT