diff --git a/Gemfile b/Gemfile index 175ca330c..091716e52 100644 --- a/Gemfile +++ b/Gemfile @@ -135,4 +135,4 @@ gem 'doorkeeper' gem 'doorkeeper-jwt' -gem 'gitea-client', '~> 0.8.2' \ No newline at end of file +gem 'gitea-client', '~> 0.9.1' \ No newline at end of file diff --git a/app/controllers/api/v1/base_controller.rb b/app/controllers/api/v1/base_controller.rb index d97123f45..9832ee112 100644 --- a/app/controllers/api/v1/base_controller.rb +++ b/app/controllers/api/v1/base_controller.rb @@ -20,8 +20,21 @@ class Api::V1::BaseController < ApplicationController # end # end + # 具有对仓库的管理权限 def require_manager_above @project = load_project return render_forbidden unless current_user.admin? && @project.manager?(current_user) end + + # 具有对仓库的操作权限 + def require_operate_above + @project = load_project + return render_forbidden unless current_user.admin? && @project.operator?(current_user) + end + + # 具有对仓库的访问权限 + def require_public_and_member_above + @project = load_project + return render_forbidden unless @project.is_public || (current_user.admin? && @project.member?(current_user)) + end end \ No newline at end of file diff --git a/app/controllers/api/v1/projects/branches_controller.rb b/app/controllers/api/v1/projects/branches_controller.rb new file mode 100644 index 000000000..d7f66d749 --- /dev/null +++ b/app/controllers/api/v1/projects/branches_controller.rb @@ -0,0 +1,19 @@ +class Api::V1::Projects::BranchesController < Api::V1::BaseController + before_action :require_public_and_member_above, only: [:index] + + def all + @result_object = Api::V1::Projects::Branches::AllListService.call(@project, current_user&.gitea_token) + end + + before_action :require_operate_above, only: [:create] + + def create + @result_object = Api::V1::Projects::Branches::CreateService.call(@project, branch_params, current_user&.gitea_token) + puts @result_object + end + + private + def branch_params + params.require(:branch).permit(:new_branch_name, :old_branch_name) + end +end \ No newline at end of file diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index f71a7501b..45a814a22 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -248,44 +248,57 @@ class ApplicationController < ActionController::Base #return if params[:controller] == "main" # Find the current user #Rails.logger.info("current_laboratory is #{current_laboratory} domain is #{request.subdomain}") - User.current = find_current_user - uid_logger("user_setup: " + (User.current.logged? ? "#{User.current.try(:login)} (id=#{User.current.try(:id)})" : "anonymous")) - - # 开放课程通过链接访问的用户 - if !User.current.logged? && !params[:chinaoocTimestamp].blank? && !params[:websiteName].blank? && !params[:chinaoocKey].blank? - content = "#{OPENKEY}#{params[:websiteName]}#{params[:chinaoocTimestamp]}" - - if Digest::MD5.hexdigest(content) == params[:chinaoocKey] - user = open_class_user - if user - start_user_session(user) - set_autologin_cookie(user) + if request.headers["Authorization"].present? && request.headers["Authorization"].start_with?('Bearer') + tip_exception(401, "请登录后再操作!") unless valid_doorkeeper_token? + if @doorkeeper_token.present? + # client方法对接,需要一直带着用户标识uid + if @doorkeeper_token.resource_owner_id.blank? + tip_exception(-1, "缺少用户标识!") if params[:uid].nil? + User.current = User.find(params[:uid]) + else + User.current = User.find_by(id: @doorkeeper_token.resource_owner_id) end - User.current = user end + else + User.current = find_current_user + uid_logger("user_setup: " + (User.current.logged? ? "#{User.current.try(:login)} (id=#{User.current.try(:id)})" : "anonymous")) + + # 开放课程通过链接访问的用户 + if !User.current.logged? && !params[:chinaoocTimestamp].blank? && !params[:websiteName].blank? && !params[:chinaoocKey].blank? + content = "#{OPENKEY}#{params[:websiteName]}#{params[:chinaoocTimestamp]}" + + if Digest::MD5.hexdigest(content) == params[:chinaoocKey] + user = open_class_user + if user + start_user_session(user) + set_autologin_cookie(user) + end + User.current = user + end + end + + # if !User.current.logged? && Rails.env.development? + # user = User.find 1 + # User.current = user + # start_user_session(user) + # end + + + # 测试版前端需求 + # logger.info("subdomain:#{request.subdomain}") + # if request.subdomain != "www" + # if params[:debug] == 'teacher' #todo 为了测试,记得讲debug删除 + # User.current = User.find 81403 + # elsif params[:debug] == 'student' + # User.current = User.find 8686 + # elsif params[:debug] == 'admin' + # logger.info "@@@@@@@@@@@@@@@@@@@@@@ debug mode....." + # user = User.find 36480 + # User.current = user + # cookies.signed[:user_id] = user.id + # end + # end end - - if !User.current.logged? && Rails.env.development? - user = User.find 1 - User.current = user - start_user_session(user) - end - - - # 测试版前端需求 - logger.info("subdomain:#{request.subdomain}") - # if request.subdomain != "www" - # if params[:debug] == 'teacher' #todo 为了测试,记得讲debug删除 - # User.current = User.find 81403 - # elsif params[:debug] == 'student' - # User.current = User.find 8686 - # elsif params[:debug] == 'admin' - # logger.info "@@@@@@@@@@@@@@@@@@@@@@ debug mode....." - # user = User.find 36480 - # User.current = user - # cookies.signed[:user_id] = user.id - # end - # end # User.current = User.find 81403 end diff --git a/app/controllers/concerns/api/project_helper.rb b/app/controllers/concerns/api/project_helper.rb index 0b444c488..52967e784 100644 --- a/app/controllers/concerns/api/project_helper.rb +++ b/app/controllers/concerns/api/project_helper.rb @@ -8,7 +8,7 @@ module Api::ProjectHelper @project, @owner = Project.find_with_namespace(namespace, repo) if @project - logger.info "###########:project not founded" + logger.info "###########:project founded" @project else logger.info "###########:project not found" diff --git a/app/services/api/v1/projects/branches/all_list_service.rb b/app/services/api/v1/projects/branches/all_list_service.rb new file mode 100644 index 000000000..fd942288f --- /dev/null +++ b/app/services/api/v1/projects/branches/all_list_service.rb @@ -0,0 +1,27 @@ +class Api::V1::Projects::Branches::AllListService < ApplicationService + + attr_accessor :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_branch_name_set_by_owner_repo(owner, repo) + end +end \ No newline at end of file diff --git a/app/services/api/v1/projects/branches/create_service.rb b/app/services/api/v1/projects/branches/create_service.rb new file mode 100644 index 000000000..a4d9f854b --- /dev/null +++ b/app/services/api/v1/projects/branches/create_service.rb @@ -0,0 +1,47 @@ +class Api::V1::Projects::Branches::CreateService < ApplicationService + include ActiveModel::Model + + attr_accessor :project, :token, :owner, :repo, :old_branch_name, :new_branch_name + attr_accessor :gitea_data + + validates :new_branch_name, :old_branch_name, presence: :true + + def initialize(project, params, token=nil) + @project = project + @owner = project&.owner.login + @repo = project&.identifier + @new_branch_name = params[:new_branch_name] + @old_branch_name = params[:old_branch_name] + @token = token + end + + def call + raise Error, errors.full_messages.join(",") unless valid? + $gitea_client.token = token unless token.blank? + + check_new_branch_exist + excute_data_to_gitea + + $gitea_client.token = nil unless token.blank? + gitea_data + end + + private + def request_body + { + new_branch_name: new_branch_name, + old_branch_name: old_branch_name, + } + end + + def excute_data_to_gitea + @gitea_data = $gitea_client.post_repos_branches_by_owner_repo(owner, repo, {body: request_body.to_json}) + raise Error, '创建分支失败!' unless @gitea_data.is_a?(Hash) + end + + def check_new_branch_exist + result = $gitea_client.get_repos_branch_name_set_by_owner_repo(owner, repo) + raise Error, '查询分支名称失败!' unless result.is_a?(Hash) + raise Error, '分支已存在!' if result['branch_name'].include?(@new_branch_name) + end +end \ No newline at end of file diff --git a/app/views/api/v1/projects/branches/_simple_detail.json.jbuilder b/app/views/api/v1/projects/branches/_simple_detail.json.jbuilder new file mode 100644 index 000000000..b1e407a9b --- /dev/null +++ b/app/views/api/v1/projects/branches/_simple_detail.json.jbuilder @@ -0,0 +1,4 @@ +json.name branch +json.http_url render_http_url(@project) +json.zip_url render_zip_url(@owner, @project.repository, branch) +json.tar_url render_tar_url(@owner, @project.repository, branch) \ No newline at end of file diff --git a/app/views/api/v1/projects/branches/_simple_gitea_detail.json.jbuilder b/app/views/api/v1/projects/branches/_simple_gitea_detail.json.jbuilder new file mode 100644 index 000000000..9fee552d4 --- /dev/null +++ b/app/views/api/v1/projects/branches/_simple_gitea_detail.json.jbuilder @@ -0,0 +1,23 @@ +json.name branch['name'] +json.commit do + json.id branch['commit']['id'] + json.message branch['commit']['message'] + json.author do + + json.partial! 'api/v1/users/commit_user', locals: { user: render_cache_commit_author(branch['commit']['author']), name: branch['commit']['author']['name'] } + end + + json.committer do + json.partial! 'api/v1/users/commit_user', locals: { user: render_cache_commit_author(branch['commit']['committer']), name: branch['commit']['committer']['name'] } + end + json.time_ago time_from_now(branch['commit']['timestamp'].to_time) + json.timestamp branch['commit']['timestamp'] +end + +json.protected branch['protected'] +json.user_can_push branch['user_can_push'] +json.user_can_merge branch['user_can_merge'] +json.commit_id branch['commit_id'] +json.commit_time_from_now branch['commit_time'] +json.commit_time branch['commit_time'] +json.default_branch branch['default_branch'] \ No newline at end of file diff --git a/app/views/api/v1/projects/branches/all.json.jbuilder b/app/views/api/v1/projects/branches/all.json.jbuilder new file mode 100644 index 000000000..d89b1ee16 --- /dev/null +++ b/app/views/api/v1/projects/branches/all.json.jbuilder @@ -0,0 +1,3 @@ +json.array! @result_object["branch_name"] do |branch| + json.partial! "api/v1/projects/branches/simple_detail", branch: branch +end \ No newline at end of file diff --git a/app/views/api/v1/projects/branches/create.json.jbuilder b/app/views/api/v1/projects/branches/create.json.jbuilder new file mode 100644 index 000000000..eed860b81 --- /dev/null +++ b/app/views/api/v1/projects/branches/create.json.jbuilder @@ -0,0 +1 @@ +json.partial! "api/v1/projects/branches/simple_gitea_detail", branch: @result_object diff --git a/app/views/api/v1/users/_commit_user.json.jbuilder b/app/views/api/v1/users/_commit_user.json.jbuilder new file mode 100644 index 000000000..83935709a --- /dev/null +++ b/app/views/api/v1/users/_commit_user.json.jbuilder @@ -0,0 +1,21 @@ +if user.present? + if user.is_a?(Hash) + json.id user["id"] + json.login user["login"] + json.name user["name"] + json.type user["type"] + json.image_url user["avatar_url"] + else + json.id user.id + json.login user.login + json.name user.real_name + json.type user&.type + json.image_url url_to_avatar(user) + end +else + json.id nil + json.login name + json.name name + json.type nil + json.image_url User::Avatar.get_letter_avatar_url(name) +end diff --git a/config/routes/api.rb b/config/routes/api.rb index 32acdabd4..c969302ba 100644 --- a/config/routes/api.rb +++ b/config/routes/api.rb @@ -23,6 +23,11 @@ defaults format: :json do get :hooktasks end end + resources :branches, only:[:index, :create] do + collection do + get :all + end + end end end