environment.go 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. package gorm
  2. import (
  3. "strings"
  4. "github.com/porter-dev/porter/internal/models"
  5. "github.com/porter-dev/porter/internal/repository"
  6. "gorm.io/gorm"
  7. )
  8. // EnvironmentRepository uses gorm.DB for querying the database
  9. type EnvironmentRepository struct {
  10. db *gorm.DB
  11. }
  12. // NewEnvironmentRepository returns a DefaultEnvironmentRepository which uses
  13. // gorm.DB for querying the database
  14. func NewEnvironmentRepository(db *gorm.DB) repository.EnvironmentRepository {
  15. return &EnvironmentRepository{db}
  16. }
  17. func (repo *EnvironmentRepository) CreateEnvironment(env *models.Environment) (*models.Environment, error) {
  18. if err := repo.db.Create(env).Error; err != nil {
  19. return nil, err
  20. }
  21. return env, nil
  22. }
  23. func (repo *EnvironmentRepository) ReadEnvironment(projectID, clusterID, gitInstallationID uint, gitRepoOwner, gitRepoName string) (*models.Environment, error) {
  24. env := &models.Environment{}
  25. switch repo.db.Dialector.Name() {
  26. case "sqlite":
  27. if err := repo.db.Order("id desc").Where(
  28. "project_id = ? AND cluster_id = ? AND git_installation_id = ? AND git_repo_owner LIKE ? AND git_repo_name LIKE ?",
  29. projectID, clusterID, gitInstallationID, gitRepoOwner, gitRepoName,
  30. ).First(&env).Error; err != nil {
  31. return nil, err
  32. }
  33. case "postgres":
  34. if err := repo.db.Order("id desc").Where(
  35. "project_id = ? AND cluster_id = ? AND git_installation_id = ? AND git_repo_owner iLIKE ? AND git_repo_name iLIKE ?",
  36. projectID, clusterID, gitInstallationID, gitRepoOwner, gitRepoName,
  37. ).First(&env).Error; err != nil {
  38. return nil, err
  39. }
  40. }
  41. return env, nil
  42. }
  43. func (repo *EnvironmentRepository) ReadEnvironmentByID(projectID, clusterID, envID uint) (*models.Environment, error) {
  44. env := &models.Environment{}
  45. if err := repo.db.Order("id desc").Where(
  46. "project_id = ? AND cluster_id = ? AND id = ?",
  47. projectID, clusterID, envID,
  48. ).First(&env).Error; err != nil {
  49. return nil, err
  50. }
  51. return env, nil
  52. }
  53. func (repo *EnvironmentRepository) ReadEnvironmentByOwnerRepoName(
  54. projectID, clusterID uint,
  55. gitRepoOwner, gitRepoName string,
  56. ) (*models.Environment, error) {
  57. env := &models.Environment{}
  58. switch repo.db.Dialector.Name() {
  59. case "sqlite":
  60. if err := repo.db.Order("id desc").Where("project_id = ? AND cluster_id = ? AND git_repo_owner LIKE ? AND git_repo_name LIKE ?",
  61. projectID, clusterID, gitRepoOwner, gitRepoName,
  62. ).First(&env).Error; err != nil {
  63. return nil, err
  64. }
  65. case "postgres":
  66. if err := repo.db.Order("id desc").Where("project_id = ? AND cluster_id = ? AND git_repo_owner iLIKE ? AND git_repo_name iLIKE ?",
  67. projectID, clusterID, gitRepoOwner, gitRepoName,
  68. ).First(&env).Error; err != nil {
  69. return nil, err
  70. }
  71. }
  72. return env, nil
  73. }
  74. func (repo *EnvironmentRepository) ReadEnvironmentByWebhookIDOwnerRepoName(
  75. webhookID, gitRepoOwner, gitRepoName string,
  76. ) (*models.Environment, error) {
  77. env := &models.Environment{}
  78. switch repo.db.Dialector.Name() {
  79. case "sqlite":
  80. if err := repo.db.Order("id desc").Where("webhook_id = ? AND git_repo_owner LIKE ? AND git_repo_name LIKE ?",
  81. webhookID, gitRepoOwner, gitRepoName,
  82. ).First(&env).Error; err != nil {
  83. return nil, err
  84. }
  85. case "postgres":
  86. if err := repo.db.Order("id desc").Where("webhook_id = ? AND git_repo_owner iLIKE ? AND git_repo_name iLIKE ?",
  87. webhookID, gitRepoOwner, gitRepoName,
  88. ).First(&env).Error; err != nil {
  89. return nil, err
  90. }
  91. }
  92. return env, nil
  93. }
  94. func (repo *EnvironmentRepository) ListEnvironments(projectID, clusterID uint) ([]*models.Environment, error) {
  95. envs := make([]*models.Environment, 0)
  96. if err := repo.db.Order("id asc").Where("project_id = ? AND cluster_id = ?", projectID, clusterID).Find(&envs).Error; err != nil {
  97. return nil, err
  98. }
  99. return envs, nil
  100. }
  101. func (repo *EnvironmentRepository) UpdateEnvironment(environment *models.Environment) (*models.Environment, error) {
  102. if err := repo.db.Save(environment).Error; err != nil {
  103. return nil, err
  104. }
  105. return environment, nil
  106. }
  107. func (repo *EnvironmentRepository) DeleteEnvironment(env *models.Environment) (*models.Environment, error) {
  108. if err := repo.db.Delete(&env).Error; err != nil {
  109. return nil, err
  110. }
  111. return env, nil
  112. }
  113. func (repo *EnvironmentRepository) CreateDeployment(deployment *models.Deployment) (*models.Deployment, error) {
  114. if err := repo.db.Create(deployment).Error; err != nil {
  115. return nil, err
  116. }
  117. return deployment, nil
  118. }
  119. func (repo *EnvironmentRepository) UpdateDeployment(deployment *models.Deployment) (*models.Deployment, error) {
  120. if err := repo.db.Save(deployment).Error; err != nil {
  121. return nil, err
  122. }
  123. return deployment, nil
  124. }
  125. func (repo *EnvironmentRepository) ReadDeployment(environmentID uint, namespace string) (*models.Deployment, error) {
  126. depl := &models.Deployment{}
  127. if err := repo.db.Order("id desc").Where("environment_id = ? AND namespace = ?", environmentID, namespace).First(&depl).Error; err != nil {
  128. return nil, err
  129. }
  130. return depl, nil
  131. }
  132. func (repo *EnvironmentRepository) ReadDeploymentByID(projectID, clusterID, id uint) (*models.Deployment, error) {
  133. depl := &models.Deployment{}
  134. if err := repo.db.
  135. Order("deployments.updated_at desc").
  136. Joins("INNER JOIN environments ON environments.id = deployments.environment_id").
  137. Where("environments.project_id = ? AND environments.cluster_id = ? AND deployments.id = ?", projectID, clusterID, id).First(&depl).Error; err != nil {
  138. return nil, err
  139. }
  140. return depl, nil
  141. }
  142. func (repo *EnvironmentRepository) ReadDeploymentByGitDetails(
  143. environmentID uint, gitRepoOwner, gitRepoName string, prNumber uint,
  144. ) (*models.Deployment, error) {
  145. depl := &models.Deployment{}
  146. switch repo.db.Dialector.Name() {
  147. case "sqlite":
  148. if err := repo.db.Order("id asc").
  149. Where("environment_id = ? AND repo_owner LIKE ? AND repo_name LIKE ? AND pull_request_id = ?",
  150. environmentID, gitRepoOwner, gitRepoName, prNumber).
  151. First(&depl).Error; err != nil {
  152. return nil, err
  153. }
  154. case "postgres":
  155. if err := repo.db.Order("id asc").
  156. Where("environment_id = ? AND repo_owner iLIKE ? AND repo_name iLIKE ? AND pull_request_id = ?",
  157. environmentID, gitRepoOwner, gitRepoName, prNumber).
  158. First(&depl).Error; err != nil {
  159. return nil, err
  160. }
  161. }
  162. return depl, nil
  163. }
  164. func (repo *EnvironmentRepository) ReadDeploymentForBranch(environmentID uint, owner, name, branch string) (*models.Deployment, error) {
  165. depl := &models.Deployment{}
  166. switch repo.db.Dialector.Name() {
  167. case "sqlite":
  168. if err := repo.db.Order("id desc").
  169. Where("environment_id = ? AND repo_owner LIKE ? AND repo_name LIKE ? AND pr_branch_from = ? AND pr_branch_into = ?",
  170. environmentID, owner, name, branch, branch).
  171. First(&depl).Error; err != nil {
  172. return nil, err
  173. }
  174. case "postgres":
  175. if err := repo.db.Order("id desc").
  176. Where("environment_id = ? AND repo_owner iLIKE ? AND repo_name iLIKE ? AND pr_branch_from = ? AND pr_branch_into = ?",
  177. environmentID, owner, name, branch, branch).
  178. First(&depl).Error; err != nil {
  179. return nil, err
  180. }
  181. }
  182. return depl, nil
  183. }
  184. func (repo *EnvironmentRepository) ListDeploymentsByCluster(projectID, clusterID uint, states ...string) ([]*models.Deployment, error) {
  185. query := repo.db.
  186. Order("deployments.updated_at desc").
  187. Joins("INNER JOIN environments ON environments.id = deployments.environment_id").
  188. Where("environments.project_id = ? AND environments.cluster_id = ? AND environments.deleted_at IS NULL", projectID, clusterID)
  189. if len(states) > 0 {
  190. queryArr := make([]string, len(states))
  191. stateInterArr := make([]interface{}, len(states))
  192. for i, state := range states {
  193. queryArr[i] = "deployments.status = ?"
  194. stateInterArr[i] = state
  195. }
  196. query = query.Where(strings.Join(queryArr, " OR "), stateInterArr...)
  197. }
  198. depls := make([]*models.Deployment, 0)
  199. if err := query.Find(&depls).Error; err != nil {
  200. return nil, err
  201. }
  202. return depls, nil
  203. }
  204. func (repo *EnvironmentRepository) ListDeployments(environmentID uint, states ...string) ([]*models.Deployment, error) {
  205. query := repo.db.Debug().Order("deployments.updated_at desc").Where("environment_id = ?", environmentID)
  206. if len(states) > 0 {
  207. queryArr := make([]string, len(states))
  208. stateInterArr := make([]interface{}, len(states))
  209. for i, state := range states {
  210. queryArr[i] = "deployments.status = ?"
  211. stateInterArr[i] = state
  212. }
  213. query = query.Where(strings.Join(queryArr, " OR "), stateInterArr...)
  214. }
  215. depls := make([]*models.Deployment, 0)
  216. if err := query.Find(&depls).Error; err != nil {
  217. return nil, err
  218. }
  219. return depls, nil
  220. }
  221. func (repo *EnvironmentRepository) DeleteDeployment(deployment *models.Deployment) (*models.Deployment, error) {
  222. if err := repo.db.Delete(deployment).Error; err != nil {
  223. return nil, err
  224. }
  225. return deployment, nil
  226. }