-- Ручное создание таблицы mail_mailbox_shares (миграция Version5007Date20260204120000). -- Используйте, если нельзя выполнять occ app:update mail. -- БД: PostgreSQL, префикс таблиц: oc_ (из config.php: dbtableprefix). -- -- Проверить, что таблицы нет (должно быть 0 строк): -- sudo -u postgres psql -d f7cloud_new -c "SELECT tablename FROM pg_tables WHERE schemaname='public' AND tablename='oc_mail_mailbox_shares';" -- -- Запуск (обязательно БД из config.php: dbname = f7cloud_new): -- sudo -u postgres psql -d f7cloud_new -f /var/www/f7cloud/apps/mail/docs/create-mailbox-shares-table.sql -- -- Если префикс таблиц у вас не oc_, замените oc_ в скрипте на свой (dbtableprefix из config.php). -- Шаги 4 (FK) при повторном запуске можно закомментировать, если ограничения уже созданы. -- 1) Создать таблицу CREATE TABLE IF NOT EXISTS oc_mail_mailbox_shares ( id SERIAL NOT NULL, owner_user_id VARCHAR(64) NOT NULL, account_id INTEGER NOT NULL, mailbox_id INTEGER NOT NULL, share_type VARCHAR(64) NOT NULL, share_with VARCHAR(64) NOT NULL, permission VARCHAR(32) NOT NULL, created_at INTEGER NOT NULL DEFAULT 0, PRIMARY KEY (id) ); -- 2) Уникальный индекс (один шаринг на пару папка+получатель) CREATE UNIQUE INDEX IF NOT EXISTS mail_mailbox_shares_owner_acc_mb_sw ON oc_mail_mailbox_shares (owner_user_id, account_id, mailbox_id, share_type, share_with); -- 3) Индекс для запросов «расшарено мне» CREATE INDEX IF NOT EXISTS mail_mailbox_shares_share_with_type ON oc_mail_mailbox_shares (share_with, share_type); -- 4) Внешние ключи (опционально; не создаём, если ограничение уже есть) DO $$ BEGIN IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'oc_mail_mailboxes') AND NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'fk_mailbox_shares_mailbox') THEN ALTER TABLE oc_mail_mailbox_shares ADD CONSTRAINT fk_mailbox_shares_mailbox FOREIGN KEY (mailbox_id) REFERENCES oc_mail_mailboxes(id) ON DELETE CASCADE; END IF; END $$; DO $$ BEGIN IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'oc_mail_accounts') AND NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'fk_mailbox_shares_account') THEN ALTER TABLE oc_mail_mailbox_shares ADD CONSTRAINT fk_mailbox_shares_account FOREIGN KEY (account_id) REFERENCES oc_mail_accounts(id) ON DELETE CASCADE; END IF; END $$; -- 5) Права для пользователя БД приложения (dbuser из config.php, у вас f7user) GRANT SELECT, INSERT, UPDATE, DELETE ON oc_mail_mailbox_shares TO f7user; GRANT USAGE, SELECT ON SEQUENCE oc_mail_mailbox_shares_id_seq TO f7user; -- 6) Записать миграцию как выполненную (чтобы при будущем app:update её не запускали повторно) -- PK таблицы oc_migrations: (app, version) INSERT INTO oc_migrations (app, version) VALUES ('mail', '5007Date20260204120000') ON CONFLICT (app, version) DO NOTHING;