user.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. package dbstore
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "git.linuxforward.com/byop/byop-engine/dbmanager"
  6. "git.linuxforward.com/byop/byop-engine/models"
  7. )
  8. type UserStore struct {
  9. dbConn dbmanager.DbManager
  10. }
  11. // NewUserStore creates a new UserStore
  12. func NewUserStore(dbConn dbmanager.DbManager) *UserStore {
  13. return &UserStore{
  14. dbConn: dbConn,
  15. }
  16. }
  17. func (us *UserStore) CreateTable() error {
  18. query := `
  19. CREATE TABLE IF NOT EXISTS users (
  20. id TEXT PRIMARY KEY,
  21. data TEXT NOT NULL
  22. );`
  23. _, err := us.dbConn.Exec(query)
  24. if err != nil {
  25. return fmt.Errorf("failed to create users table: %w", err)
  26. }
  27. return nil
  28. }
  29. // Create creates a new user
  30. func (us *UserStore) Create(user *models.User) error {
  31. return us.dbConn.Create("users", user)
  32. }
  33. // GetByID retrieves a user by ID
  34. func (us *UserStore) GetByID(id string) (*models.User, error) {
  35. user, err := us.dbConn.GetByID("users", id)
  36. if err != nil {
  37. return nil, err
  38. }
  39. return user.(*models.User), nil
  40. }
  41. // Update updates an existing user
  42. func (us *UserStore) Update(user *models.User) error {
  43. return us.dbConn.Update("users", user)
  44. }
  45. // Delete deletes a user by ID
  46. func (us *UserStore) Delete(id string) error {
  47. return us.dbConn.Delete("users", id)
  48. }
  49. // List retrieves all users
  50. func (us *UserStore) List(filter map[string]interface{}) ([]*models.User, error) {
  51. users, err := us.dbConn.List("users", filter)
  52. if err != nil {
  53. return nil, err
  54. }
  55. // If no users are found, return an empty slice
  56. if len(users) == 0 {
  57. return []*models.User{}, nil
  58. }
  59. var userList []*models.User
  60. for _, user := range users {
  61. userData, ok := user.(map[string]interface{})
  62. if !ok {
  63. return nil, fmt.Errorf("unexpected data format")
  64. }
  65. // Unmarshal the map into a *models.User
  66. user := &models.User{}
  67. jsonData, err := json.Marshal(userData)
  68. if err != nil {
  69. return nil, fmt.Errorf("failed to marshal user data: %w", err)
  70. }
  71. if err := json.Unmarshal(jsonData, user); err != nil {
  72. return nil, fmt.Errorf("failed to unmarshal user data: %w", err)
  73. }
  74. userList = append(userList, user)
  75. }
  76. return userList, nil
  77. }
  78. // GetByUsername retrieves a user by username
  79. func (us *UserStore) GetByUsername(username string) (*models.User, error) {
  80. user, err := us.dbConn.GetByID("users", username)
  81. if err != nil {
  82. return nil, err
  83. }
  84. return user.(*models.User), nil
  85. }
  86. func (us *UserStore) GetUserByEmail(email string) (*models.User, error) {
  87. // Retrieve the list of users filtered by email
  88. users, err := us.dbConn.List("users", map[string]interface{}{"email": email})
  89. if err != nil {
  90. return nil, err
  91. }
  92. // If no users are found, return nil
  93. if len(users) == 0 {
  94. return nil, nil
  95. }
  96. // Convert the first result to *models.User
  97. userData, ok := users[0].(map[string]interface{})
  98. if !ok {
  99. return nil, fmt.Errorf("unexpected data format")
  100. }
  101. // Unmarshal the map into a *models.User
  102. user := &models.User{}
  103. jsonData, err := json.Marshal(userData)
  104. if err != nil {
  105. return nil, fmt.Errorf("failed to marshal user data: %w", err)
  106. }
  107. if err := json.Unmarshal(jsonData, user); err != nil {
  108. return nil, fmt.Errorf("failed to unmarshal user data: %w", err)
  109. }
  110. return user, nil
  111. }
  112. // ListDeploymentsByUserID retrieves all deployments for a user by user ID
  113. func (us *UserStore) ListDeploymentsByUserID(userID string) ([]*models.Deployment, error) {
  114. deployments, err := us.dbConn.List("deployments", map[string]interface{}{"user_id": userID})
  115. if err != nil {
  116. return nil, err
  117. }
  118. var deploymentList []*models.Deployment
  119. for _, deployment := range deployments {
  120. deploymentList = append(deploymentList, deployment.(*models.Deployment))
  121. }
  122. return deploymentList, nil
  123. }