v2.0.0.go 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. package migrations
  2. import (
  3. "github.com/jmoiron/sqlx"
  4. "github.com/knadh/koanf"
  5. "github.com/knadh/stuffbin"
  6. )
  7. // V2_0_0 performs the DB migrations for v.1.0.0.
  8. func V2_0_0(db *sqlx.DB, fs stuffbin.FileSystem, ko *koanf.Koanf) error {
  9. if _, err := db.Exec(`
  10. CREATE TABLE IF NOT EXISTS bounces (
  11. id SERIAL PRIMARY KEY,
  12. subscriber_id INTEGER NOT NULL REFERENCES subscribers(id) ON DELETE CASCADE ON UPDATE CASCADE,
  13. campaign_id INTEGER NULL REFERENCES campaigns(id) ON DELETE SET NULL ON UPDATE CASCADE,
  14. type bounce_type NOT NULL DEFAULT 'hard',
  15. source TEXT NOT NULL DEFAULT '',
  16. meta JSONB NOT NULL DEFAULT '{}',
  17. created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
  18. );
  19. CREATE INDEX IF NOT EXISTS idx_bounces_sub_id ON bounces(subscriber_id);
  20. CREATE INDEX IF NOT EXISTS idx_bounces_camp_id ON bounces(campaign_id);
  21. CREATE INDEX IF NOT EXISTS idx_bounces_source ON bounces(source);
  22. `); err != nil {
  23. return err
  24. }
  25. if _, err := db.Exec(`
  26. INSERT INTO settings (key, value) VALUES
  27. ('bounce.enabled', 'false'),
  28. ('bounce.webhooks_enabled', 'false'),
  29. ('bounce.count', '2'),
  30. ('bounce.action', '"blocklist"'),
  31. ('bounce.ses_enabled', 'false'),
  32. ('bounce.sendgrid_enabled', 'false'),
  33. ('bounce.sendgrid_key', '""'),
  34. ('bounce.mailboxes', '[{"enabled":false, "type": "pop", "host":"pop.yoursite.com","port":995,"auth_protocol":"userpass","username":"username","password":"password","return_path": "bounce@listmonk.yoursite.com","scan_interval":"15m","tls_enabled":true,"tls_skip_verify":false}]')
  35. ON CONFLICT DO NOTHING;`); err != nil {
  36. return err
  37. }
  38. if _, err := db.Exec(`ALTER TABLE subscribers DROP COLUMN IF EXISTS campaigns; `); err != nil {
  39. return err
  40. }
  41. // S3 URL i snow a settings field. Prepare S3 URL based on region and bucket.
  42. if _, err := db.Exec(`
  43. WITH region AS (
  44. SELECT value#>>'{}' AS value FROM settings WHERE key='upload.s3.aws_default_region'
  45. ), s3url AS (
  46. SELECT FORMAT('https://s3.%s.amazonaws.com', (SELECT value FROM region)) AS value
  47. )
  48. INSERT INTO settings (key, value) VALUES ('upload.s3.url', TO_JSON((SELECT * FROM s3url))) ON CONFLICT DO NOTHING;`); err != nil {
  49. return err
  50. }
  51. return nil
  52. }