From 07e3dcc58c0cf5aae192424e5c950c64a44b84d8 Mon Sep 17 00:00:00 2001 From: Jasder <2053003901@@qq.com> Date: Tue, 17 Dec 2019 19:25:57 +0800 Subject: [PATCH] ADD create repository api --- app/controllers/accounts_controller.rb | 4 +- app/forms/gitea/repository_form.rb | 9 ++ app/interactors/gitea/register_interactor.rb | 50 +++++----- .../gitea/repository_interactor.rb | 35 +++++++ app/services/gitea/client_service.rb | 99 +++++++++++++++++++ .../gitea/repository/create_service.rb | 18 ++++ .../gitea/user/generate_token_service.rb | 28 ++++++ app/services/gitea/user/register_service.rb | 28 ++++++ .../gitea/users/generate_token_service.rb | 27 ----- app/services/gitea/users/register_service.rb | 31 ------ config/initializers/gitea_init.rb | 34 ------- 11 files changed, 246 insertions(+), 117 deletions(-) create mode 100644 app/forms/gitea/repository_form.rb create mode 100644 app/interactors/gitea/repository_interactor.rb create mode 100644 app/services/gitea/client_service.rb create mode 100644 app/services/gitea/repository/create_service.rb create mode 100644 app/services/gitea/user/generate_token_service.rb create mode 100644 app/services/gitea/user/register_service.rb delete mode 100644 app/services/gitea/users/generate_token_service.rb delete mode 100644 app/services/gitea/users/register_service.rb delete mode 100644 config/initializers/gitea_init.rb diff --git a/app/controllers/accounts_controller.rb b/app/controllers/accounts_controller.rb index 495d86df8..bc15056a7 100644 --- a/app/controllers/accounts_controller.rb +++ b/app/controllers/accounts_controller.rb @@ -20,11 +20,9 @@ class AccountsController < ApplicationController @user.platform = platform @user.activate ActiveRecord::Base.transaction do - Gitea::UserForm.new({username: phone, email: email, password: password}).validate! interactor = Gitea::RegisterInteractor.call({username: phone, email: email, password: password}) - if interactor.success? - result = Gitea::Users::GenerateTokenService.new(phone, password).call + result = Gitea::User::GenerateTokenService.new(phone, password).call @user.gitea_token = result['sha1'] if @user.save! UserExtension.create!(user_id: @user.id) diff --git a/app/forms/gitea/repository_form.rb b/app/forms/gitea/repository_form.rb new file mode 100644 index 000000000..6ec3e7557 --- /dev/null +++ b/app/forms/gitea/repository_form.rb @@ -0,0 +1,9 @@ +class Gitea::RepositoryForm + include ActiveModel::Model + attr_accessor :name, :description, :auto_init, :gitignores, + :issue_labels, :license, :private, :readme + + validates :name, presence: true + validates :name, uniqueness: true + +end diff --git a/app/interactors/gitea/register_interactor.rb b/app/interactors/gitea/register_interactor.rb index 89cfea643..5b6481a0e 100644 --- a/app/interactors/gitea/register_interactor.rb +++ b/app/interactors/gitea/register_interactor.rb @@ -1,31 +1,37 @@ -class Gitea::RegisterInteractor - def self.call(params) - interactor = new(params) - interactor.run - interactor - end +module Gitea + class RegisterInteractor + def self.call(params) + interactor = new(params) + interactor.run + interactor + end - attr_reader :error + attr_reader :error - def initialize(params) - @params = params - end + def initialize(params) + @params = params + end - def success? - @error.nil? - end + def success? + @error.nil? + end + + def run + Gitea::UserForm.new(params).validate! + Gitea::User::RegisterService.new(params).call + # Gitea::Client.new.register("nifewf", "123@qq.com", "djs_D_00001") + rescue Exception => exception + Rails.logger.info "Exception ===========> #{exception.message}" + fail!(exception.message) + end - def run - Gitea::Users::RegisterService.new(params).call - rescue Exception => exception - fail!(exception.message) - end - private + private - attr_reader :params + attr_reader :params - def fail!(error) - @error = error + def fail!(error) + @error = error + end end end diff --git a/app/interactors/gitea/repository_interactor.rb b/app/interactors/gitea/repository_interactor.rb new file mode 100644 index 000000000..5985f0492 --- /dev/null +++ b/app/interactors/gitea/repository_interactor.rb @@ -0,0 +1,35 @@ +class Gitea::RepositoryInteractor + attr_reader :token, :repository + + # params: token and repository + def self.call(token, repository) + interactor = new(token, repository) + interactor.run + interactor + end + + def initialize(token, repository) + @token = token + @repository = repository + end + + def success? + @error.nil? + end + + def run + Gitea::RepositoryForm.new({name: repository&.name}).validate! + Gitea::Repository::CreateService.new(token, repository).call + rescue Exception => exception + puts exception.message + fail!(exception.message) + end + + private + + attr_reader :error + + def fail!(error) + @error = error + end +end diff --git a/app/services/gitea/client_service.rb b/app/services/gitea/client_service.rb new file mode 100644 index 000000000..cc4b42d02 --- /dev/null +++ b/app/services/gitea/client_service.rb @@ -0,0 +1,99 @@ +class Gitea::ClientService < ApplicationService + attr_reader :username, :secret, :token, :url, :params + + def initialize(options={}) + @username = options[:username] + @secret = options[:password] + @token = options[:token] + @url = options[:url] + @params = options[:params] + end + + # params + # EXA: + # { + # token: {}, + # data: {} + # } + def post(url, params) + puts "[gitea] request params: #{params}" + request_url = [api_url, url].join('').freeze + auth_token = authen_params(params[:token]) + + response = conn(auth_token).post do |req| + req.url "#{request_url}" + req.body = params[:data].to_json + end + render_status(response) + end + + private + def conn(auth={}) + username = auth[:username] || access_key_id + secret = auth[:password] || access_key_secret + token = auth[:token] + puts "[gitea] username: #{username}" + puts "[gitea] secret: #{secret}" + puts "[gitea] token: #{token}" + + @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 + if token.blank? + req.basic_auth(username, secret) + else + req.authorization :Bearer, token + req.headers['Authorization'] + end + end + end + @client + end + + def base_url + Gitea.gitea_config[:base_url] + end + + def domain + Gitea.gitea_config[:domain] + end + + def access_key_id + Gitea.gitea_config[:access_key_id] + end + + def access_key_secret + Gitea.gitea_config[:access_key_secret] + end + + def api_url + [domain, base_url].join('') + end + + def render_status(response) + mark = "[gitea] " + + case response.status + when 201 + JSON.parse(response&.body) + when 401 + raise Error, mark + "401" + when 422 + result = JSON.parse(response&.body) + puts "[gitea] parse body: #{result}" + # return {status: -1, message: result[0]} + raise Error, result[0] + else + result = JSON.parse(response&.body) + message = result['message'] + raise Error, mark + message + end + end + + def authen_params(token) + (token.is_a? String) ? {token: token} : Hash(token) + end +end diff --git a/app/services/gitea/repository/create_service.rb b/app/services/gitea/repository/create_service.rb new file mode 100644 index 000000000..0a8cdfb7d --- /dev/null +++ b/app/services/gitea/repository/create_service.rb @@ -0,0 +1,18 @@ +class Gitea::Repository::CreateService < Gitea::ClientService + attr_reader :token, :params + + def initialize(token, params) + @token = token + @params = params + end + + def call + request_params = {} + url = "/user/repos".freeze + request_params = request_params.merge(token: token, data: params) + post(url, request_params) + end + + private + +end diff --git a/app/services/gitea/user/generate_token_service.rb b/app/services/gitea/user/generate_token_service.rb new file mode 100644 index 000000000..a92bfc554 --- /dev/null +++ b/app/services/gitea/user/generate_token_service.rb @@ -0,0 +1,28 @@ +# 根据对应的用户名和秘密生成token +class Gitea::User::GenerateTokenService < Gitea::ClientService + attr_reader :username, :password + + def initialize(username, password) + @username = username + @password = password + end + + def call + params = {} + url = "/users/#{username}/tokens".freeze + params = params.merge(token: token_params, data: request_params) + post(url, params) + end + + private + def token_params + { + username: username, + password: password + } + end + + def request_params + { name: username } + end +end diff --git a/app/services/gitea/user/register_service.rb b/app/services/gitea/user/register_service.rb new file mode 100644 index 000000000..cb7bfc9d4 --- /dev/null +++ b/app/services/gitea/user/register_service.rb @@ -0,0 +1,28 @@ +class Gitea::User::RegisterService < Gitea::ClientService + def initialize(options = {}) + options.each_pair do |key, value| + instance_variable_set("@#{key}", value) + end + end + + def call + url = "/admin/users" + params = {} + params = params.merge(data: user_params) + post(url, params) + end + + private + + attr_reader :email, :username, :password, :url + + def user_params + { + email: email, + username: username, + password: password, + must_change_password: false #允许不更改秘密就可以登录 + } + end + +end diff --git a/app/services/gitea/users/generate_token_service.rb b/app/services/gitea/users/generate_token_service.rb deleted file mode 100644 index 54ca961e9..000000000 --- a/app/services/gitea/users/generate_token_service.rb +++ /dev/null @@ -1,27 +0,0 @@ -# 根据对应的用户名和秘密生成token -class Gitea::Users::GenerateTokenService < Gitea::APIService - attr_reader :username, :password - - def initialize(username, password) - @username = username - @password = password - end - - def call - response = Gitea.client(user_params).post do |req| - req.url "#{Gitea::APIService.base_url}/users/#{username}/tokens".freeze - req.headers['Content-Type'] = 'application/json' - req.body = {name: username}.to_json - end - puts "-----------generate token response boby: #{response.body}" - Gitea::APIService.render_status(response) - end - - private - def user_params - { - username: username, - password: password - } - end -end diff --git a/app/services/gitea/users/register_service.rb b/app/services/gitea/users/register_service.rb deleted file mode 100644 index 700cab4fa..000000000 --- a/app/services/gitea/users/register_service.rb +++ /dev/null @@ -1,31 +0,0 @@ -class Gitea::Users::RegisterService < Gitea::APIService - REQUEST_URL = [Gitea::APIService.base_url, "/admin/users"].join('').freeze - - def initialize(options = {}) - options.each_pair do |key, value| - instance_variable_set("@#{key}", value) - end - end - - def call - response = Gitea.client.post do |req| - req.url "#{REQUEST_URL}" - req.headers['Content-Type'] = 'application/json' - req.body = user_params.to_json - end - Gitea::APIService.render_status(response) - end - - private - - attr_reader :email, :username, :password - - def user_params - { - email: email, - username: username, - password: password, - must_change_password: false #允许不更改秘密就可以登录 - } - end -end diff --git a/config/initializers/gitea_init.rb b/config/initializers/gitea_init.rb deleted file mode 100644 index 79b64f400..000000000 --- a/config/initializers/gitea_init.rb +++ /dev/null @@ -1,34 +0,0 @@ -module Gitea - def self.client(options={}) - puts "------ init gitea -----" - username = options[:username] || Gitea.gitea_config[:access_key_id] - password = options[:password] || Gitea.gitea_config[:access_key_secret] - url = gitea_config[:domain] - - puts "gitea username: #{username} -- password: #{password}" - @client ||= begin - Faraday.new(url: url) do |req| - req.request :url_encoded - req.response :logger # 显示日志 - req.adapter Faraday.default_adapter - req.basic_auth(username, password) - end - end - @client - end - - def self.gitea_config - begin - config = Rails.application.config_for(:configuration).symbolize_keys! - gitea_config = config[:gitea].symbolize_keys! - raise 'gitea config missing' if gitea_config.blank? - rescue => ex - raise ex if Rails.env.production? - - puts %Q{\033[33m [warning] gitea config or configuration.yml missing, - please add it or execute 'cp config/configuration.yml.example config/configuration.yml' \033[0m} - gitea_config = {} - end - gitea_config - end -end