require 'db/mongo/models/stack_template/stack_template_factory' require "app/api2/parsers/stack_template" require_relative "request_handler" module Devops module API2_0 module Handler class StackTemplate < RequestHandler set_parser Devops::API2_0::Parser::StackTemplateParser def stack_templates Devops::Db.connector.stack_templates end def stack_templates_for_provider provider Devops::Db.connector.stack_templates(provider) end def create_stack_template provider body = parser.create template_model = Model::StackTemplateFactory.create(provider, body) template_model.owner = parser.current_user Devops::Db.connector.stack_template_insert(template_model) template_model end def get_stack_template id Devops::Db.connector.stack_template(id) end def delete_stack_template id envs_with_this_template = envs_using_stack_template(id) if envs_with_this_template.empty? Devops::Db.connector.stack_template_delete id else raise ConflictException.new("Stack template '#{id}' is already in use in #{envs_with_this_template.map{|project, envs| "#{project}: #{envs.join(', ')}"}.join('; ')}", {projects: envs_with_this_template}) end end private # returns: # { # "project" => ["deploy_env"] # } def envs_using_stack_template(id) projects = Devops::Db.connector.projects_and_deploy_envs_by_field('stack_template', id) envs_with_this_template = [] res = {} projects.each do |project| array = [] res[project.id] = array project.deploy_envs.each do |env| array << env.identifier end end res end end end end end