workspace.go 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. package store
  2. import (
  3. "context"
  4. "fmt"
  5. "git.linuxforward.com/byom/byom-core/common"
  6. "github.com/google/uuid"
  7. "gorm.io/gorm"
  8. )
  9. //CRUD methods for the workspace
  10. // CreateWorkspace creates a new workspace
  11. func (s *DataStore) CreateWorkspace(ctx context.Context, w *common.Workspace) error {
  12. result := s.db.Create(w)
  13. if result.Error != nil {
  14. return fmt.Errorf("create workspace: %w", result.Error)
  15. }
  16. return nil
  17. }
  18. // GetWorkspace gets a workspace by ID
  19. func (s *DataStore) GetWorkspace(ctx context.Context, id string) (*common.Workspace, error) {
  20. var workspace common.Workspace
  21. result := s.db.First(&workspace, id)
  22. if result.Error != nil {
  23. return nil, fmt.Errorf("get workspace: %w", result.Error)
  24. }
  25. return &workspace, nil
  26. }
  27. // UpdateWorkspace updates a workspace
  28. func (s *DataStore) UpdateWorkspace(ctx context.Context, w *common.Workspace) error {
  29. result := s.db.Save(w)
  30. if result.Error != nil {
  31. return fmt.Errorf("update workspace: %w", result.Error)
  32. }
  33. return nil
  34. }
  35. // DeleteWorkspace deletes a workspace
  36. func (s *DataStore) DeleteWorkspace(ctx context.Context, id string) error {
  37. result := s.db.Delete(&common.Workspace{}, id)
  38. if result.Error != nil {
  39. return fmt.Errorf("delete workspace: %w", result.Error)
  40. }
  41. return nil
  42. }
  43. // GetWorkspaces gets all workspaces
  44. func (s *DataStore) GetWorkspaces(ctx context.Context) ([]common.Workspace, error) {
  45. var workspaces []common.Workspace
  46. result := s.db.Find(&workspaces)
  47. if result.Error != nil {
  48. return nil, fmt.Errorf("get workspaces: %w", result.Error)
  49. }
  50. return workspaces, nil
  51. }
  52. // GetWorkspacesByUserID gets all workspaces by user ID
  53. func (s *DataStore) GetWorkspacesByUserID(ctx context.Context, userID uuid.UUID) ([]common.Workspace, error) {
  54. var workspaces []common.Workspace
  55. err := s.db.Model(&common.User{ID: userID}).
  56. Association("Workspaces").
  57. Find(&workspaces)
  58. if err != nil {
  59. return nil, fmt.Errorf("get workspaces by user ID: %w", err)
  60. }
  61. return workspaces, nil
  62. }
  63. // GetWorkspaceByUserID gets a workspace by user ID
  64. func (s *DataStore) GetWorkspaceByUserID(ctx context.Context, userID, workspaceID uuid.UUID) (*common.Workspace, error) {
  65. var workspace common.Workspace
  66. err := s.db.Model(&common.User{ID: userID}).
  67. Association("Workspaces").
  68. Find(&workspace, workspaceID)
  69. if err != nil {
  70. return nil, fmt.Errorf("get workspace by user ID: %w", err)
  71. }
  72. return &workspace, nil
  73. }
  74. // AddUserToWorkspace adds a user to a workspace
  75. func (s *DataStore) AddUserToWorkspace(ctx context.Context, userID, workspaceID uuid.UUID, role string) error {
  76. uwr := common.UserWorkspaceRole{
  77. UserID: userID,
  78. WorkspaceID: workspaceID,
  79. Role: role,
  80. }
  81. result := s.db.Create(&uwr)
  82. if result.Error != nil {
  83. return fmt.Errorf("add user to workspace: %w", result.Error)
  84. }
  85. return nil
  86. }
  87. // AddUserToWorkspaceTx adds a user to a workspace in a transaction
  88. func (s *DataStore) AddUserToWorkspaceTx(ctx context.Context, tx *gorm.DB, role string, userID, workspaceID uuid.UUID) error {
  89. uwr := common.UserWorkspaceRole{
  90. UserID: userID,
  91. WorkspaceID: workspaceID,
  92. Role: role,
  93. }
  94. result := tx.Create(&uwr)
  95. if result.Error != nil {
  96. return fmt.Errorf("add user to workspace in transaction: %w", result.Error)
  97. }
  98. return nil
  99. }
  100. // GetUserWorkspaceRole gets a user's role in a workspace
  101. func (s *DataStore) GetUserWorkspaceRole(ctx context.Context, userID, workspaceID string) (*common.UserWorkspaceRole, error) {
  102. var uwr common.UserWorkspaceRole
  103. result := s.db.Where("user_id = ? AND workspace_id = ?", userID, workspaceID).First(&uwr)
  104. if result.Error != nil {
  105. return nil, fmt.Errorf("get user workspace role: %w", result.Error)
  106. }
  107. return &uwr, nil
  108. }
  109. // UpdateUserWorkspaceRole updates a user's role in a workspace
  110. func (s *DataStore) UpdateUserWorkspaceRole(ctx context.Context, userID, workspaceID, newRole string) error {
  111. result := s.db.Model(&common.UserWorkspaceRole{}).
  112. Where("user_id = ? AND workspace_id = ?", userID, workspaceID).
  113. Update("role", newRole)
  114. if result.Error != nil {
  115. return fmt.Errorf("update user workspace role: %w", result.Error)
  116. }
  117. return nil
  118. }
  119. // DeleteUserFromWorkspace deletes a user from a workspace
  120. func (s *DataStore) DeleteUserFromWorkspace(ctx context.Context, userID, workspaceID string) error {
  121. result := s.db.Where("user_id = ? AND workspace_id = ?", userID, workspaceID).Delete(&common.UserWorkspaceRole{})
  122. if result.Error != nil {
  123. return fmt.Errorf("delete user from workspace: %w", result.Error)
  124. }
  125. return nil
  126. }
  127. // GetWorkspaceUsers gets all users in a workspace
  128. func (s *DataStore) GetWorkspaceUsers(ctx context.Context, workspaceID string) ([]common.User, error) {
  129. var users []common.User
  130. workspaceUUID, err := uuid.Parse(workspaceID)
  131. if err != nil {
  132. return nil, fmt.Errorf("invalid workspace ID: %w", err)
  133. }
  134. err = s.db.Model(&common.Workspace{ID: workspaceUUID}).
  135. Association("Users").
  136. Find(&users)
  137. if err != nil {
  138. return nil, fmt.Errorf("get workspace users: %w", err)
  139. }
  140. return users, nil
  141. }