2
0

user.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. package gorm
  2. import (
  3. "github.com/porter-dev/porter/internal/models"
  4. "github.com/porter-dev/porter/internal/repository"
  5. "golang.org/x/crypto/bcrypt"
  6. "gorm.io/gorm"
  7. )
  8. // UserRepository uses gorm.DB for querying the database
  9. type UserRepository struct {
  10. db *gorm.DB
  11. }
  12. // NewUserRepository returns a DefaultUserRepository which uses
  13. // gorm.DB for querying the database
  14. func NewUserRepository(db *gorm.DB) repository.UserRepository {
  15. return &UserRepository{db}
  16. }
  17. // CreateUser adds a new User row to the Users table in the database
  18. func (repo *UserRepository) CreateUser(user *models.User) (*models.User, error) {
  19. if err := repo.db.Create(user).Error; err != nil {
  20. return nil, err
  21. }
  22. return user, nil
  23. }
  24. // ReadUser finds a single user based on their unique id
  25. func (repo *UserRepository) ReadUser(id uint) (*models.User, error) {
  26. user := &models.User{}
  27. if err := repo.db.Where("id = ?", id).First(&user).Error; err != nil {
  28. return nil, err
  29. }
  30. return user, nil
  31. }
  32. // ListUsersByIDs finds all users matching ids
  33. func (repo *UserRepository) ListUsersByIDs(ids []uint) ([]*models.User, error) {
  34. users := make([]*models.User, 0)
  35. if err := repo.db.Model(&models.User{}).Where("id IN (?)", ids).Find(&users).Error; err != nil {
  36. return nil, err
  37. }
  38. return users, nil
  39. }
  40. // ReadUserByEmail finds a single user based on their unique email
  41. func (repo *UserRepository) ReadUserByEmail(email string) (*models.User, error) {
  42. user := &models.User{}
  43. if err := repo.db.Where("email = ?", email).First(&user).Error; err != nil {
  44. return nil, err
  45. }
  46. return user, nil
  47. }
  48. // ReadUserByGithubUserID finds a single user based on their github user id
  49. func (repo *UserRepository) ReadUserByGithubUserID(id int64) (*models.User, error) {
  50. user := &models.User{}
  51. if err := repo.db.Where("github_user_id = ?", id).First(&user).Error; err != nil {
  52. return nil, err
  53. }
  54. return user, nil
  55. }
  56. // ReadUserByGoogleUserID finds a single user based on their google user id
  57. func (repo *UserRepository) ReadUserByGoogleUserID(id string) (*models.User, error) {
  58. user := &models.User{}
  59. if err := repo.db.Where("google_user_id = ?", id).First(&user).Error; err != nil {
  60. return nil, err
  61. }
  62. return user, nil
  63. }
  64. // UpdateUser modifies an existing User in the database
  65. func (repo *UserRepository) UpdateUser(user *models.User) (*models.User, error) {
  66. if err := repo.db.Save(user).Error; err != nil {
  67. return nil, err
  68. }
  69. return user, nil
  70. }
  71. // DeleteUser deletes a single user using their unique id
  72. func (repo *UserRepository) DeleteUser(user *models.User) (*models.User, error) {
  73. if err := repo.db.Delete(&user).Error; err != nil {
  74. return nil, err
  75. }
  76. return user, nil
  77. }
  78. // CheckPassword checks the input password is correct for the provided user id.
  79. func (repo *UserRepository) CheckPassword(id int, pwd string) (bool, error) {
  80. u := &models.User{}
  81. if err := repo.db.First(u, id).Error; err != nil {
  82. return false, err
  83. }
  84. if err := bcrypt.CompareHashAndPassword([]byte(u.Password), []byte(pwd)); err != nil {
  85. return false, err
  86. }
  87. return true, nil
  88. }