0.15.0

Итерация 11 плана аудита: Postgres-режим — миграции, email-store, унификация времени.

Added

  • pgmigrations/014_agent_providers.up.sql и 016_email_accounts.up.sql — недостающие PG-миграции, синхронизированные с SQLite-версиями (BIGSERIAL, BOOLEAN, TIMESTAMPTZ, IF NOT EXISTS)
  • Down-миграции (*.down.sql) для всех 20 миграций в migrations/ и pgmigrations/ (40 файлов)
  • Email-методы в PostgresStore: CreateEmailAccount (RETURNING id), GetEmailAccount, ListEmailAccountsByAgent, UpdateEmailAccount, DeleteEmailAccount, ListAllEnabledChannelAccounts — ранее заглушки
  • scanPGEmailAccount/scanPGEmailAccountRows с конвертацией TIMESTAMPTZ → RFC3339Nano
  • convertSQLiteToPG — schema-aware приведение типов при копировании SQLite→PG: INTEGER 0/1 → BOOLEAN, TEXT → time.Time для TIMESTAMPTZ
  • syncSequencesSELECT setval(table_id_seq, MAX(id)) после копирования данных
  • getPGColumnTypes — запрос information_schema.columns для определения типов PG-колонок при копировании
  • 30 новых тестов: конвертация типов (18 кейсов), миграции CRUD (5 тестов), совместимость времени (5 тестов), проверка наличия down-миграций

Fixed

  • dual.go передавал MigrationsFS вместо PGMigrationsFS в NewPostgresStore — PG-миграции не находили файлы в pgmigrations/
  • MigrateToPG не запускал PG-миграции перед копированием — таблицы в PG не создавались
  • SQLiteStore.CreateEmailAccount: не хватало одного ? в VALUES (25 колонок, 24 плейсхолдера)
  • SQLite Now()/ParseTime() использовали time.RFC3339 вместо time.RFC3339Nano — разнобой с PG

Changed

  • copyTable переписан на getColumnNames (возвращает []string) + schema-aware конвертацию вместо «сырого» копирования
  • copyAllTables добавлены email_accounts, agent_providers, oauth_sessions в порядок копирования
  • Удалён splitCSV — заменён на getColumnNames
  • Унифицированный формат времени time.RFC3339Nano в обоих хранилищах