ADD create repository api

dev_forge
Jasder 5 years ago
parent 6f5f8ce247
commit 07e3dcc58c

@ -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)

@ -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

@ -1,4 +1,5 @@
class Gitea::RegisterInteractor
module Gitea
class RegisterInteractor
def self.call(params)
interactor = new(params)
interactor.run
@ -16,11 +17,15 @@ class Gitea::RegisterInteractor
end
def run
Gitea::Users::RegisterService.new(params).call
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
private
attr_reader :params
@ -28,4 +33,5 @@ class Gitea::RegisterInteractor
def fail!(error)
@error = error
end
end
end

@ -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

@ -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

@ -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

@ -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

@ -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

@ -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

@ -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

@ -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
Loading…
Cancel
Save