ADD gitea user register and create token api

dev_forge
Jasder 5 years ago
parent 485267021a
commit 7f52fa5b6e

@ -6,6 +6,39 @@ class AccountsController < ApplicationController
render json: session
end
# 其他平台同步注册的用户
def remote_register
phone = params[:phone]&.gsub(/\s+/, "")
email = params[:email]&.gsub(/\s+/, "")
password = params[:password]
platform = params[:platform]&.gsub(/\s+/, "")
@user = User.new(admin: false, login: phone, mail: email, phone: phone, type: "User")
@user.admin = false
@user.type = 'User'
@user.password = password
@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
@user.gitea_token = result['sha1']
if @user.save!
UserExtension.create!(user_id: @user.id)
render_ok({user: {id: @user.id, token: @user.gitea_token}})
end
else
render_error(interactor.error)
end
end
rescue Exception => e
uid_logger_error(e.message)
tip_exception(-1, e.message)
end
# 用户注册
# 注意:用户注册需要兼顾本地版,本地版是不需要验证码及激活码以及使用授权的,注册完成即可使用
# params[:login] 邮箱或者手机号
@ -214,4 +247,27 @@ class AccountsController < ApplicationController
end
end
end
def generate_login(login)
type = phone_mail_type(login.strip)
if type == 1
uid_logger("start register by phone: type is #{type}")
pre = 'p'
email = nil
phone = login
else
uid_logger("start register by email: type is #{type}")
pre = 'm'
email = login
phone = nil
end
code = generate_identifier User, 8, pre
{ login: pre + code, email: email, phone: phone }
end
def user_params
params.require(:user).permit(:login, :email, :phone)
end
end

@ -0,0 +1,24 @@
class Gitea::UserForm
EMAIL_REGEX = /^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/
include ActiveModel::Model
attr_accessor :username, :email, :password
validates :username, presence: true
validates :email, presence: true, format: { with: EMAIL_REGEX, multiline: true }
validates :password, presence: true
attr_reader :record
def persist
@record = id ? User.find(id) : User.new
if valid?
@record.attributes = attributes.except(:password_confirmation, :id)
@record.save!
true
else
false
end
end
end

@ -0,0 +1,31 @@
class Gitea::RegisterInteractor
def self.call(params)
interactor = new(params)
interactor.run
interactor
end
attr_reader :error
def initialize(params)
@params = params
end
def success?
@error.nil?
end
def run
Gitea::Users::RegisterService.new(params).call
rescue Exception => exception
fail!(exception.message)
end
private
attr_reader :params
def fail!(error)
@error = error
end
end

@ -0,0 +1,32 @@
class Gitea::APIService < ApplicationService
def self.render_status(response)
mark = " --from gitea platform."
case response.status
when 201
JSON.parse(response&.body)
when 401
raise Error, "401 Unauthorized from gitea #{mark}"
when 403, 422
body = JSON.parse(response&.body)
raise Error, body['message'] + mark
else
false
end
end
def self.base_url
Gitea.gitea_config[:base_url]
end
def self.domain
Gitea.gitea_config[:domain]
end
private
def logger
Rails.logger
end
end

@ -0,0 +1,27 @@
# 根据对应的用户名和秘密生成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 = user_params.slice(:name).to_json
end
puts "-----------generate token response boby: #{response.body}"
Gitea::APIService.render_status(response)
end
private
def user_params
{
name: username,
password: password
}
end
end

@ -0,0 +1,31 @@
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

@ -23,53 +23,53 @@ Rails.application.routes.draw do
put 'commons/unhidden', to: 'commons#unhidden'
delete 'commons/delete', to: 'commons#delete'
resources :memos do
member do
post :sticky_or_cancel
post :hidden
get :more_reply
end
collection do
post :reply
end
end
resources :hacks, path: :problems, param: :identifier do
collection do
get :unpulished_list
end
member do
post :publish
get :start
post :update_set
delete :delete_set
end
resources :comments do
post :reply
end
end
resources :hack_user_lastest_codes, path: :myproblems, param: :identifier do
member do
post :update_code
get :code_debug
get :code_submit
match :listen_result, :via => [:get, :post]
get :result
get :submit_records
post :restore_initial_code
end
collection do
get :record_detail
end
end
# resources :memos do
# member do
# post :sticky_or_cancel
# post :hidden
# get :more_reply
# end
#
# collection do
# post :reply
# end
# end
# resources :hacks, path: :problems, param: :identifier do
# collection do
# get :unpulished_list
# end
# member do
# post :publish
# get :start
# post :update_set
# delete :delete_set
# end
# resources :comments do
# post :reply
# end
# end
# resources :hack_user_lastest_codes, path: :myproblems, param: :identifier do
# member do
# post :update_code
# get :code_debug
# get :code_submit
# match :listen_result, :via => [:get, :post]
# get :result
# get :submit_records
# post :restore_initial_code
# end
#
# collection do
# get :record_detail
# end
#
#
# end
resources :tem_tests
# resources :tem_tests
# For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
#
#
@ -82,6 +82,7 @@ Rails.application.routes.draw do
get :logout
get :get_verification_code
get :valid_email_and_phone
post :remote_register
end
end

Loading…
Cancel
Save