From 2772b97e32ebdcd740736ab9f5988a2dd75028f6 Mon Sep 17 00:00:00 2001 From: yystopf Date: Fri, 3 Feb 2023 18:03:57 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E6=A0=87=E7=AD=BE?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E5=92=8C=E5=88=A0=E9=99=A4=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Gemfile | 2 +- .../api/v1/projects/tags_controller.rb | 18 ++++++++ .../v1/projects/branches/delete_service.rb | 2 +- .../api/v1/projects/tags/delete_service.rb | 42 +++++++++++++++++++ .../api/v1/projects/tags/list_service.rb | 36 ++++++++++++++++ .../_simple_gitea_index_detail.json.jbuilder | 26 ++++++++++++ .../api/v1/projects/tags/index.json.jbuilder | 4 ++ config/routes/api.rb | 1 + 8 files changed, 129 insertions(+), 2 deletions(-) create mode 100644 app/controllers/api/v1/projects/tags_controller.rb create mode 100644 app/services/api/v1/projects/tags/delete_service.rb create mode 100644 app/services/api/v1/projects/tags/list_service.rb create mode 100644 app/views/api/v1/projects/tags/_simple_gitea_index_detail.json.jbuilder create mode 100644 app/views/api/v1/projects/tags/index.json.jbuilder diff --git a/Gemfile b/Gemfile index 2a431701b..45a83fd28 100644 --- a/Gemfile +++ b/Gemfile @@ -139,4 +139,4 @@ gem 'doorkeeper' gem 'doorkeeper-jwt' -gem 'gitea-client', '~> 0.11.4' \ No newline at end of file +gem 'gitea-client', '~> 0.11.5' \ No newline at end of file diff --git a/app/controllers/api/v1/projects/tags_controller.rb b/app/controllers/api/v1/projects/tags_controller.rb new file mode 100644 index 000000000..9764225d4 --- /dev/null +++ b/app/controllers/api/v1/projects/tags_controller.rb @@ -0,0 +1,18 @@ +class Api::V1::Projects::TagsController < Api::V1::BaseController + before_action :require_public_and_member_above, only: [:index] + + def index + @result_object = Api::V1::Projects::Tags::ListService.call(@project, {page: page, limit: limit}, current_user&.gitea_token) + end + + before_action :require_operate_above, only: [:destroy] + + def destroy + @result_object = Api::V1::Projects::Tags::DeleteService.call(@project, params[:id], current_user&.gitea_token) + if @result_object + return render_ok + else + return render_error('删除标签失败!') + end + end +end \ No newline at end of file diff --git a/app/services/api/v1/projects/branches/delete_service.rb b/app/services/api/v1/projects/branches/delete_service.rb index c6ff5f80e..ab9fee157 100644 --- a/app/services/api/v1/projects/branches/delete_service.rb +++ b/app/services/api/v1/projects/branches/delete_service.rb @@ -17,7 +17,7 @@ class Api::V1::Projects::Branches::DeleteService < ApplicationService def call raise Error, errors.full_messages.join(",") unless valid? - # check_branch_exist + check_branch_exist excute_data_to_gitea true diff --git a/app/services/api/v1/projects/tags/delete_service.rb b/app/services/api/v1/projects/tags/delete_service.rb new file mode 100644 index 000000000..ee383a5bd --- /dev/null +++ b/app/services/api/v1/projects/tags/delete_service.rb @@ -0,0 +1,42 @@ +class Api::V1::Projects::Tags::DeleteService < ApplicationService + include ActiveModel::Model + + attr_accessor :project, :token, :owner, :repo, :tag_name + attr_accessor :gitea_data + + validates :tag_name, presence: true + + def initialize(project, tag_name, token=nil) + @project = project + @owner = project&.owner.login + @repo = project&.identifier + @tag_name = tag_name + @token = token + end + + def call + raise Error, errors.full_messages.join(",") unless valid? + + check_tag_exist + excute_data_to_gitea + + true + end + + private + def request_params + { + access_token: token + } + end + + def excute_data_to_gitea + @gitea_data = $gitea_client.delete_repos_tags_by_owner_repo_tag(owner, repo, tag_name, {query: request_params}) rescue nil + end + + def check_tag_exist + result = $gitea_client.get_repos_tag_name_set_by_owner_repo(owner, repo, {query: request_params}) rescue nil + raise Error, '查询标签名称失败!' unless result.is_a?(Array) + raise Error, '标签不存在!' if !result.include?(@tag_name) + end +end \ No newline at end of file diff --git a/app/services/api/v1/projects/tags/list_service.rb b/app/services/api/v1/projects/tags/list_service.rb new file mode 100644 index 000000000..a7743fe00 --- /dev/null +++ b/app/services/api/v1/projects/tags/list_service.rb @@ -0,0 +1,36 @@ +class Api::V1::Projects::Tags::ListService < ApplicationService + + attr_accessor :project, :token, :owner, :repo, :page, :limit + attr_accessor :gitea_data + + def initialize(project, params, token=nil) + @project = project + @owner = project&.owner.login + @repo = project&.identifier + @token = token + @page = params[:page] + @limit = params[:limit] + end + + def call + load_gitea_data + + gitea_data + end + + private + def request_params + params = { + access_token: token, + page: page, + limit: limit + } + + params + end + + def load_gitea_data + @gitea_data = $gitea_client.get_repos_tags_by_owner_repo(owner, repo, {query: request_params}) rescue nil + raise Error, '获取标签列表失败!' unless @gitea_data.is_a?(Hash) + end +end \ No newline at end of file diff --git a/app/views/api/v1/projects/tags/_simple_gitea_index_detail.json.jbuilder b/app/views/api/v1/projects/tags/_simple_gitea_index_detail.json.jbuilder new file mode 100644 index 000000000..6dada8204 --- /dev/null +++ b/app/views/api/v1/projects/tags/_simple_gitea_index_detail.json.jbuilder @@ -0,0 +1,26 @@ +if tag.present? && tag.is_a?(Hash) + json.name tag['name'] + json.id tag['id'] + json.zipball_url render_zip_url(@owner, @repository, tag['name']) + json.tarball_url render_tar_url(@owner, @repository, tag['name']) + json.tagger do + json.partial! 'commit_author', user: render_cache_commit_author(tag['tagger']), name: tag['tagger']['name'] + end + json.time_ago time_from_now(tag['tagger']['date'].to_time) + json.created_at_unix tag['tagger']['date'].to_time.to_i + json.message tag['message'] + json.commit do + json.sha tag['commit']['sha'] + json.message tag['commit']['message'] + json.time_ago time_from_now(tag['commit']['commiter']['date'].to_time) + json.created_at_unix tag['commit']['commiter']['date'].to_time.to_i + json.committer do + json.partial! 'commit_author', user: render_cache_commit_author(tag['commit']['commiter']), name: tag['commit']['commiter']['name'] + end + json.author do + json.partial! 'commit_author', user: render_cache_commit_author(tag['commit']['author']), name: tag['commit']['author']['name'] + end + end +else + json.name tag +end \ No newline at end of file diff --git a/app/views/api/v1/projects/tags/index.json.jbuilder b/app/views/api/v1/projects/tags/index.json.jbuilder new file mode 100644 index 000000000..3c6f2d4a7 --- /dev/null +++ b/app/views/api/v1/projects/tags/index.json.jbuilder @@ -0,0 +1,4 @@ +json.total_count @result_object[:total_data].to_i +json.tags @result_object[:data].each do |tag| + json.partial! "api/v1/projects/tags/simple_gitea_index_detail", tag: tag +end \ No newline at end of file diff --git a/config/routes/api.rb b/config/routes/api.rb index 6fb9f3500..870861579 100644 --- a/config/routes/api.rb +++ b/config/routes/api.rb @@ -52,6 +52,7 @@ defaults format: :json do patch :update_default_branch end end + resources :tags, only: [:index, :destroy] resources :commits, only: [:index] resources :code_stats, only: [:index] get '/commits/:sha/diff', to: 'commits#diff'