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