install.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. package main
  2. import (
  3. "fmt"
  4. "io/ioutil"
  5. "strings"
  6. "time"
  7. "github.com/jmoiron/sqlx"
  8. "github.com/knadh/goyesql"
  9. "github.com/knadh/listmonk/models"
  10. "github.com/lib/pq"
  11. uuid "github.com/satori/go.uuid"
  12. )
  13. // install runs the first time setup of creating and
  14. // migrating the database and creating the super user.
  15. func install(app *App, qMap goyesql.Queries) {
  16. fmt.Println("")
  17. fmt.Println("** First time installation **")
  18. fmt.Printf("** IMPORTANT: This will wipe existing listmonk tables and types in the DB '%s' **",
  19. ko.String("db.database"))
  20. fmt.Println("")
  21. var ok string
  22. fmt.Print("Continue (y/n)? ")
  23. if _, err := fmt.Scanf("%s", &ok); err != nil {
  24. logger.Fatalf("Error reading value from terminal: %v", err)
  25. }
  26. if strings.ToLower(ok) != "y" {
  27. fmt.Println("Installation cancelled.")
  28. return
  29. }
  30. // Migrate the tables.
  31. err := installMigrate(app.DB, app)
  32. if err != nil {
  33. logger.Fatalf("Error migrating DB schema: %v", err)
  34. }
  35. // Load the queries.
  36. var q Queries
  37. if err := scanQueriesToStruct(&q, qMap, app.DB.Unsafe()); err != nil {
  38. logger.Fatalf("error loading SQL queries: %v", err)
  39. }
  40. // Sample list.
  41. var listID int
  42. if err := q.CreateList.Get(&listID,
  43. uuid.NewV4().String(),
  44. "Default list",
  45. models.ListTypePublic,
  46. pq.StringArray{"test"},
  47. ); err != nil {
  48. logger.Fatalf("Error creating superadmin user: %v", err)
  49. }
  50. // Sample subscriber.
  51. if _, err := q.UpsertSubscriber.Exec(
  52. uuid.NewV4(),
  53. "john@example.com",
  54. "John Doe",
  55. `{"type": "known", "good": true, "city": "Bengaluru"}`,
  56. pq.Int64Array{int64(listID)},
  57. ); err != nil {
  58. logger.Fatalf("Error creating subscriber: %v", err)
  59. }
  60. // Default template.
  61. tplBody, err := ioutil.ReadFile("email-templates/default.tpl")
  62. if err != nil {
  63. tplBody = []byte(tplTag)
  64. }
  65. var tplID int
  66. if err := q.CreateTemplate.Get(&tplID,
  67. "Default template",
  68. string(tplBody),
  69. ); err != nil {
  70. logger.Fatalf("error creating default template: %v", err)
  71. }
  72. if _, err := q.SetDefaultTemplate.Exec(tplID); err != nil {
  73. logger.Fatalf("error setting default template: %v", err)
  74. }
  75. // Sample campaign.
  76. sendAt := time.Now()
  77. sendAt.Add(time.Minute * 43200)
  78. if _, err := q.CreateCampaign.Exec(uuid.NewV4(),
  79. "Test campaign",
  80. "Welcome to listmonk",
  81. "noreply@yoursite.com",
  82. `<h3>Hi {{ .Subscriber.FirstName }}!</h3>
  83. This is a test e-mail campaign. Your second name is {{ .Subscriber.LastName }} and you are from {{ .Subscriber.Attribs.city }}.`,
  84. "richtext",
  85. sendAt,
  86. pq.StringArray{"test-campaign"},
  87. "email",
  88. 1,
  89. pq.Int64Array{1},
  90. ); err != nil {
  91. logger.Fatalf("error creating sample campaign: %v", err)
  92. }
  93. logger.Printf("Setup complete")
  94. logger.Printf(`Run the program view it at %s`, ko.String("app.address"))
  95. }
  96. // installMigrate executes the SQL schema and creates the necessary tables and types.
  97. func installMigrate(db *sqlx.DB, app *App) error {
  98. q, err := app.FS.Read("/schema.sql")
  99. if err != nil {
  100. return err
  101. }
  102. _, err = db.Query(string(q))
  103. if err != nil {
  104. return err
  105. }
  106. return nil
  107. }