project.go 3.7 KB

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