v0.2.30
RustBox CI / rustbox (push) Waiting to run

This commit is contained in:
Mateusz Gruszczyński committed 2026-11-08 07:32:12 +01:00
1 parent 1b12899ff6
commit a3ac2a68fe
33 files changed
+5422 -28

No files matched your search

+12 -1
View File
@@ -43,7 +43,18 @@ V054 adds three appearance columns to `display_preferences` and calendar reminde
Fresh installations already contain the columns in `schema.sql`. Existing V053 tenants execute `V054__theme_schedule_account_color_and_reminders.sql`.
The next migration number is **V055**.
## V055 — CalDAV / CardDAV
V055 prepares the calendar and contacts tables for the optional CalDAV/CardDAV server (`[dav]`):
- `calendar_events.dav_name` / `contacts.dav_name` (nullable) — resource name chosen by the DAV client (e.g. `4f9e….ics`); rows created in the webmail keep `NULL` and are served as `<id>.ics` / `<id>.vcf`;
- `calendar_events.dav_data` / `contacts.dav_data` (nullable) — the iCalendar object / vCard exactly as uploaded, so time zones, recurrence exceptions, alarms and vendor properties survive; webmail edits are patched into it;
- `idx_contacts_email` becomes a regular (non-unique) index, because an address book may contain several cards with the same address (and cards without any address);
- new indexes `idx_calendar_events_dav_name` and `idx_contacts_dav_name`.
Fresh installations already contain the columns in `schema.sql`. Existing V054 tenants execute `V055__caldav_carddav.sql`.
The next migration number is **V056**.
## Migration rules
+15
View File
@@ -0,0 +1,15 @@
ALTER TABLE {{p}}calendar_events
ADD COLUMN dav_name VARCHAR(255),
ADD COLUMN dav_data LONGTEXT;
ALTER TABLE {{p}}contacts
ADD COLUMN dav_name VARCHAR(255),
ADD COLUMN dav_data LONGTEXT;
DROP INDEX {{p}}idx_contacts_email ON {{p}}contacts;
CREATE INDEX {{p}}idx_contacts_email ON {{p}}contacts (email);
CREATE INDEX {{p}}idx_calendar_events_dav_name ON {{p}}calendar_events (dav_name);
CREATE INDEX {{p}}idx_contacts_dav_name ON {{p}}contacts (dav_name);
+9 -3
View File
@@ -1,7 +1,7 @@
-- RustBox 0.2.0 MySQL schema.
-- One physical database contains global sessions plus isolated per-account tables.
-- Application tables are materialized by replacing {{p}} with a collision-checked prefix.
-- Squashed compatibility baseline: V052; current schema: V054.
-- Squashed compatibility baseline: V052; current schema: V055.
-- RUSTBOX:GLOBAL-BEGIN
CREATE TABLE IF NOT EXISTS rustbox_accounts (
@@ -59,6 +59,8 @@ CREATE TABLE {{p}}calendar_events (
color TEXT,
reminder_minutes BIGINT,
reminder_extra_minutes BIGINT,
dav_name VARCHAR(255),
dav_data LONGTEXT,
created_at VARCHAR(64) NOT NULL DEFAULT (CAST(CURRENT_TIMESTAMP AS CHAR)),
updated_at VARCHAR(64) NOT NULL DEFAULT (CAST(CURRENT_TIMESTAMP AS CHAR))
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
@@ -122,7 +124,9 @@ CREATE TABLE {{p}}contacts (
birthday TEXT NOT NULL DEFAULT (''),
emails_json LONGTEXT NOT NULL DEFAULT ('[]'),
phones_json LONGTEXT NOT NULL DEFAULT ('[]'),
addresses_json LONGTEXT NOT NULL DEFAULT ('[]')
addresses_json LONGTEXT NOT NULL DEFAULT ('[]'),
dav_name VARCHAR(255),
dav_data LONGTEXT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE {{p}}display_preferences (
@@ -461,9 +465,11 @@ ALTER TABLE {{p}}messages ADD CONSTRAINT {{p}}fk_messages_0 FOREIGN KEY (folder)
CREATE INDEX {{p}}idx_calendar_events_source_uid ON {{p}}calendar_events (source_uid);
CREATE INDEX {{p}}idx_calendar_events_time ON {{p}}calendar_events (start_time, end_time);
CREATE INDEX {{p}}idx_calendar_events_dav_name ON {{p}}calendar_events (dav_name);
CREATE INDEX {{p}}idx_cgm_contact_id ON {{p}}contact_group_members (contact_id);
CREATE INDEX {{p}}idx_contacts_contact_count ON {{p}}contacts (contact_count DESC);
CREATE UNIQUE INDEX {{p}}idx_contacts_email ON {{p}}contacts (email);
CREATE INDEX {{p}}idx_contacts_email ON {{p}}contacts (email);
CREATE INDEX {{p}}idx_contacts_dav_name ON {{p}}contacts (dav_name);
CREATE INDEX {{p}}idx_contacts_last_contacted ON {{p}}contacts (last_contacted DESC);
CREATE INDEX {{p}}idx_contacts_name ON {{p}}contacts (name);
CREATE INDEX {{p}}idx_known_addresses_name ON {{p}}known_addresses (name);
+15
View File
@@ -0,0 +1,15 @@
ALTER TABLE {{p}}calendar_events
ADD COLUMN dav_name TEXT,
ADD COLUMN dav_data TEXT;
ALTER TABLE {{p}}contacts
ADD COLUMN dav_name TEXT,
ADD COLUMN dav_data TEXT;
DROP INDEX IF EXISTS {{p}}idx_contacts_email;
CREATE INDEX {{p}}idx_contacts_email ON {{p}}contacts (email);
CREATE INDEX {{p}}idx_calendar_events_dav_name ON {{p}}calendar_events (dav_name);
CREATE INDEX {{p}}idx_contacts_dav_name ON {{p}}contacts (dav_name);
+9 -3
View File
@@ -1,7 +1,7 @@
-- RustBox 0.2.0 PostgreSQL schema.
-- One physical database contains global sessions plus isolated per-account tables.
-- Application tables are materialized by replacing {{p}} with a collision-checked prefix.
-- Squashed compatibility baseline: V052; current schema: V054.
-- Squashed compatibility baseline: V052; current schema: V055.
-- RUSTBOX:GLOBAL-BEGIN
CREATE TABLE IF NOT EXISTS rustbox_accounts (
@@ -59,6 +59,8 @@ CREATE TABLE {{p}}calendar_events (
color TEXT,
reminder_minutes BIGINT,
reminder_extra_minutes BIGINT,
dav_name TEXT,
dav_data TEXT,
created_at TEXT NOT NULL DEFAULT (CURRENT_TIMESTAMP::text),
updated_at TEXT NOT NULL DEFAULT (CURRENT_TIMESTAMP::text)
);
@@ -122,7 +124,9 @@ CREATE TABLE {{p}}contacts (
birthday TEXT NOT NULL DEFAULT '',
emails_json TEXT NOT NULL DEFAULT '[]',
phones_json TEXT NOT NULL DEFAULT '[]',
addresses_json TEXT NOT NULL DEFAULT '[]'
addresses_json TEXT NOT NULL DEFAULT '[]',
dav_name TEXT,
dav_data TEXT
);
CREATE TABLE {{p}}display_preferences (
@@ -462,9 +466,11 @@ ALTER TABLE {{p}}messages ADD CONSTRAINT {{p}}fk_messages_0 FOREIGN KEY (folder)
CREATE INDEX {{p}}idx_calendar_events_source_uid ON {{p}}calendar_events (source_uid);
CREATE INDEX {{p}}idx_calendar_events_time ON {{p}}calendar_events (start_time, end_time);
CREATE INDEX {{p}}idx_calendar_events_dav_name ON {{p}}calendar_events (dav_name);
CREATE INDEX {{p}}idx_cgm_contact_id ON {{p}}contact_group_members (contact_id);
CREATE INDEX {{p}}idx_contacts_contact_count ON {{p}}contacts (contact_count DESC);
CREATE UNIQUE INDEX {{p}}idx_contacts_email ON {{p}}contacts (email);
CREATE INDEX {{p}}idx_contacts_email ON {{p}}contacts (email);
CREATE INDEX {{p}}idx_contacts_dav_name ON {{p}}contacts (dav_name);
CREATE INDEX {{p}}idx_contacts_last_contacted ON {{p}}contacts (last_contacted DESC);
CREATE INDEX {{p}}idx_contacts_name ON {{p}}contacts (name);
CREATE INDEX {{p}}idx_known_addresses_name ON {{p}}known_addresses (name);
@@ -0,0 +1,19 @@
ALTER TABLE {{p}}calendar_events
ADD COLUMN dav_name TEXT;
ALTER TABLE {{p}}calendar_events
ADD COLUMN dav_data TEXT;
ALTER TABLE {{p}}contacts
ADD COLUMN dav_name TEXT;
ALTER TABLE {{p}}contacts
ADD COLUMN dav_data TEXT;
DROP INDEX IF EXISTS {{p}}idx_contacts_email;
CREATE INDEX {{p}}idx_contacts_email ON {{p}}contacts(email);
CREATE INDEX {{p}}idx_calendar_events_dav_name ON {{p}}calendar_events(dav_name);
CREATE INDEX {{p}}idx_contacts_dav_name ON {{p}}contacts(dav_name);
+7 -3
View File
@@ -1,7 +1,7 @@
-- RustBox 0.2.0 SQLite schema.
-- One physical database contains global sessions plus isolated per-account tables.
-- Application tables are materialized from the tenant section by replacing {{p}}.
-- Squashed compatibility baseline: V052; current schema: V054.
-- Squashed compatibility baseline: V052; current schema: V055.
-- RUSTBOX:GLOBAL-BEGIN
CREATE TABLE IF NOT EXISTS rustbox_accounts (
@@ -59,6 +59,8 @@ CREATE TABLE {{p}}calendar_events (
color TEXT,
reminder_minutes INTEGER,
reminder_extra_minutes INTEGER,
dav_name TEXT,
dav_data TEXT,
created_at TEXT NOT NULL DEFAULT (datetime('now')),
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
);
@@ -117,7 +119,7 @@ CREATE TABLE {{p}}contacts (
source TEXT NOT NULL DEFAULT 'manual',
created_at TEXT NOT NULL DEFAULT (datetime('now')),
updated_at TEXT NOT NULL DEFAULT (datetime('now')),
phone TEXT NOT NULL DEFAULT '', job_title TEXT NOT NULL DEFAULT '', address TEXT NOT NULL DEFAULT '', website TEXT NOT NULL DEFAULT '', birthday TEXT NOT NULL DEFAULT '', emails_json TEXT NOT NULL DEFAULT '[]', phones_json TEXT NOT NULL DEFAULT '[]', addresses_json TEXT NOT NULL DEFAULT '[]');
phone TEXT NOT NULL DEFAULT '', job_title TEXT NOT NULL DEFAULT '', address TEXT NOT NULL DEFAULT '', website TEXT NOT NULL DEFAULT '', birthday TEXT NOT NULL DEFAULT '', emails_json TEXT NOT NULL DEFAULT '[]', phones_json TEXT NOT NULL DEFAULT '[]', addresses_json TEXT NOT NULL DEFAULT '[]', dav_name TEXT, dav_data TEXT);
CREATE TABLE {{p}}display_preferences (
id INTEGER PRIMARY KEY DEFAULT 1 CHECK (id = 1),
@@ -359,12 +361,14 @@ CREATE TABLE {{p}}user_meta (
CREATE INDEX {{p}}idx_calendar_events_source_uid ON {{p}}calendar_events(source_uid);
CREATE INDEX {{p}}idx_calendar_events_time ON {{p}}calendar_events(start_time, end_time);
CREATE INDEX {{p}}idx_calendar_events_dav_name ON {{p}}calendar_events(dav_name);
CREATE INDEX {{p}}idx_cgm_contact_id ON {{p}}contact_group_members(contact_id);
CREATE INDEX {{p}}idx_contacts_contact_count ON {{p}}contacts(contact_count DESC);
CREATE UNIQUE INDEX {{p}}idx_contacts_email ON {{p}}contacts(email);
CREATE INDEX {{p}}idx_contacts_email ON {{p}}contacts(email);
CREATE INDEX {{p}}idx_contacts_dav_name ON {{p}}contacts(dav_name);
CREATE INDEX {{p}}idx_contacts_last_contacted ON {{p}}contacts(last_contacted DESC);