project.go 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. package gorm
  2. import (
  3. "errors"
  4. "github.com/porter-dev/porter/internal/models"
  5. "github.com/porter-dev/porter/internal/repository"
  6. "gorm.io/gorm"
  7. )
  8. // ProjectRepository uses gorm.DB for querying the database
  9. type ProjectRepository struct {
  10. db *gorm.DB
  11. }
  12. // NewProjectRepository returns a ProjectRepository which uses
  13. // gorm.DB for querying the database
  14. func NewProjectRepository(db *gorm.DB) repository.ProjectRepository {
  15. return &ProjectRepository{db}
  16. }
  17. // CreateProject creates a new project
  18. func (repo *ProjectRepository) CreateProject(project *models.Project) (*models.Project, error) {
  19. if err := repo.db.Create(project).Error; err != nil {
  20. return nil, err
  21. }
  22. return project, nil
  23. }
  24. // CreateProjectRole appends a role to the existing array of roles
  25. func (repo *ProjectRepository) CreateProjectRole(project *models.Project, role *models.Role) (*models.Role, error) {
  26. assoc := repo.db.Model(&project).Association("Roles")
  27. if assoc.Error != nil {
  28. return nil, assoc.Error
  29. }
  30. if err := assoc.Append(role); err != nil {
  31. return nil, err
  32. }
  33. return role, nil
  34. }
  35. // UpdateProject updates an existing project
  36. func (repo *ProjectRepository) UpdateProject(project *models.Project) (*models.Project, error) {
  37. if err := repo.db.Save(project).Error; err != nil {
  38. return nil, err
  39. }
  40. return project, nil
  41. }
  42. func (repo *ProjectRepository) UpdateProjectRole(projID uint, role *models.Role) (*models.Role, error) {
  43. foundRole := &models.Role{}
  44. if err := repo.db.Where("project_id = ? AND user_id = ?", projID, role.UserID).First(&foundRole).Error; err != nil {
  45. return nil, err
  46. }
  47. role.ID = foundRole.ID
  48. if err := repo.db.Save(&role).Error; err != nil {
  49. return nil, err
  50. }
  51. return role, nil
  52. }
  53. // ReadProject gets a projects specified by a unique id
  54. func (repo *ProjectRepository) ReadProject(id uint) (*models.Project, error) {
  55. project := &models.Project{}
  56. if err := repo.db.Preload("Roles").Where("id = ?", id).First(&project).Error; err != nil {
  57. return nil, err
  58. }
  59. return project, nil
  60. }
  61. // ReadProject gets a projects specified by a unique id
  62. func (repo *ProjectRepository) ReadProjectRole(projID, userID uint) (*models.Role, error) {
  63. // find the role
  64. role := &models.Role{}
  65. if err := repo.db.Where("project_id = ? AND user_id = ?", projID, userID).First(&role).Error; err != nil {
  66. return nil, err
  67. }
  68. return role, nil
  69. }
  70. // ListProjectsByUserID lists projects where a user has an associated role
  71. func (repo *ProjectRepository) ListProjectsByUserID(userID uint) ([]*models.Project, error) {
  72. projects := make([]*models.Project, 0)
  73. subQuery := repo.db.Model(&models.Role{}).Where("user_id = ?", userID).Select("project_id")
  74. if err := repo.db.Preload("Roles").Model(&models.Project{}).Where("id IN (?)", subQuery).Find(&projects).Error; err != nil {
  75. return nil, err
  76. }
  77. return projects, nil
  78. }
  79. // ListProjectRolesOrdered returns a list of roles for a project ordered by creation date
  80. func (repo *ProjectRepository) ListProjectRolesOrdered(projID uint) ([]models.Role, error) {
  81. project := &models.Project{}
  82. if err := repo.db.Preload("Roles").Where("id = ?", projID).Order("created_at").First(&project).Error; err != nil {
  83. return nil, err
  84. }
  85. return project.Roles, nil
  86. }
  87. // ListProjectRoles returns a list of roles for the project
  88. func (repo *ProjectRepository) ListProjectRoles(projID uint) ([]models.Role, error) {
  89. project := &models.Project{}
  90. if err := repo.db.Preload("Roles").Where("id = ?", projID).First(&project).Error; err != nil {
  91. return nil, err
  92. }
  93. return project.Roles, nil
  94. }
  95. // DeleteProject deletes a project (marking deleted in the db)
  96. func (repo *ProjectRepository) DeleteProject(project *models.Project) (*models.Project, error) {
  97. if err := repo.db.Delete(&project).Error; err != nil {
  98. return nil, err
  99. }
  100. return project, nil
  101. }
  102. func (repo *ProjectRepository) DeleteProjectRole(projID, userID uint) (*models.Role, error) {
  103. // find the role
  104. role := &models.Role{}
  105. if err := repo.db.Where("project_id = ? AND user_id = ?", projID, userID).First(&role).Error; err != nil {
  106. return nil, err
  107. }
  108. if err := repo.db.Delete(&role).Error; err != nil {
  109. return nil, err
  110. }
  111. return role, nil
  112. }
  113. // DeleteRolesForProject deletes all roles for a project
  114. func (repo *ProjectRepository) DeleteRolesForProject(projID uint) error {
  115. if projID == 0 {
  116. return errors.New("must provide a project ID")
  117. }
  118. var roles []models.Role
  119. if err := repo.db.Where("project_id = ?", projID).Find(&roles).Error; err != nil {
  120. return err
  121. }
  122. for _, role := range roles {
  123. r := role
  124. if err := repo.db.Delete(&r).Error; err != nil {
  125. return err
  126. }
  127. }
  128. return nil
  129. }