6f376a479f
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.
2160 lines
52 KiB
YAML
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
|