install.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. package main
  2. import (
  3. "fmt"
  4. "io/ioutil"
  5. "strings"
  6. "github.com/jmoiron/sqlx"
  7. "github.com/knadh/goyesql"
  8. "github.com/knadh/listmonk/models"
  9. "github.com/lib/pq"
  10. uuid "github.com/satori/go.uuid"
  11. "github.com/spf13/viper"
  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. viper.GetString("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. "test@test.com",
  54. "Test Subscriber",
  55. `{"type": "known", "good": true}`,
  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("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. logger.Printf("Setup complete")
  76. logger.Printf(`Run the program view it at %s`, viper.GetString("app.address"))
  77. }
  78. // installMigrate executes the SQL schema and creates the necessary tables and types.
  79. func installMigrate(db *sqlx.DB, app *App) error {
  80. q, err := app.FS.Read("/schema.sql")
  81. if err != nil {
  82. return err
  83. }
  84. _, err = db.Query(string(q))
  85. if err != nil {
  86. return err
  87. }
  88. return nil
  89. }