Encrypted messaging app
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

123 lines
2.7 KiB

  1. package Database
  2. import (
  3. "errors"
  4. "github.com/gofrs/uuid"
  5. "gorm.io/gorm"
  6. "gorm.io/gorm/clause"
  7. )
  8. // BeforeUpdate prevents updating the username or email if it has not changed
  9. // This stops a unique constraint error
  10. func (u *User) BeforeUpdate(tx *gorm.DB) (err error) {
  11. if !tx.Statement.Changed("Username") {
  12. tx.Statement.Omit("Username")
  13. }
  14. if !tx.Statement.Changed("Email") {
  15. tx.Statement.Omit("Email")
  16. }
  17. return nil
  18. }
  19. // User holds user data
  20. type User struct {
  21. Base
  22. Username string `gorm:"not null;unique" json:"username"`
  23. Password string `gorm:"not null" json:"password"`
  24. ConfirmPassword string `gorm:"-" json:"confirm_password"`
  25. Email string ` json:"email"`
  26. AsymmetricPrivateKey string `gorm:"not null" json:"asymmetric_private_key"` // Stored encrypted
  27. AsymmetricPublicKey string `gorm:"not null" json:"asymmetric_public_key"`
  28. SymmetricKey string `gorm:"not null" json:"symmetric_key"` // Stored encrypted
  29. AttachmentID *uuid.UUID ` json:"attachment_id"`
  30. Attachment Attachment ` json:"attachment"`
  31. MessageExpiryDefault MessageExpiry `gorm:"default:no_expiry" json:"-" sql:"type:ENUM('fifteen_min', 'thirty_min', 'one_hour', 'three_hour', 'six_hour', 'twelve_hour', 'one_day', 'three_day', 'no_expiry')"` // Stored encrypted
  32. }
  33. func GetUserById(id string) (User, error) {
  34. var (
  35. user User
  36. err error
  37. )
  38. err = DB.Preload(clause.Associations).
  39. First(&user, "id = ?", id).
  40. Error
  41. return user, err
  42. }
  43. func GetUserByUsername(username string) (User, error) {
  44. var (
  45. user User
  46. err error
  47. )
  48. err = DB.Preload(clause.Associations).
  49. First(&user, "username = ?", username).
  50. Error
  51. return user, err
  52. }
  53. func CheckUniqueUsername(username string) error {
  54. var (
  55. exists bool
  56. err error
  57. )
  58. err = DB.Model(User{}).
  59. Select("count(*) > 0").
  60. Where("username = ?", username).
  61. Find(&exists).
  62. Error
  63. if err != nil {
  64. return err
  65. }
  66. if exists {
  67. return errors.New("Invalid username")
  68. }
  69. return nil
  70. }
  71. func (user *User) CreateUser() error {
  72. var err error
  73. err = DB.Session(&gorm.Session{FullSaveAssociations: true}).
  74. Create(user).
  75. Error
  76. return err
  77. }
  78. func (user *User) UpdateUser() error {
  79. var err error
  80. err = DB.Model(&user).
  81. Omit("id").
  82. Where("id = ?", user.ID.String()).
  83. Updates(user).
  84. Error
  85. if err != nil {
  86. return err
  87. }
  88. err = DB.Model(User{}).
  89. Where("id = ?", user.ID.String()).
  90. First(user).
  91. Error
  92. return err
  93. }
  94. func (user *User) DeleteUser() error {
  95. return DB.Session(&gorm.Session{FullSaveAssociations: true}).
  96. Delete(user).
  97. Error
  98. }