From c181abce81481c950632afb000311022e61d32d4 Mon Sep 17 00:00:00 2001 From: Jasder <2053003901@@qq.com> Date: Wed, 15 Jul 2020 16:53:38 +0800 Subject: [PATCH 1/2] =?UTF-8?q?FIX=20=E5=AE=8C=E5=96=84devops=E6=B5=81?= =?UTF-8?q?=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/dev_ops/builds_controller.rb | 30 +++- app/libs/dev_ops/drone/api.rb | 41 +++-- app/libs/dev_ops/drone/ci.rb | 2 +- app/libs/dev_ops/drone/request.rb | 147 ++++++------------ app/models/dev_ops/cloud_account.rb | 1 + app/models/repository.rb | 1 + config/routes.rb | 10 +- ...repository_ref_to_dev_ops_cloud_account.rb | 7 + 8 files changed, 127 insertions(+), 112 deletions(-) create mode 100644 db/migrate/20200715075831_add_repository_ref_to_dev_ops_cloud_account.rb diff --git a/app/controllers/dev_ops/builds_controller.rb b/app/controllers/dev_ops/builds_controller.rb index 24d8b99d7..0cf160a10 100644 --- a/app/controllers/dev_ops/builds_controller.rb +++ b/app/controllers/dev_ops/builds_controller.rb @@ -3,9 +3,37 @@ class DevOps::BuildsController < ApplicationController before_action :find_project def index + cloud_account = @repo.dev_ops_cloud_account + result = DevOps::Drone::API.new(cloud_account.drone_token, cloud_account.drone_url, @repo.user.login, @repo.identifier).builds + + render json: result end - def show + def detail + cloud_account = @repo.dev_ops_cloud_account + result = DevOps::Drone::API.new(cloud_account.drone_token, cloud_account.drone_url, @repo.user.login, @repo.identifier, number: params[:number]).build + + render json: result + end + + def restart + cloud_account = @repo.dev_ops_cloud_account + result = DevOps::Drone::API.new(cloud_account.drone_token, cloud_account.drone_url, @repo.user.login, @repo.identifier, number: params[:number]).restart + + render json: result + end + + def delete + cloud_account = @repo.dev_ops_cloud_account + result = DevOps::Drone::API.new(cloud_account.drone_token, cloud_account.drone_url, @repo.user.login, @repo.identifier, number: params[:number]).stop + render json: result + end + + def logs + cloud_account = @repo.dev_ops_cloud_account + result = DevOps::Drone::API.new(cloud_account.drone_token, cloud_account.drone_url, @repo.user.login, @repo.identifier, build: params[:build], stage: params[:stage], step: sync_params[:step]).logs + + render json: result end private diff --git a/app/libs/dev_ops/drone/api.rb b/app/libs/dev_ops/drone/api.rb index 08dafcb42..860e54557 100644 --- a/app/libs/dev_ops/drone/api.rb +++ b/app/libs/dev_ops/drone/api.rb @@ -1,12 +1,12 @@ class DevOps::Drone::API < DevOps::Drone::Request - attr_reader :drone_token, :drone_url, :owner, :repo, :options + attr_reader :drone_token, :endpoint, :owner, :repo, :options # drone_token: # owner: repo's owner name or login # repo: repo's identifier - def initialize(drone_token, drone_url, owner, repo, options={}) + def initialize(drone_token, endpoint, owner, repo, options={}) @drone_token = drone_token - @drone_url = drone_url + @endpoint = endpoint @owner = owner @repo = repo @options = options @@ -15,40 +15,59 @@ class DevOps::Drone::API < DevOps::Drone::Request # Build List # GET api/repos/{owner}/{name}/builds # eq: - # DevOps::Drone::API + # DevOps::Drone::API.new(cloud_account.drone_token, cloud_account.drone_url, @repo.user.login, @repo.identifier) def builds - request(:get, drone_url, "api/repos/#{owner}/#{repo}/builds", drone_token: drone_token) + get(endpoint, "api/repos/#{owner}/#{repo}/builds", drone_token: drone_token) end # Build Info # GET api/repos/{owner}/{name}/builds/{number} + # eq: + # DevOps::Drone::API.new(cloud_account.drone_token, cloud_account.endpoint, project.owner.login, project.identifier, number: number).build def build - request(:get, "api/repos/#{owner}/#{repo}/builds/#{number}", drone_token: drone_token) + get(endpoint, "api/repos/#{owner}/#{repo}/builds/#{options[:number]}", drone_token: drone_token) end # Update .trustie-pipeline.yml file - # PATCH api/repos/{owner}/{name} + # PATCH api/repos/{owner}/{name}\ + # eq: + # DevOps::Drone::API.new(cloud_account.drone_token, cloud_account.endpoint, project.owner.login, project.identifier, config_path: config_path).config_yml def config_yml - request(:patch, "/api/repos/#{owner}/#{repo}", drone_token: drone_token, config_path: config_path) + patch(endpoint, "/api/repos/#{owner}/#{repo}", drone_token: drone_token, config_path: options[:config_path]) end # Activate user's project with Drone CI # POST api/repos/{owner}/{name} + # eq: + # DevOps::Drone::API.new(cloud_account.drone_token, cloud_account.endpoint, project.owner.login, project.identifier).avtivate def activate - request(:post, "/api/repos/#{owner}/#{repo}", drone_token: drone_token) + post(endpoint, "/api/repos/#{owner}/#{repo}", drone_token: drone_token) end # Build Restart # POST api/repos/{owner}/{name}/builds/{number} # Restart the specified build. Please note this api requires read and write access to the repository and the request parameter {build} is not the build id but the build number. + # eq: + # DevOps::Drone::API.new(cloud_account.drone_token, cloud_account.drone_url, @repo.user.login, @repo.identifier, number: number).restart def restart - request(:post, "/api/repos/#{owner}/#{repo}/builds/#{number}", drone_token: drone_token) + post(endpoint, "/api/repos/#{owner}/#{repo}/builds/#{options[:number]}", drone_token: drone_token) end # Build Stop # DELETE api/repos/{owner}/{name}/builds/{number} # Stop the specified build. Please note this api requires administrative privileges and the request parameter {build} is not the build id but the build number. + # eq: + # DevOps::Drone::API.new(cloud_account.drone_token, cloud_account.drone_url, @repo.user.login, @repo.identifier, number: number).stop def stop - request(:delete, "/api/repos/#{owner}/#{repo}/builds/#{number}", drone_token: drone_token) + delete(endpoint, "/api/repos/#{owner}/#{repo}/builds/#{options[:number]}", drone_token: drone_token) + end + + # Build Logs + # GET /api/repos/{owner}/{repo}/builds/{build}/logs/{stage}/{step} + # Please note this api requires read access to the repository. + # eq: + # DevOps::Drone::API.new(cloud_account.drone_token, cloud_account.drone_url, @repo.user.login, @repo.identifier, build: build, stage: stage, step: step).logs + def logs + get(endpoint, "/api/repos/#{owner}/#{repo}/builds/#{options[:build]}/logs/#{options[:stage]}/#{options[:step]}", drone_token: drone_token) end end diff --git a/app/libs/dev_ops/drone/ci.rb b/app/libs/dev_ops/drone/ci.rb index 13eed9ba5..cfa67cdc2 100644 --- a/app/libs/dev_ops/drone/ci.rb +++ b/app/libs/dev_ops/drone/ci.rb @@ -5,7 +5,7 @@ class DevOps::Drone::Ci # username: drone server's account # password: drone server's password # eq: - # DevOps::Drone::Ci.new(@cloud_account.drone_ip, @cloud_account.account, @cloud_account.visible_secret).get_token + # DevOps::Drone::Ci.new(@cloud_account.drone_ip, @cloud_account.account, @cloud_account.visible_secret, current_user.login).get_token def initialize(host, username, password, gitea_username) @host = host @username = username diff --git a/app/libs/dev_ops/drone/request.rb b/app/libs/dev_ops/drone/request.rb index 7e059dc41..615e53b6e 100644 --- a/app/libs/dev_ops/drone/request.rb +++ b/app/libs/dev_ops/drone/request.rb @@ -1,10 +1,4 @@ - # @private class DevOps::Drone::Request - # format :json - # headers 'Accept' => 'application/json' - # parser Proc.new { |body, _| parse(body) } - - # Converts the response body to an ObjectifiedHash. def self.parse(body) body = decode(body) @@ -29,113 +23,70 @@ end end - def get(path, options={}) - set_httparty_config(options) - set_private_token_header(options) - validate self.class.get(path, options) + def get(endpoint, path, options={}) + set_request_defaults(endpoint) + request(:get, endpoint, path, options) end - def post(path, options={}) - set_httparty_config(options) - set_private_token_header(options, path) - validate self.class.post(path, options) + def post(endpoint, path, options={}) + set_request_defaults(endpoint) + request(:post, endpoint, path, options) end - def put(path, options={}) - set_httparty_config(options) - set_private_token_header(options) - validate self.class.put(path, options) + def put(endpoint, path, options={}) + set_request_defaults(endpoint) + request(:put, endpoint, path, options) end - def delete(path, options={}) - set_httparty_config(options) - set_private_token_header(options) - validate self.class.delete(path, options) - end - - # Checks the response code for common errors. - # Returns parsed response for successful requests. - def validate(response) - # case response.code - # when 400; raise Error::BadRequest.new error_message(response) - # when 401; raise Error::Unauthorized.new error_message(response) - # when 403; raise Error::Forbidden.new error_message(response) - # when 404; raise Error::NotFound.new error_message(response) - # when 405; raise Error::MethodNotAllowed.new error_message(response) - # when 406; raise Error::DataNotAccepted.new error_message(response) - # when 409; raise Error::Conflict.new error_message(response) - # when 500; raise Error::InternalServerError.new error_message(response) - # when 502; raise Error::BadGateway.new error_message(response) - # when 503; raise Error::ServiceUnavailable.new error_message(response) - # end - - response.parsed_response - end - - # Sets a base_uri and default_params for requests. - # @raise [Error::MissingCredentials] if endpoint not set. - def set_request_defaults(endpoint, private_token, sudo=nil) - raise Error::MissingCredentials.new("Please set an endpoint to API") unless endpoint - @private_token = private_token - - self.class.base_uri endpoint - self.class.default_params :sudo => sudo - self.class.default_params.delete(:sudo) if sudo.nil? - end - - def request(method, domain, url, **params) - Rails.logger.info("[drone] request: #{method} #{url} #{params.except(:secret).inspect}") - - client = Faraday.new(url: domain) - response = client.public_send(method, url, params) - result = JSON.parse(response.body) - - Rails.logger.info("[drone] response:#{response.status} #{result.inspect}") - - if response.status != 200 - raise DevOps::Drone::Error.parse(result) - end - - if result['errcode'].present? && result['errcode'].to_i.nonzero? - raise DevOps::Drone::Error.parse(result) - end - - result + def delete(endpoint, path, options={}) + set_request_defaults(endpoint) + request(:delete, endpoint, path, options) end private - def conn(auth={}) - token = auth[:token] - puts "[gitea] token: #{token}" + def request(method, endpoint, path, **params) + Rails.logger.info("[drone] request: #{method} #{path} #{params.except(:secret).inspect}") - @client ||= begin - Faraday.new(url: domain) do |req| - req.request :url_encoded - req.headers['Content-Type'] = 'application/json' - req.response :logger # 显示日志 - req.adapter Faraday.default_adapter - req.authorization :Bearer, token - req.headers['Authorization'] - end + client = Faraday.new(path: domain) + response = client.public_send(method, path, params) + result = JSON.parse(response.body) + + Rails.logger.info("[drone] response:#{response.status} #{result.inspect}") + + if response.status != 200 + raise DevOps::Drone::Error.parse(result) end - @client + + if result['errcode'].present? && result['errcode'].to_i.nonzero? + raise DevOps::Drone::Error.parse(result) + end + + result end - # Sets a PRIVATE-TOKEN header for requests. - # @raise [Error::MissingCredentials] if private_token not set. - def set_private_token_header(options, path=nil) - unless path == '/session' - raise Error::MissingCredentials.new("Please set a private_token for user") unless @private_token - options[:headers] = {'PRIVATE-TOKEN' => @private_token} - end + # Sets a base_uri and default_params for requests. + # @raise [Error::MissingCredentials] if endpoint not set. + def set_request_defaults(endpoint, private_token, sudo=nil) + raise "Please set an endpoint to API" unless endpoint end - # Set HTTParty configuration - # @see https://github.com/jnunemaker/httparty - def set_httparty_config(options) - if self.httparty - options.merge!(self.httparty) - end + # Checks the response code for common errors. + # Returns parsed response for successful requests. + def validate(response) + # case response.code + # when 400; raise Error::BadRequest.new error_message(response) + # when 401; raise Error::Unauthorized.new error_message(response) + # when 403; raise Error::Forbidden.new error_message(response) + # when 404; raise Error::NotFound.new error_message(response) + # when 405; raise Error::MethodNotAllowed.new error_message(response) + # when 406; raise Error::DataNotAccepted.new error_message(response) + # when 409; raise Error::Conflict.new error_message(response) + # when 500; raise Error::InternalServerError.new error_message(response) + # when 502; raise Error::BadGateway.new error_message(response) + # when 503; raise Error::ServiceUnavailable.new error_message(response) + # end + + response.parsed_response end def error_message(response) diff --git a/app/models/dev_ops/cloud_account.rb b/app/models/dev_ops/cloud_account.rb index 255396493..778335fb6 100644 --- a/app/models/dev_ops/cloud_account.rb +++ b/app/models/dev_ops/cloud_account.rb @@ -1,6 +1,7 @@ class DevOps::CloudAccount < ApplicationRecord belongs_to :project belongs_to :user + belongs_to :repository def drone_host [drone_ip, ":80"].join diff --git a/app/models/repository.rb b/app/models/repository.rb index 6d20afce5..ec6232927 100644 --- a/app/models/repository.rb +++ b/app/models/repository.rb @@ -3,6 +3,7 @@ class Repository < ApplicationRecord belongs_to :project, :touch => true belongs_to :user has_one :mirror, foreign_key: :repo_id + has_one :dev_ops_cloud_account, foreign_key: :repo_id has_many :version_releases, dependent: :destroy validates :identifier, presence: true diff --git a/config/routes.rb b/config/routes.rb index 075ed74a0..709ff9073 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -22,7 +22,15 @@ Rails.application.routes.draw do get :common end end - resources :builds + + resources :builds, only: :index do + collection do + get ':number', to: 'builds#detail', as: 'detail' + get ':number/logs/:stage/:step', to: 'builds#detail', as: 'logs' + post ':number', to: 'builds#restart', as: 'restart' + delete ':number', to: 'builds#delete', as: 'delete' + end + end end resources :sync_forge, only: [:create] do diff --git a/db/migrate/20200715075831_add_repository_ref_to_dev_ops_cloud_account.rb b/db/migrate/20200715075831_add_repository_ref_to_dev_ops_cloud_account.rb new file mode 100644 index 000000000..af42232e0 --- /dev/null +++ b/db/migrate/20200715075831_add_repository_ref_to_dev_ops_cloud_account.rb @@ -0,0 +1,7 @@ +class AddRepositoryRefToDevOpsCloudAccount < ActiveRecord::Migration[5.2] + def change + add_column :dev_ops_cloud_accounts, :repo_id, :integer + + add_index :dev_ops_cloud_accounts, :repo_id, name: 'dev_ops_cloud_accounts_repo_id_ix' + end +end From b9abd6a15239c140cb3a7021e209306c3b6e3d99 Mon Sep 17 00:00:00 2001 From: Jasder <2053003901@@qq.com> Date: Wed, 15 Jul 2020 17:13:16 +0800 Subject: [PATCH 2/2] =?UTF-8?q?FIX=20=E6=8F=92=E9=94=80=E6=8E=89dev=5Fchai?= =?UTF-8?q?n=E5=88=86=E6=94=AF=E7=9A=84=E5=90=88=E5=B9=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/sync_forge_controller.rb | 37 ++++++++--- app/jobs/sync_projects_job.rb | 78 +++++++++++++++++------- app/models/sync_log.rb | 2 +- 3 files changed, 85 insertions(+), 32 deletions(-) diff --git a/app/controllers/sync_forge_controller.rb b/app/controllers/sync_forge_controller.rb index eb42f6075..8b0e6ab0b 100644 --- a/app/controllers/sync_forge_controller.rb +++ b/app/controllers/sync_forge_controller.rb @@ -5,14 +5,31 @@ class SyncForgeController < ApplicationController ActiveRecord::Base.transaction do params.permit! sync_params = params[:sync_params] + project_user = User.where(login: sync_params[:owner_login])&.first #以前已同步的项目,那么肯定存在仓库 - if Project.exists?(identifier: sync_params[:identifier]) + + user_projects = Project.where(user_id: project_user.id) + if user_projects.where(id: sync_params[:id], identifier: sync_params[:identifier]).present? + has_project = true + project = user_projects.where(id: sync_params[:id], identifier: sync_params[:identifier])&.first + elsif user_projects.where(id: sync_params[:id]).present? + has_project = true + project = user_projects.where(id: sync_params[:id])&.first + elsif user_projects.where(identifier: sync_params[:identifier]).present? + has_project = true + project = user_projects.where(identifier: sync_params[:identifier])&.first + else + has_project = false + end + + if has_project SyncLog.sync_log("=================begin_to_update_project========") - project = Project.find_by(identifier: sync_params[:identifier]) + # project = user_projects.where(id: sync_params[:id]), identifier: sync_params[:identifier])&.first || + check_sync_project(project, sync_params) else #新建项目 SyncLog.sync_log("=================begin_to_create_new_project========") - project_user = User.where(login: sync_params[:owner_login]).first + project_params = { repository_name: sync_params[:identifier], user_id: project_user.id, @@ -30,6 +47,8 @@ class SyncForgeController < ApplicationController SyncRepositoryJob.perform_later(sync_params[:owner_login], sync_params[:identifier], sync_params[:repository], get_sudomain) if sync_params[:repository].present? check_new_project(project, sync_params) + else + SyncLog.sync_project_log("=============new_project_create_failed, trustie_project_id==:#{params[:sync_params][:id]}") end end end @@ -57,6 +76,7 @@ class SyncForgeController < ApplicationController new_user = User.new(u[:user_params].merge(mail: u_mail)) username = new_user.login + password = "12345678" if new_user.save! SyncLog.sync_log("=================sync_to_user_success==#{new_user.login}") @@ -175,11 +195,10 @@ class SyncForgeController < ApplicationController begin forge_issue_ids = project&.issues&.select(:id)&.pluck(:id) sync_projects_params = {} - unless forge_issue_ids.size.to_i < old_issues_params[:count].to_i - forge_journal_ids = Journal.select([:id, :journalized_id, :journalized_type]).where(journalized_id: forge_issue_ids).pluck(:id) + if forge_issue_ids.size.to_i <= old_issues_params[:count].to_i diff_issue_ids = old_issues_params[:ids] - forge_issue_ids - if diff_issue_ids.size == 0 #issue数量一样,判断评论是否有增减 + forge_journal_ids = Journal.select([:id, :journalized_id, :journalized_type]).where(journalized_id: forge_issue_ids).pluck(:id) diff_journal_ids = old_issues_params[:journals][:ids] - forge_journal_ids unless diff_journal_ids.size == 0 sync_projects_params = { @@ -209,7 +228,7 @@ class SyncForgeController < ApplicationController def change_project_watchers(project, watchers,gitea_main) SyncLog.sync_log("***5. begin_to_sync_watchers---------------") forge_watchers_ids = project&.watchers&.select(:id)&.pluck(:id) - unless forge_watchers_ids.size.to_i < watchers[:count].to_i + if forge_watchers_ids.size.to_i <= watchers[:count].to_i diff_target_ids = watchers[:ids] - forge_watchers_ids if diff_target_ids.size > 0 sync_projects_params = { @@ -228,7 +247,7 @@ class SyncForgeController < ApplicationController def change_project_versions(project, versions,gitea_main) SyncLog.sync_log("***4. begin_to_sync_versions---------------") forge_version_ids = project&.versions&.select(:id)&.pluck(:id) - unless forge_version_ids.size < versions[:count].to_i + if forge_version_ids.size <= versions[:count].to_i diff_version_ids = versions[:ids] - forge_version_ids if diff_version_ids.size > 0 sync_projects_params = { @@ -247,7 +266,7 @@ class SyncForgeController < ApplicationController def change_project_members(project, members,gitea_main) SyncLog.sync_log("***3. begin_to_sync_members---------------") forge_member_ids = project&.members&.select(:id)&.pluck(:id) - unless forge_member_ids.size < members[:count] + if forge_member_ids.size <= members[:count] diff_member_ids = members[:ids] - forge_member_ids if diff_member_ids.size > 0 sync_projects_params = { diff --git a/app/jobs/sync_projects_job.rb b/app/jobs/sync_projects_job.rb index cfa52d22d..fb6cbed03 100644 --- a/app/jobs/sync_projects_job.rb +++ b/app/jobs/sync_projects_job.rb @@ -57,23 +57,42 @@ class SyncProjectsJob < ApplicationJob u_id = User.select(:id, :login).where(login: re[:user_login]).pluck(:id).first re[:target_params].delete(:id) if target_type == "Issue" - new_target = target_type.constantize.new(re[:target_params].merge(author_id: u_id)) + is_exists = Issue.exists?(author_id: u_id, project_id: re[:target_params][:project_id], subject: re[:target_params][:subject]) + unless is_exists + assing_u_id = User.select(:id, :login).where(login: re[:assign_login]).pluck(:id).first + new_target = target_type.constantize.new(re[:target_params].merge(author_id: u_id)) + new_target.assigned_to_id = assing_u_id + end else - new_target = target_type.constantize.new(re[:target_params].merge(user_id: u_id)) + case target_type + when "Journal" + is_exists = Journal.exists?(user_id: u_id, journalized_id: re[:target_params][:journalized_id], created_on: re[:target_params][:created_on].to_s.to_time) + when "Member" + is_exists = Member.exists?(user_id: u_id, project_id: re[:target_params][:project_id], created_on: re[:target_params][:created_on].to_s.to_time) + when "Version" + is_exists = Version.exists?(user_id: u_id, project_id: re[:target_params][:project_id], created_on: re[:target_params][:created_on].to_s.to_time) + when "Watcher" + is_exists = Watcher.exists?(user_id: u_id, watchable_id: re[:target_params][:watchable_id], created_at: re[:target_params][:created_at].to_s.to_time) + when "PraiseTread" + is_exists = PraiseTread.exists?(user_id: u_id, praise_tread_object_id: re[:target_params][:praise_tread_object_id], created_at: re[:target_params][:created_at].to_s.to_time) + else + is_exists = false + end + unless is_exists + new_target = target_type.constantize.new(re[:target_params].merge(user_id: u_id)) + end end - - if target_type == "Issue" - assing_u_id = User.select(:id, :login).where(login: re[:assign_login]).pluck(:id).first - new_target.assigned_to_id = assing_u_id - end - if new_target.save! + + if !is_exists && new_target.save! SyncLog.sync_project_log("***【#{target_type}】. create_success---------------") if re[:journals].present? create_journals(re[:journals], "Journal", new_target.id) end if re[:journal_details].present? re[:journal_details].each do |j| - JournalDetail.create!(j.merge(journal_id: new_target.id)) if j.present? + unless JournalDetail.exists?(journal_id: new_target.id) + JournalDetail.create!(j.merge(journal_id: new_target.id)) if j.present? + end end end if re[:member_roles].present? @@ -82,7 +101,7 @@ class SyncProjectsJob < ApplicationJob end end else - SyncLog.sync_project_log("***【#{target_type}】. create_failed---------------") + SyncLog.sync_project_log("***【#{target_type}】. create_failed---or has_exists---------------") end end end @@ -100,14 +119,22 @@ class SyncProjectsJob < ApplicationJob SyncLog.sync_log("***user_login:#{re[:user_login]}----target_type:#{target_type}-----#{index+1}") if re[:target_params].present? u_id = User.select(:id, :login).where(login: re[:user_login]).pluck(:id).first - re[:target_params].delete(:id) - new_target = Journal.new(re[:target_params].merge(user_id: u_id)) - new_target.journalized_id = issue_id - if new_target.save! - if re[:journal_details].present? - re[:journal_details].each do |j| - JournalDetail.create!(j.merge(journal_id: new_target.id)) + is_exists = Journal.exists?(user_id: u_id, journalized_id: re[:target_params][:journalized_id], created_on: re[:target_params][:created_on].to_s.to_time) + + if is_exists + SyncLog.sync_project_log("***00000. Journal:#{re[:target_params][:id]}-is exists--------------") + else + re[:target_params].delete(:id) + new_target = Journal.new(re[:target_params].merge(user_id: u_id)) + new_target.journalized_id = issue_id + if new_target.save! + if re[:journal_details].present? + re[:journal_details].each do |j| + JournalDetail.create!(j.merge(journal_id: new_target.id)) + end end + else + SyncLog.sync_project_log("***111222. journal_create failed---------------") end end end @@ -118,15 +145,22 @@ class SyncProjectsJob < ApplicationJob def create_versions(project, target_jsons) SyncLog.sync_log("***【Versions】. begin_to_create_verison---------------") return SyncLog.sync_log("*** no target_jsons") if target_jsons.blank? - all_issues = project.issues.select(:id, :project_id, :fixed_version_id) target_jsons.each do |re| old_id = re[:target_params][:id] if re[:target_params].present? u_id = User.select(:id, :login).where(login: re[:user_login]).pluck(:id).first - re[:target_params].delete(:id) - new_target = Version.new(re[:target_params].merge(user_id: u_id)) - if new_target.save! - all_issues&.where(fixed_version_id: old_id)&.update_all(fixed_version_id: new_target.id) + is_exists = Version.exists?(user_id: u_id, project_id: re[:target_params][:project_id], created_on: re[:target_params][:created_on].to_s.to_time) + if is_exists + SyncLog.sync_project_log("***00000. Version:#{re[:target_params][:id]}-is exists--------------") + else + re[:target_params].delete(:id) + new_target = Version.new(re[:target_params].merge(user_id: u_id)) + if new_target.save! + all_issues = project.issues.select(:id, :project_id, :fixed_version_id) + all_issues&.where(fixed_version_id: old_id)&.update_all(fixed_version_id: new_target.id) + else + SyncLog.sync_project_log("***111222. Version_create failed---------------") + end end end end diff --git a/app/models/sync_log.rb b/app/models/sync_log.rb index f24a0a927..73fd8c789 100644 --- a/app/models/sync_log.rb +++ b/app/models/sync_log.rb @@ -5,7 +5,7 @@ class SyncLog end def self.sync_project_log(message=nil) - @my_log ||= Logger.new("#{Rails.root}/log/sync_error_project.log") + @my_log ||= Logger.new("#{Rails.root}/log/sync_project_log.log") @my_log.debug(message) unless message.nil? end end \ No newline at end of file