uffizzi-core 0.1.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (257) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +201 -0
  3. data/README.md +52 -0
  4. data/Rakefile +31 -0
  5. data/app/assets/config/uffizzi_core_manifest.js +1 -0
  6. data/app/assets/stylesheets/uffizzi_core/application.css +15 -0
  7. data/app/clients/uffizzi_core/amazon_registry_client.rb +18 -0
  8. data/app/clients/uffizzi_core/azure_registry_client/request_result.rb +5 -0
  9. data/app/clients/uffizzi_core/azure_registry_client.rb +42 -0
  10. data/app/clients/uffizzi_core/controller_client/request_result.rb +5 -0
  11. data/app/clients/uffizzi_core/controller_client.rb +106 -0
  12. data/app/clients/uffizzi_core/docker_hub_client/request_result.rb +7 -0
  13. data/app/clients/uffizzi_core/docker_hub_client.rb +141 -0
  14. data/app/clients/uffizzi_core/github_container_registry_client/request_result.rb +7 -0
  15. data/app/clients/uffizzi_core/github_container_registry_client.rb +52 -0
  16. data/app/clients/uffizzi_core/google_registry_client/request_result.rb +5 -0
  17. data/app/clients/uffizzi_core/google_registry_client.rb +42 -0
  18. data/app/contexts/uffizzi_core/base_context.rb +12 -0
  19. data/app/contexts/uffizzi_core/project_context.rb +13 -0
  20. data/app/contexts/uffizzi_core/webhooks_context.rb +9 -0
  21. data/app/controllers/concerns/uffizzi_core/auth_management.rb +23 -0
  22. data/app/controllers/concerns/uffizzi_core/authorization_concern.rb +38 -0
  23. data/app/controllers/concerns/uffizzi_core/dependency_injection_concern.rb +19 -0
  24. data/app/controllers/uffizzi_core/api/cli/v1/account/application_controller.rb +7 -0
  25. data/app/controllers/uffizzi_core/api/cli/v1/account/credentials_controller.rb +91 -0
  26. data/app/controllers/uffizzi_core/api/cli/v1/application_controller.rb +5 -0
  27. data/app/controllers/uffizzi_core/api/cli/v1/projects/application_controller.rb +11 -0
  28. data/app/controllers/uffizzi_core/api/cli/v1/projects/compose_files_controller.rb +93 -0
  29. data/app/controllers/uffizzi_core/api/cli/v1/projects/deployments/activity_items_controller.rb +36 -0
  30. data/app/controllers/uffizzi_core/api/cli/v1/projects/deployments/application_controller.rb +7 -0
  31. data/app/controllers/uffizzi_core/api/cli/v1/projects/deployments/containers/application_controller.rb +8 -0
  32. data/app/controllers/uffizzi_core/api/cli/v1/projects/deployments/containers/logs_controller.rb +27 -0
  33. data/app/controllers/uffizzi_core/api/cli/v1/projects/deployments/containers_controller.rb +24 -0
  34. data/app/controllers/uffizzi_core/api/cli/v1/projects/deployments/events_controller.rb +29 -0
  35. data/app/controllers/uffizzi_core/api/cli/v1/projects/deployments_controller.rb +179 -0
  36. data/app/controllers/uffizzi_core/api/cli/v1/projects/secrets_controller.rb +61 -0
  37. data/app/controllers/uffizzi_core/api/cli/v1/projects_controller.rb +85 -0
  38. data/app/controllers/uffizzi_core/api/cli/v1/sessions_controller.rb +43 -0
  39. data/app/controllers/uffizzi_core/application_controller.rb +57 -0
  40. data/app/errors/uffizzi_core/compose_file/build_error.rb +4 -0
  41. data/app/errors/uffizzi_core/compose_file/credential_error.rb +4 -0
  42. data/app/errors/uffizzi_core/compose_file/parse_error.rb +4 -0
  43. data/app/errors/uffizzi_core/compose_file/secrets_error.rb +4 -0
  44. data/app/errors/uffizzi_core/deployment/image_pull_error.rb +10 -0
  45. data/app/errors/uffizzi_core/deployment_not_found_error.rb +10 -0
  46. data/app/forms/uffizzi_core/api/cli/v1/account/credential/check_credential_form.rb +16 -0
  47. data/app/forms/uffizzi_core/api/cli/v1/account/credential/create_form.rb +26 -0
  48. data/app/forms/uffizzi_core/api/cli/v1/compose_file/check_credentials_form.rb +21 -0
  49. data/app/forms/uffizzi_core/api/cli/v1/compose_file/cli_form.rb +22 -0
  50. data/app/forms/uffizzi_core/api/cli/v1/compose_file/create_form.rb +13 -0
  51. data/app/forms/uffizzi_core/api/cli/v1/compose_file/template_form.rb +44 -0
  52. data/app/forms/uffizzi_core/api/cli/v1/compose_file/update_form.rb +9 -0
  53. data/app/forms/uffizzi_core/api/cli/v1/config_file/create_form.rb +11 -0
  54. data/app/forms/uffizzi_core/api/cli/v1/deployment/create_form.rb +92 -0
  55. data/app/forms/uffizzi_core/api/cli/v1/deployment/update_form.rb +90 -0
  56. data/app/forms/uffizzi_core/api/cli/v1/project/create_form.rb +7 -0
  57. data/app/forms/uffizzi_core/api/cli/v1/project/update_form.rb +10 -0
  58. data/app/forms/uffizzi_core/api/cli/v1/secret/bulk_assign_form.rb +39 -0
  59. data/app/forms/uffizzi_core/api/cli/v1/session_create_form.rb +29 -0
  60. data/app/forms/uffizzi_core/api/cli/v1/template/create_form.rb +65 -0
  61. data/app/forms/uffizzi_core/application_form.rb +11 -0
  62. data/app/forms/uffizzi_core/application_form_without_active_record.rb +17 -0
  63. data/app/forms/uffizzi_core/mass_assignment_control_concern.rb +22 -0
  64. data/app/helpers/uffizzi_core/application_helper.rb +6 -0
  65. data/app/jobs/uffizzi_core/account/create_credential_job.rb +10 -0
  66. data/app/jobs/uffizzi_core/activity_item/docker/update_digest_job.rb +11 -0
  67. data/app/jobs/uffizzi_core/application_job.rb +7 -0
  68. data/app/jobs/uffizzi_core/config_file/apply_job.rb +31 -0
  69. data/app/jobs/uffizzi_core/credential/docker_hub/create_webhook_job.rb +15 -0
  70. data/app/jobs/uffizzi_core/deployment/create_credential_job.rb +32 -0
  71. data/app/jobs/uffizzi_core/deployment/create_credentials_job.rb +17 -0
  72. data/app/jobs/uffizzi_core/deployment/create_job.rb +15 -0
  73. data/app/jobs/uffizzi_core/deployment/create_webhooks_job.rb +13 -0
  74. data/app/jobs/uffizzi_core/deployment/delete_credential_job.rb +13 -0
  75. data/app/jobs/uffizzi_core/deployment/delete_job.rb +11 -0
  76. data/app/jobs/uffizzi_core/deployment/deploy_containers_job.rb +27 -0
  77. data/app/jobs/uffizzi_core/deployment/manage_deploy_activity_item_job.rb +38 -0
  78. data/app/lib/uffizzi_core/concerns/models/activity_item.rb +39 -0
  79. data/app/lib/uffizzi_core/concerns/models/credential.rb +65 -0
  80. data/app/lib/uffizzi_core/concerns/models/repo.rb +33 -0
  81. data/app/lib/uffizzi_core/rbac/user_access_service.rb +45 -0
  82. data/app/mailers/uffizzi_core/application_mailer.rb +8 -0
  83. data/app/models/concerns/uffizzi_core/hashid_concern.rb +25 -0
  84. data/app/models/concerns/uffizzi_core/state_machine_concern.rb +16 -0
  85. data/app/models/uffizzi_core/account.rb +83 -0
  86. data/app/models/uffizzi_core/activity_item/docker.rb +4 -0
  87. data/app/models/uffizzi_core/activity_item/github.rb +4 -0
  88. data/app/models/uffizzi_core/activity_item/memory_limit.rb +4 -0
  89. data/app/models/uffizzi_core/activity_item.rb +53 -0
  90. data/app/models/uffizzi_core/application_record.rb +7 -0
  91. data/app/models/uffizzi_core/build.rb +39 -0
  92. data/app/models/uffizzi_core/comment.rb +16 -0
  93. data/app/models/uffizzi_core/compose_file.rb +57 -0
  94. data/app/models/uffizzi_core/config_file.rb +24 -0
  95. data/app/models/uffizzi_core/container.rb +100 -0
  96. data/app/models/uffizzi_core/container_config_file.rb +8 -0
  97. data/app/models/uffizzi_core/continuous_preview.rb +4 -0
  98. data/app/models/uffizzi_core/coupon.rb +5 -0
  99. data/app/models/uffizzi_core/credential/amazon.rb +4 -0
  100. data/app/models/uffizzi_core/credential/azure.rb +4 -0
  101. data/app/models/uffizzi_core/credential/docker_hub.rb +4 -0
  102. data/app/models/uffizzi_core/credential/github.rb +4 -0
  103. data/app/models/uffizzi_core/credential/github_container_registry.rb +4 -0
  104. data/app/models/uffizzi_core/credential/google.rb +4 -0
  105. data/app/models/uffizzi_core/credential.rb +61 -0
  106. data/app/models/uffizzi_core/database.rb +4 -0
  107. data/app/models/uffizzi_core/database_offering.rb +4 -0
  108. data/app/models/uffizzi_core/deployment.rb +86 -0
  109. data/app/models/uffizzi_core/event.rb +13 -0
  110. data/app/models/uffizzi_core/invitation.rb +27 -0
  111. data/app/models/uffizzi_core/membership.rb +16 -0
  112. data/app/models/uffizzi_core/payment.rb +11 -0
  113. data/app/models/uffizzi_core/price.rb +9 -0
  114. data/app/models/uffizzi_core/product.rb +11 -0
  115. data/app/models/uffizzi_core/project.rb +67 -0
  116. data/app/models/uffizzi_core/rating.rb +20 -0
  117. data/app/models/uffizzi_core/repo/amazon.rb +4 -0
  118. data/app/models/uffizzi_core/repo/azure.rb +4 -0
  119. data/app/models/uffizzi_core/repo/docker_hub.rb +4 -0
  120. data/app/models/uffizzi_core/repo/github.rb +4 -0
  121. data/app/models/uffizzi_core/repo/github_container_registry.rb +4 -0
  122. data/app/models/uffizzi_core/repo/google.rb +4 -0
  123. data/app/models/uffizzi_core/repo.rb +29 -0
  124. data/app/models/uffizzi_core/role.rb +17 -0
  125. data/app/models/uffizzi_core/secret.rb +9 -0
  126. data/app/models/uffizzi_core/template.rb +19 -0
  127. data/app/models/uffizzi_core/user.rb +62 -0
  128. data/app/models/uffizzi_core/user_project.rb +14 -0
  129. data/app/policies/uffizzi_core/api/cli/v1/account/credentials_policy.rb +19 -0
  130. data/app/policies/uffizzi_core/api/cli/v1/projects/compose_files_policy.rb +15 -0
  131. data/app/policies/uffizzi_core/api/cli/v1/projects/deployments/activity_items_policy.rb +7 -0
  132. data/app/policies/uffizzi_core/api/cli/v1/projects/deployments/containers_policy.rb +7 -0
  133. data/app/policies/uffizzi_core/api/cli/v1/projects/deployments/events_policy.rb +7 -0
  134. data/app/policies/uffizzi_core/api/cli/v1/projects/deployments_policy.rb +27 -0
  135. data/app/policies/uffizzi_core/api/cli/v1/projects/secrets_policy.rb +15 -0
  136. data/app/policies/uffizzi_core/api/cli/v1/projects_policy.rb +19 -0
  137. data/app/policies/uffizzi_core/application_policy.rb +12 -0
  138. data/app/repositories/uffizzi_core/activity_item_repo.rb +9 -0
  139. data/app/repositories/uffizzi_core/basic_order_repo.rb +11 -0
  140. data/app/repositories/uffizzi_core/build_repo.rb +23 -0
  141. data/app/repositories/uffizzi_core/comment_repo.rb +11 -0
  142. data/app/repositories/uffizzi_core/compose_file_repo.rb +11 -0
  143. data/app/repositories/uffizzi_core/config_file_repo.rb +40 -0
  144. data/app/repositories/uffizzi_core/container_repo.rb +25 -0
  145. data/app/repositories/uffizzi_core/credential_repo.rb +31 -0
  146. data/app/repositories/uffizzi_core/deployment_repo.rb +24 -0
  147. data/app/repositories/uffizzi_core/event_repo.rb +9 -0
  148. data/app/repositories/uffizzi_core/membership_repo.rb +10 -0
  149. data/app/repositories/uffizzi_core/price_repo.rb +11 -0
  150. data/app/repositories/uffizzi_core/product_repo.rb +11 -0
  151. data/app/repositories/uffizzi_core/project_repo.rb +10 -0
  152. data/app/repositories/uffizzi_core/repo_repo.rb +10 -0
  153. data/app/repositories/uffizzi_core/template_repo.rb +87 -0
  154. data/app/repositories/uffizzi_core/usage_repo.rb +9 -0
  155. data/app/repositories/uffizzi_core/user_repo.rb +11 -0
  156. data/app/responders/uffizzi_core/json_responder.rb +13 -0
  157. data/app/serializers/uffizzi_core/api/cli/v1/account/credential_serializer.rb +9 -0
  158. data/app/serializers/uffizzi_core/api/cli/v1/project_serializer/compose_file_serializer.rb +7 -0
  159. data/app/serializers/uffizzi_core/api/cli/v1/project_serializer/deployment_serializer.rb +13 -0
  160. data/app/serializers/uffizzi_core/api/cli/v1/project_serializer.rb +30 -0
  161. data/app/serializers/uffizzi_core/api/cli/v1/projects/compose_file_serializer.rb +7 -0
  162. data/app/serializers/uffizzi_core/api/cli/v1/projects/deployment_serializer/container_serializer.rb +32 -0
  163. data/app/serializers/uffizzi_core/api/cli/v1/projects/deployment_serializer/user_serializer.rb +11 -0
  164. data/app/serializers/uffizzi_core/api/cli/v1/projects/deployment_serializer.rb +74 -0
  165. data/app/serializers/uffizzi_core/api/cli/v1/projects/deployments/activity_item_serializer.rb +24 -0
  166. data/app/serializers/uffizzi_core/api/cli/v1/projects/deployments/container_serializer/container_config_file_serializer/config_file_serializer.rb +6 -0
  167. data/app/serializers/uffizzi_core/api/cli/v1/projects/deployments/container_serializer/container_config_file_serializer.rb +7 -0
  168. data/app/serializers/uffizzi_core/api/cli/v1/projects/deployments/container_serializer.rb +30 -0
  169. data/app/serializers/uffizzi_core/api/cli/v1/projects/secret_serializer.rb +5 -0
  170. data/app/serializers/uffizzi_core/api/cli/v1/short_project_serializer.rb +7 -0
  171. data/app/serializers/uffizzi_core/api/cli/v1/user_serializer/account_serializer.rb +5 -0
  172. data/app/serializers/uffizzi_core/api/cli/v1/user_serializer.rb +7 -0
  173. data/app/serializers/uffizzi_core/base_serializer.rb +7 -0
  174. data/app/serializers/uffizzi_core/controller/apply_config_file/config_file_serializer.rb +5 -0
  175. data/app/serializers/uffizzi_core/controller/create_credential/credential_serializer.rb +19 -0
  176. data/app/serializers/uffizzi_core/controller/create_deployment/deployment_serializer.rb +5 -0
  177. data/app/serializers/uffizzi_core/controller/deploy_containers/container_serializer/container_config_file_serializer/config_file_serializer.rb +8 -0
  178. data/app/serializers/uffizzi_core/controller/deploy_containers/container_serializer/container_config_file_serializer.rb +7 -0
  179. data/app/serializers/uffizzi_core/controller/deploy_containers/container_serializer.rb +70 -0
  180. data/app/serializers/uffizzi_core/controller/deploy_containers/credential_serializer.rb +5 -0
  181. data/app/services/uffizzi_core/account_service.rb +21 -0
  182. data/app/services/uffizzi_core/activity_item_service.rb +88 -0
  183. data/app/services/uffizzi_core/amazon/credential_service.rb +31 -0
  184. data/app/services/uffizzi_core/amazon_service.rb +45 -0
  185. data/app/services/uffizzi_core/azure/credential_service.rb +18 -0
  186. data/app/services/uffizzi_core/compose_file/builders/config_files_builder_service.rb +31 -0
  187. data/app/services/uffizzi_core/compose_file/builders/container_builder_service.rb +222 -0
  188. data/app/services/uffizzi_core/compose_file/builders/docker_repo_builder_service.rb +25 -0
  189. data/app/services/uffizzi_core/compose_file/builders/template_builder_service.rb +45 -0
  190. data/app/services/uffizzi_core/compose_file/builders/variables_builder_service.rb +58 -0
  191. data/app/services/uffizzi_core/compose_file/config_files_service.rb +52 -0
  192. data/app/services/uffizzi_core/compose_file/config_option_service.rb +41 -0
  193. data/app/services/uffizzi_core/compose_file/configs_options_service.rb +26 -0
  194. data/app/services/uffizzi_core/compose_file/container_service.rb +68 -0
  195. data/app/services/uffizzi_core/compose_file/continuous_preview_options_service.rb +57 -0
  196. data/app/services/uffizzi_core/compose_file/dependencies_service.rb +56 -0
  197. data/app/services/uffizzi_core/compose_file/errors_service.rb +46 -0
  198. data/app/services/uffizzi_core/compose_file/github_dependencies_service.rb +38 -0
  199. data/app/services/uffizzi_core/compose_file/ingress_options_service.rb +51 -0
  200. data/app/services/uffizzi_core/compose_file/parsers/services/healthcheck_parser_service.rb +73 -0
  201. data/app/services/uffizzi_core/compose_file/secrets_options_service.rb +28 -0
  202. data/app/services/uffizzi_core/compose_file/services_options/command_service.rb +18 -0
  203. data/app/services/uffizzi_core/compose_file/services_options/configs_service.rb +51 -0
  204. data/app/services/uffizzi_core/compose_file/services_options/deploy_service.rb +44 -0
  205. data/app/services/uffizzi_core/compose_file/services_options/entrypoint_service.rb +18 -0
  206. data/app/services/uffizzi_core/compose_file/services_options/env_file_service.rb +34 -0
  207. data/app/services/uffizzi_core/compose_file/services_options/environment_service.rb +20 -0
  208. data/app/services/uffizzi_core/compose_file/services_options/image_service.rb +89 -0
  209. data/app/services/uffizzi_core/compose_file/services_options/secrets_service.rb +35 -0
  210. data/app/services/uffizzi_core/compose_file/services_options_service.rb +57 -0
  211. data/app/services/uffizzi_core/compose_file/template_service.rb +55 -0
  212. data/app/services/uffizzi_core/compose_file/variables_service.rb +25 -0
  213. data/app/services/uffizzi_core/compose_file_service.rb +181 -0
  214. data/app/services/uffizzi_core/container_service.rb +42 -0
  215. data/app/services/uffizzi_core/controller_service.rb +86 -0
  216. data/app/services/uffizzi_core/credential_service.rb +44 -0
  217. data/app/services/uffizzi_core/deployment_service.rb +307 -0
  218. data/app/services/uffizzi_core/docker_hub/credential_service.rb +15 -0
  219. data/app/services/uffizzi_core/docker_hub_service.rb +77 -0
  220. data/app/services/uffizzi_core/github_container_registry/credential_service.rb +24 -0
  221. data/app/services/uffizzi_core/google/credential_service.rb +18 -0
  222. data/app/services/uffizzi_core/logs_service.rb +33 -0
  223. data/app/services/uffizzi_core/manage_activity_items_service.rb +159 -0
  224. data/app/services/uffizzi_core/project_service.rb +48 -0
  225. data/app/services/uffizzi_core/repo_service.rb +43 -0
  226. data/app/services/uffizzi_core/response_service.rb +13 -0
  227. data/app/services/uffizzi_core/starter_template_service.rb +200 -0
  228. data/app/services/uffizzi_core/template_service.rb +21 -0
  229. data/app/services/uffizzi_core/token_service.rb +19 -0
  230. data/app/services/uffizzi_core/user_access_service.rb +14 -0
  231. data/app/services/uffizzi_core/user_generator_service.rb +84 -0
  232. data/app/utils/uffizzi_core/converters.rb +33 -0
  233. data/app/validators/uffizzi_core/email_validator.rb +9 -0
  234. data/app/validators/uffizzi_core/environment_variable_list_validator.rb +15 -0
  235. data/app/validators/uffizzi_core/image_command_args_validator.rb +21 -0
  236. data/config/initializers/rswag_api.rb +15 -0
  237. data/config/initializers/rswag_ui.rb +15 -0
  238. data/config/initializers/swagger_yard.rb +17 -0
  239. data/config/locales/en.activerecord.yml +23 -0
  240. data/config/locales/en.yml +66 -0
  241. data/config/routes.rb +69 -0
  242. data/db/migrate/20220218121438_create_uffizzi_core_tables.rb +375 -0
  243. data/db/migrate/20220309110201_remove_secrets_from_projects.rb +7 -0
  244. data/db/migrate/20220310110150_create_project_secrets.rb +14 -0
  245. data/db/migrate/20220325113342_add_name_to_uffizzi_containers.rb +7 -0
  246. data/db/migrate/20220329123323_rename_project_secrets_to_secrets.rb +7 -0
  247. data/db/migrate/20220329124542_add_resource_to_secrets.rb +7 -0
  248. data/db/migrate/20220329143241_remove_project_ref_from_secrets.rb +7 -0
  249. data/db/migrate/20220419074956_add_health_check_to_containers.rb +7 -0
  250. data/db/migrate/20220525113412_rename_name_to_uffizzi_containers.rb +7 -0
  251. data/db/seeds.rb +16 -0
  252. data/lib/tasks/uffizzi_core_tasks.rake +19 -0
  253. data/lib/uffizzi_core/engine.rb +15 -0
  254. data/lib/uffizzi_core/version.rb +5 -0
  255. data/lib/uffizzi_core.rb +61 -0
  256. data/swagger/v1/swagger.json +1659 -0
  257. metadata +966 -0
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ class UffizziCore::Credential::Google < UffizziCore::Credential
4
+ end
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ class UffizziCore::Credential < UffizziCore::ApplicationRecord
4
+ include AASM
5
+ include UffizziCore::CredentialRepo
6
+
7
+ self.table_name = UffizziCore.table_names[:credentials]
8
+
9
+ belongs_to :account
10
+
11
+ before_destroy :remove_token
12
+
13
+ validates :registry_url, presence: true
14
+
15
+ aasm :state, column: :state do
16
+ state :not_connected, initial: true
17
+ state :active
18
+ state :unauthorized
19
+
20
+ event :activate do
21
+ transitions from: [:not_connected, :unauthorized], to: :active
22
+ end
23
+
24
+ event :unauthorize do
25
+ transitions from: [:not_connected, :active], to: :unauthorized
26
+ end
27
+ end
28
+
29
+ def github_container_registry?
30
+ type == UffizziCore::Credential::GithubContainerRegistry.name
31
+ end
32
+
33
+ def docker_hub?
34
+ type == UffizziCore::Credential::DockerHub.name
35
+ end
36
+
37
+ def azure?
38
+ type == UffizziCore::Credential::Azure.name
39
+ end
40
+
41
+ def google?
42
+ type == UffizziCore::Credential::Google.name
43
+ end
44
+
45
+ def amazon?
46
+ type == UffizziCore::Credential::Amazon.name
47
+ end
48
+
49
+ private
50
+
51
+ def remove_token
52
+ account.projects.find_each do |project|
53
+ project.deployments.find_each do |deployment|
54
+ containers = deployment.containers
55
+ attributes = { continuously_deploy: UffizziCore::Container::STATE_DISABLED }
56
+
57
+ containers.with_docker_hub_repo.update_all(attributes) if docker_hub?
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ class UffizziCore::Database < UffizziCore::ApplicationRecord
4
+ end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ class UffizziCore::DatabaseOffering < UffizziCore::ApplicationRecord
4
+ end
@@ -0,0 +1,86 @@
1
+ # frozen_string_literal: true
2
+
3
+ # @model Deployment
4
+ #
5
+ # @property id [integer]
6
+ # @property project_id [integer]
7
+ # @property kind [string]
8
+ # @property state [string]
9
+ # @property preview_url [string]
10
+ # @property tag [string]
11
+ # @property branch [string]
12
+ # @property commit [string]
13
+ # @property image_id [string]
14
+ # @property created_at [date-time]
15
+ # @property updated_at [date-time]
16
+ # @property ingress_container_ready [boolean]
17
+ # @property ingress_container_state [string]
18
+ # @property creation_source [string]
19
+ # @property contaners [array]
20
+ # @property deployed_by [object]
21
+
22
+ class UffizziCore::Deployment < UffizziCore::ApplicationRecord
23
+ include AASM
24
+ include UffizziCore::StateMachineConcern
25
+ include UffizziCore::DeploymentRepo
26
+ extend Enumerize
27
+
28
+ self.table_name = UffizziCore.table_names[:deployments]
29
+
30
+ enumerize :kind, in: [:standard, :performance, :enterprise, :free], predicates: true, default: :standard
31
+
32
+ belongs_to :project, touch: true
33
+ belongs_to :deployed_by, class_name: UffizziCore::User.name, foreign_key: :deployed_by_id, optional: true
34
+ belongs_to :template, optional: true
35
+ belongs_to :compose_file, optional: true
36
+
37
+ has_many :credentials, through: :project
38
+ has_many :containers, dependent: :destroy, index_errors: true
39
+ has_many :activity_items, dependent: :destroy
40
+
41
+ has_one :ingress_container, -> { where(receive_incoming_requests: true) }, class_name: UffizziCore::Container.name
42
+
43
+ validates :kind, presence: true
44
+
45
+ enumerize :creation_source, in: [:manual, :continuous_preview, :compose_file_manual, :compose_file_continuous_preview], predicates: true,
46
+ scope: true, default: :manual
47
+
48
+ accepts_nested_attributes_for :containers, allow_destroy: true
49
+
50
+ after_destroy_commit :clean
51
+
52
+ def active_containers
53
+ containers.active
54
+ end
55
+
56
+ aasm(:state) do
57
+ state :active, initial: true
58
+ state :failed
59
+ state :disabled
60
+
61
+ event :activate do
62
+ transitions from: [:disabled], to: :active
63
+ end
64
+
65
+ event :fail, after: :after_fail do
66
+ transitions from: [:active], to: :failed
67
+ end
68
+
69
+ event :disable, after: :after_disable do
70
+ transitions from: [:active, :failed], to: :disabled
71
+ end
72
+ end
73
+
74
+ def after_disable
75
+ clean
76
+ end
77
+
78
+ def after_fail
79
+ active_containers.each(&:disable!)
80
+ end
81
+
82
+ def clean
83
+ active_containers.each(&:disable!)
84
+ UffizziCore::Deployment::DeleteJob.perform_async(id)
85
+ end
86
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ class UffizziCore::Event < UffizziCore::ApplicationRecord
4
+ include UffizziCore::EventRepo
5
+ extend Enumerize
6
+
7
+ self.table_name = UffizziCore.table_names[:events]
8
+
9
+ enumerize :state, in: [:queued, :successful, :deployed, :failed, :building, :timeout, :cancelled, :deploying], predicates: true,
10
+ scope: true
11
+
12
+ belongs_to :activity_item, touch: true
13
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ class UffizziCore::Invitation < UffizziCore::ApplicationRecord
4
+ include AASM
5
+ include UffizziCore::StateMachineConcern
6
+ extend Enumerize
7
+
8
+ self.table_name = UffizziCore.table_names[:invitations]
9
+
10
+ enumerize :role, in: [:admin, :developer, :viewer], predicates: true
11
+
12
+ belongs_to :entityable, polymorphic: true
13
+ belongs_to :invited_by, class_name: UffizziCore::User.name, foreign_key: :invited_by_id
14
+ belongs_to :invitee, class_name: UffizziCore::User.name, foreign_key: :invitee_id, optional: true
15
+
16
+ validates :email, presence: true, 'uffizzi_core/email': true
17
+ validates :token, presence: true, uniqueness: true
18
+
19
+ aasm(:status) do
20
+ state :pending, initial: true
21
+ state :accepted
22
+
23
+ event :accept do
24
+ transitions from: :pending, to: :accepted
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ class UffizziCore::Membership < UffizziCore::ApplicationRecord
4
+ include UffizziCore::MembershipRepo
5
+ extend Enumerize
6
+
7
+ self.table_name = UffizziCore.table_names[:memberships]
8
+
9
+ enumerize :role, in: [:admin, :developer, :viewer], predicates: true
10
+ validates :role, presence: true
11
+
12
+ belongs_to :account
13
+ belongs_to :user
14
+
15
+ validates :role, presence: true
16
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ class UffizziCore::Payment < UffizziCore::ApplicationRecord
4
+ self.table_name = UffizziCore.table_names[:payments]
5
+
6
+ belongs_to :account
7
+
8
+ scope :succeeded, -> { where(status: :succeeded) }
9
+ scope :pending, -> { where(status: :pending) }
10
+ scope :failed, -> { where(status: :failed) }
11
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ class UffizziCore::Price < UffizziCore::ApplicationRecord
4
+ include UffizziCore::PriceRepo
5
+
6
+ self.table_name = UffizziCore.table_names[:prices]
7
+
8
+ belongs_to :product
9
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ class UffizziCore::Product < UffizziCore::ApplicationRecord
4
+ include UffizziCore::ProductRepo
5
+
6
+ self.table_name = UffizziCore.table_names[:products]
7
+
8
+ has_one :price, dependent: :destroy
9
+
10
+ UffizziCore::Product.inheritance_column = :sti
11
+ end
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ # @model Project
4
+ # @property slug [string]
5
+ # @property name [string]
6
+ # @property description [string]
7
+ # @property created_at [date-time]
8
+ # @property secrets [string]
9
+ # @property default_compose [object<source: string>]
10
+ # @property deployments [object<id: integer, domain: string>]
11
+
12
+ class UffizziCore::Project < UffizziCore::ApplicationRecord
13
+ include AASM
14
+ include UffizziCore::StateMachineConcern
15
+ include UffizziCore::ProjectRepo
16
+
17
+ self.table_name = UffizziCore.table_names[:projects]
18
+
19
+ belongs_to :account
20
+
21
+ has_many :repos
22
+ has_many :deployments, dependent: :destroy
23
+ has_many :user_projects, dependent: :destroy
24
+ has_many :users, through: :user_projects
25
+ has_many :invitations, as: :entityable
26
+ has_many :config_files, dependent: :destroy
27
+ has_many :templates, dependent: :destroy
28
+ has_many :credentials, through: :account
29
+ has_many :compose_files, dependent: :destroy
30
+ has_many :secrets, dependent: :destroy, as: :resource
31
+
32
+ validates :name, presence: true, uniqueness: { scope: :account, message: 'Name already exists' }
33
+ validates :slug, presence: true, uniqueness: { message: 'Project slug already taken' }
34
+
35
+ aasm(:state) do
36
+ state :active, initial: true
37
+ state :disabled
38
+
39
+ event :activate do
40
+ transitions from: [:disabled], to: :active
41
+ end
42
+
43
+ event :disable, after: :after_disable do
44
+ transitions from: [:active], to: :disabled
45
+ end
46
+ end
47
+
48
+ def after_disable
49
+ update(name: "#{name} deleted #{DateTime.current.strftime('%H:%M:%S-%m%d%Y')}")
50
+ update(slug: "#{slug} deleted #{DateTime.current.strftime('%H:%M:%S-%m%d%Y')}")
51
+ disable_deployments
52
+ end
53
+
54
+ def active_deployments
55
+ deployments.active
56
+ end
57
+
58
+ def disable_deployments
59
+ active_deployments.each do |deployment|
60
+ UffizziCore::DeploymentService.disable!(deployment)
61
+ end
62
+ end
63
+
64
+ def compose_file
65
+ compose_files.main.first
66
+ end
67
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ class UffizziCore::Rating < UffizziCore::ApplicationRecord
4
+ include AASM
5
+
6
+ self.table_name = UffizziCore.table_names[:ratings]
7
+
8
+ aasm(:state) do
9
+ state :active, initial: true
10
+ state :disabled
11
+
12
+ event :activate do
13
+ transitions from: [:disabled], to: :active
14
+ end
15
+
16
+ event :disable do
17
+ transitions from: [:active], to: :disabled
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ class UffizziCore::Repo::Amazon < UffizziCore::Repo
4
+ end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ class UffizziCore::Repo::Azure < UffizziCore::Repo
4
+ end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ class UffizziCore::Repo::DockerHub < UffizziCore::Repo
4
+ end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ class UffizziCore::Repo::Github < UffizziCore::Repo
4
+ end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ class UffizziCore::Repo::GithubContainerRegistry < UffizziCore::Repo
4
+ end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ class UffizziCore::Repo::Google < UffizziCore::Repo
4
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ class UffizziCore::Repo < UffizziCore::ApplicationRecord
4
+ extend Enumerize
5
+ include UffizziCore::RepoRepo
6
+
7
+ self.table_name = UffizziCore.table_names[:repos]
8
+
9
+ enumerize :kind, in: [:buildpacks18, :dockerfile, :dotnet, :gatsby, :barestatic], predicates: true
10
+
11
+ belongs_to :project
12
+ has_one :container, inverse_of: :repo, dependent: :destroy
13
+ has_many :builds, dependent: :destroy
14
+
15
+ validates :dockerfile_path, presence: true, if: :dockerfile?
16
+ validates :delete_preview_after, numericality: { greater_than: 0, only_integer: true }, allow_nil: true
17
+
18
+ def docker_hub?
19
+ type == UffizziCore::Repo::DockerHub.name
20
+ end
21
+
22
+ def azure?
23
+ type == UffizziCore::Repo::Azure.name
24
+ end
25
+
26
+ def google?
27
+ type == UffizziCore::Repo::Google.name
28
+ end
29
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ class UffizziCore::Role < UffizziCore::ApplicationRecord
4
+ self.table_name = UffizziCore.table_names[:roles]
5
+
6
+ has_and_belongs_to_many :users, join_table: UffizziCore.table_names[:users_roles]
7
+
8
+ belongs_to :resource,
9
+ polymorphic: true,
10
+ optional: true
11
+
12
+ validates :resource_type,
13
+ inclusion: { in: Rolify.resource_types },
14
+ allow_nil: true
15
+
16
+ scopify
17
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ class UffizziCore::Secret < ApplicationRecord
4
+ self.table_name = UffizziCore.table_names[:secrets]
5
+
6
+ belongs_to :resource, polymorphic: true
7
+
8
+ validates :name, presence: true, uniqueness: { scope: :resource }
9
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ class UffizziCore::Template < UffizziCore::ApplicationRecord
4
+ include UffizziCore::TemplateRepo
5
+ extend Enumerize
6
+
7
+ self.table_name = UffizziCore.table_names[:templates]
8
+
9
+ belongs_to :added_by, class_name: UffizziCore::User.name, foreign_key: :added_by_id
10
+ belongs_to :project, touch: true
11
+ belongs_to :compose_file, optional: true
12
+
13
+ has_many :deployments, dependent: :nullify
14
+
15
+ enumerize :creation_source, in: [:manual, :compose_file, :system], predicates: true, scope: true
16
+
17
+ validates :name, presence: true
18
+ validates :name, uniqueness: { scope: :project }, if: -> { compose_file.blank? || compose_file.kind.main? }
19
+ end
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+
3
+ class UffizziCore::User < ActiveRecord::Base
4
+ include AASM
5
+ include ActiveModel::Validations
6
+ include UffizziCore::StateMachineConcern
7
+ include UffizziCore::HashidConcern
8
+ include UffizziCore::UserRepo
9
+ extend Enumerize
10
+
11
+ self.table_name = UffizziCore.table_names[:users]
12
+
13
+ rolify
14
+
15
+ has_secure_password
16
+
17
+ validates :email, presence: true, 'uffizzi_core/email': true, uniqueness: { case_sensitive: false }
18
+ validates :password, allow_nil: true, length: { minimum: 8 }, on: :update
19
+
20
+ has_many :memberships, dependent: :destroy
21
+ has_many :accounts, through: :memberships
22
+ has_many :user_projects
23
+ has_many :projects, through: :user_projects
24
+
25
+ has_one_attached :avatar
26
+
27
+ enumerize :creation_source, in: [:system, :online_registration, :google, :sso], predicates: true
28
+
29
+ def organizational_account
30
+ accounts.find_by(kind: UffizziCore::Account.kind.organizational)
31
+ end
32
+
33
+ def active_projects
34
+ projects.active
35
+ end
36
+
37
+ def deployments
38
+ UffizziCore::Deployment.where(project_id: active_projects)
39
+ end
40
+
41
+ def full_name
42
+ "#{first_name} #{last_name}"
43
+ end
44
+
45
+ aasm(:state) do
46
+ state :initial, initial: true
47
+ state :active
48
+ state :disabled
49
+
50
+ event :activate do
51
+ transitions from: [:initial, :disabled], to: :active
52
+ end
53
+
54
+ event :disable do
55
+ transitions from: [:initial, :active], to: :disabled
56
+ end
57
+ end
58
+
59
+ def admin_access_to_project?(project)
60
+ projects.by_ids(project).by_accounts(memberships.by_role_admin.select(:account_id)).exists?
61
+ end
62
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ class UffizziCore::UserProject < UffizziCore::ApplicationRecord
4
+ extend Enumerize
5
+
6
+ self.table_name = UffizziCore.table_names[:user_projects]
7
+
8
+ enumerize :role, in: [:admin, :developer, :viewer], predicates: true
9
+ validates :role, presence: true
10
+
11
+ belongs_to :user
12
+ belongs_to :project
13
+ belongs_to :invited_by, class_name: UffizziCore::User.name, foreign_key: :invited_by_id, optional: true
14
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ class UffizziCore::Api::Cli::V1::Account::CredentialsPolicy < UffizziCore::ApplicationPolicy
4
+ def index?
5
+ context.user_access_module.admin_access_to_account?(context.user, context.account)
6
+ end
7
+
8
+ def create?
9
+ context.user_access_module.admin_access_to_account?(context.user, context.account)
10
+ end
11
+
12
+ def check_credential?
13
+ context.user_access_module.admin_access_to_account?(context.user, context.account)
14
+ end
15
+
16
+ def destroy?
17
+ context.user_access_module.admin_access_to_account?(context.user, context.account)
18
+ end
19
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ class UffizziCore::Api::Cli::V1::Projects::ComposeFilesPolicy < UffizziCore::ApplicationPolicy
4
+ def show?
5
+ context.user_access_module.any_access_to_project?(context.user, context.project)
6
+ end
7
+
8
+ def create?
9
+ context.user_access_module.admin_or_developer_access_to_project?(context.user, context.project)
10
+ end
11
+
12
+ def destroy?
13
+ context.user_access_module.admin_or_developer_access_to_project?(context.user, context.project)
14
+ end
15
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ class UffizziCore::Api::Cli::V1::Projects::Deployments::ActivityItemsPolicy < UffizziCore::ApplicationPolicy
4
+ def index?
5
+ context.user_access_module.any_access_to_project?(context.user, context.project)
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ class UffizziCore::Api::Cli::V1::Projects::Deployments::ContainersPolicy < UffizziCore::ApplicationPolicy
4
+ def index?
5
+ context.user_access_module.any_access_to_project?(context.user, context.project)
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ class UffizziCore::Api::Cli::V1::Projects::Deployments::EventsPolicy < UffizziCore::ApplicationPolicy
4
+ def index?
5
+ context.user_access_module.any_access_to_project?(context.user, context.project)
6
+ end
7
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ class UffizziCore::Api::Cli::V1::Projects::DeploymentsPolicy < UffizziCore::ApplicationPolicy
4
+ def index?
5
+ context.user_access_module.any_access_to_project?(context.user, context.project)
6
+ end
7
+
8
+ def show?
9
+ context.user_access_module.any_access_to_project?(context.user, context.project)
10
+ end
11
+
12
+ def create?
13
+ context.user_access_module.admin_or_developer_access_to_project?(context.user, context.project)
14
+ end
15
+
16
+ def update?
17
+ context.user_access_module.admin_or_developer_access_to_project?(context.user, context.project)
18
+ end
19
+
20
+ def destroy?
21
+ context.user_access_module.admin_or_developer_access_to_project?(context.user, context.project)
22
+ end
23
+
24
+ def deploy_containers?
25
+ context.user_access_module.admin_or_developer_access_to_project?(context.user, context.project)
26
+ end
27
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ class UffizziCore::Api::Cli::V1::Projects::SecretsPolicy < UffizziCore::ApplicationPolicy
4
+ def index?
5
+ context.user_access_module.any_access_to_project?(context.user, context.project)
6
+ end
7
+
8
+ def bulk_create?
9
+ context.user_access_module.admin_or_developer_access_to_project?(context.user, context.project)
10
+ end
11
+
12
+ def destroy?
13
+ context.user_access_module.admin_or_developer_access_to_project?(context.user, context.project)
14
+ end
15
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ class UffizziCore::Api::Cli::V1::ProjectsPolicy < UffizziCore::ApplicationPolicy
4
+ def index?
5
+ context.user_access_module.any_access_to_account?(context.user, context.account)
6
+ end
7
+
8
+ def show?
9
+ context.user_access_module.any_access_to_account?(context.user, context.account)
10
+ end
11
+
12
+ def create?
13
+ context.user_access_module.admin_or_developer_access_to_account?(context.user, context.account)
14
+ end
15
+
16
+ def destroy?
17
+ context.user_access_module.admin_or_developer_access_to_account?(context.user, context.account)
18
+ end
19
+ end