diff --git a/app/services/educoder/client_service.rb b/app/services/educoder/client_service.rb new file mode 100644 index 000000000..6c5c10d99 --- /dev/null +++ b/app/services/educoder/client_service.rb @@ -0,0 +1,112 @@ +class Educoder::ClientService < ApplicationService + attr_reader :url, :params + + PAGINATE_DEFAULT_PAGE = 1 + PAGINATE_DEFAULT_LIMIT = 20 + + def initialize(options={}) + @url = options[:url] + @params = options[:params] + end + + def post(url, params={}) + puts "[educoder] request params: #{params}" + auth_token = authen_params(params[:token]) + response = conn(auth_token).post do |req| + req.url full_url(url) + req.body = params[:data].to_json + end + render_status(response) + end + + def get(url, params={}) + puts "[educoder] params: #{params}" + conn(api_url(url), params) + end + + def delete(url, params={}) + auth_token = authen_params(params[:token]) + conn(auth_token).delete do |req| + req.url full_url(url) + req.body = params[:data].to_json + end + end + + def patch(url, params={}) + puts "[educoder] request params: #{params}" + auth_token = authen_params(params[:token]) + conn(auth_token).patch do |req| + req.url full_url(url) + req.body = params[:data].to_json + end + end + + def put(url, params={}) + puts "[educoder] put request params: #{params}" + conn(authen_params(params[:token])).put do |req| + req.url full_url(url) + req.body = params[:data].to_json + end + end + + private + def conn(url, hash={}) + par = [] + hash.each do |k,v| + par << "#{k}=#{v}" + end + + uri = URI("#{url}.json?#{par.join('&')}&private_token=#{private_token}") + puts "[educoder] request_url: #{uri}" + response = Net::HTTP.get_response(uri) + puts "[educoder] response code: #{response.code.to_i}" + if response.code.to_i != 200 + puts "======= 接口请求失败!" + raise '接口请求失败.' + return nil + end + JSON.parse(response.body) + end + + def base_url + Rails.application.config_for(:configuration)['educoder']['base_url'] + end + + def domain + Rails.application.config_for(:configuration)['educoder']['main_site'] + end + + def private_token + Rails.application.config_for(:configuration)['educoder']['token'] + end + + def access_key_secret + Gitea.gitea_config[:access_key_secret] + end + + def api_url(url) + [domain, base_url, url].join('/') + end + + def full_url(api_rest, action='post') + url = [api_url, api_rest].join('').freeze + url = action === 'get' ? url : URI.escape(url) + puts "[gitea] request url: #{url}" + return url + end + + + + def authen_params(token) + (token.is_a? String) ? {token: token} : Hash(token) + end + + def render_data(response) + case response.status + when 201, 200 + JSON.parse(response.body) + else + nil + end + end +end diff --git a/app/services/educoder/repository/commits/list_service.rb b/app/services/educoder/repository/commits/list_service.rb new file mode 100644 index 000000000..1a83c2600 --- /dev/null +++ b/app/services/educoder/repository/commits/list_service.rb @@ -0,0 +1,29 @@ +class Educoder::Repository::Commits::ListService < Educoder::ClientService + attr_reader :repo_name, :args + + # ref: The name of the commit/branch/tag. Default the repository’s default branch (usually master) + # repo_name: the name of repository + # Educoder::Repository::Commits::ListService.call('fessf/6hiwcb7o20200917174054') + def initialize(repo_name, **args) + @repo_name = repo_name + @args = {ref: 'master'}.merge(args.compact) + end + + def call + response = get(url, params) + render_result(response) + end + + private + def params + @args.merge(repo_name: repo_name) + end + + def url + "commits".freeze + end + + def render_result(response) + response['commits'] || [] + end +end diff --git a/app/services/educoder/repository/entries/get_service.rb b/app/services/educoder/repository/entries/get_service.rb new file mode 100644 index 000000000..9c4fed92e --- /dev/null +++ b/app/services/educoder/repository/entries/get_service.rb @@ -0,0 +1,30 @@ +class Educoder::Repository::Entries::GetService < Educoder::ClientService + attr_reader :repo_name, :filepath + + # filepath: path of the dir, file, symlink or submodule in the repo + # repo_name: the name of repository + def initialize(repo_name, filepath) + @repo_name = repo_name + @filepath = filepath + end + + def call + get(url, params) + end + + private + def params + Hash.new.merge(repo_name: repo_name, path: filepath) + end + + def url + "file_content".freeze + end + + def render_result(response) + body = JSON.parse(response.body) + if body['status'].to_i === -1 + raise '无权限访问.' + end + end +end diff --git a/app/services/educoder/repository/entries/list_service.rb b/app/services/educoder/repository/entries/list_service.rb new file mode 100644 index 000000000..dd3abea77 --- /dev/null +++ b/app/services/educoder/repository/entries/list_service.rb @@ -0,0 +1,39 @@ +class Educoder::Repository::Entries::ListService < Educoder::ClientService + attr_reader :repo_name, :args + + # ref: The name of the commit/branch/tag. Default the repository’s default branch (usually master) + # repo_name: the name of repository + # args: + # { + # "repo_name": "wmov43ez8/5xahe2t7nv20191022173304", + # "path": 'src' + # } + # Educoder::Repository::Entries::ListService.new('wmov43ez8/5xahe2t7nv20191022173304', {path: 'src'}).call + def initialize(repo_name, args={}) + @repo_name = repo_name + @args = args.compact + end + + def call + get(url, params) + end + + private + def params + @args.merge(repo_name: repo_name) + end + + def url + "repository".freeze + end + + def render_result(response) + body = JSON.parse(response.body) + case response.status + when 200 + body + else + [] + end + end +end