f7cloud_client/apps/mail/docs/create-mailbox-shares-table.sql
root 8b6a0139db f7cloud_client
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-17 22:59:26 +00:00

64 lines
3.4 KiB
SQL
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- Ручное создание таблицы 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;