messages.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. package data
  2. import (
  3. "context"
  4. "database/sql"
  5. "github.com/owncast/owncast/db"
  6. "github.com/owncast/owncast/models"
  7. log "github.com/sirupsen/logrus"
  8. )
  9. // CreateMessagesTable will create the chat messages table if needed.
  10. func CreateMessagesTable(db *sql.DB) {
  11. createTableSQL := `CREATE TABLE IF NOT EXISTS messages (
  12. "id" string NOT NULL,
  13. "user_id" TEXT,
  14. "body" TEXT,
  15. "eventType" TEXT,
  16. "hidden_at" DATETIME,
  17. "timestamp" DATETIME,
  18. "title" TEXT,
  19. "subtitle" TEXT,
  20. "image" TEXT,
  21. "link" TEXT,
  22. PRIMARY KEY (id)
  23. );`
  24. MustExec(createTableSQL, db)
  25. // Create indexes
  26. MustExec(`CREATE INDEX IF NOT EXISTS user_id_hidden_at_timestamp ON messages (id, user_id, hidden_at, timestamp);`, db)
  27. MustExec(`CREATE INDEX IF NOT EXISTS idx_id ON messages (id);`, db)
  28. MustExec(`CREATE INDEX IF NOT EXISTS idx_user_id ON messages (user_id);`, db)
  29. MustExec(`CREATE INDEX IF NOT EXISTS idx_hidden_at ON messages (hidden_at);`, db)
  30. MustExec(`CREATE INDEX IF NOT EXISTS idx_timestamp ON messages (timestamp);`, db)
  31. MustExec(`CREATE INDEX IF NOT EXISTS idx_messages_hidden_at_timestamp on messages(hidden_at, timestamp);`, db)
  32. }
  33. // GetMessagesCount will return the number of messages in the database.
  34. func GetMessagesCount() int64 {
  35. query := `SELECT COUNT(*) FROM messages`
  36. rows, err := _db.Query(query)
  37. if err != nil || rows.Err() != nil {
  38. return 0
  39. }
  40. defer rows.Close()
  41. var count int64
  42. for rows.Next() {
  43. if err := rows.Scan(&count); err != nil {
  44. return 0
  45. }
  46. }
  47. return count
  48. }
  49. // CreateBanIPTable will create the IP ban table if needed.
  50. func CreateBanIPTable(db *sql.DB) {
  51. createTableSQL := ` CREATE TABLE IF NOT EXISTS ip_bans (
  52. "ip_address" TEXT NOT NULL PRIMARY KEY,
  53. "notes" TEXT,
  54. "created_at" TIMESTAMP DEFAULT CURRENT_TIMESTAMP
  55. );`
  56. stmt, err := db.Prepare(createTableSQL)
  57. if err != nil {
  58. log.Fatal("error creating ip ban table", err)
  59. }
  60. defer stmt.Close()
  61. if _, err := stmt.Exec(); err != nil {
  62. log.Fatal("error creating ip ban table", err)
  63. }
  64. }
  65. // BanIPAddress will persist a new IP address ban to the datastore.
  66. func BanIPAddress(address, note string) error {
  67. return _datastore.GetQueries().BanIPAddress(context.Background(), db.BanIPAddressParams{
  68. IpAddress: address,
  69. Notes: sql.NullString{String: note, Valid: true},
  70. })
  71. }
  72. // IsIPAddressBanned will return if an IP address has been previously blocked.
  73. func IsIPAddressBanned(address string) (bool, error) {
  74. blocked, error := _datastore.GetQueries().IsIPAddressBlocked(context.Background(), address)
  75. return blocked > 0, error
  76. }
  77. // GetIPAddressBans will return all the banned IP addresses.
  78. func GetIPAddressBans() ([]models.IPAddress, error) {
  79. result, err := _datastore.GetQueries().GetIPAddressBans(context.Background())
  80. if err != nil {
  81. return nil, err
  82. }
  83. response := []models.IPAddress{}
  84. for _, ip := range result {
  85. response = append(response, models.IPAddress{
  86. IPAddress: ip.IpAddress,
  87. Notes: ip.Notes.String,
  88. CreatedAt: ip.CreatedAt.Time,
  89. })
  90. }
  91. return response, err
  92. }
  93. // RemoveIPAddressBan will remove a previously banned IP address.
  94. func RemoveIPAddressBan(address string) error {
  95. return _datastore.GetQueries().RemoveIPAddressBan(context.Background(), address)
  96. }