From aefd6c08dc76d9214709205544af2fc25facb93c Mon Sep 17 00:00:00 2001 From: yystopf Date: Tue, 21 Jun 2022 17:39:11 +0800 Subject: [PATCH 1/9] =?UTF-8?q?=E6=96=B0=E5=A2=9E:=20gitea-client=E5=BC=95?= =?UTF-8?q?=E5=85=A5=E4=BB=A5=E5=8F=8A=E8=B7=AF=E7=94=B1=E5=AE=9A=E4=B9=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Gemfile | 2 ++ Gemfile.lock | 20 ++++++++++++++++++++ app/controllers/api/v1/base_controller.rb | 2 ++ app/controllers/api/v1/repos_controller.rb | 6 ++++++ config/initializers/gitea_client.rb | 11 +++++++++++ config/routes.rb | 6 ++++++ config/routes/api.rb | 7 +++++++ 7 files changed, 54 insertions(+) create mode 100644 app/controllers/api/v1/base_controller.rb create mode 100644 app/controllers/api/v1/repos_controller.rb create mode 100644 config/initializers/gitea_client.rb create mode 100644 config/routes/api.rb diff --git a/Gemfile b/Gemfile index effb2be6e..0347de453 100644 --- a/Gemfile +++ b/Gemfile @@ -134,3 +134,5 @@ gem 'jwt' gem 'doorkeeper' gem 'doorkeeper-jwt' + +gem 'gitea-client', '~> 0.5.1' \ No newline at end of file diff --git a/Gemfile.lock b/Gemfile.lock index e27c504aa..6e4f079fb 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -106,6 +106,8 @@ GEM activerecord (>= 3.1.0, < 7) diff-lcs (1.3) diffy (3.3.0) + domain_name (0.5.20190701) + unf (>= 0.0.5, < 1.0.0) doorkeeper (5.5.1) railties (>= 5) doorkeeper-jwt (0.4.1) @@ -133,6 +135,8 @@ GEM fugit (1.4.1) et-orbi (~> 1.1, >= 1.1.8) raabro (~> 1.4) + gitea-client (0.5.1) + rest-client (~> 2.1.0) globalid (0.4.2) activesupport (>= 4.2.0) grape-entity (0.7.1) @@ -143,6 +147,9 @@ GEM harmonious_dictionary (0.0.1) hashie (3.6.0) htmlentities (4.3.4) + http-accept (1.7.0) + http-cookie (1.0.5) + domain_name (~> 0.5) i18n (1.8.2) concurrent-ruby (~> 1.0) io-like (0.3.1) @@ -180,6 +187,9 @@ GEM mimemagic (~> 0.3.2) maruku (0.7.3) method_source (0.9.2) + mime-types (3.4.1) + mime-types-data (~> 3.2015) + mime-types-data (3.2022.0105) mimemagic (0.3.10) nokogiri (~> 1) rake @@ -193,6 +203,7 @@ GEM mustermann (1.1.1) ruby2_keywords (~> 0.0.1) mysql2 (0.5.3) + netrc (0.11.0) nio4r (2.5.2) nokogiri (1.10.8) mini_portile2 (~> 2.4.0) @@ -292,6 +303,11 @@ GEM regexp_parser (1.7.0) request_store (1.5.0) rack (>= 1.4) + rest-client (2.1.0) + http-accept (>= 1.7.0, < 2.0) + http-cookie (>= 1.0.2, < 2.0) + mime-types (>= 1.16, < 4.0) + netrc (~> 0.8) reverse_markdown (1.4.0) nokogiri roo (2.8.3) @@ -418,6 +434,9 @@ GEM thread_safe (~> 0.1) uglifier (4.2.0) execjs (>= 0.3.0, < 3) + unf (0.1.4) + unf_ext + unf_ext (0.0.8.2) unicode-display_width (1.6.1) web-console (3.7.0) actionview (>= 5.0) @@ -459,6 +478,7 @@ DEPENDENCIES enumerize faraday (~> 0.15.4) font-awesome-sass (= 4.7.0) + gitea-client (~> 0.5.1) grape-entity (~> 0.7.1) groupdate (~> 4.1.0) harmonious_dictionary (~> 0.0.1) diff --git a/app/controllers/api/v1/base_controller.rb b/app/controllers/api/v1/base_controller.rb new file mode 100644 index 000000000..76c527d85 --- /dev/null +++ b/app/controllers/api/v1/base_controller.rb @@ -0,0 +1,2 @@ +class Api::V1::BaseController < ApplicationController +end \ No newline at end of file diff --git a/app/controllers/api/v1/repos_controller.rb b/app/controllers/api/v1/repos_controller.rb new file mode 100644 index 000000000..667f47dbc --- /dev/null +++ b/app/controllers/api/v1/repos_controller.rb @@ -0,0 +1,6 @@ +class Api::V1::ReposController < Api::V1::BaseController + + def index + render_ok + end +end \ No newline at end of file diff --git a/config/initializers/gitea_client.rb b/config/initializers/gitea_client.rb new file mode 100644 index 000000000..92706ffd8 --- /dev/null +++ b/config/initializers/gitea_client.rb @@ -0,0 +1,11 @@ +require 'gitea-client' + +config = Rails.application.config_for(:configuration).symbolize_keys! +gitea_config = config[:gitea].symbolize_keys! + +$gitea_client = Gitea::Api::Client.new({ + domain: gitea_config[:domain], + base_url: gitea_config[:base_url], + username: gitea_config[:username], + password: gitea_config[:password] +}) \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index d3b2e7f36..c0e845a85 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,5 +1,11 @@ Rails.application.routes.draw do + def draw(routes_name) + instance_eval(File.read(Rails.root.join("config/routes/#{routes_name}.rb"))) + end + + draw :api + use_doorkeeper require 'sidekiq/web' require 'sidekiq/cron/web' diff --git a/config/routes/api.rb b/config/routes/api.rb new file mode 100644 index 000000000..718f705a6 --- /dev/null +++ b/config/routes/api.rb @@ -0,0 +1,7 @@ +defaults format: :json do + namespace :api do + namespace :v1 do + resources :repos + end + end +end \ No newline at end of file From d7dd3901b8f60f76283d00c7f8d9a18bf0e776d0 Mon Sep 17 00:00:00 2001 From: yystopf Date: Wed, 22 Jun 2022 19:08:14 +0800 Subject: [PATCH 2/9] =?UTF-8?q?=E6=96=B0=E5=A2=9E:=20=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E8=AF=A6=E6=83=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Gemfile | 2 +- Gemfile.lock | 4 +- app/controllers/api/v1/base_controller.rb | 4 ++ app/controllers/api/v1/projects_controller.rb | 11 +++++ app/controllers/api/v1/repos_controller.rb | 6 --- .../concerns/api/project_helper.rb | 20 ++++++++ app/services/api/v1/projects/get_service.rb | 48 +++++++++++++++++++ .../v1/projects/_simple_detail.json.jbuilder | 10 ++++ app/views/api/v1/projects/show.json.jbuilder | 5 ++ .../api/v1/users/_simple_user.json.jbuilder | 9 ++++ config/routes/api.rb | 16 ++++++- 11 files changed, 125 insertions(+), 10 deletions(-) create mode 100644 app/controllers/api/v1/projects_controller.rb delete mode 100644 app/controllers/api/v1/repos_controller.rb create mode 100644 app/controllers/concerns/api/project_helper.rb create mode 100644 app/services/api/v1/projects/get_service.rb create mode 100644 app/views/api/v1/projects/_simple_detail.json.jbuilder create mode 100644 app/views/api/v1/projects/show.json.jbuilder create mode 100644 app/views/api/v1/users/_simple_user.json.jbuilder diff --git a/Gemfile b/Gemfile index 0347de453..1542856cf 100644 --- a/Gemfile +++ b/Gemfile @@ -135,4 +135,4 @@ gem 'doorkeeper' gem 'doorkeeper-jwt' -gem 'gitea-client', '~> 0.5.1' \ No newline at end of file +gem 'gitea-client', '~> 0.6.2' \ No newline at end of file diff --git a/Gemfile.lock b/Gemfile.lock index 6e4f079fb..467e19a2d 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -135,7 +135,7 @@ GEM fugit (1.4.1) et-orbi (~> 1.1, >= 1.1.8) raabro (~> 1.4) - gitea-client (0.5.1) + gitea-client (0.6.2) rest-client (~> 2.1.0) globalid (0.4.2) activesupport (>= 4.2.0) @@ -478,7 +478,7 @@ DEPENDENCIES enumerize faraday (~> 0.15.4) font-awesome-sass (= 4.7.0) - gitea-client (~> 0.5.1) + gitea-client (~> 0.6.2) grape-entity (~> 0.7.1) groupdate (~> 4.1.0) harmonious_dictionary (~> 0.0.1) diff --git a/app/controllers/api/v1/base_controller.rb b/app/controllers/api/v1/base_controller.rb index 76c527d85..2202df8d2 100644 --- a/app/controllers/api/v1/base_controller.rb +++ b/app/controllers/api/v1/base_controller.rb @@ -1,2 +1,6 @@ class Api::V1::BaseController < ApplicationController + + include Api::ProjectHelper + + skip_before_action :user_setup end \ No newline at end of file diff --git a/app/controllers/api/v1/projects_controller.rb b/app/controllers/api/v1/projects_controller.rb new file mode 100644 index 000000000..05a3750ca --- /dev/null +++ b/app/controllers/api/v1/projects_controller.rb @@ -0,0 +1,11 @@ +class Api::V1::ProjectsController < Api::V1::BaseController + before_action :load_project, only: [:show] + + def index + render_ok + end + + def show + @result_object = Api::V1::Projects::GetService.call(@project, current_user.gitea_token) + end +end \ No newline at end of file diff --git a/app/controllers/api/v1/repos_controller.rb b/app/controllers/api/v1/repos_controller.rb deleted file mode 100644 index 667f47dbc..000000000 --- a/app/controllers/api/v1/repos_controller.rb +++ /dev/null @@ -1,6 +0,0 @@ -class Api::V1::ReposController < Api::V1::BaseController - - def index - render_ok - end -end \ No newline at end of file diff --git a/app/controllers/concerns/api/project_helper.rb b/app/controllers/concerns/api/project_helper.rb new file mode 100644 index 000000000..0b444c488 --- /dev/null +++ b/app/controllers/concerns/api/project_helper.rb @@ -0,0 +1,20 @@ +module Api::ProjectHelper + extend ActiveSupport::Concern + + def load_project + namespace = params[:owner] + repo = params[:repo] + + @project, @owner = Project.find_with_namespace(namespace, repo) + + if @project + logger.info "###########:project not founded" + @project + else + logger.info "###########:project not found" + @project = nil + render_not_found and return + end + @project + end +end \ No newline at end of file diff --git a/app/services/api/v1/projects/get_service.rb b/app/services/api/v1/projects/get_service.rb new file mode 100644 index 000000000..1244938ce --- /dev/null +++ b/app/services/api/v1/projects/get_service.rb @@ -0,0 +1,48 @@ +class Api::V1::Projects::GetService < ApplicationService + + attr_reader :project, :token, :owner, :repo + attr_accessor :gitea_data, :gitea_branch_tag_count + + def initialize(project, token=nil) + @project = project + @owner = project&.owner.login + @repo = project&.identifier + @token = token + end + + def call + $gitea_client.token = token unless token.blank? + load_gitea_data + load_gitea_branch_tag_count + + $gitea_client.token = nil unless token.blank? + + result_object + rescue + raise Error, "服务器错误,请联系系统管理员!" + end + + private + + def result_object + { + full_name: "#{owner}/#{repo}", + owner: project&.owner, + ssh_url: gitea_data["ssh_url"], + clone_url: gitea_data["clone_url"], + size: gitea_data["size"], + default_branch: gitea_data["default_branch"], + empty: gitea_data["empty"], + branch_count: gitea_branch_tag_count["branch_count"], + tag_count: gitea_branch_tag_count["tag_count"], + } + end + + def load_gitea_data + @gitea_data = $gitea_client.get_repos_by_owner_repo(owner, repo) + end + + def load_gitea_branch_tag_count + @gitea_branch_tag_count = $gitea_client.get_repos_branch_tag_count_by_owner_repo(owner, repo) + end +end \ No newline at end of file diff --git a/app/views/api/v1/projects/_simple_detail.json.jbuilder b/app/views/api/v1/projects/_simple_detail.json.jbuilder new file mode 100644 index 000000000..f5f6b1dbe --- /dev/null +++ b/app/views/api/v1/projects/_simple_detail.json.jbuilder @@ -0,0 +1,10 @@ +if project.present? + json.type @project.project_type + json.(project, + :description, :forked_count, :forked_from_project_id, :identifier, + :issues_count, :pull_requests_count, :invite_code, :website, :platform, + :name, :open_devops, :praises_count, :is_public, :status, :watchers_count, + :ignore_id, :license_id, :project_category_id, :project_language_id) +else + json.nil! +end \ No newline at end of file diff --git a/app/views/api/v1/projects/show.json.jbuilder b/app/views/api/v1/projects/show.json.jbuilder new file mode 100644 index 000000000..40862365c --- /dev/null +++ b/app/views/api/v1/projects/show.json.jbuilder @@ -0,0 +1,5 @@ +json.owner do + json.partial! "api/v1/users/simple_user", user: @result_object[:owner] +end +json.(@result_object, :full_name, :ssh_url, :clone_url, :default_branch, :empty, :branch_count, :tag_count) +json.partial! "api/v1/projects/simple_detail", project: @project \ No newline at end of file diff --git a/app/views/api/v1/users/_simple_user.json.jbuilder b/app/views/api/v1/users/_simple_user.json.jbuilder new file mode 100644 index 000000000..ef45bcd94 --- /dev/null +++ b/app/views/api/v1/users/_simple_user.json.jbuilder @@ -0,0 +1,9 @@ +if user.present? + json.id user.id + json.type user.type + json.name user.real_name + json.login user.login + json.image_url url_to_avatar(user) +else + json.nil! +end \ No newline at end of file diff --git a/config/routes/api.rb b/config/routes/api.rb index 718f705a6..cf55cfcf7 100644 --- a/config/routes/api.rb +++ b/config/routes/api.rb @@ -1,7 +1,21 @@ defaults format: :json do namespace :api do namespace :v1 do - resources :repos + resources :projects, only: [:index] + # 项目相关的api + scope ':owner/:repo' do + # projects + resource :projects, path: '/', only: [:show, :update, :edit, :destroy] + + # projects文件夹下的 + scope module: :projects do + resources :issues + resources :pull_requests + resources :versions + resources :release_versions + end + end + end end end \ No newline at end of file From d14bf35ca1cdca2b32d1448dd287066662b73a36 Mon Sep 17 00:00:00 2001 From: yystopf Date: Thu, 23 Jun 2022 11:33:11 +0800 Subject: [PATCH 3/9] =?UTF-8?q?=E4=BF=AE=E5=A4=8D:=20gitea=20module?= =?UTF-8?q?=E5=91=BD=E5=90=8D=E9=87=8D=E5=A4=8D=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/attachments_controller.rb | 4 ++-- app/controllers/concerns/acceleratorable.rb | 6 +++--- app/controllers/repositories_controller.rb | 12 ++++++------ app/helpers/projects_helper.rb | 2 +- app/interactors/gitea/register_interactor.rb | 4 ++-- app/libs/ci/drone/server.rb | 2 +- app/libs/{gitea.rb => gitea_service.rb} | 2 +- app/services/educoder/client_service.rb | 2 +- app/services/gitea/accelerator/base_service.rb | 2 +- app/services/gitea/client_service.rb | 4 ++-- app/services/gitea/user/delete_service.rb | 4 ++-- app/services/gitea/user/update_service.rb | 2 +- app/services/repositories/create_service.rb | 2 +- lib/tasks/sync_data_to_gitea.rake | 2 +- 14 files changed, 25 insertions(+), 25 deletions(-) rename app/libs/{gitea.rb => gitea_service.rb} (96%) diff --git a/app/controllers/attachments_controller.rb b/app/controllers/attachments_controller.rb index 3aa98257a..79047b516 100644 --- a/app/controllers/attachments_controller.rb +++ b/app/controllers/attachments_controller.rb @@ -33,8 +33,8 @@ class AttachmentsController < ApplicationController normal_status(-1, "参数缺失") if params[:download_url].blank? url = URI.encode(params[:download_url].to_s.gsub("http:", "https:")) if url.starts_with?(base_url) - domain = Gitea.gitea_config[:domain] - api_url = Gitea.gitea_config[:base_url] + domain = GiteaService.gitea_config[:domain] + api_url = GiteaService.gitea_config[:base_url] url = url.split(base_url)[1].gsub("api", "repos").gsub('?filepath=', '/').gsub('&', '?') request_url = [domain, api_url, url, "?ref=#{params[:ref]}&access_token=#{current_user&.gitea_token}"].join response = Faraday.get(request_url) diff --git a/app/controllers/concerns/acceleratorable.rb b/app/controllers/concerns/acceleratorable.rb index 5243ac538..88ec4dd63 100644 --- a/app/controllers/concerns/acceleratorable.rb +++ b/app/controllers/concerns/acceleratorable.rb @@ -18,15 +18,15 @@ module Acceleratorable end def accelerator_domain - Gitea.gitea_config[:accelerator]["domain"] + GiteaService.gitea_config[:accelerator]["domain"] end def accelerator_username - Gitea.gitea_config[:accelerator]["access_key_id"] + GiteaService.gitea_config[:accelerator]["access_key_id"] end def config_accelerator? - Gitea.gitea_config[:accelerator].present? + GiteaService.gitea_config[:accelerator].present? end def is_foreign_url?(clone_addr) diff --git a/app/controllers/repositories_controller.rb b/app/controllers/repositories_controller.rb index a2ab33b23..34ac97632 100644 --- a/app/controllers/repositories_controller.rb +++ b/app/controllers/repositories_controller.rb @@ -54,7 +54,7 @@ class RepositoriesController < ApplicationController else @entries = Gitea::Repository::Entries::ListService.new(@owner, @project.identifier, ref: @ref).call @entries = @entries.present? ? @entries.sort_by{ |hash| hash['type'] } : [] - @path = Gitea.gitea_config[:domain]+"/#{@project.owner.login}/#{@project.identifier}/raw/branch/#{@ref}/" + @path = GiteaService.gitea_config[:domain]+"/#{@project.owner.login}/#{@project.identifier}/raw/branch/#{@ref}/" end end @@ -222,7 +222,7 @@ class RepositoriesController < ApplicationController else result = Gitea::Repository::Readme::GetService.call(@owner.login, @repository.identifier, params[:ref], current_user&.gitea_token) end - @path = Gitea.gitea_config[:domain]+"/#{@owner.login}/#{@repository.identifier}/raw/branch/#{params[:ref]}/" + @path = GiteaService.gitea_config[:domain]+"/#{@owner.login}/#{@repository.identifier}/raw/branch/#{params[:ref]}/" @readme = result[:status] === :success ? result[:body] : nil @readme['content'] = decode64_content(@readme, @owner, @repository, params[:ref], @path) @readme['replace_content'] = readme_decode64_content(@readme, @owner, @repository, params[:ref], @path) @@ -240,8 +240,8 @@ class RepositoriesController < ApplicationController end def archive - domain = Gitea.gitea_config[:domain] - api_url = Gitea.gitea_config[:base_url] + domain = GiteaService.gitea_config[:domain] + api_url = GiteaService.gitea_config[:base_url] archive_url = "/repos/#{@owner.login}/#{@repository.identifier}/archive/#{Addressable::URI.escape(params[:archive])}" file_path = [domain, api_url, archive_url].join @@ -253,8 +253,8 @@ class RepositoriesController < ApplicationController end def raw - domain = Gitea.gitea_config[:domain] - api_url = Gitea.gitea_config[:base_url] + domain = GiteaService.gitea_config[:domain] + api_url = GiteaService.gitea_config[:base_url] url = "/repos/#{@owner.login}/#{@repository.identifier}/raw/#{Addressable::URI.escape(params[:filepath])}?ref=#{Addressable::URI.escape(params[:ref])}" file_path = [domain, api_url, url].join diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb index cc4a3fe02..0dcb6ca12 100644 --- a/app/helpers/projects_helper.rb +++ b/app/helpers/projects_helper.rb @@ -30,7 +30,7 @@ module ProjectsHelper end def gitea_domain - Gitea.gitea_config[:domain] + GiteaService.gitea_config[:domain] end def find_user_by_login_or_mail(identifier) diff --git a/app/interactors/gitea/register_interactor.rb b/app/interactors/gitea/register_interactor.rb index e188809ac..ebb2bc4af 100644 --- a/app/interactors/gitea/register_interactor.rb +++ b/app/interactors/gitea/register_interactor.rb @@ -44,8 +44,8 @@ module Gitea def token { - username: Gitea.gitea_config[:access_key_id], - password: Gitea.gitea_config[:access_key_secret] + username: GiteaService.gitea_config[:access_key_id], + password: GiteaService.gitea_config[:access_key_secret] } end end diff --git a/app/libs/ci/drone/server.rb b/app/libs/ci/drone/server.rb index add2e4392..de23dd738 100644 --- a/app/libs/ci/drone/server.rb +++ b/app/libs/ci/drone/server.rb @@ -37,7 +37,7 @@ class Ci::Drone::Server private def gitea_url - Gitea.gitea_config[:domain] + GiteaService.gitea_config[:domain] end def database_username diff --git a/app/libs/gitea.rb b/app/libs/gitea_service.rb similarity index 96% rename from app/libs/gitea.rb rename to app/libs/gitea_service.rb index 6679b89d6..b44f79487 100644 --- a/app/libs/gitea.rb +++ b/app/libs/gitea_service.rb @@ -1,4 +1,4 @@ -module Gitea +module GiteaService class << self def gitea_config gitea_config = {} diff --git a/app/services/educoder/client_service.rb b/app/services/educoder/client_service.rb index 6c5c10d99..1e77ad89b 100644 --- a/app/services/educoder/client_service.rb +++ b/app/services/educoder/client_service.rb @@ -81,7 +81,7 @@ class Educoder::ClientService < ApplicationService end def access_key_secret - Gitea.gitea_config[:access_key_secret] + GiteaService.gitea_config[:access_key_secret] end def api_url(url) diff --git a/app/services/gitea/accelerator/base_service.rb b/app/services/gitea/accelerator/base_service.rb index e63d77aab..9a66eb2bd 100644 --- a/app/services/gitea/accelerator/base_service.rb +++ b/app/services/gitea/accelerator/base_service.rb @@ -56,7 +56,7 @@ class Gitea::Accelerator::BaseService < ApplicationService end def accelerator - Gitea.gitea_config[:accelerator] + GiteaService.gitea_config[:accelerator] end def render_status(response) diff --git a/app/services/gitea/client_service.rb b/app/services/gitea/client_service.rb index b0c842db1..e2bd9d491 100644 --- a/app/services/gitea/client_service.rb +++ b/app/services/gitea/client_service.rb @@ -96,11 +96,11 @@ class Gitea::ClientService < ApplicationService end def base_url - Gitea.gitea_config[:base_url] + GiteaService.gitea_config[:base_url] end def domain - Gitea.gitea_config[:domain] + GiteaService.gitea_config[:domain] end def api_url diff --git a/app/services/gitea/user/delete_service.rb b/app/services/gitea/user/delete_service.rb index 5df3cb6b2..9011158d2 100644 --- a/app/services/gitea/user/delete_service.rb +++ b/app/services/gitea/user/delete_service.rb @@ -14,8 +14,8 @@ class Gitea::User::DeleteService < Gitea::ClientService private def token { - username: Gitea.gitea_config[:access_key_id], - password: Gitea.gitea_config[:access_key_secret] + username: GiteaService.gitea_config[:access_key_id], + password: GiteaService.gitea_config[:access_key_secret] } end diff --git a/app/services/gitea/user/update_service.rb b/app/services/gitea/user/update_service.rb index 5e6108a9b..9826c7ed0 100644 --- a/app/services/gitea/user/update_service.rb +++ b/app/services/gitea/user/update_service.rb @@ -17,7 +17,7 @@ class Gitea::User::UpdateService < Gitea::ClientService # source_id integer($int64) # website string - def initialize(edit_username, params={}, token={username: Gitea.gitea_config[:access_key_id], password: Gitea.gitea_config[:access_key_secret]}) + def initialize(edit_username, params={}, token={username: GiteaService.gitea_config[:access_key_id], password: GiteaService.gitea_config[:access_key_secret]}) @token = token @params = params @edit_username = edit_username diff --git a/app/services/repositories/create_service.rb b/app/services/repositories/create_service.rb index f0c584e18..e7ff8bd1d 100644 --- a/app/services/repositories/create_service.rb +++ b/app/services/repositories/create_service.rb @@ -63,7 +63,7 @@ class Repositories::CreateService < ApplicationService end def remote_repository_url - [Gitea.gitea_config[:domain], '/', user.login, '/', params[:identifier], ".git"].join("") + [GiteaService.gitea_config[:domain], '/', user.login, '/', params[:identifier], ".git"].join("") end def repository_params diff --git a/lib/tasks/sync_data_to_gitea.rake b/lib/tasks/sync_data_to_gitea.rake index 9e30b290c..85df9c69a 100644 --- a/lib/tasks/sync_data_to_gitea.rake +++ b/lib/tasks/sync_data_to_gitea.rake @@ -128,7 +128,7 @@ namespace :sync_data_to_gitea do end def remote_repository_url(username, identifier) - [Gitea.gitea_config[:domain], '/', username, '/', identifier, ".git"].join("") + [GiteaService.gitea_config[:domain], '/', username, '/', identifier, ".git"].join("") end def generate_identifier From 5d0849a1483413d1c0cb0cc75d76faaf2a651279 Mon Sep 17 00:00:00 2001 From: yystopf Date: Thu, 23 Jun 2022 12:19:03 +0800 Subject: [PATCH 4/9] =?UTF-8?q?=E6=96=B0=E5=A2=9E:=20=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E5=88=97=E8=A1=A8=E4=BB=A5=E5=8F=8Ahelper?= =?UTF-8?q?=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/api/v1/base_controller.rb | 7 ++++ .../api/v1/users/projects_controller.rb | 7 ++++ app/controllers/api/v1/users_controller.rb | 6 ++++ app/controllers/concerns/api/user_helper.rb | 19 +++++++++++ .../v1/projects/_simple_detail.json.jbuilder | 2 +- .../api/v1/users/projects/index.json.jbuilder | 5 +++ config/routes/api.rb | 33 ++++++++++++------- 7 files changed, 66 insertions(+), 13 deletions(-) create mode 100644 app/controllers/api/v1/users/projects_controller.rb create mode 100644 app/controllers/api/v1/users_controller.rb create mode 100644 app/controllers/concerns/api/user_helper.rb create mode 100644 app/views/api/v1/users/projects/index.json.jbuilder diff --git a/app/controllers/api/v1/base_controller.rb b/app/controllers/api/v1/base_controller.rb index 2202df8d2..4fb6c8759 100644 --- a/app/controllers/api/v1/base_controller.rb +++ b/app/controllers/api/v1/base_controller.rb @@ -1,6 +1,13 @@ class Api::V1::BaseController < ApplicationController include Api::ProjectHelper + include Api::UserHelper + before_action :doorkeeper_authorize! skip_before_action :user_setup + + protected + def current_user + User.find(doorkeeper_token.resource_owner_id) if doorkeeper_token + end end \ No newline at end of file diff --git a/app/controllers/api/v1/users/projects_controller.rb b/app/controllers/api/v1/users/projects_controller.rb new file mode 100644 index 000000000..d130071af --- /dev/null +++ b/app/controllers/api/v1/users/projects_controller.rb @@ -0,0 +1,7 @@ +class Api::V1::Users::ProjectsController < Api::V1::BaseController + before_action :load_observe_user + + def index + @projects = kaminari_paginate(@observe_user.projects) + end +end \ No newline at end of file diff --git a/app/controllers/api/v1/users_controller.rb b/app/controllers/api/v1/users_controller.rb new file mode 100644 index 000000000..55f5cfb22 --- /dev/null +++ b/app/controllers/api/v1/users_controller.rb @@ -0,0 +1,6 @@ +class Api::V1::UsersController < Api::V1::BaseController + + def index + render_ok + end +end \ No newline at end of file diff --git a/app/controllers/concerns/api/user_helper.rb b/app/controllers/concerns/api/user_helper.rb new file mode 100644 index 000000000..e6156ea56 --- /dev/null +++ b/app/controllers/concerns/api/user_helper.rb @@ -0,0 +1,19 @@ +module Api::UserHelper + extend ActiveSupport::Concern + + def load_observe_user + username = params[:owner] + + @observe_user = User.find_by(login: username) + + if @observe_user + logger.info "###########observe_user not founded" + @observe_user + else + logger.info "###########observe_user not found" + @observe_user = nil + render_not_found and return + end + @observe_user + end +end \ No newline at end of file diff --git a/app/views/api/v1/projects/_simple_detail.json.jbuilder b/app/views/api/v1/projects/_simple_detail.json.jbuilder index f5f6b1dbe..3eadaaf8f 100644 --- a/app/views/api/v1/projects/_simple_detail.json.jbuilder +++ b/app/views/api/v1/projects/_simple_detail.json.jbuilder @@ -1,5 +1,5 @@ if project.present? - json.type @project.project_type + json.type project.project_type json.(project, :description, :forked_count, :forked_from_project_id, :identifier, :issues_count, :pull_requests_count, :invite_code, :website, :platform, diff --git a/app/views/api/v1/users/projects/index.json.jbuilder b/app/views/api/v1/users/projects/index.json.jbuilder new file mode 100644 index 000000000..c126d414f --- /dev/null +++ b/app/views/api/v1/users/projects/index.json.jbuilder @@ -0,0 +1,5 @@ +json.total_count @projects.total_count + +json.projects @projects do |project| + json.partial! "api/v1/projects/simple_detail", project: project +end \ No newline at end of file diff --git a/config/routes/api.rb b/config/routes/api.rb index cf55cfcf7..5cefe7930 100644 --- a/config/routes/api.rb +++ b/config/routes/api.rb @@ -1,20 +1,29 @@ defaults format: :json do namespace :api do namespace :v1 do - resources :projects, only: [:index] - # 项目相关的api - scope ':owner/:repo' do - # projects - resource :projects, path: '/', only: [:show, :update, :edit, :destroy] - - # projects文件夹下的 - scope module: :projects do - resources :issues - resources :pull_requests - resources :versions - resources :release_versions + scope ':owner' do + resource :users, path: '/', only: [:show, :update, :edit, :destroy] + scope module: :users do + resources :projects, only: [:index] end + + scope ':repo' do + # projects + resource :projects, path: '/', only: [:show, :update, :edit, :destroy] + + # projects文件夹下的 + scope module: :projects do + resources :issues + resources :pull_requests + resources :versions + resources :release_versions + end + end + end + + resources :projects, only: [:index] + end end From fe58175ee081edb23d274441574835842c874ddb Mon Sep 17 00:00:00 2001 From: yystopf Date: Thu, 23 Jun 2022 16:14:00 +0800 Subject: [PATCH 5/9] =?UTF-8?q?=E6=96=B0=E5=A2=9E:=20webhooks=E4=BD=BF?= =?UTF-8?q?=E7=94=A8token=E8=AE=BF=E9=97=AE=E7=9A=84=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Gemfile | 2 +- Gemfile.lock | 4 +- .../api/v1/projects/webhooks_controller.rb | 55 +++++++++++++++++ .../v1/projects/webhooks/create_service.rb | 60 ++++++++++++++++++ .../v1/projects/webhooks/delete_service.rb | 30 +++++++++ .../api/v1/projects/webhooks/get_service.rb | 30 +++++++++ .../v1/projects/webhooks/hooktasks_service.rb | 30 +++++++++ .../api/v1/projects/webhooks/list_service.rb | 29 +++++++++ .../api/v1/projects/webhooks/tests_service.rb | 30 +++++++++ .../v1/projects/webhooks/update_service.rb | 61 +++++++++++++++++++ .../webhooks/_simple_detail.json.jbuilder | 3 + .../_simple_gitea_detail.json.jbuilder | 8 +++ .../v1/projects/webhooks/create.json.jbuilder | 1 + .../projects/webhooks/hooktasks.json.jbuilder | 6 ++ .../v1/projects/webhooks/index.json.jbuilder | 4 ++ .../v1/projects/webhooks/show.json.jbuilder | 1 + .../v1/projects/webhooks/update.json.jbuilder | 1 + config/routes/api.rb | 6 ++ 18 files changed, 358 insertions(+), 3 deletions(-) create mode 100644 app/controllers/api/v1/projects/webhooks_controller.rb create mode 100644 app/services/api/v1/projects/webhooks/create_service.rb create mode 100644 app/services/api/v1/projects/webhooks/delete_service.rb create mode 100644 app/services/api/v1/projects/webhooks/get_service.rb create mode 100644 app/services/api/v1/projects/webhooks/hooktasks_service.rb create mode 100644 app/services/api/v1/projects/webhooks/list_service.rb create mode 100644 app/services/api/v1/projects/webhooks/tests_service.rb create mode 100644 app/services/api/v1/projects/webhooks/update_service.rb create mode 100644 app/views/api/v1/projects/webhooks/_simple_detail.json.jbuilder create mode 100644 app/views/api/v1/projects/webhooks/_simple_gitea_detail.json.jbuilder create mode 100644 app/views/api/v1/projects/webhooks/create.json.jbuilder create mode 100644 app/views/api/v1/projects/webhooks/hooktasks.json.jbuilder create mode 100644 app/views/api/v1/projects/webhooks/index.json.jbuilder create mode 100644 app/views/api/v1/projects/webhooks/show.json.jbuilder create mode 100644 app/views/api/v1/projects/webhooks/update.json.jbuilder diff --git a/Gemfile b/Gemfile index 1542856cf..1b3ff3e0c 100644 --- a/Gemfile +++ b/Gemfile @@ -135,4 +135,4 @@ gem 'doorkeeper' gem 'doorkeeper-jwt' -gem 'gitea-client', '~> 0.6.2' \ No newline at end of file +gem 'gitea-client', '~> 0.8.1' \ No newline at end of file diff --git a/Gemfile.lock b/Gemfile.lock index 467e19a2d..e231bbef7 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -135,7 +135,7 @@ GEM fugit (1.4.1) et-orbi (~> 1.1, >= 1.1.8) raabro (~> 1.4) - gitea-client (0.6.2) + gitea-client (0.8.1) rest-client (~> 2.1.0) globalid (0.4.2) activesupport (>= 4.2.0) @@ -478,7 +478,7 @@ DEPENDENCIES enumerize faraday (~> 0.15.4) font-awesome-sass (= 4.7.0) - gitea-client (~> 0.6.2) + gitea-client (~> 0.8.1) grape-entity (~> 0.7.1) groupdate (~> 4.1.0) harmonious_dictionary (~> 0.0.1) diff --git a/app/controllers/api/v1/projects/webhooks_controller.rb b/app/controllers/api/v1/projects/webhooks_controller.rb new file mode 100644 index 000000000..bb828a70e --- /dev/null +++ b/app/controllers/api/v1/projects/webhooks_controller.rb @@ -0,0 +1,55 @@ +class Api::V1::Projects::WebhooksController < Api::V1::BaseController + before_action :load_project + before_action :find_webhook, only: [:show, :update, :destroy, :tests, :hooktasks] + + def index + # @result_object = Api::V1::Projects::Webhooks::ListService.call(@project, current_user&.gitea_token) + @webhooks = @project.webhooks + @webhooks = kaminari_paginate(@webhooks) + end + + def create + @result_object = Api::V1::Projects::Webhooks::CreateService.call(@project, webhook_params, current_user&.gitea_token) + end + + def show + @result_object = Api::V1::Projects::Webhooks::GetService.call(@project, params[:id], current_user&.gitea_token) + end + + def update + @result_object = Api::V1::Projects::Webhooks::UpdateService.call(@project, params[:id], webhook_params, current_user&.gitea_token) + end + + def destroy + @result_object = Api::V1::Projects::Webhooks::DeleteService.call(@project, params[:id], current_user&.gitea_token) + if @result_object + return render_ok + else + return render_error('删除失败!') + end + end + + def tests + @result_object = Api::V1::Projects::Webhooks::TestsService.call(@project, params[:id], current_user&.gitea_token) + if @result_object + return render_ok + else + return render_error('推送失败!') + end + end + + def hooktasks + @hooktasks = @webhook.tasks.where(is_delivered: true).order("delivered desc") + @hooktasks = kaminari_paginate(@hooktasks) + end + + private + def webhook_params + params.require(:webhook).permit(:active, :branch_filter, :http_method, :url, :content_type, :secret, events: []) + end + + def find_webhook + @webhook = Gitea::Webhook.find_by_id(params[:id]) + return render_not_found unless @webhook.present? + end +end \ No newline at end of file diff --git a/app/services/api/v1/projects/webhooks/create_service.rb b/app/services/api/v1/projects/webhooks/create_service.rb new file mode 100644 index 000000000..401ff9ff6 --- /dev/null +++ b/app/services/api/v1/projects/webhooks/create_service.rb @@ -0,0 +1,60 @@ +class Api::V1::Projects::Webhooks::CreateService < ApplicationService + include ActiveModel::Model + + attr_reader :project, :token, :owner, :repo, :active, :branch_filter, :content_type, :url, :http_method, :secret, :events + attr_accessor :gitea_data + + validates :url, format: { with: URI::regexp(%w[http https]), message: "请输入正确的地址" } + validates :active, inclusion: {in: [true, false]} + validates :http_method, inclusion: { in: %w(POST GET), message: "请输入正确的请求方式"} + validates :content_type, inclusion: { in: %w(json form), message: "请输入正确的Content Type"} + + def initialize(project, params, token=nil) + @project = project + @owner = project&.owner.login + @repo = project&.identifier + @active = params[:active] + @branch_filter = params[:branch_filter] + @content_type = params[:content_type] + @url = params[:url] + @http_method = params[:http_method] + @secret = params[:secret] + @events = params[:events] + @token = token + end + + def call + raise Error, errors.full_messages.join(",") unless valid? + begin + $gitea_client.token = token unless token.blank? + + excute_data_to_gitea + + $gitea_client.token = nil unless token.blank? + + gitea_data + rescue + raise Error, "服务器错误,请联系系统管理员!" + end + end + + private + def request_body + { + active: active, + branch_filter: branch_filter, + config: { + content_type: content_type, + url: url, + http_method: http_method, + secret: secret + }, + events: events || [], + type: 'gitea', + } + end + + def excute_data_to_gitea + @gitea_data = $gitea_client.post_repos_hooks_by_owner_repo(owner, repo, {body: request_body.to_json}) + end +end \ No newline at end of file diff --git a/app/services/api/v1/projects/webhooks/delete_service.rb b/app/services/api/v1/projects/webhooks/delete_service.rb new file mode 100644 index 000000000..53fd8edd4 --- /dev/null +++ b/app/services/api/v1/projects/webhooks/delete_service.rb @@ -0,0 +1,30 @@ +class Api::V1::Projects::Webhooks::DeleteService < ApplicationService + + attr_reader :project, :id, :token, :owner, :repo + attr_accessor :gitea_data + + def initialize(project, id, token=nil) + @project = project + @id = id + @owner = project&.owner.login + @repo = project&.identifier + @token = token + end + + def call + $gitea_client.token = token unless token.blank? + excute_data_to_gitea + + $gitea_client.token = nil unless token.blank? + + gitea_data + # rescue + # raise Error, "服务器错误,请联系系统管理员!" + end + + private + + def excute_data_to_gitea + @gitea_data = $gitea_client.delete_repos_hooks_by_owner_repo_id(owner, repo, id) + end +end \ No newline at end of file diff --git a/app/services/api/v1/projects/webhooks/get_service.rb b/app/services/api/v1/projects/webhooks/get_service.rb new file mode 100644 index 000000000..1ae5c54e2 --- /dev/null +++ b/app/services/api/v1/projects/webhooks/get_service.rb @@ -0,0 +1,30 @@ +class Api::V1::Projects::Webhooks::GetService < ApplicationService + + attr_reader :project, :id, :token, :owner, :repo + attr_accessor :gitea_data + + def initialize(project, id, token=nil) + @project = project + @id = id + @owner = project&.owner.login + @repo = project&.identifier + @token = token + end + + def call + $gitea_client.token = token unless token.blank? + load_gitea_data + + $gitea_client.token = nil unless token.blank? + + gitea_data + rescue + raise Error, "服务器错误,请联系系统管理员!" + end + + private + + def load_gitea_data + @gitea_data = $gitea_client.get_repos_hooks_by_owner_repo_id(owner, repo, id) + end +end \ No newline at end of file diff --git a/app/services/api/v1/projects/webhooks/hooktasks_service.rb b/app/services/api/v1/projects/webhooks/hooktasks_service.rb new file mode 100644 index 000000000..4dd90ee3e --- /dev/null +++ b/app/services/api/v1/projects/webhooks/hooktasks_service.rb @@ -0,0 +1,30 @@ +class Api::V1::Projects::Webhooks::ListService < ApplicationService + + attr_reader :project, :id, :token, :owner, :repo + attr_accessor :gitea_data + + def initialize(project, id, token=nil) + @project = project + @id = id + @owner = project&.owner.login + @repo = project&.identifier + @token = token + end + + def call + $gitea_client.token = token unless token.blank? + load_gitea_data + + $gitea_client.token = nil unless token.blank? + + gitea_data + rescue + raise Error, "服务器错误,请联系系统管理员!" + end + + private + + def load_gitea_data + @gitea_data = $gitea_client.get_repos_hooks_hooktasks_by_owner_repo(owner, repo, id) + end +end \ No newline at end of file diff --git a/app/services/api/v1/projects/webhooks/list_service.rb b/app/services/api/v1/projects/webhooks/list_service.rb new file mode 100644 index 000000000..fb746de48 --- /dev/null +++ b/app/services/api/v1/projects/webhooks/list_service.rb @@ -0,0 +1,29 @@ +class Api::V1::Projects::Webhooks::ListService < ApplicationService + + attr_reader :project, :token, :owner, :repo + attr_accessor :gitea_data + + def initialize(project, token=nil) + @project = project + @owner = project&.owner.login + @repo = project&.identifier + @token = token + end + + def call + $gitea_client.token = token unless token.blank? + load_gitea_data + + $gitea_client.token = nil unless token.blank? + + gitea_data + rescue + raise Error, "服务器错误,请联系系统管理员!" + end + + private + + def load_gitea_data + @gitea_data = $gitea_client.get_repos_hooks_by_owner_repo(owner, repo) + end +end \ No newline at end of file diff --git a/app/services/api/v1/projects/webhooks/tests_service.rb b/app/services/api/v1/projects/webhooks/tests_service.rb new file mode 100644 index 000000000..3d8b99c97 --- /dev/null +++ b/app/services/api/v1/projects/webhooks/tests_service.rb @@ -0,0 +1,30 @@ +class Api::V1::Projects::Webhooks::TestsService < ApplicationService + + attr_reader :project, :id, :token, :owner, :repo + attr_accessor :gitea_data + + def initialize(project, id, token=nil) + @project = project + @id = id + @owner = project&.owner.login + @repo = project&.identifier + @token = token + end + + def call + $gitea_client.token = token unless token.blank? + excute_data_to_gitea + + $gitea_client.token = nil unless token.blank? + + gitea_data + rescue + raise Error, "服务器错误,请联系系统管理员!" + end + + private + + def excute_data_to_gitea + @gitea_data = $gitea_client.post_repos_hooks_tests_by_owner_repo_id(owner, repo, id) + end +end \ No newline at end of file diff --git a/app/services/api/v1/projects/webhooks/update_service.rb b/app/services/api/v1/projects/webhooks/update_service.rb new file mode 100644 index 000000000..19ff4f32b --- /dev/null +++ b/app/services/api/v1/projects/webhooks/update_service.rb @@ -0,0 +1,61 @@ +class Api::V1::Projects::Webhooks::UpdateService < ApplicationService + include ActiveModel::Model + + attr_reader :project, :id, :token, :owner, :repo, :active, :branch_filter, :content_type, :url, :http_method, :secret, :events + attr_accessor :gitea_data + + validates :url, format: { with: URI::regexp(%w[http https]), message: "请输入正确的地址" } + validates :active, inclusion: {in: [true, false]} + validates :http_method, inclusion: { in: %w(POST GET), message: "请输入正确的请求方式"} + validates :content_type, inclusion: { in: %w(json form), message: "请输入正确的Content Type"} + + def initialize(project, id, params, token=nil) + @project = project + @id = id + @owner = project&.owner.login + @repo = project&.identifier + @active = params[:active] + @branch_filter = params[:branch_filter] + @content_type = params[:content_type] + @url = params[:url] + @http_method = params[:http_method] + @secret = params[:secret] + @events = params[:events] + @token = token + end + + def call + raise Error, errors.full_messages.join(",") unless valid? + begin + $gitea_client.token = token unless token.blank? + + excute_data_to_gitea + + $gitea_client.token = nil unless token.blank? + + gitea_data + rescue + raise Error, "服务器错误,请联系系统管理员!" + end + end + + private + def request_body + { + active: active, + branch_filter: branch_filter, + config: { + content_type: content_type, + url: url, + http_method: http_method, + secret: secret + }, + events: events || [], + type: 'gitea', + } + end + + def excute_data_to_gitea + @gitea_data = $gitea_client.patch_repos_hooks_by_owner_repo_id(owner, repo, id, {body: request_body.to_json}) + end +end \ No newline at end of file diff --git a/app/views/api/v1/projects/webhooks/_simple_detail.json.jbuilder b/app/views/api/v1/projects/webhooks/_simple_detail.json.jbuilder new file mode 100644 index 000000000..145b3e59b --- /dev/null +++ b/app/views/api/v1/projects/webhooks/_simple_detail.json.jbuilder @@ -0,0 +1,3 @@ +json.(webhook, :id, :url, :http_method, :is_active) +json.last_status webhook.last_status +json.create_time Time.at(webhook.created_unix).strftime("%Y-%m-%d %H:%M:%S") \ No newline at end of file diff --git a/app/views/api/v1/projects/webhooks/_simple_gitea_detail.json.jbuilder b/app/views/api/v1/projects/webhooks/_simple_gitea_detail.json.jbuilder new file mode 100644 index 000000000..ca180d8b1 --- /dev/null +++ b/app/views/api/v1/projects/webhooks/_simple_gitea_detail.json.jbuilder @@ -0,0 +1,8 @@ +json.id webhook["id"] +json.content_type webhook['config']['content_type'] +json.http_method webhook['config']['http_method'] +json.url webhook['config']['url'] +json.events webhook['events'] +json.active webhook['active'] +json.branch_filter webhook['branch_filter'] +json.created_at format_time(webhook['created_at'].to_time) \ No newline at end of file diff --git a/app/views/api/v1/projects/webhooks/create.json.jbuilder b/app/views/api/v1/projects/webhooks/create.json.jbuilder new file mode 100644 index 000000000..01f91963d --- /dev/null +++ b/app/views/api/v1/projects/webhooks/create.json.jbuilder @@ -0,0 +1 @@ +json.partial! "api/v1/projects/webhooks/simple_gitea_detail", webhook: @result_object \ No newline at end of file diff --git a/app/views/api/v1/projects/webhooks/hooktasks.json.jbuilder b/app/views/api/v1/projects/webhooks/hooktasks.json.jbuilder new file mode 100644 index 000000000..618a05515 --- /dev/null +++ b/app/views/api/v1/projects/webhooks/hooktasks.json.jbuilder @@ -0,0 +1,6 @@ +json.total_count @hooktasks.total_count +json.hooktasks @hooktasks.each do |task| + json.(task, :id, :event_type, :type, :uuid, :is_succeed, :is_delivered, :payload_content, :request_content) + json.response_content task.response_content_json + json.delivered_time Time.at(task.delivered*10**-9).strftime("%Y-%m-%d %H:%M:%S") +end \ No newline at end of file diff --git a/app/views/api/v1/projects/webhooks/index.json.jbuilder b/app/views/api/v1/projects/webhooks/index.json.jbuilder new file mode 100644 index 000000000..7a375619e --- /dev/null +++ b/app/views/api/v1/projects/webhooks/index.json.jbuilder @@ -0,0 +1,4 @@ +json.total_count @webhooks.total_count +json.webhooks @webhooks do |webhook| + json.partial! "api/v1/projects/webhooks/simple_detail", webhook: webhook +end \ No newline at end of file diff --git a/app/views/api/v1/projects/webhooks/show.json.jbuilder b/app/views/api/v1/projects/webhooks/show.json.jbuilder new file mode 100644 index 000000000..01f91963d --- /dev/null +++ b/app/views/api/v1/projects/webhooks/show.json.jbuilder @@ -0,0 +1 @@ +json.partial! "api/v1/projects/webhooks/simple_gitea_detail", webhook: @result_object \ No newline at end of file diff --git a/app/views/api/v1/projects/webhooks/update.json.jbuilder b/app/views/api/v1/projects/webhooks/update.json.jbuilder new file mode 100644 index 000000000..01f91963d --- /dev/null +++ b/app/views/api/v1/projects/webhooks/update.json.jbuilder @@ -0,0 +1 @@ +json.partial! "api/v1/projects/webhooks/simple_gitea_detail", webhook: @result_object \ No newline at end of file diff --git a/config/routes/api.rb b/config/routes/api.rb index 5cefe7930..32acdabd4 100644 --- a/config/routes/api.rb +++ b/config/routes/api.rb @@ -17,6 +17,12 @@ defaults format: :json do resources :pull_requests resources :versions resources :release_versions + resources :webhooks do + member do + post :tests + get :hooktasks + end + end end end From 7cad953413e5282de00bb8c666ada9e204313a4b Mon Sep 17 00:00:00 2001 From: yystopf Date: Thu, 23 Jun 2022 18:16:57 +0800 Subject: [PATCH 6/9] =?UTF-8?q?=E6=96=B0=E5=A2=9E:=20=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E5=88=97=E8=A1=A8=E6=94=AF=E6=8C=81=E5=A4=9A?= =?UTF-8?q?=E4=B8=AA=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/api/v1/base_controller.rb | 5 ++ .../api/v1/projects/webhooks_controller.rb | 2 +- .../api/v1/users/projects_controller.rb | 8 +- .../api/v1/users/projects/list_service.rb | 79 +++++++++++++++++++ .../api/v1/users/projects/index.json.jbuilder | 3 + 5 files changed, 95 insertions(+), 2 deletions(-) create mode 100644 app/services/api/v1/users/projects/list_service.rb diff --git a/app/controllers/api/v1/base_controller.rb b/app/controllers/api/v1/base_controller.rb index 4fb6c8759..9170975b5 100644 --- a/app/controllers/api/v1/base_controller.rb +++ b/app/controllers/api/v1/base_controller.rb @@ -10,4 +10,9 @@ class Api::V1::BaseController < ApplicationController def current_user User.find(doorkeeper_token.resource_owner_id) if doorkeeper_token end + + def require_manager_above + @project = load_project + return render_forbidden unless current_user.admin? && @project.manager?(current_user) + end end \ No newline at end of file diff --git a/app/controllers/api/v1/projects/webhooks_controller.rb b/app/controllers/api/v1/projects/webhooks_controller.rb index bb828a70e..bb2c2172c 100644 --- a/app/controllers/api/v1/projects/webhooks_controller.rb +++ b/app/controllers/api/v1/projects/webhooks_controller.rb @@ -1,5 +1,5 @@ class Api::V1::Projects::WebhooksController < Api::V1::BaseController - before_action :load_project + before_action :require_manager_above before_action :find_webhook, only: [:show, :update, :destroy, :tests, :hooktasks] def index diff --git a/app/controllers/api/v1/users/projects_controller.rb b/app/controllers/api/v1/users/projects_controller.rb index d130071af..ac4b48324 100644 --- a/app/controllers/api/v1/users/projects_controller.rb +++ b/app/controllers/api/v1/users/projects_controller.rb @@ -2,6 +2,12 @@ class Api::V1::Users::ProjectsController < Api::V1::BaseController before_action :load_observe_user def index - @projects = kaminari_paginate(@observe_user.projects) + @object_results = Api::V1::Users::Projects::ListService.call(@observe_user, query_params, current_user) + @projects = kaminari_paginate(@object_results) + end + + private + def query_params + params.permit(:category, :is_public, :project_type, :sort_by, :sort_direction, :search) end end \ No newline at end of file diff --git a/app/services/api/v1/users/projects/list_service.rb b/app/services/api/v1/users/projects/list_service.rb new file mode 100644 index 000000000..32884ac78 --- /dev/null +++ b/app/services/api/v1/users/projects/list_service.rb @@ -0,0 +1,79 @@ +class Api::V1::Users::Projects::ListService < ApplicationService + include ActiveModel::Model + + attr_reader :observe_user, :category, :is_public, :project_type, :sort_by, :sort_direction, :search, :current_user + attr_accessor :queried_projects + + validates :category, inclusion: {in: %w(all join created watched forked), message: "请输入正确的Category"} + validates :is_public, inclusion: {in: [true, false], message: '请输入正确的IsPublic'} + validates :project_type, inclusion: {in: %w(common mirror sync_mirror), message: '请输入正确的ProjectType'}, allow_nil: true + validates :sort_by, inclusion: {in: Project.column_names, message: '请输入正确的SortBy'} + validates :sort_direction, inclusion: {in: %w(asc desc), message: '请输入正确的SortDirection'} + + def initialize(observe_user, params, current_user=nil) + @observe_user = observe_user + @category = params[:category] || 'all' + @is_public = params[:is_public] || true + @project_type = params[:project_type] + @sort_by = params[:sort_by] || 'updated_on' + @sort_direction = params[:sort_direction] || 'desc' + @search = params[:search] + @current_user = current_user + end + + def call + raise Error, errors.full_messages.join(", ") unless valid? + # begin + project_query_data + + queried_projects + # rescue + # raise Error, "服务器错误,请联系系统管理员!" + # end + end + + private + def project_query_data + if current_user.admin? + projects = Project + else + projects = Project.visible + end + + case category + when 'join' + normal_projects = projects.where.not(user_id: observe_user.id).members_projects(observe_user.id).to_sql + org_projects = projects.joins(team_projects: [team: :team_users]).where(team_users: {user_id: observe_user.id}).to_sql + projects = Project.from("( #{normal_projects} UNION #{org_projects} ) AS projects").distinct + when 'created' + projects = projects.where(user_id: observe_user.id) + when 'watched' + projects = projects.where.not(user_id: observe_user.id).joins(:watchers).where(watchers: {watchable_type: "Project", user_id: observe_user.id}) + when 'forked' + fork_ids = observe_user.fork_users.select(:id, :fork_project_id).pluck(:fork_project_id) + projects = projects.where(id: fork_ids) + else + normal_projects = projects.members_projects(observe_user.id).to_sql + org_projects = projects.joins(team_projects: [team: :team_users]).where(team_users: {user_id: observe_user.id}).to_sql + projects = Project.from("( #{ normal_projects} UNION #{ org_projects } ) AS projects").distinct + end + + if is_public + projects = projects.visible + else + projects = projects.is_private + end + + projects = projects.with_project_type(project_type) + + q = projects.ransack(name_or_identifier_cont: search) + + scope = q.result.includes(:project_category, :project_language,:owner, :repository, :has_pinned_users) + + + scope = scope.order("projects.#{sort_by} #{sort_direction}") + + @queried_projects = scope + end + +end \ No newline at end of file diff --git a/app/views/api/v1/users/projects/index.json.jbuilder b/app/views/api/v1/users/projects/index.json.jbuilder index c126d414f..5450d2dd7 100644 --- a/app/views/api/v1/users/projects/index.json.jbuilder +++ b/app/views/api/v1/users/projects/index.json.jbuilder @@ -1,5 +1,8 @@ json.total_count @projects.total_count json.projects @projects do |project| + json.owner do + json.partial! "api/v1/users/simple_user", user: project.owner + end json.partial! "api/v1/projects/simple_detail", project: project end \ No newline at end of file From 211581cef0ffababcf9b30f0090f3f35bd4da478 Mon Sep 17 00:00:00 2001 From: yystopf Date: Fri, 24 Jun 2022 09:26:01 +0800 Subject: [PATCH 7/9] =?UTF-8?q?=E6=96=B0=E5=A2=9E:=20webhooks=E6=96=87?= =?UTF-8?q?=E6=A1=A3=E4=BD=BF=E7=94=A8=E6=96=B0api=E5=9C=B0=E5=9D=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../slate/source/includes/_repositories.md | 108 ++++++++++-------- .../v1/projects/webhooks/delete_service.rb | 4 +- .../api/v1/users/projects/list_service.rb | 8 +- 3 files changed, 67 insertions(+), 53 deletions(-) diff --git a/app/docs/slate/source/includes/_repositories.md b/app/docs/slate/source/includes/_repositories.md index a44d2b35d..9238615e4 100644 --- a/app/docs/slate/source/includes/_repositories.md +++ b/app/docs/slate/source/includes/_repositories.md @@ -1115,15 +1115,15 @@ await octokit.request('GET /api/yystopf/csfjkkj/contributors.json') ```shell curl -X GET \ -http://localhost:3000/api/yystopf/ceshi/webhooks.json +http://localhost:3000/api/v1/yystopf/ceshi/webhooks.json ``` ```javascript -await octokit.request('GET /api/yystopf/ceshi/webhooks.json') +await octokit.request('GET /api/v1/yystopf/ceshi/webhooks.json') ``` ### HTTP 请求 -`GET /api/:owner/:repo/webhooks.json` +`GET /api/v1/:owner/:repo/webhooks.json` ### 请求参数: 参数 | 必选 | 默认 | 类型 | 字段说明 @@ -1200,15 +1200,15 @@ await octokit.request('GET /api/yystopf/ceshi/webhooks.json') ```shell curl -X GET \ -http://localhost:3000/api/yystopf/ceshi/webhooks/3/edit.json +http://localhost:3000/api/v1/yystopf/ceshi/webhooks/3.json ``` ```javascript -await octokit.request('GET /api/yystopf/ceshi/webhooks/3/edit.json') +await octokit.request('GET /api/v1/yystopf/ceshi/webhooks/3.json') ``` ### HTTP 请求 -`GET /api/:owner/:repo/webhooks/:id/edit.json` +`GET /api/v1/:owner/:repo/webhooks/:id.json` ### 请求参数: 参数 | 必选 | 默认 | 类型 | 字段说明 @@ -1226,12 +1226,10 @@ await octokit.request('GET /api/yystopf/ceshi/webhooks/3/edit.json') |content_type |string|POST Content Type| |http_method |string|请求方式| |secret| |string|密钥| -|is_active |bool |是否激活| -|type |string|类型| -|last_status |string|最后一次推送的状态, waiting 等待,fail 失败,succeed 成功| +|active |bool |是否激活| |branch_filter |string|分支过滤| |events |string|触发条件| -|create_time |string|创建时间| +|create_at |string|创建时间| 参数| 含义| @@ -1266,11 +1264,8 @@ await octokit.request('GET /api/yystopf/ceshi/webhooks/3/edit.json') "http_method": "GET", "content_type": "form", "url": "http://localhost:3000", - "secret": "123456", - "last_status": "succeed", - "is_active": true, - "type": "gitea", - "create_time": "2021-07-26 10:03:45", + "active": true, + "create_at": "2021-07-26 10:03", "branch_filter": "*", "events": [ "create", @@ -1305,15 +1300,15 @@ await octokit.request('GET /api/yystopf/ceshi/webhooks/3/edit.json') ```shell curl -X POST \ -http://localhost:3000/api/yystopf/ceshi/webhooks.json +http://localhost:3000/api/v1/yystopf/ceshi/webhooks.json ``` ```javascript -await octokit.request('POST /api/yystopf/ceshi/webhooks.json') +await octokit.request('POST /api/v1/yystopf/ceshi/webhooks.json') ``` ### HTTP 请求 -`POST /api/:owner/:repo/webhooks.json` +`POST /api/v1/:owner/:repo/webhooks.json` ### 请求参数: 参数 | 必选 | 默认 | 类型 | 字段说明 @@ -1321,7 +1316,6 @@ await octokit.request('POST /api/yystopf/ceshi/webhooks.json') |owner |是| | string |用户登录名 | |repo |是| | string |项目标识identifier | |webhook.url |是| | string |目标url | -|webhook.type |否| | string |类型| |webhook.http_method |是| | string | http方法, POST和GET | |webhook.content_type |是| | string | POST Content Type | |webhook.secret |否| | string |密钥文本| @@ -1335,24 +1329,24 @@ await octokit.request('POST /api/yystopf/ceshi/webhooks.json') --------- | ------- | ------- | |create|创建分支或标签| |delete|分支或标签删除| -|fork|仓库被fork| + |push|git仓库推送| -|issue|疑修已打开、已关闭、已重新打开或编辑| + |pull_request|合并请求| |pull_request_assign|合并请求被指派| -|pull_request_label|合并请求被贴上标签| + |pull_request_review_approved|合并请求被批准| |pull_request_review_rejected|合并请求被拒绝| -|pull_request_review_comment|合并请求被提出审查意见| + > 请求的JSON示例: @@ -1385,15 +1379,22 @@ await octokit.request('POST /api/yystopf/ceshi/webhooks.json') ```json { - "id": 18, - "type": "gitea", + "id": 68, "content_type": "json", - "url": "http://localhost:10000", + "http_method": "GET", + "url": "http://127.0.0.1:3000", "events": [ - "push" + "create", + "delete", + "push", + "pull_request", + "pull_request_assign", + "pull_request_review_approved", + "pull_request_review_rejected" ], "active": true, - "create_time": "2021-07-26 18:53:43" + "branch_filter": "*", + "created_at": "2022-06-23 15:52" } ```