159 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			159 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| module Connectors
 | |
|   class Project < Base
 | |
|     include Helpers::InsertCommand,
 | |
|       Helpers::ShowCommand,
 | |
| #      Helpers::ListCommand,
 | |
|       Helpers::DeleteCommand
 | |
| #      Helpers::UpdateCommand
 | |
| 
 | |
| 
 | |
|     def initialize(db)
 | |
|       super(db)
 | |
|     end
 | |
| 
 | |
|     def collection_name
 | |
|       'projects'
 | |
|     end
 | |
| 
 | |
|     def is_project_exists?(project)
 | |
|       self.project(project.id)
 | |
|       return true
 | |
|     rescue RecordNotFound => e
 | |
|       return false
 | |
|     end
 | |
| 
 | |
|     def projects_all
 | |
|       list
 | |
|     end
 | |
| 
 | |
|     def projects ids=nil, type=nil, fields=[], archived=false
 | |
|       query = {}
 | |
|       query['_id'] = {'$in' => ids} if ids
 | |
|       query['type'] = 'multi' if type == :multi
 | |
|       if archived
 | |
|         query["archived"] = true
 | |
|       else
 | |
|         query["archived"] = {"$exists" => false}
 | |
|       end
 | |
|       fields << '_id'
 | |
|       list(query, fields: fields)
 | |
|     end
 | |
| 
 | |
|     # names - array of project names
 | |
|     def project_names_with_envs(names=nil)
 | |
|       # db.projects.aggregate({$unwind:"$deploy_envs"}, {$project:{"deploy_envs.identifier":1}}, {$group:{_id:"$_id", envs: {$addToSet: "$deploy_envs.identifier"}}})
 | |
|       q = []
 | |
|       unless names.nil?
 | |
|         q.push({
 | |
|           '$match' => {
 | |
|             '_id' => {
 | |
|               '$in' => names
 | |
|             }
 | |
|           }
 | |
|         })
 | |
|       end
 | |
|       q.push({
 | |
|         '$unwind' => '$deploy_envs'
 | |
|       })
 | |
|       q.push({
 | |
|         '$project' => {
 | |
|           'deploy_envs.identifier' => 1
 | |
|         }
 | |
|       })
 | |
|       q.push({
 | |
|         '$group' => {
 | |
|           '_id' => '$_id',
 | |
|           'envs' => {
 | |
|             '$addToSet' => '$deploy_envs.identifier'
 | |
|           }
 | |
|         }
 | |
|       })
 | |
|       res = @collection.aggregate(q)
 | |
|       r = {}
 | |
|       res.each do |ar|
 | |
|         r[ar['_id']] = ar['envs']
 | |
|       end
 | |
|       return r
 | |
|     end
 | |
| 
 | |
|     def projects_by_image(image)
 | |
|       list('deploy_envs.image' => image)
 | |
|     end
 | |
| 
 | |
|     def projects_by_user(user)
 | |
|       list('deploy_envs.users' => user)
 | |
|     end
 | |
| 
 | |
|     def archive_project id
 | |
|       @collection.update({"_id" => id}, {"$set" => {"archived" => true}})
 | |
|     end
 | |
| 
 | |
|     def unarchive_project id
 | |
|       @collection.update({"_id" => id}, {"$unset" => {"archived" => ""}})
 | |
|     end
 | |
| 
 | |
|     def check_project_auth(project_id, env, user_id)
 | |
|       project = show(project_id)
 | |
|       raise InvalidPrivileges.new("User '#{user_id}' is unauthorized to work with project '#{project_id}' and environment '#{env}'") unless project.check_authorization(user_id, env)
 | |
|       project
 | |
|     end
 | |
| 
 | |
|     def projects_and_deploy_envs_by_field field, value
 | |
|       q = {}
 | |
|       q[field] = value
 | |
|       # {find all projects with deploy_envs with field=value}, {return deploy_envs with field=value}
 | |
|       list( {'deploy_envs' => {'$elemMatch' => q}}, {:fields => {'deploy_envs' => {'$elemMatch' => q}}} )
 | |
|     end
 | |
| 
 | |
|     def set_project_deploy_env_field(project_id, env, field_value_hash)
 | |
|       set = {}
 | |
|       field_value_hash.each do |field, value|
 | |
|         set["deploy_envs.$.#{field}"] = value
 | |
|       end
 | |
|       @collection.update({"_id" => project_id, "deploy_envs.identifier" => env}, {"$set" => set})
 | |
|     end
 | |
| 
 | |
|     def set_project_env_run_list(project_id, env, run_list)
 | |
|       Helpers::RunList.new(run_list).validate!
 | |
|       set_project_deploy_env_field(project_id, env, {"run_list" => run_list})
 | |
|     end
 | |
| 
 | |
|     def set_project_run_list(project_id, env, run_list)
 | |
|       Helpers::RunList.new(run_list).validate!
 | |
|       @collection.update({"_id" => project_id}, {"$set" => {run_list: run_list}})
 | |
|     end
 | |
| 
 | |
|     def add_deploy_env_to_project id, env
 | |
|       @collection.update({"_id" => id}, {'$push' => {deploy_envs: env.to_hash} })
 | |
|     end
 | |
| 
 | |
|     def remove_deploy_env_from_project id, env
 | |
|       @collection.update({"_id" => id}, {'$pull' => {deploy_envs: {identifier: env}} })
 | |
|     end
 | |
| 
 | |
|     def project_update_field id, field, value
 | |
|       obj = {}
 | |
|       obj[field] = value
 | |
|       @collection.update({"_id" => id}, {'$set' => obj })
 | |
|     end
 | |
| 
 | |
|     def project_update id, params
 | |
|       #raise InvalidRecord.new("You can not change project name for '#{id}'.") if params["name"]
 | |
|       keys = %w(run_list description)
 | |
|       params.delete_if{|k,v| !keys.include?(k)}
 | |
|       @collection.update({"_id" => id}, {'$set' => params })
 | |
|     end
 | |
| 
 | |
|     private
 | |
| 
 | |
|     def list(query={}, query_options={})
 | |
|       @collection.find(query, query_options).to_a.map {|bson| model_from_bson(bson)}
 | |
|     end
 | |
| 
 | |
|     def model_from_bson(bson)
 | |
|       Devops::Model::Project.build_from_bson(bson)
 | |
|     end
 | |
|   end
 | |
| 
 | |
| end
 | 
