forked from Gitlink/forgeplus
Compare commits
233 Commits
master
...
trustie_se
| Author | SHA1 | Date |
|---|---|---|
|
|
85d1aa3a85 | |
|
|
0f57844106 | |
|
|
b9bf3fb5ff | |
|
|
c9e265f95c | |
|
|
cf8278ee5e | |
|
|
ccd477e519 | |
|
|
7d26fba3c0 | |
|
|
5637001b16 | |
|
|
8c11759b6c | |
|
|
65e5420246 | |
|
|
598beedc7b | |
|
|
fbede59261 | |
|
|
f03182c771 | |
|
|
68712f9b4c | |
|
|
43add36d29 | |
|
|
c3b9d2e0b5 | |
|
|
4d7d587419 | |
|
|
c8b21f818d | |
|
|
23b8342283 | |
|
|
299e8534d1 | |
|
|
3caa751d4d | |
|
|
eafc8ea527 | |
|
|
f996525e8e | |
|
|
486ed960ca | |
|
|
8a90162ac6 | |
|
|
258272d439 | |
|
|
8b809fb813 | |
|
|
e8496e77dc | |
|
|
155f288c81 | |
|
|
0f45e8f44b | |
|
|
d7362925f2 | |
|
|
43945b00b8 | |
|
|
b11d515ec6 | |
|
|
495d7773fe | |
|
|
9425d2e59d | |
|
|
0654f81565 | |
|
|
ede2f7199a | |
|
|
ea98528100 | |
|
|
6f010d992d | |
|
|
ffb58b788a | |
|
|
a53367b7eb | |
|
|
63fccd03f8 | |
|
|
07a38ac3f7 | |
|
|
18227c232b | |
|
|
eb56c34c41 | |
|
|
f1d79e4d9f | |
|
|
20e2e22be5 | |
|
|
27e5febef2 | |
|
|
c748f4eaed | |
|
|
bfef459b75 | |
|
|
eeb69daff1 | |
|
|
4b8bb8a65f | |
|
|
4d6ec8088a | |
|
|
264a831a1c | |
|
|
8b53aac8a6 | |
|
|
cb1a4d8c8c | |
|
|
ebc4305ca8 | |
|
|
fb23e733d6 | |
|
|
512bff426d | |
|
|
8905f60265 | |
|
|
671c2c2257 | |
|
|
c6f2021017 | |
|
|
f334864f1b | |
|
|
f5e07ab3ec | |
|
|
fcc7736c34 | |
|
|
581b147b3c | |
|
|
deebfc3292 | |
|
|
6c4d17bed8 | |
|
|
e68c13f1a2 | |
|
|
0db334217e | |
|
|
32fe6958df | |
|
|
15eb1f4a17 | |
|
|
a1cb9a11d6 | |
|
|
e4fda9243b | |
|
|
0884a0de1b | |
|
|
900fdd2691 | |
|
|
aeaa5d4366 | |
|
|
d4b9881f2d | |
|
|
a543c3e08f | |
|
|
998381585a | |
|
|
2ddf1dbd01 | |
|
|
fd3fab99ae | |
|
|
4520055de2 | |
|
|
193d1b21df | |
|
|
de2b54c39e | |
|
|
ed8e079595 | |
|
|
4929734a1a | |
|
|
55a0bcfb82 | |
|
|
8f1aa3f4b1 | |
|
|
1c6d8fc2f3 | |
|
|
d271a684fa | |
|
|
b054094798 | |
|
|
2d648e516e | |
|
|
34c3a83df4 | |
|
|
71e039efb8 | |
|
|
9ac21938e6 | |
|
|
fa8594d2ab | |
|
|
3614f3e15b | |
|
|
7c23b40661 | |
|
|
ff21916f18 | |
|
|
d9162cb3bf | |
|
|
e76d475fef | |
|
|
1392024657 | |
|
|
312fca7e2b | |
|
|
ca1fd3cd4f | |
|
|
d1939116a3 | |
|
|
2a72fc56a4 | |
|
|
913bc45a9f | |
|
|
8131d8cd48 | |
|
|
87049b74ef | |
|
|
f19219a467 | |
|
|
4cc46f4cb4 | |
|
|
8331d849d5 | |
|
|
0e7f3a8905 | |
|
|
b45ab12279 | |
|
|
259090b8e3 | |
|
|
c3bc4166d9 | |
|
|
7e474cab70 | |
|
|
01341d4389 | |
|
|
3a475a4674 | |
|
|
7b27ed71ca | |
|
|
83b7b8cd9c | |
|
|
c298ff02b8 | |
|
|
6c3c1ce093 | |
|
|
62d1a2378c | |
|
|
e111f40c69 | |
|
|
8d300e11f9 | |
|
|
b7dd12927b | |
|
|
16ea03dcc8 | |
|
|
4126ea7b4e | |
|
|
7bb4cf7391 | |
|
|
539b832af6 | |
|
|
0bfed83bc0 | |
|
|
23f7439a8c | |
|
|
ce8527359c | |
|
|
fff21a1bc8 | |
|
|
526920f564 | |
|
|
2d37df1c00 | |
|
|
0af08bc967 | |
|
|
ea82a52b7b | |
|
|
fa8f1155f5 | |
|
|
484f8a854a | |
|
|
62bd331876 | |
|
|
91e142ba82 | |
|
|
7bedac263d | |
|
|
a82b13ecdf | |
|
|
855c51a470 | |
|
|
f0b1c9e80b | |
|
|
dc23be9001 | |
|
|
e24269c2a7 | |
|
|
e31176c696 | |
|
|
bf390c8366 | |
|
|
632a06e575 | |
|
|
04c7887319 | |
|
|
b012740195 | |
|
|
d75b79670d | |
|
|
0f79238f0e | |
|
|
2c5fa8492f | |
|
|
fdfbf505ed | |
|
|
6d845eeb3b | |
|
|
a7695b16a4 | |
|
|
83e666a387 | |
|
|
1a0fd38d15 | |
|
|
72b89d4b2b | |
|
|
b0b224fe76 | |
|
|
38f6254edc | |
|
|
57d9da002e | |
|
|
8a4b0ba966 | |
|
|
84927c2361 | |
|
|
b568ac4e97 | |
|
|
91bbb58d4f | |
|
|
f278b38e6c | |
|
|
4023b8980e | |
|
|
1c1be18151 | |
|
|
e5f591e509 | |
|
|
27ee32054b | |
|
|
3e3fd46cad | |
|
|
7a752b177d | |
|
|
abbabfdefd | |
|
|
edd76b9286 | |
|
|
a3ca94d433 | |
|
|
91a804caf7 | |
|
|
663deae21b | |
|
|
dae5c9690f | |
|
|
e65df07d79 | |
|
|
246b6b52ec | |
|
|
b9789183e3 | |
|
|
7cf2c6021f | |
|
|
e0f9a3d43d | |
|
|
c1ef39b262 | |
|
|
51643dc02c | |
|
|
a078c07b59 | |
|
|
b984790d5c | |
|
|
876591100e | |
|
|
ba9848ebe7 | |
|
|
41c621cf55 | |
|
|
09ac49dda5 | |
|
|
341a810afc | |
|
|
2282c52efb | |
|
|
34edd78ae7 | |
|
|
36fb5a118c | |
|
|
b756be1d6a | |
|
|
348c2244f7 | |
|
|
31738fc227 | |
|
|
a93c98fb7c | |
|
|
39193324e9 | |
|
|
81743ce3bc | |
|
|
e9ae536f04 | |
|
|
186955fe4a | |
|
|
8ce7fd95cb | |
|
|
0867e5130f | |
|
|
db476a1a9b | |
|
|
fa1fd8a4ba | |
|
|
0d7a11f3ab | |
|
|
879e45e106 | |
|
|
b3b0f75e9b | |
|
|
5c8e561bd8 | |
|
|
2b0c987558 | |
|
|
6796805b21 | |
|
|
5752f19b2f | |
|
|
eb52f05417 | |
|
|
786629dbff | |
|
|
7a00541375 | |
|
|
1d832a1723 | |
|
|
80ce40e492 | |
|
|
91f6dae56a | |
|
|
8c5a834b14 | |
|
|
57f420848e | |
|
|
fba58800a7 | |
|
|
c4a43c4392 | |
|
|
1153bd5ab6 | |
|
|
f732b0374c | |
|
|
0d97d7d4f0 |
|
|
@ -74,6 +74,7 @@ vendor/bundle/
|
|||
/log
|
||||
/public/admin
|
||||
/mysql_data
|
||||
/public/repo/
|
||||
|
||||
|
||||
.generators
|
||||
|
|
@ -85,3 +86,4 @@ redis_data/
|
|||
Dockerfile
|
||||
dump.rdb
|
||||
.tags*
|
||||
ceshi_user.xlsx
|
||||
|
|
@ -329,7 +329,6 @@ class ApplicationController < ActionController::Base
|
|||
User.current = user
|
||||
end
|
||||
end
|
||||
|
||||
# if !User.current.logged? && Rails.env.development?
|
||||
# User.current = User.find 1
|
||||
# end
|
||||
|
|
@ -771,11 +770,12 @@ class ApplicationController < ActionController::Base
|
|||
end
|
||||
|
||||
def base_url
|
||||
request.base_url
|
||||
Rails.application.config_for(:configuration)['platform_url'] || request.base_url
|
||||
end
|
||||
|
||||
def convert_image!
|
||||
@image = params[:image] || user_params[:image]
|
||||
@image = params[:image]
|
||||
@image = @image.nil? && params[:user].present? ? params[:user][:image] : @image
|
||||
return unless @image.present?
|
||||
max_size = EduSetting.get('upload_avatar_max_size') || 2 * 1024 * 1024 # 2M
|
||||
if @image.class == ActionDispatch::Http::UploadedFile
|
||||
|
|
|
|||
|
|
@ -6,26 +6,48 @@ class CompareController < ApplicationController
|
|||
end
|
||||
|
||||
def show
|
||||
load_compare_params
|
||||
compare
|
||||
@merge_status, @merge_message = get_merge_message
|
||||
end
|
||||
|
||||
private
|
||||
def get_merge_message
|
||||
if @base.blank? || @head.blank?
|
||||
return -2, "请选择分支"
|
||||
else
|
||||
if @head.include?(":")
|
||||
fork_project = @project.forked_projects.joins(:owner).where(users: {login: @head.to_s.split("/")[0]}).take
|
||||
return -2, "请选择正确的仓库" unless fork_project.present?
|
||||
@exist_pullrequest = @project.pull_requests.where(is_original: true, head: @head.to_s.split(":")[1], base: @base, status: 0, fork_project_id: fork_project.id).take
|
||||
else
|
||||
@exist_pullrequest = @project.pull_requests.where(is_original: false, head: @base, base: @head, status: 0).take
|
||||
end
|
||||
if @exist_pullrequest.present?
|
||||
return -2, "在这些分支之间的合并请求已存在:<a href='/projects/#{@owner.login}/#{@project.identifier}/pulls/#{@exist_pullrequest.id}/Messagecount'>#{@exist_pullrequest.try(:title)}</a>"
|
||||
else
|
||||
if @compare_result["Commits"].blank? && @compare_result["Diff"].blank?
|
||||
return -2, "分支内容相同,无需创建合并请求"
|
||||
end
|
||||
end
|
||||
end
|
||||
return 0, "可以合并"
|
||||
end
|
||||
|
||||
def compare
|
||||
base, head = compare_params
|
||||
|
||||
# TODO: 处理fork的项目向源项目发送PR的base、head参数问题
|
||||
@compare_result ||=
|
||||
head.include?(":") ? gitea_compare(base, head) : gitea_compare(head, base)
|
||||
@head.include?(":") ? gitea_compare(@base, @head) : gitea_compare(@head, @base)
|
||||
end
|
||||
|
||||
def compare_params
|
||||
base = Addressable::URI.unescape(params[:base])
|
||||
head = params[:head].include?('json') ? params[:head]&.split('.json')[0] : params[:head]
|
||||
def load_compare_params
|
||||
@base = Addressable::URI.unescape(params[:base])
|
||||
@head = params[:head].include?('json') ? params[:head]&.split('.json')[0] : params[:head]
|
||||
|
||||
[base, head]
|
||||
end
|
||||
|
||||
def gitea_compare(base, head)
|
||||
Gitea::Repository::Commits::CompareService.call(@owner.login, @project.identifier, base, head)
|
||||
Gitea::Repository::Commits::CompareService.call(@owner.login, @project.identifier, base, head, current_user.gitea_token)
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -1,13 +1,17 @@
|
|||
module RegisterHelper
|
||||
extend ActiveSupport::Concern
|
||||
|
||||
def autologin_register(username, email, password, platform= 'forge')
|
||||
def autologin_register(username, email, password, platform= 'forge', need_edit_info = false)
|
||||
result = {message: nil, user: nil}
|
||||
|
||||
user = User.new(admin: false, login: username, mail: email, type: "User")
|
||||
user.password = password
|
||||
user.platform = platform
|
||||
user.activate
|
||||
if need_edit_info
|
||||
user.need_edit_info
|
||||
else
|
||||
user.activate
|
||||
end
|
||||
|
||||
return unless user.valid?
|
||||
|
||||
|
|
@ -27,4 +31,31 @@ module RegisterHelper
|
|||
result
|
||||
end
|
||||
|
||||
def autosync_register_trustie(username, password, email, lastname="")
|
||||
config = Rails.application.config_for(:configuration).symbolize_keys!
|
||||
|
||||
api_host = config[:sync_url]
|
||||
|
||||
return if api_host.blank?
|
||||
|
||||
url = "#{api_host}/api/v1/users/common"
|
||||
sync_json = {
|
||||
"mail": email,
|
||||
"password": password,
|
||||
"login": username,
|
||||
"lastname": lastname
|
||||
}.compact
|
||||
uri = URI.parse(url)
|
||||
|
||||
if api_host
|
||||
http = Net::HTTP.new(uri.hostname, uri.port)
|
||||
|
||||
if api_host.include?("https://")
|
||||
http.use_ssl = true
|
||||
end
|
||||
|
||||
http.send_request('POST', uri.path, sync_json.to_json, {'Content-Type' => 'application/json'})
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ class IssueTagsController < ApplicationController
|
|||
|
||||
|
||||
def index
|
||||
issue_tags = @project.issue_tags.order("#{order_name} #{order_type}")
|
||||
issue_tags = @project.issue_tags.reorder("#{order_name} #{order_type}")
|
||||
@user_admin_or_member = current_user.present? && (current_user.admin || @project.member?(current_user))
|
||||
@page = params[:page] || 1
|
||||
@limit = params[:limit] || 15
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@ class IssuesController < ApplicationController
|
|||
before_action :load_project
|
||||
before_action :set_user
|
||||
before_action :check_issue_permission
|
||||
before_action :operate_issue_permission, only:[:create, :update, :destroy, :clean, :series_update, :copy]
|
||||
before_action :check_project_public, only: [:index ,:show, :copy, :index_chosen, :close_issue]
|
||||
|
||||
before_action :set_issue, only: [:edit, :update, :destroy, :show, :copy, :close_issue, :lock_issue]
|
||||
|
|
@ -218,7 +219,7 @@ class IssuesController < ApplicationController
|
|||
change_type = change_token > 0 ? "add" : "minus"
|
||||
post_to_chain(change_type, change_token.abs, current_user.try(:login))
|
||||
end
|
||||
@issue.create_journal_detail(change_files, issue_files, issue_file_ids, current_user&.id)
|
||||
@issue.create_journal_detail(change_files, issue_files, issue_file_ids, current_user&.id) if @issue.previous_changes.present?
|
||||
normal_status(0, "更新成功")
|
||||
else
|
||||
normal_status(-1, "更新失败")
|
||||
|
|
@ -230,7 +231,7 @@ class IssuesController < ApplicationController
|
|||
end
|
||||
|
||||
def show
|
||||
@user_permission = current_user.present? && current_user.logged? && (!@issue.is_lock || @project.member?(current_user) || current_user.admin? || @issue.user == current_user)
|
||||
@user_permission = current_user.present? && current_user.logged? && (@project.member?(current_user) || current_user.admin? || @issue.user == current_user)
|
||||
@issue_attachments = @issue.attachments
|
||||
@issue_user = @issue.user
|
||||
@issue_assign_to = @issue.get_assign_user
|
||||
|
|
@ -301,9 +302,11 @@ class IssuesController < ApplicationController
|
|||
# update_hash = params[:issue]
|
||||
issue_ids = params[:ids]
|
||||
if issue_ids.present?
|
||||
issues = Issue.where(id: issue_ids)
|
||||
if update_hash.blank?
|
||||
normal_status(-1, "请选择批量更新内容")
|
||||
elsif Issue.where(id: issue_ids).update_all(update_hash)
|
||||
elsif issues&.update(update_hash)
|
||||
issues.map{|i| i.create_journal_detail(false, [], [], current_user&.id) if i.previous_changes.present?}
|
||||
normal_status(0, "批量更新成功")
|
||||
else
|
||||
normal_status(-1, "批量更新失败")
|
||||
|
|
@ -315,6 +318,7 @@ class IssuesController < ApplicationController
|
|||
|
||||
def copy
|
||||
@new_issue = @issue.dup
|
||||
@new_issue.author_id = current_user.id
|
||||
if @new_issue.save
|
||||
issue_tags = @issue.issue_tags.pluck(:id)
|
||||
if issue_tags.present?
|
||||
|
|
@ -412,6 +416,10 @@ class IssuesController < ApplicationController
|
|||
end
|
||||
end
|
||||
|
||||
def operate_issue_permission
|
||||
return render_forbidden("您没有权限进行此操作.") unless current_user.admin? || @project.member?(current_user)
|
||||
end
|
||||
|
||||
def export_issues(issues)
|
||||
@table_columns = %w(ID 类型 标题 描述 状态 指派给 优先级 标签 发布人 创建时间 里程碑 开始时间 截止时间 完成度 分类 金额 属于)
|
||||
@export_issues = []
|
||||
|
|
|
|||
|
|
@ -47,7 +47,7 @@ class MembersController < ApplicationController
|
|||
end
|
||||
|
||||
def member_exists?
|
||||
@project.members.exists?(params[:user_id])
|
||||
@project.members.exists?(user_id: params[:user_id])
|
||||
end
|
||||
|
||||
def operate!
|
||||
|
|
@ -55,10 +55,10 @@ class MembersController < ApplicationController
|
|||
end
|
||||
|
||||
def check_member_exists!
|
||||
return render_result(1, "user_id为#{params[:user_id]}的用户已经是项目成员") if member_exists?
|
||||
return render_error("user_id为#{params[:user_id]}的用户已经是项目成员") if member_exists?
|
||||
end
|
||||
|
||||
def check_member_not_exists!
|
||||
return render_result(1, "user_id为#{params[:user_id]}的用户还不是项目成员") unless @project.member?(params[:user_id])
|
||||
return render_error("user_id为#{params[:user_id]}的用户还不是项目成员") unless member_exists?
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@ class Oauth::BaseController < ActionController::Base
|
|||
include RenderHelper
|
||||
include LoginHelper
|
||||
include ControllerRescueHandler
|
||||
include LoggerHelper
|
||||
# include LaboratoryHelper
|
||||
|
||||
skip_before_action :verify_authenticity_token
|
||||
|
|
@ -11,6 +12,18 @@ class Oauth::BaseController < ActionController::Base
|
|||
end
|
||||
|
||||
private
|
||||
def tip_exception(status = -1, message)
|
||||
raise Educoder::TipException.new(status, message)
|
||||
end
|
||||
|
||||
def tip_show_exception(status = -2, message)
|
||||
raise Educoder::TipException.new(status, message)
|
||||
end
|
||||
|
||||
def tip_show(exception)
|
||||
uid_logger("Tip show status is #{exception.status}, message is #{exception.message}")
|
||||
render json: exception.tip_json
|
||||
end
|
||||
|
||||
def session_user_id
|
||||
# session[:user_id]
|
||||
|
|
@ -48,4 +61,13 @@ class Oauth::BaseController < ActionController::Base
|
|||
Rails.logger.info("[wechat] set session unionid: #{unionid}")
|
||||
session[:unionid] = unionid
|
||||
end
|
||||
|
||||
def session_edulogin
|
||||
session[:edulogin]
|
||||
end
|
||||
|
||||
def set_session_edulogin(login)
|
||||
Rails.logger.info("[educoder] set sesstion edulogin: #{login}")
|
||||
session[:edulogin] = login
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -1,4 +1,6 @@
|
|||
class Oauth::EducoderController < Oauth::BaseController
|
||||
include RegisterHelper
|
||||
|
||||
def bind
|
||||
begin
|
||||
login = params[:login]
|
||||
|
|
@ -32,4 +34,41 @@ class Oauth::EducoderController < Oauth::BaseController
|
|||
render_error(ex.message)
|
||||
end
|
||||
end
|
||||
|
||||
# 需要educoder那边设置回调地址
|
||||
def create
|
||||
begin
|
||||
code = params['code'].to_s.strip
|
||||
tip_exception("code不能为空") if code.blank?
|
||||
|
||||
new_user = false
|
||||
result = EducoderOauth::Service.access_token(code)
|
||||
result = EducoderOauth::Service.user_info(result[:access_token])
|
||||
|
||||
# 存在该用户
|
||||
open_user = OpenUsers::Educoder.find_by(uid: result['login'])
|
||||
if open_user.present? && open_user.user.present?
|
||||
successful_authentication(open_user.user)
|
||||
else
|
||||
if current_user.blank? || !current_user.logged?
|
||||
new_user = true
|
||||
login = User.generate_login('E')
|
||||
reg_result = autologin_register(login,"#{login}@forge.com", "Ec#{login}2021#", 'educoder', true)
|
||||
if reg_result[:message].blank?
|
||||
open_user = OpenUsers::Educoder.create!(user_id: reg_result[:user][:id], uid: result['login'], extra: result)
|
||||
autosync_register_trustie(login, "Ec#{login}2021#", "#{login}@forge.com")
|
||||
successful_authentication(open_user.user)
|
||||
else
|
||||
render_error(reg_result[:message])
|
||||
end
|
||||
else
|
||||
OpenUsers::Educoder.create!(user: current_user, uid: result['login'], extra: result)
|
||||
end
|
||||
end
|
||||
|
||||
redirect_to root_path(new_user: new_user)
|
||||
rescue Exception => ex
|
||||
render_error(ex.message)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -61,6 +61,7 @@ class OauthController < ApplicationController
|
|||
login = params[:login]
|
||||
email = params[:mail]
|
||||
password = params[:password]
|
||||
lastname = params[:lastname]
|
||||
callback_url = params[:callback_url]
|
||||
platform = params[:plathform] || 'educoder'
|
||||
|
||||
|
|
@ -72,8 +73,11 @@ class OauthController < ApplicationController
|
|||
if result[:message].blank?
|
||||
logger.info "[Oauth educoer] ====auto_register success"
|
||||
user = User.find result[:user][:id]
|
||||
successful_authentication(user)
|
||||
user.update_column(:lastname, params[:lastname])
|
||||
autosync_register_trustie(login, password, email, lastname)
|
||||
|
||||
OpenUsers::Educoder.create!(user: user, uid: user.login)
|
||||
successful_authentication(user)
|
||||
|
||||
render json: { callback_url: callback_url }
|
||||
# redirect_to callback_url
|
||||
|
|
|
|||
|
|
@ -29,6 +29,11 @@ class Organizations::TeamUsersController < Organizations::BaseController
|
|||
ActiveRecord::Base.transaction do
|
||||
@team_user.destroy!
|
||||
Gitea::Organization::TeamUser::DeleteService.call(@organization.gitea_token, @team.gtid, @operate_user.login)
|
||||
org_team_users = @organization.team_users.where(user_id: @operate_user.id)
|
||||
unless org_team_users.present?
|
||||
@organization.organization_users.find_by(user_id: @operate_user.id).destroy!
|
||||
Gitea::Organization::OrganizationUser::DeleteService.call(@organization.gitea_token, @organization.login, @operate_user.login)
|
||||
end
|
||||
render_ok
|
||||
end
|
||||
rescue Exception => e
|
||||
|
|
@ -43,6 +48,11 @@ class Organizations::TeamUsersController < Organizations::BaseController
|
|||
ActiveRecord::Base.transaction do
|
||||
@team_user.destroy!
|
||||
Gitea::Organization::TeamUser::DeleteService.call(@organization.gitea_token, @team.gtid, current_user.login)
|
||||
org_team_users = @organization.team_users.where(user_id: current_user.id)
|
||||
unless org_team_users.present?
|
||||
@organization.organization_users.find_by(user_id: current_user.id).destroy!
|
||||
Gitea::Organization::OrganizationUser::DeleteService.call(@organization.gitea_token, @organization.login, current_user.login)
|
||||
end
|
||||
render_ok
|
||||
end
|
||||
rescue Exception => e
|
||||
|
|
|
|||
|
|
@ -4,4 +4,7 @@ class Projects::BaseController < ApplicationController
|
|||
before_action :load_project
|
||||
before_action :load_repository
|
||||
|
||||
def require_manager!
|
||||
return render_forbidden('你没有权限操作') unless current_user.admin? || @project.manager?(current_user)
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@ class Projects::TeamsController < Projects::BaseController
|
|||
def create
|
||||
ActiveRecord::Base.transaction do
|
||||
@team_project = TeamProject.build(@owner.id, @operate_team.id, @project.id)
|
||||
Gitea::Organization::TeamProject::CreateService.call(@owner.gitea_token, @operate_team.gtid, @owner.login, @project.identifier)
|
||||
Gitea::Organization::TeamProject::CreateService.call(current_user.gitea_token, @operate_team.gtid, @owner.login, @project.identifier)
|
||||
render_ok
|
||||
end
|
||||
rescue Exception => e
|
||||
|
|
@ -25,7 +25,7 @@ class Projects::TeamsController < Projects::BaseController
|
|||
def destroy
|
||||
ActiveRecord::Base.transaction do
|
||||
@team_project.destroy!
|
||||
Gitea::Organization::TeamProject::DeleteService.call(@owner.gitea_token, @operate_team.gtid, @owner.login, @project.identifier)
|
||||
Gitea::Organization::TeamProject::DeleteService.call(current_user.gitea_token, @operate_team.gtid, @owner.login, @project.identifier)
|
||||
render_ok
|
||||
end
|
||||
rescue Exception => e
|
||||
|
|
|
|||
|
|
@ -0,0 +1,116 @@
|
|||
class Projects::WebhooksController < Projects::BaseController
|
||||
before_action :require_manager!
|
||||
before_action :find_webhook, only:[:edit, :update, :destroy, :tasks, :test]
|
||||
|
||||
def index
|
||||
@webhooks = @project.webhooks
|
||||
@webhooks = kaminari_paginate(@webhooks)
|
||||
end
|
||||
|
||||
def create
|
||||
ActiveRecord::Base.transaction do
|
||||
return render_error("webhooks数量已到上限!请删除暂不使用的webhooks以进行添加操作") if @project.webhooks.size > 19
|
||||
return render_error("参数错误.") unless webhook_params.present?
|
||||
form = Projects::Webhooks::CreateForm.new(webhook_params)
|
||||
return render json: {status: -1, message: form.errors} unless form.validate!
|
||||
response = Gitea::Repository::Webhooks::CreateService.new(operating_token, @project&.owner&.login, @project&.identifier, gitea_webhooks_params).call
|
||||
if response[0] == 201
|
||||
@webhook = response[2]
|
||||
else
|
||||
render_error("创建失败.")
|
||||
end
|
||||
end
|
||||
rescue Exception => e
|
||||
uid_logger_error(e.message)
|
||||
tip_exception(e.message)
|
||||
end
|
||||
|
||||
def edit
|
||||
|
||||
end
|
||||
|
||||
def update
|
||||
return render_error("参数错误.") unless webhook_params.present?
|
||||
form = Projects::Webhooks::CreateForm.new(webhook_params)
|
||||
return render json: {status: -1, message: form.errors} unless form.validate!
|
||||
response = Gitea::Repository::Webhooks::UpdateService.call(operating_token, @project&.owner&.login, @project&.identifier, @webhook.id, gitea_webhooks_params)
|
||||
if response[0] == 200
|
||||
@webhook = response[2]
|
||||
render_ok
|
||||
else
|
||||
render_error("更新失败.")
|
||||
end
|
||||
rescue Exception => e
|
||||
uid_logger_error(e.message)
|
||||
tip_exception(e.message)
|
||||
end
|
||||
|
||||
def destroy
|
||||
response = Gitea::Repository::Webhooks::DeleteService.call(operating_token, @project&.owner&.login, @project&.identifier, @webhook.id)
|
||||
if response[0] == 204
|
||||
@webhook = response[2]
|
||||
render_ok
|
||||
else
|
||||
render_error("删除失败.")
|
||||
end
|
||||
rescue Exception => e
|
||||
uid_logger_error(e.message)
|
||||
tip_exception(e.message)
|
||||
end
|
||||
|
||||
def tasks
|
||||
@tasks = @webhook.tasks.where(is_delivered: true).order("delivered desc")
|
||||
@tasks = kaminari_paginate(@tasks)
|
||||
end
|
||||
|
||||
def test
|
||||
ActiveRecord::Base.transaction do
|
||||
response = Gitea::Repository::Webhooks::TestService.call(operating_token, @project&.owner&.login, @project&.identifier, @webhook.id)
|
||||
if response[0] == 204
|
||||
render_ok
|
||||
else
|
||||
render_error("测试推送失败.")
|
||||
end
|
||||
end
|
||||
rescue Exception => e
|
||||
uid_logger_error(e.message)
|
||||
tip_exception(e.message)
|
||||
end
|
||||
|
||||
private
|
||||
def find_webhook
|
||||
@webhook = @project.webhooks.find_by_id(params[:id])
|
||||
return render_not_found if @webhook.nil?
|
||||
end
|
||||
|
||||
def webhook_params
|
||||
params.require(:webhook).permit(:url, :type, :http_method, :content_type, :secret, :active, :branch_filter, events: [])
|
||||
end
|
||||
|
||||
def webhook_type
|
||||
webhook_params.fetch(:type, "gitea")
|
||||
end
|
||||
|
||||
def webhook_branch_filter
|
||||
webhook_params.fetch(:branch_filter, "*")
|
||||
end
|
||||
|
||||
def gitea_webhooks_params
|
||||
{
|
||||
active: webhook_params[:active],
|
||||
branch_filter: webhook_branch_filter,
|
||||
config: {
|
||||
content_type: webhook_params[:content_type],
|
||||
url: webhook_params[:url],
|
||||
http_method: webhook_params[:http_method],
|
||||
secret: webhook_params[:secret]
|
||||
},
|
||||
events: webhook_params[:events],
|
||||
type: webhook_type,
|
||||
}
|
||||
end
|
||||
|
||||
def operating_token
|
||||
@project.member?(current_user) ? current_user.gitea_token : @project&.owner&.gitea_token
|
||||
end
|
||||
end
|
||||
|
|
@ -5,7 +5,7 @@ class ProjectsController < ApplicationController
|
|||
include Acceleratorable
|
||||
|
||||
before_action :require_login, except: %i[index branches group_type_list simple show fork_users praise_users watch_users recommend about menu_list]
|
||||
before_action :load_project, except: %i[index group_type_list migrate create recommend]
|
||||
before_action :load_repository, except: %i[index group_type_list migrate create recommend]
|
||||
before_action :authorizate_user_can_edit_project!, only: %i[update]
|
||||
before_action :project_public?, only: %i[fork_users praise_users watch_users]
|
||||
|
||||
|
|
@ -16,6 +16,7 @@ class ProjectsController < ApplicationController
|
|||
menu.append(menu_hash_by_name("code")) if @project.has_menu_permission("code")
|
||||
menu.append(menu_hash_by_name("issues")) if @project.has_menu_permission("issues")
|
||||
menu.append(menu_hash_by_name("pulls")) if @project.has_menu_permission("pulls")
|
||||
menu.append(menu_hash_by_name("wiki")) if @project.has_menu_permission("wiki")
|
||||
menu.append(menu_hash_by_name("devops")) if @project.has_menu_permission("devops")
|
||||
menu.append(menu_hash_by_name("versions")) if @project.has_menu_permission("versions")
|
||||
menu.append(menu_hash_by_name("resources")) if @project.has_menu_permission("resources")
|
||||
|
|
@ -108,18 +109,25 @@ class ProjectsController < ApplicationController
|
|||
ActiveRecord::Base.transaction do
|
||||
# TODO:
|
||||
# 临时特殊处理修改website、lesson_url操作方法
|
||||
if project_params.has_key?("website")
|
||||
if project_params.has_key?("website")
|
||||
@project.update(project_params)
|
||||
elsif project_params.has_key?("default_branch")
|
||||
@project.update(project_params)
|
||||
gitea_params = {
|
||||
default_branch: @project.default_branch
|
||||
}
|
||||
Gitea::Repository::UpdateService.call(@owner, @project.identifier, gitea_params)
|
||||
else
|
||||
validate_params = project_params.slice(:name, :description,
|
||||
:project_category_id, :project_language_id, :private)
|
||||
|
||||
Projects::UpdateForm.new(validate_params).validate!
|
||||
|
||||
private = params[:private] || false
|
||||
private = @project.forked_from_project.present? ? !@project.forked_from_project.is_public : params[:private] || false
|
||||
|
||||
new_project_params = project_params.except(:private).merge(is_public: !private)
|
||||
@project.update_attributes!(new_project_params)
|
||||
@project.forked_projects.update_all(is_public: @project.is_public)
|
||||
gitea_params = {
|
||||
private: private,
|
||||
default_branch: @project.default_branch,
|
||||
|
|
@ -144,6 +152,7 @@ class ProjectsController < ApplicationController
|
|||
ActiveRecord::Base.transaction do
|
||||
Gitea::Repository::DeleteService.new(@project.owner, @project.identifier).call
|
||||
@project.destroy!
|
||||
@project.forked_projects.update_all(forked_from_project_id: nil)
|
||||
render_ok
|
||||
end
|
||||
else
|
||||
|
|
@ -211,7 +220,7 @@ class ProjectsController < ApplicationController
|
|||
|
||||
private
|
||||
def project_params
|
||||
params.permit(:user_id, :name, :description, :repository_name, :website, :lesson_url,
|
||||
params.permit(:user_id, :name, :description, :repository_name, :website, :lesson_url, :default_branch,
|
||||
:project_category_id, :project_language_id, :license_id, :ignore_id, :private)
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,64 @@
|
|||
class PublicKeysController < ApplicationController
|
||||
before_action :require_login
|
||||
before_action :find_public_key, only: [:destroy]
|
||||
|
||||
def index
|
||||
@public_keys = current_user.public_keys
|
||||
@public_keys = kaminari_paginate(@public_keys)
|
||||
rescue Exception => e
|
||||
uid_logger_error(e.message)
|
||||
tip_exception(e.message)
|
||||
end
|
||||
|
||||
def create
|
||||
return render_error("参数错误") if public_key_params.blank?
|
||||
return render_ok({status: 10002, message: "请输入密钥"}) if public_key_params[:key].blank?
|
||||
return render_ok({status: 10001, message: "请输入标题"}) if public_key_params[:title].blank?
|
||||
@gitea_response = Gitea::User::Keys::CreateService.call(current_user.gitea_token, public_key_params)
|
||||
if @gitea_response[0] == 201
|
||||
@public_key = @gitea_response[2]
|
||||
else
|
||||
return render_error("创建ssh key失败") if @gitea_response[2].blank?
|
||||
return render_ok({status: 10002, message: "密钥格式不正确"}) if @gitea_response[2]["message"].starts_with?("Invalid key content")
|
||||
exist_public_key = Gitea::PublicKey.find_by(content: public_key_params[:key])
|
||||
return render_ok({status: 10002, message: "密钥已被占用"}) if @gitea_response[2]["message"].starts_with?("Key content has been used as non-deploy key") && exist_public_key.present? && exist_public_key&.owner_id != current_user.gitea_uid
|
||||
return render_ok({status: 10002, message: "密钥已存在,请勿重复添加"}) if @gitea_response[2]["message"].starts_with?("Key content has been used as non-deploy key")
|
||||
@public_key = nil
|
||||
end
|
||||
rescue Exception => e
|
||||
uid_logger_error(e.message)
|
||||
tip_exception(e.message)
|
||||
end
|
||||
|
||||
def destroy
|
||||
return render_not_found unless @public_key.present?
|
||||
result = Gitea::User::Keys::DeleteService.call(current_user.gitea_token, @public_key.id)
|
||||
if result[0] == 204
|
||||
render_ok
|
||||
else
|
||||
render_error
|
||||
end
|
||||
rescue Exception => e
|
||||
uid_logger_error(e.message)
|
||||
tip_exception(e.message)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def page
|
||||
params[:page].to_i.zero? ? 1 : params[:page].to_i
|
||||
end
|
||||
|
||||
def limit
|
||||
limit = params[:limit] || params[:per_page]
|
||||
limit = (limit.to_i.zero? || limit.to_i > 15) ? 15 : limit.to_i
|
||||
end
|
||||
|
||||
def public_key_params
|
||||
params.require(:public_key).permit(:key, :title)
|
||||
end
|
||||
|
||||
def find_public_key
|
||||
@public_key = current_user.public_keys.find_by_id(params[:id])
|
||||
end
|
||||
end
|
||||
|
|
@ -19,6 +19,7 @@ class PullRequestsController < ApplicationController
|
|||
@close_issues = @filter_issues.joins(:pull_request).where(pull_requests: {status: PullRequest::CLOSED})
|
||||
@merged_issues = @filter_issues.joins(:pull_request).where(pull_requests: {status: PullRequest::MERGED})
|
||||
@user_admin_or_member = current_user.present? && (current_user.admin || @project.member?(current_user))
|
||||
@user_admin_or_developer = current_user.present? && (current_user.admin || @project.all_developers.include?(current_user))
|
||||
|
||||
scopes = Issues::ListQueryService.call(issues,params.delete_if{|k,v| v.blank?}, "PullRequest")
|
||||
@issues_size = scopes.size
|
||||
|
|
@ -56,7 +57,7 @@ class PullRequestsController < ApplicationController
|
|||
ActiveRecord::Base.transaction do
|
||||
@pull_request, @gitea_pull_request = PullRequests::CreateService.call(current_user, @owner, @project, params)
|
||||
if @gitea_pull_request[:status] == :success
|
||||
@pull_request.bind_gitea_pull_request!(@gitea_pull_request[:body]["number"])
|
||||
@pull_request.bind_gitea_pull_request!(@gitea_pull_request[:body]["number"], @gitea_pull_request[:body]["id"])
|
||||
render_ok
|
||||
else
|
||||
render_error("create pull request error: #{@gitea_pull_request[:status]}")
|
||||
|
|
@ -91,7 +92,7 @@ class PullRequestsController < ApplicationController
|
|||
if @issue.update_attributes(@issue_params)
|
||||
if @pull_request.update_attributes(@local_params.compact)
|
||||
gitea_pull = Gitea::PullRequest::UpdateService.call(@owner.login, @repository.identifier,
|
||||
@pull_request.gpid, @requests_params, current_user.gitea_token)
|
||||
@pull_request.gitea_number, @requests_params, current_user.gitea_token)
|
||||
|
||||
if gitea_pull[:status] === :success
|
||||
if params[:issue_tag_ids].present?
|
||||
|
|
@ -139,7 +140,7 @@ class PullRequestsController < ApplicationController
|
|||
@issue_user = @issue.user
|
||||
@issue_assign_to = @issue.get_assign_user
|
||||
@gitea_pull = Gitea::PullRequest::GetService.call(@owner.login,
|
||||
@repository.identifier, @pull_request.gpid, current_user&.gitea_token)
|
||||
@repository.identifier, @pull_request.gitea_number, current_user&.gitea_token)
|
||||
end
|
||||
|
||||
def pr_merge
|
||||
|
|
@ -150,9 +151,16 @@ class PullRequestsController < ApplicationController
|
|||
else
|
||||
ActiveRecord::Base.transaction do
|
||||
begin
|
||||
result = PullRequests::MergeService.call(@owner, @repository, @pull_request, current_user, params)
|
||||
@gitea_pull = Gitea::PullRequest::GetService.call(@owner.login, @repository.identifier, @pull_request.gitea_number, current_user&.gitea_token)
|
||||
|
||||
if result.status == 200 && @pull_request.merge!
|
||||
if @gitea_pull["merged_by"].present?
|
||||
success_condition = true
|
||||
else
|
||||
result = PullRequests::MergeService.call(@owner, @repository, @pull_request, current_user, params)
|
||||
success_condition = result.status == 200
|
||||
end
|
||||
|
||||
if success_condition && @pull_request.merge!
|
||||
@pull_request.project_trend_status!
|
||||
@issue&.custom_journal_detail("merge", "", "该合并请求已被合并", current_user&.id)
|
||||
normal_status(1, "合并成功")
|
||||
|
|
@ -191,12 +199,12 @@ class PullRequestsController < ApplicationController
|
|||
|
||||
|
||||
def files
|
||||
@files_result = Gitea::PullRequest::FilesService.call(@owner.login, @project.identifier, @pull_request.gpid, current_user&.gitea_token)
|
||||
@files_result = Gitea::PullRequest::FilesService.call(@owner.login, @project.identifier, @pull_request.gitea_number, current_user&.gitea_token)
|
||||
# render json: @files_result
|
||||
end
|
||||
|
||||
def commits
|
||||
@commits_result = Gitea::PullRequest::CommitsService.call(@owner.login, @project.identifier, @pull_request.gpid, current_user&.gitea_token)
|
||||
@commits_result = Gitea::PullRequest::CommitsService.call(@owner.login, @project.identifier, @pull_request.gitea_number, current_user&.gitea_token)
|
||||
# render json: @commits_result
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -5,9 +5,9 @@ class RepositoriesController < ApplicationController
|
|||
|
||||
before_action :require_login, only: %i[edit update create_file update_file delete_file sync_mirror]
|
||||
before_action :load_repository
|
||||
before_action :authorizate!, except: [:sync_mirror, :tags, :commit]
|
||||
before_action :authorizate!, except: [:sync_mirror, :tags, :commit, :archive]
|
||||
before_action :authorizate_user_can_edit_repo!, only: %i[sync_mirror]
|
||||
before_action :get_ref, only: %i[entries sub_entries top_counts file]
|
||||
before_action :get_ref, only: %i[entries sub_entries top_counts file archive]
|
||||
before_action :get_latest_commit, only: %i[entries sub_entries top_counts]
|
||||
before_action :get_statistics, only: %i[top_counts]
|
||||
|
||||
|
|
@ -192,6 +192,19 @@ class RepositoriesController < ApplicationController
|
|||
render json: languages_precentagable
|
||||
end
|
||||
|
||||
def archive
|
||||
domain = Gitea.gitea_config[:domain]
|
||||
api_url = Gitea.gitea_config[:base_url]
|
||||
archive_url = "/repos/#{@owner.login}/#{@repository.identifier}/archive/#{params[:archive]}"
|
||||
|
||||
file_path = [domain, api_url, archive_url].join
|
||||
file_path = [file_path, "access_token=#{current_user&.gitea_token}"].join("?") if @repository.hidden?
|
||||
|
||||
return render_not_found if !request.format.zip? && !request.format.gzip?
|
||||
|
||||
redirect_to file_path
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def find_project
|
||||
|
|
@ -266,7 +279,7 @@ class RepositoriesController < ApplicationController
|
|||
|
||||
# uploadPushInfo
|
||||
end
|
||||
|
||||
|
||||
def create_new_pr(params)
|
||||
if params[:new_branch].present? && params[:new_branch] != params[:branch]
|
||||
local_params = {
|
||||
|
|
@ -303,7 +316,7 @@ class RepositoriesController < ApplicationController
|
|||
local_requests = PullRequest.new(local_params.merge(user_id: current_user.try(:id), project_id: @project.id, issue_id: @pull_issue.id))
|
||||
if local_requests.save
|
||||
gitea_request = Gitea::PullRequest::CreateService.new(current_user.try(:gitea_token), @owner.login, @project.try(:identifier), requests_params).call
|
||||
if gitea_request[:status] == :success && local_requests.update_attributes(gpid: gitea_request["body"]["number"])
|
||||
if gitea_request[:status] == :success && local_requests.update_attributes(gitea_number: gitea_request["body"]["number"])
|
||||
local_requests.project_trends.create(user_id: current_user.id, project_id: @project.id, action_type: "create")
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ class SettingsController < ApplicationController
|
|||
get_add_menu
|
||||
get_common_menu
|
||||
get_personal_menu
|
||||
|
||||
get_third_party
|
||||
end
|
||||
|
||||
private
|
||||
|
|
@ -40,6 +40,14 @@ class SettingsController < ApplicationController
|
|||
end
|
||||
end
|
||||
|
||||
def get_third_party
|
||||
@third_party = []
|
||||
@third_party << {
|
||||
name: 'educoder',
|
||||
url: EducoderOauth.oauth_url
|
||||
}
|
||||
end
|
||||
|
||||
def get_site_url(key, value)
|
||||
key.to_s === "url" ? append_http(reset_site_url(value)) : reset_site_url(value)
|
||||
end
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ class Users::BaseController < ApplicationController
|
|||
helper_method :observed_logged_user?, :observed_user
|
||||
|
||||
def observed_user
|
||||
@_observed_user ||= (User.find_by_id(params[:user_id]) || User.find_by_login(params[:user_id]))
|
||||
@_observed_user ||= (User.find_by_login(params[:user_id]) || User.find_by_id(params[:user_id]))
|
||||
end
|
||||
|
||||
def observed_logged_user?
|
||||
|
|
|
|||
|
|
@ -267,7 +267,7 @@ class UsersController < ApplicationController
|
|||
|
||||
interactor = Gitea::User::UpdateInteractor.call(user.login, sync_params)
|
||||
if interactor.success?
|
||||
user.update!(password: params[:password], mail: params[:email], status: User::STATUS_EDIT_INFO)
|
||||
user.update!(password: params[:password], mail: params[:email], status: User::STATUS_ACTIVE)
|
||||
render_ok
|
||||
else
|
||||
render_error(interactor.error)
|
||||
|
|
|
|||
|
|
@ -25,17 +25,13 @@ class VersionsController < ApplicationController
|
|||
end
|
||||
|
||||
def show
|
||||
version_issues = @version.issues.issue_includes
|
||||
version_issues = @version.issues.issue_issue.issue_includes
|
||||
|
||||
status_type = params[:status_type] || "1"
|
||||
# @close_issues_size = version_issues.where(status_id: 5).size
|
||||
# @open_issues_size = version_issues.size - @close_issues_size
|
||||
|
||||
if status_type.to_s == "1" #表示开启中的
|
||||
version_issues = version_issues.where.not(status_id: 5)
|
||||
else
|
||||
version_issues = version_issues.where(status_id: 5)
|
||||
end
|
||||
|
||||
version_issues = version_issues.where(author_id: params[:author_id]) if params[:author_id].present? && params[:author_id].to_s != "all"
|
||||
version_issues = version_issues.where(assigned_to_id: params[:assigned_to_id]) if params[:assigned_to_id].present? && params[:assigned_to_id].to_s != "all"
|
||||
version_issues = version_issues.where(tracker_id: params[:tracker_id]) if params[:tracker_id].present? && params[:tracker_id].to_s != "all"
|
||||
|
|
@ -47,10 +43,26 @@ class VersionsController < ApplicationController
|
|||
version_issues = version_issues.joins(:issue_tags).where(issue_tags: {id: params[:issue_tag_id].to_i}) if params[:issue_tag_id].present? && params[:issue_tag_id].to_s != "all"
|
||||
|
||||
version_issues = version_issues.reorder("#{order_name} #{order_type}")
|
||||
has_filter_params = (params[:author_id].present? && params[:author_id].to_s != "all") ||
|
||||
(params[:assigned_to_id].present? && params[:assigned_to_id].to_s != "all") ||
|
||||
(params[:tracker_id].present? && params[:tracker_id].to_s != "all") ||
|
||||
(params[:status_id].present? && params[:status_id].to_s != "all") ||
|
||||
(params[:priority_id].present? && params[:priority_id].to_s != "all") ||
|
||||
(params[:fixed_version_id].present? && params[:fixed_version_id].to_s != "all") ||
|
||||
(params[:done_ratio].present? && params[:done_ratio].to_s != "all") ||
|
||||
(params[:issue_type].present? && params[:issue_type].to_s != "all") ||
|
||||
(params[:issue_tag_id].present? && params[:issue_tag_id].to_s != "all")
|
||||
@version_close_issues_size = has_filter_params ? version_issues.closed.size : @version.issues.issue_issue.issue_includes.closed.size
|
||||
@version_issues_size = has_filter_params ? version_issues.size : @version.issues.issue_issue.issue_includes.size
|
||||
if status_type.to_s == "1" #表示开启中的
|
||||
version_issues = version_issues.where.not(status_id: 5)
|
||||
else
|
||||
version_issues = version_issues.where(status_id: 5)
|
||||
end
|
||||
|
||||
@page = params[:page] || 1
|
||||
@limit = params[:limit] || 15
|
||||
@version_issues_size = version_issues.size
|
||||
# @version_issues_size = version_issues.size
|
||||
@version_issues = version_issues.page(@page).per(@limit)
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@ toc_footers:
|
|||
includes:
|
||||
- licenses
|
||||
- gitignores
|
||||
- public_keys
|
||||
- users
|
||||
- projects
|
||||
- repositories
|
||||
|
|
|
|||
|
|
@ -0,0 +1,158 @@
|
|||
<!--
|
||||
* @Date: 2021-07-14 15:10:29
|
||||
* @LastEditors: viletyy
|
||||
* @LastEditTime: 2021-07-14 15:37:23
|
||||
* @FilePath: /forgeplus/app/docs/slate/source/includes/_public_keys.md
|
||||
-->
|
||||
# PublicKeys
|
||||
|
||||
## public_keys列表
|
||||
获取public_keys列表,支持分页
|
||||
|
||||
> 示例:
|
||||
|
||||
```shell
|
||||
curl -X GET \
|
||||
http://localhost:3000/api/public_keys.json
|
||||
```
|
||||
|
||||
```javascript
|
||||
await octokit.request('GET /api/public_keys.json')
|
||||
```
|
||||
|
||||
### HTTP 请求
|
||||
`GET api/public_keys.json`
|
||||
|
||||
### 请求参数
|
||||
参数 | 必选 | 默认 | 类型 | 字段说明
|
||||
--------- | ------- | ------- | -------- | ----------
|
||||
page |否| 1 | int | 页码 |
|
||||
limit |否| 15 | int | 每页数量 |
|
||||
|
||||
### 返回字段说明
|
||||
参数 | 类型 | 字段说明
|
||||
--------- | ----------- | -----------
|
||||
total_count |int |总数 |
|
||||
public_keys.id |int |ID|
|
||||
public_keys.name |string|密钥标题|
|
||||
public_keys.content |string|密钥内容|
|
||||
public_keys.fingerprint |string|密钥标识|
|
||||
public_keys.created_time |string|密钥创建时间|
|
||||
|
||||
|
||||
> 返回的JSON示例:
|
||||
|
||||
```json
|
||||
{
|
||||
"total_count": 1,
|
||||
"public_keys": [
|
||||
{
|
||||
"id": 16,
|
||||
"name": "xxx",
|
||||
"content": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDe5ETOTB5PcmcYJkIhfF7+mxmJQDCLg7/LnMoKHpKoo/jYUnFU9OjfsxVo3FTNUvh2475WXMAur5KsFoNKjK9+JHxvoXyJKmyVPWgXU/NRxQyaWPnPLPK8qPRF5ksJE6feBOqtsdxsvBiHs2r1NX/U26Ecnpr6avudD0cmyrEfbYMWbupLrhsd39dswPT73f3W5jc7B9Y47Ioiv8UOju3ABt1+kpuAjaaVC6VtUQoEFiZb1y33yBnyePya7dvFyApyD4ILyyIG2rtZWK7l53YFnwZDuFsTWjEEEQD0U4FBSFdH5wtwx0WQLMSNyTtaFBSG0kJ+uiQQIrxlvikcm63df7zbC3/rWLPsKgW122Zt966dcpFqiCiJNDKZPPw3qpg8TBL6X+qIZ+FxVEk/16/zScpyEfoxQp0GvgxI7hPLErmfkC5tMsib8MAXYBNyvJXna0vg/wOaNNIaI4SAH9Ksh3f/TtalYVjp6WxIwVBfnbq51WnmlnEXePtX6XjAGL+GbF2VQ1nv/IzrY09tNbTV6wQsrSIP3VDzYQxdJ1rdsVNMoJB0H2Pu0NdcSz53Wx45N+myD0QnE05ss+zDp5StY90OYsx2aCo6qAA8Qn2jUjdta7MQWwkPfKrta4tTQ0XbWMjx4/E1+l3J5liwZkl2XOGOwhfXdRsBjaEziZ18kQ== yystopf@163.com",
|
||||
"fingerprint": "SHA256:cU8AK/+roqUUyiaYXIdS2Nj4+Rb2p6rqWSeRDc+aqKM",
|
||||
"created_unix": 1626246596,
|
||||
"created_time": "2021/07/14 15:09"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
<aside class="success">
|
||||
Success — a happy kitten is an authenticated kitten!
|
||||
</aside>
|
||||
|
||||
## 创建public_key
|
||||
创建public_key
|
||||
|
||||
> 示例:
|
||||
|
||||
```shell
|
||||
curl -X POST \
|
||||
http://localhost:3000/api/public_keys.json
|
||||
```
|
||||
|
||||
```javascript
|
||||
await octokit.request('POST /api/public_keys.json')
|
||||
```
|
||||
|
||||
### HTTP 请求
|
||||
`POST api/public_keys.json`
|
||||
|
||||
### 请求参数
|
||||
参数 | 必选 | 默认 | 类型 | 字段说明
|
||||
--------- | ------- | ------- | -------- | ----------
|
||||
key |是 | 否 | string | 密钥 |
|
||||
title |是 | 否 | string | 密钥标题 |
|
||||
|
||||
> 请求的JSON示例:
|
||||
```json
|
||||
{
|
||||
"public_key": {
|
||||
"key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDe5ETOTB5PcmcYJkIhfF7+mxmJQDCLg7/LnMoKHpKoo/jYUnFU9OjfsxVo3FTNUvh2475WXMAur5KsFoNKjK9+JHxvoXyJKmyVPWgXU/NRxQyaWPnPLPK8qPRF5ksJE6feBOqtsdxsvBiHs2r1NX/U26Ecnpr6avudD0cmyrEfbYMWbupLrhsd39dswPT73f3W5jc7B9Y47Ioiv8UOju3ABt1+kpuAjaaVC6VtUQoEFiZb1y33yBnyePya7dvFyApyD4ILyyIG2rtZWK7l53YFnwZDuFsTWjEEEQD0U4FBSFdH5wtwx0WQLMSNyTtaFBSG0kJ+uiQQIrxlvikcm63df7zbC3/rWLPsKgW122Zt966dcpFqiCiJNDKZPPw3qpg8TBL6X+qIZ+FxVEk/16/zScpyEfoxQp0GvgxI7hPLErmfkC5tMsib8MAXYBNyvJXna0vg/wOaNNIaI4SAH9Ksh3f/TtalYVjp6WxIwVBfnbq51WnmlnEXePtX6XjAGL+GbF2VQ1nv/IzrY09tNbTV6wQsrSIP3VDzYQxdJ1rdsVNMoJB0H2Pu0NdcSz53Wx45N+myD0QnE05ss+zDp5StY90OYsx2aCo6qAA8Qn2jUjdta7MQWwkPfKrta4tTQ0XbWMjx4/E1+l3J5liwZkl2XOGOwhfXdRsBjaEziZ18kQ== yystopf@163.com",
|
||||
"title": "xxx"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 返回字段说明
|
||||
参数 | 类型 | 字段说明
|
||||
--------- | ----------- | -----------
|
||||
total_count |int |总数 |
|
||||
id |int |ID|
|
||||
name |string|密钥标题|
|
||||
content |string|密钥内容|
|
||||
fingerprint |string|密钥标识|
|
||||
created_time |string|密钥创建时间|
|
||||
|
||||
|
||||
> 返回的JSON示例:
|
||||
|
||||
```json
|
||||
{
|
||||
"id": 17,
|
||||
"name": "xxx",
|
||||
"content": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDe5ETOTB5PcmcYJkIhfF7+mxmJQDCLg7/LnMoKHpKoo/jYUnFU9OjfsxVo3FTNUvh2475WXMAur5KsFoNKjK9+JHxvoXyJKmyVPWgXU/NRxQyaWPnPLPK8qPRF5ksJE6feBOqtsdxsvBiHs2r1NX/U26Ecnpr6avudD0cmyrEfbYMWbupLrhsd39dswPT73f3W5jc7B9Y47Ioiv8UOju3ABt1+kpuAjaaVC6VtUQoEFiZb1y33yBnyePya7dvFyApyD4ILyyIG2rtZWK7l53YFnwZDuFsTWjEEEQD0U4FBSFdH5wtwx0WQLMSNyTtaFBSG0kJ+uiQQIrxlvikcm63df7zbC3/rWLPsKgW122Zt966dcpFqiCiJNDKZPPw3qpg8TBL6X+qIZ+FxVEk/16/zScpyEfoxQp0GvgxI7hPLErmfkC5tMsib8MAXYBNyvJXna0vg/wOaNNIaI4SAH9Ksh3f/TtalYVjp6WxIwVBfnbq51WnmlnEXePtX6XjAGL+GbF2VQ1nv/IzrY09tNbTV6wQsrSIP3VDzYQxdJ1rdsVNMoJB0H2Pu0NdcSz53Wx45N+myD0QnE05ss+zDp5StY90OYsx2aCo6qAA8Qn2jUjdta7MQWwkPfKrta4tTQ0XbWMjx4/E1+l3J5liwZkl2XOGOwhfXdRsBjaEziZ18kQ== yystopf@163.com",
|
||||
"fingerprint": "SHA256:cU8AK/+roqUUyiaYXIdS2Nj4+Rb2p6rqWSeRDc+aqKM",
|
||||
"created_time": "2021/07/14 15:26"
|
||||
}
|
||||
```
|
||||
<aside class="success">
|
||||
Success — a happy kitten is an authenticated kitten!
|
||||
</aside>
|
||||
|
||||
|
||||
## 删除public_key
|
||||
删除public_key
|
||||
|
||||
> 示例:
|
||||
|
||||
```shell
|
||||
curl -X DELETE \
|
||||
http://localhost:3000/api/public_keys/:id.json
|
||||
```
|
||||
|
||||
```javascript
|
||||
await octokit.request('DELETE /api/public_keys/:id.json')
|
||||
```
|
||||
|
||||
### HTTP 请求
|
||||
`DELETE api/public_keys/:id.json`
|
||||
|
||||
### 请求参数
|
||||
参数 | 必选 | 默认 | 类型 | 字段说明
|
||||
--------- | ------- | ------- | -------- | ----------
|
||||
id |是 | 否 | int | 密钥ID |
|
||||
|
||||
|
||||
> 返回的JSON示例:
|
||||
|
||||
```json
|
||||
{
|
||||
"status": 0,
|
||||
"message": "success"
|
||||
}
|
||||
```
|
||||
<aside class="success">
|
||||
Success — a happy kitten is an authenticated kitten!
|
||||
</aside>
|
||||
|
||||
|
|
@ -867,3 +867,674 @@ await octokit.request('GET /api/jasder/jasder_test/sub_entries.json')
|
|||
<aside class="success">
|
||||
Success Data.
|
||||
</aside>
|
||||
|
||||
## 获取仓库webhooks列表
|
||||
获取仓库webhooks列表
|
||||
|
||||
> 示例:
|
||||
|
||||
```shell
|
||||
curl -X GET \
|
||||
http://localhost:3000/api/yystopf/ceshi/webhooks.json
|
||||
```
|
||||
|
||||
```javascript
|
||||
await octokit.request('GET /api/yystopf/ceshi/webhooks.json')
|
||||
```
|
||||
|
||||
### HTTP 请求
|
||||
`GET /api/:owner/:repo/webhooks.json`
|
||||
|
||||
### 请求参数:
|
||||
参数 | 必选 | 默认 | 类型 | 字段说明
|
||||
--------- | ------- | ------- | -------- | ----------
|
||||
|owner |是| |string |用户登录名 |
|
||||
|repo |是| |string |项目标识identifier |
|
||||
|
||||
|
||||
### 返回字段说明:
|
||||
参数 | 类型 | 字段说明
|
||||
--------- | ----------- | -----------
|
||||
|id |int |id |
|
||||
|url |string|地址|
|
||||
|http_method |string|请求方式|
|
||||
|is_active |bool |是否激活|
|
||||
|type |string|类型|
|
||||
|last_status |string|最后一次推送的状态|
|
||||
|create_time |string|创建时间|
|
||||
|
||||
|
||||
> 返回的JSON示例:
|
||||
|
||||
```json
|
||||
{
|
||||
"total_count": 4,
|
||||
"webhooks": [
|
||||
{
|
||||
"id": 2,
|
||||
"url": "https://oapi.dingtalk.com/robot/send?access_token=7e1e19d0eddb6a5e33c5c2c4e66f4c88f9437184b9ed2c2653194c6374c7d513",
|
||||
"http_method": "",
|
||||
"is_active": true,
|
||||
"type": "dingtalk",
|
||||
"last_status": "succeed",
|
||||
"create_time": "2021-07-12 10:50:07"
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"url": "http://localhost:3000",
|
||||
"http_method": "GET",
|
||||
"is_active": true,
|
||||
"type": "gitea",
|
||||
"last_status": "succeed",
|
||||
"create_time": "2021-07-26 10:03:45"
|
||||
},
|
||||
{
|
||||
"id": 4,
|
||||
"url": "http://localhost:10081",
|
||||
"http_method": "POST",
|
||||
"is_active": true,
|
||||
"type": "gitea",
|
||||
"last_status": "waiting",
|
||||
"create_time": "2021-07-26 16:56:53"
|
||||
},
|
||||
{
|
||||
"id": 5,
|
||||
"url": "http://localhost:3001",
|
||||
"http_method": "POST",
|
||||
"is_active": true,
|
||||
"type": "gitea",
|
||||
"last_status": "fail",
|
||||
"create_time": "2021-07-26 16:58:23"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
<aside class="success">
|
||||
Success Data.
|
||||
</aside>
|
||||
|
||||
## 获取仓库单个webhook
|
||||
获取仓库单个webhook
|
||||
|
||||
> 示例:
|
||||
|
||||
```shell
|
||||
curl -X GET \
|
||||
http://localhost:3000/api/yystopf/ceshi/webhooks/3/edit.json
|
||||
```
|
||||
|
||||
```javascript
|
||||
await octokit.request('GET /api/yystopf/ceshi/webhooks/3/edit.json')
|
||||
```
|
||||
|
||||
### HTTP 请求
|
||||
`GET /api/:owner/:repo/webhooks/:id/edit.json`
|
||||
|
||||
### 请求参数:
|
||||
参数 | 必选 | 默认 | 类型 | 字段说明
|
||||
--------- | ------- | ------- | -------- | ----------
|
||||
|owner |是| |string |用户登录名 |
|
||||
|repo |是| |string |项目标识identifier |
|
||||
|id |是||integer|webhook ID|
|
||||
|
||||
|
||||
### 返回字段说明:
|
||||
参数 | 类型 | 字段说明
|
||||
--------- | ----------- | -----------
|
||||
|id |int |id |
|
||||
|url |string|地址|
|
||||
|content_type |string|POST Content Type|
|
||||
|http_method |string|请求方式|
|
||||
|secret| |string|密钥|
|
||||
|is_active |bool |是否激活|
|
||||
|type |string|类型|
|
||||
|last_status |string|最后一次推送的状态, waiting 等待,fail 失败,succeed 成功|
|
||||
|branch_filter |string|分支过滤|
|
||||
|events |string|触发条件|
|
||||
|create_time |string|创建时间|
|
||||
|
||||
|
||||
参数| 含义|
|
||||
--------- | ------- | ------- |
|
||||
|create|创建分支或标签|
|
||||
|delete|分支或标签删除|
|
||||
|fork|仓库被fork|
|
||||
|push|git仓库推送|
|
||||
|issue|易修已打开、已关闭、已重新打开或编辑|
|
||||
|issue_assign|易修被指派|
|
||||
|issue_label|易修标签被更新或删除|
|
||||
|issue_milestone|易修被收入里程碑|
|
||||
|issue_comment|易修评论|
|
||||
|pull_request|合并请求|
|
||||
|pull_request_assign|合并请求被指派|
|
||||
|pull_request_label|合并请求被贴上标签|
|
||||
|pull_request_milestone|合并请求被记录于里程碑中|
|
||||
|pull_request_comment|合并请求被评论|
|
||||
|pull_request_review_approved|合并请求被批准|
|
||||
|pull_request_review_rejected|合并请求被拒绝|
|
||||
|pull_request_review_comment|合并请求被提出审查意见|
|
||||
|pull_request_sync|合并请求被同步|
|
||||
|repository|创建或删除仓库|
|
||||
|release|版本发布|
|
||||
|
||||
|
||||
> 返回的JSON示例:
|
||||
|
||||
```json
|
||||
{
|
||||
"id": 3,
|
||||
"http_method": "GET",
|
||||
"content_type": "form",
|
||||
"url": "http://localhost:3000",
|
||||
"secret": "123456",
|
||||
"last_status": "succeed",
|
||||
"is_active": true,
|
||||
"type": "gitea",
|
||||
"create_time": "2021-07-26 10:03:45",
|
||||
"branch_filter": "*",
|
||||
"events": [
|
||||
"create",
|
||||
"delete",
|
||||
"fork",
|
||||
"issues",
|
||||
"issue_assign",
|
||||
"issue_label",
|
||||
"issue_milestone",
|
||||
"issue_comment",
|
||||
"push",
|
||||
"pull_request",
|
||||
"pull_request_assign",
|
||||
"pull_request_label",
|
||||
"pull_request_milestone",
|
||||
"pull_request_comment",
|
||||
"pull_request_review",
|
||||
"pull_request_sync",
|
||||
"repository",
|
||||
"release"
|
||||
]
|
||||
}
|
||||
```
|
||||
<aside class="success">
|
||||
Success Data.
|
||||
</aside>
|
||||
|
||||
## 添加仓库webhook
|
||||
添加仓库webhook
|
||||
|
||||
> 示例:
|
||||
|
||||
```shell
|
||||
curl -X POST \
|
||||
http://localhost:3000/api/yystopf/ceshi/webhooks.json
|
||||
```
|
||||
|
||||
```javascript
|
||||
await octokit.request('POST /api/yystopf/ceshi/webhooks.json')
|
||||
```
|
||||
|
||||
### HTTP 请求
|
||||
`POST /api/:owner/:repo/webhooks.json`
|
||||
|
||||
### 请求参数:
|
||||
参数 | 必选 | 默认 | 类型 | 字段说明
|
||||
--------- | ------- | ------- | -------- | ----------
|
||||
|owner |是| | string |用户登录名 |
|
||||
|repo |是| | string |项目标识identifier |
|
||||
|webhook.url |是| | string |目标url |
|
||||
|webhook.type |否| | string |类型|
|
||||
|webhook.http_method |是| | string | http方法, POST和GET |
|
||||
|webhook.content_type |是| | string | POST Content Type |
|
||||
|webhook.secret |否| | string |密钥文本|
|
||||
|webhook.active |是| | bool | 是否激活|
|
||||
|webhook.branch_filter|否| |string|分支过滤|
|
||||
|webhook.events |否| |array|触发事件|
|
||||
|
||||
触发事件字段说明
|
||||
|
||||
参数| 含义|
|
||||
--------- | ------- | ------- |
|
||||
|create|创建分支或标签|
|
||||
|delete|分支或标签删除|
|
||||
|fork|仓库被fork|
|
||||
|push|git仓库推送|
|
||||
|issue|易修已打开、已关闭、已重新打开或编辑|
|
||||
|issue_assign|易修被指派|
|
||||
|issue_label|易修标签被更新或删除|
|
||||
|issue_milestone|易修被收入里程碑|
|
||||
|issue_comment|易修评论|
|
||||
|pull_request|合并请求|
|
||||
|pull_request_assign|合并请求被指派|
|
||||
|pull_request_label|合并请求被贴上标签|
|
||||
|pull_request_milestone|合并请求被记录于里程碑中|
|
||||
|pull_request_comment|合并请求被评论|
|
||||
|pull_request_review_approved|合并请求被批准|
|
||||
|pull_request_review_rejected|合并请求被拒绝|
|
||||
|pull_request_review_comment|合并请求被提出审查意见|
|
||||
|pull_request_sync|合并请求被同步|
|
||||
|repository|创建或删除仓库|
|
||||
|release|版本发布|
|
||||
|
||||
|
||||
> 请求的JSON示例:
|
||||
|
||||
```json
|
||||
{
|
||||
"active": true,
|
||||
"content_type": "json",
|
||||
"http_method": "GET",
|
||||
"secret": "123456",
|
||||
"url": "http://localhost:10000",
|
||||
"branch_filter": "*",
|
||||
"events": ["push"]
|
||||
}
|
||||
```
|
||||
|
||||
### 返回字段说明:
|
||||
参数 | 类型 | 字段说明
|
||||
--------- | ----------- | -----------
|
||||
|id |int |id |
|
||||
|url |string|地址|
|
||||
|content_type |string|POST Content Type|
|
||||
|is_active |bool |是否激活|
|
||||
|type |string|类型|
|
||||
|events | array|触发事件 |
|
||||
|create_time |string|创建时间|
|
||||
|
||||
|
||||
> 返回的JSON示例:
|
||||
|
||||
```json
|
||||
{
|
||||
"id": 18,
|
||||
"type": "gitea",
|
||||
"content_type": "json",
|
||||
"url": "http://localhost:10000",
|
||||
"events": [
|
||||
"push"
|
||||
],
|
||||
"active": true,
|
||||
"create_time": "2021-07-26 18:53:43"
|
||||
}
|
||||
```
|
||||
<aside class="success">
|
||||
Success Data.
|
||||
</aside>
|
||||
|
||||
## 更新仓库webhook
|
||||
更新仓库webhook
|
||||
|
||||
> 示例:
|
||||
|
||||
```shell
|
||||
curl -X PATCH \
|
||||
http://localhost:3000/api/yystopf/ceshi/webhooks/7.json
|
||||
```
|
||||
|
||||
```javascript
|
||||
await octokit.request('PATCH /api/yystopf/ceshi/webhooks/7.json')
|
||||
```
|
||||
|
||||
### HTTP 请求
|
||||
`PATCH /api/:owner/:repo/webhooks/:id.json`
|
||||
|
||||
### 请求参数:
|
||||
参数 | 必选 | 默认 | 类型 | 字段说明
|
||||
--------- | ------- | ------- | -------- | ----------
|
||||
|owner |是| | string |用户登录名 |
|
||||
|repo |是| | string |项目标识identifier |
|
||||
|id |是| | string |webhook id |
|
||||
|webhook.url |是| | string |目标url |
|
||||
|webhook.type |否| | string |类型|
|
||||
|webhook.http_method |是| | string | http方法, POST和GET |
|
||||
|webhook.content_type |是| | string | POST Content Type |
|
||||
|webhook.secret |否| | string |密钥文本|
|
||||
|webhook.active |是| | bool | 是否激活|
|
||||
|webhook.branch_filter|否| |string|分支过滤|
|
||||
|webhook.events |否| |array|触发事件|
|
||||
|
||||
触发事件字段说明
|
||||
|
||||
参数| 含义|
|
||||
--------- | ------- | ------- |
|
||||
|create|创建分支或标签|
|
||||
|delete|分支或标签删除|
|
||||
|fork|仓库被fork|
|
||||
|push|git仓库推送|
|
||||
|issue|易修已打开、已关闭、已重新打开或编辑|
|
||||
|issue_assign|易修被指派|
|
||||
|issue_label|易修标签被更新或删除|
|
||||
|issue_milestone|易修被收入里程碑|
|
||||
|issue_comment|易修评论|
|
||||
|pull_request|合并请求|
|
||||
|pull_request_assign|合并请求被指派|
|
||||
|pull_request_label|合并请求被贴上标签|
|
||||
|pull_request_milestone|合并请求被记录于里程碑中|
|
||||
|pull_request_comment|合并请求被评论|
|
||||
|pull_request_review_approved|合并请求被批准|
|
||||
|pull_request_review_rejected|合并请求被拒绝|
|
||||
|pull_request_review_comment|合并请求被提出审查意见|
|
||||
|pull_request_sync|合并请求被同步|
|
||||
|repository|创建或删除仓库|
|
||||
|release|版本发布|
|
||||
|
||||
|
||||
> 请求的JSON示例:
|
||||
|
||||
```json
|
||||
{
|
||||
"active": true,
|
||||
"content_type": "json",
|
||||
"http_method": "GET",
|
||||
"secret": "123456",
|
||||
"url": "http://localhost:10000",
|
||||
"branch_filter": "*",
|
||||
"events": ["push"]
|
||||
}
|
||||
```
|
||||
|
||||
### 返回字段说明:
|
||||
|
||||
> 返回的JSON示例:
|
||||
|
||||
```json
|
||||
{
|
||||
"status": 0,
|
||||
"message": "success"
|
||||
}
|
||||
```
|
||||
<aside class="success">
|
||||
Success Data.
|
||||
</aside>
|
||||
|
||||
|
||||
## 删除仓库webhook
|
||||
删除仓库webhook
|
||||
|
||||
> 示例:
|
||||
|
||||
```shell
|
||||
curl -X DELETE \
|
||||
http://localhost:3000/api/yystopf/ceshi/webhooks/7.json
|
||||
```
|
||||
|
||||
```javascript
|
||||
await octokit.request('DELETE /api/yystopf/ceshi/webhooks/7.json')
|
||||
```
|
||||
|
||||
### HTTP 请求
|
||||
`DELETE /api/:owner/:repo/webhooks/:id.json`
|
||||
|
||||
### 请求参数:
|
||||
参数 | 必选 | 默认 | 类型 | 字段说明
|
||||
--------- | ------- | ------- | -------- | ----------
|
||||
|owner |是| | string |用户登录名 |
|
||||
|repo |是| | string |项目标识identifier |
|
||||
|id |是| | string |webhook id |
|
||||
|
||||
### 返回字段说明:
|
||||
|
||||
> 返回的JSON示例:
|
||||
|
||||
```json
|
||||
{
|
||||
"status": 0,
|
||||
"message": "success"
|
||||
}
|
||||
```
|
||||
<aside class="success">
|
||||
Success Data.
|
||||
</aside>
|
||||
|
||||
## 获取仓库webhook的历史推送列表
|
||||
获取仓库webhook的历史推送列表
|
||||
|
||||
> 示例:
|
||||
|
||||
```shell
|
||||
curl -X GET \
|
||||
http://localhost:3000/api/yystopf/ceshi/webhooks/3/tasks.json
|
||||
```
|
||||
|
||||
```javascript
|
||||
await octokit.request('GET /api/yystopf/ceshi/webhooks/3/tasks.json')
|
||||
```
|
||||
|
||||
### HTTP 请求
|
||||
`GET /api/:owner/:repo/webhooks/:id/tasks.json`
|
||||
|
||||
### 请求参数:
|
||||
参数 | 必选 | 默认 | 类型 | 字段说明
|
||||
--------- | ------- | ------- | -------- | ----------
|
||||
|owner |是| |string |用户登录名 |
|
||||
|repo |是| |string |项目标识identifier |
|
||||
|id |是| |integer |webhook ID|
|
||||
|
||||
### 返回字段说明:
|
||||
参数 | 类型 | 字段说明
|
||||
--------- | ----------- | -----------
|
||||
|id |int |id |
|
||||
|uuid |string|推送uuid|
|
||||
|type |string|类型|
|
||||
|is_succeed |bool|是否推送成功|
|
||||
|is_delivered |bool|是否完成推送|
|
||||
|payload_content |json|请求主体内容|
|
||||
|request_content |json|请求内容,头部等等|
|
||||
|reponse_content |json|响应内容,状态,头部,主体等等|
|
||||
|delivered_time |string|推送时间|
|
||||
|
||||
|
||||
> 返回的JSON示例:
|
||||
|
||||
```json
|
||||
{
|
||||
"total_count": 6,
|
||||
"tasks": [
|
||||
{
|
||||
"id": 20,
|
||||
"type": "gitea",
|
||||
"uuid": "99aa2c23-6884-4c44-9020-5469320aa408",
|
||||
"is_succeed": true,
|
||||
"is_delivered": true,
|
||||
"payload_content": {
|
||||
"secret": "123456",
|
||||
"ref": "refs/heads/master",
|
||||
"before": "feb48e31362787a7620b53d4df3c4effddbb6f0b",
|
||||
"after": "feb48e31362787a7620b53d4df3c4effddbb6f0b",
|
||||
"compare_url": "",
|
||||
"commits": [
|
||||
{
|
||||
"id": "feb48e31362787a7620b53d4df3c4effddbb6f0b",
|
||||
"message": "fix\n",
|
||||
"url": "http://localhost:10081/yystopf/ceshi/commit/feb48e31362787a7620b53d4df3c4effddbb6f0b",
|
||||
"author": {
|
||||
"name": "viletyy",
|
||||
"email": "yystopf@163.com",
|
||||
"username": "root"
|
||||
},
|
||||
"committer": {
|
||||
"name": "viletyy",
|
||||
"email": "yystopf@163.com",
|
||||
"username": "root"
|
||||
},
|
||||
"verification": {
|
||||
"verified": false,
|
||||
"reason": "gpg.error.not_signed_commit",
|
||||
"signature": "",
|
||||
"signer": null,
|
||||
"payload": ""
|
||||
},
|
||||
"timestamp": "2021-07-26T13:52:13+08:00",
|
||||
"added": null,
|
||||
"removed": null,
|
||||
"modified": null
|
||||
}
|
||||
],
|
||||
"head_commit": null,
|
||||
"repository": {
|
||||
"id": 2,
|
||||
"owner": {
|
||||
"id": 3,
|
||||
"login": "yystopf",
|
||||
"full_name": "",
|
||||
"email": "yystopf@forge.com",
|
||||
"avatar_url": "http://localhost:10081/user/avatar/yystopf/-1",
|
||||
"language": "zh-CN",
|
||||
"is_admin": true,
|
||||
"last_login": "2021-07-21T18:38:21+08:00",
|
||||
"created": "2021-06-03T14:50:25+08:00",
|
||||
"username": "yystopf"
|
||||
},
|
||||
"name": "ceshi",
|
||||
"full_name": "yystopf/ceshi",
|
||||
"description": "",
|
||||
"empty": false,
|
||||
"private": false,
|
||||
"fork": false,
|
||||
"template": false,
|
||||
"parent": null,
|
||||
"mirror": false,
|
||||
"size": 3846,
|
||||
"html_url": "http://localhost:10081/yystopf/ceshi",
|
||||
"ssh_url": "virus@localhost:10081:yystopf/ceshi.git",
|
||||
"clone_url": "http://localhost:10081/yystopf/ceshi.git",
|
||||
"original_url": "",
|
||||
"website": "",
|
||||
"stars_count": 0,
|
||||
"forks_count": 1,
|
||||
"watchers_count": 1,
|
||||
"open_issues_count": 0,
|
||||
"open_pr_counter": 0,
|
||||
"release_counter": 0,
|
||||
"default_branch": "master",
|
||||
"archived": false,
|
||||
"created_at": "2021-06-03T15:15:30+08:00",
|
||||
"updated_at": "2021-07-26T13:52:16+08:00",
|
||||
"permissions": {
|
||||
"admin": false,
|
||||
"push": false,
|
||||
"pull": false
|
||||
},
|
||||
"has_issues": true,
|
||||
"internal_tracker": {
|
||||
"enable_time_tracker": true,
|
||||
"allow_only_contributors_to_track_time": true,
|
||||
"enable_issue_dependencies": true
|
||||
},
|
||||
"has_wiki": true,
|
||||
"has_pull_requests": true,
|
||||
"ignore_whitespace_conflicts": false,
|
||||
"allow_merge_commits": true,
|
||||
"allow_rebase": true,
|
||||
"allow_rebase_explicit": true,
|
||||
"allow_squash_merge": true,
|
||||
"avatar_url": "",
|
||||
"internal": false
|
||||
},
|
||||
"pusher": {
|
||||
"id": 0,
|
||||
"login": "yystopf",
|
||||
"full_name": "",
|
||||
"email": "yystopf@forge.com",
|
||||
"avatar_url": "http://localhost:10081/user/avatar/yystopf/-1",
|
||||
"language": "",
|
||||
"is_admin": false,
|
||||
"last_login": "0001-01-01T00:00:00Z",
|
||||
"created": "2021-06-03T14:50:25+08:00",
|
||||
"username": "yystopf"
|
||||
},
|
||||
"sender": {
|
||||
"id": 0,
|
||||
"login": "yystopf",
|
||||
"full_name": "",
|
||||
"email": "yystopf@forge.com",
|
||||
"avatar_url": "http://localhost:10081/user/avatar/yystopf/-1",
|
||||
"language": "",
|
||||
"is_admin": false,
|
||||
"last_login": "0001-01-01T00:00:00Z",
|
||||
"created": "2021-06-03T14:50:25+08:00",
|
||||
"username": "yystopf"
|
||||
}
|
||||
},
|
||||
"request_content": {
|
||||
"headers": {
|
||||
"X-GitHub-Delivery": "99aa2c23-6884-4c44-9020-5469320aa408",
|
||||
"X-GitHub-Event": "push",
|
||||
"X-Gitea-Delivery": "99aa2c23-6884-4c44-9020-5469320aa408",
|
||||
"X-Gitea-Event": "push",
|
||||
"X-Gitea-Signature": "34a01edcd952ff6410ff6ebc946471161bde74aff86171f21621d2c2c4130f66",
|
||||
"X-Gogs-Delivery": "99aa2c23-6884-4c44-9020-5469320aa408",
|
||||
"X-Gogs-Event": "push",
|
||||
"X-Gogs-Signature": "34a01edcd952ff6410ff6ebc946471161bde74aff86171f21621d2c2c4130f66"
|
||||
}
|
||||
},
|
||||
"response_content": {
|
||||
"status": 200,
|
||||
"headers": {
|
||||
"Cache-Control": "no-store, must-revalidate, private, max-age=0",
|
||||
"Content-Length": "2556",
|
||||
"Content-Type": "text/html; charset=utf-8",
|
||||
"Referrer-Policy": "strict-origin-when-cross-origin",
|
||||
"Set-Cookie": "__profilin=p%3Dt; path=/; HttpOnly",
|
||||
"Vary": "Origin",
|
||||
"X-Content-Type-Options": "nosniff",
|
||||
"X-Download-Options": "noopen",
|
||||
"X-Frame-Options": "SAMEORIGIN",
|
||||
"X-Miniprofiler-Ids": "9ynvpncz5xm0rpgorb5y,hgggd9mv6lr4a9drcrlr,j7zqlx2vy5aji2vtgoba,f1ktsmh3jxvq0z2hf612,mih3dvgvlqhi3zy8lf2x,5k1qbkvbnru8mye9cest,tj6ern8w6awqf2zsimbr,9isaehvubivd52wo5p9v,1rzfhtq1nhuwbgy9p76g,z0xzidzyywna0y7a69m0,hzoklky92ycjqt42gi0s,y0ai7y0t28mcn8x0py2x,322il7nadinp51mw2r5m,m6dukftfsh6tjcxzp1gq,667wlqbytfwbrirnmma1,jcehj3dl8lkw8gk510cr",
|
||||
"X-Miniprofiler-Original-Cache-Control": "max-age=0, private, must-revalidate",
|
||||
"X-Permitted-Cross-Domain-Policies": "none",
|
||||
"X-Request-Id": "08bff080-bbb5-4183-b845-81de3d47120a",
|
||||
"X-Runtime": "0.394766",
|
||||
"X-Xss-Protection": "1; mode=block"
|
||||
},
|
||||
"body": "<!doctype html><html lang=\"zh-CN\" class=\"notranslate translated-ltr\" translate=\"no\"><head><meta charset=\"utf-8\"><meta name=\"”Keywords”\" content=\"”trustie,trustieforge,forge,确实让创建更美好,协同开发平台″\"><meta name=\"”Keywords”\" content=\"”TrustieOpenSourceProject″\"><meta name=\"”Keywords”\" content=\"”issue,bug,tracker,软件工程,课程实践″\"><meta name=\"”Description”\" content=\"”持续构建协同、共享、可信的软件创建生态开源创作与软件生产相结合,支持大规模群体开展软件协同创新活动”\"><meta name=\"theme-color\" content=\"#000000\"><link rel=\"manifest\" href=\"/react/build//manifest.json\"><link rel=\"stylesheet\" href=\"/react/build/css/iconfont.css\"><link rel=\"stylesheet\" href=\"/react/build/css/edu-purge.css\"><link rel=\"stylesheet\" href=\"/react/build/css/editormd.min.css\"><link rel=\"stylesheet\" href=\"/react/build/css/merge.css\"><link href=\"/react/build/static/css/main.07f7e90c.chunk.css\" rel=\"stylesheet\"></head><body><div id=\"md_div\" style=\"display:none\"></div><div id=\"root\" class=\"page -layout-v -fit widthunit\"></div><div id=\"picture_display\" style=\"display:none\"></div><script src=\"/react/build/js/jquery-1.8.3.min.js\"></script><script src=\"/react/build/js/js_min_all.js\"></script><script src=\"/react/build/js/codemirror/codemirror.js\"></script><script src=\"/react/build/js/editormd/editormd.min.js\"></script><script src=\"/react/build/js/codemirror/merge/merge.js\"></script><script src=\"/react/build/./static/js/runtime~main.3d644966.js\"></script><script src=\"/react/build/./static/js/main.e46872e3.chunk.js\"></script><script async type=\"text/javascript\" id=\"mini-profiler\" src=\"/mini-profiler-resources/includes.js?v=67dd1c2571ced7fc74ae7f1813e47bdf\" data-version=\"67dd1c2571ced7fc74ae7f1813e47bdf\" data-path=\"/mini-profiler-resources/\" data-current-id=\"9ynvpncz5xm0rpgorb5y\" data-ids=\"9ynvpncz5xm0rpgorb5y,hgggd9mv6lr4a9drcrlr,j7zqlx2vy5aji2vtgoba,f1ktsmh3jxvq0z2hf612,mih3dvgvlqhi3zy8lf2x,5k1qbkvbnru8mye9cest,tj6ern8w6awqf2zsimbr,9isaehvubivd52wo5p9v,1rzfhtq1nhuwbgy9p76g,z0xzidzyywna0y7a69m0,hzoklky92ycjqt42gi0s,y0ai7y0t28mcn8x0py2x,322il7nadinp51mw2r5m,m6dukftfsh6tjcxzp1gq,667wlqbytfwbrirnmma1,jcehj3dl8lkw8gk510cr\" data-horizontal-position=\"left\" data-vertical-position=\"top\" data-trivial=\"false\" data-children=\"false\" data-max-traces=\"20\" data-controls=\"false\" data-total-sql-count=\"false\" data-authorized=\"true\" data-toggle-shortcut=\"alt+p\" data-start-hidden=\"false\" data-collapse-results=\"true\" data-html-container=\"body\"></script>\n</body></html>"
|
||||
},
|
||||
"delivered_time": "2021-07-28 11:47:29"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
<aside class="success">
|
||||
Success Data.
|
||||
</aside>
|
||||
|
||||
## 仓库webhook测试推送
|
||||
仓库webhook测试推送
|
||||
|
||||
> 示例:
|
||||
|
||||
```shell
|
||||
curl -X POST \
|
||||
http://localhost:3000/api/yystopf/ceshi/webhooks/3/test.json
|
||||
```
|
||||
|
||||
```javascript
|
||||
await octokit.request('POST /api/yystopf/ceshi/webhooks/3/test.json')
|
||||
```
|
||||
|
||||
### HTTP 请求
|
||||
`POST /api/:owner/:repo/webhooks/:id/test.json`
|
||||
|
||||
### 请求参数:
|
||||
参数 | 必选 | 默认 | 类型 | 字段说明
|
||||
--------- | ------- | ------- | -------- | ----------
|
||||
|owner |是| | string |用户登录名 |
|
||||
|repo |是| | string |项目标识identifier |
|
||||
|id |是| | integer|webhook ID|
|
||||
|
||||
|
||||
|
||||
|
||||
### 返回字段说明:
|
||||
|
||||
|
||||
> 返回的JSON示例:
|
||||
|
||||
```json
|
||||
{
|
||||
"status": 0,
|
||||
"message": "success"
|
||||
}
|
||||
```
|
||||
<aside class="success">
|
||||
Success Data.
|
||||
</aside>
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
class Projects::Webhooks::CreateForm < BaseForm
|
||||
attr_accessor :type, :url, :http_method, :content_type, :secret, :events, :active, :branch_filter
|
||||
|
||||
validates :url, format: { with: URI::regexp(%w[http https]), message: "请输入正确的地址" }
|
||||
validates :active, inclusion: {in: [true, false]}
|
||||
validates :http_method, inclusion: { in: %w(POST GET), message: "请输入正确的请求方式"}
|
||||
validates :content_type, inclusion: { in: %w(json form), message: "请输入正确的Content Type"}
|
||||
end
|
||||
|
|
@ -13,12 +13,12 @@ module ProjectsHelper
|
|||
end
|
||||
end
|
||||
|
||||
def render_zip_url(project, archive_name)
|
||||
[gitea_domain, project.owner.login, project.identifier, "archive", "#{archive_name}.zip"].join('/')
|
||||
def render_zip_url(owner, repository, archive)
|
||||
[base_url, archive_repositories_path(owner&.login, repository, "#{archive}.zip")].join
|
||||
end
|
||||
|
||||
def render_tar_url(project, archive_name)
|
||||
[gitea_domain, project.owner.login, project.identifier, "archive", "#{archive_name}.tar.gz"].join('/')
|
||||
def render_tar_url(owner, repository, archive)
|
||||
[base_url, archive_repositories_path(owner&.login, repository, "#{archive}.tar.gz")].join
|
||||
end
|
||||
|
||||
def render_http_url(project)
|
||||
|
|
@ -34,11 +34,12 @@ module ProjectsHelper
|
|||
end
|
||||
|
||||
def json_response(project, user)
|
||||
repo = Repository.includes(:mirror).select(:id, :mirror_url, :source_clone_url).find_by(project: project)
|
||||
repo = Repository.includes(:mirror).select(:id, :is_mirror, :mirror_url, :source_clone_url).find_by(project: project)
|
||||
|
||||
tmp_json = {}
|
||||
unless project.common?
|
||||
tmp_json = tmp_json.merge({
|
||||
is_mirror: repo.is_mirror ? true : false,
|
||||
mirror_status: repo.mirror_status,
|
||||
mirror_num: repo.mirror_num,
|
||||
mirror_url: repo.remote_mirror_url,
|
||||
|
|
@ -54,7 +55,11 @@ module ProjectsHelper
|
|||
repo_id: repo.id,
|
||||
open_devops: (user.blank? || user.is_a?(AnonymousUser)) ? false : project.open_devops?,
|
||||
type: project.numerical_for_project_type,
|
||||
author: render_owner(project)
|
||||
author: render_owner(project),
|
||||
project_category_id: project.project_category_id,
|
||||
project_language_id: project.project_language_id,
|
||||
license_id: project.license_id,
|
||||
ignore_id: project.ignore_id
|
||||
}).compact
|
||||
|
||||
render json: tmp_json
|
||||
|
|
|
|||
|
|
@ -10,12 +10,12 @@ module RepositoriesHelper
|
|||
end
|
||||
|
||||
def download_type(str)
|
||||
default_type = %w(xlsx xls ppt pptx pdf zip 7z rar exe pdb obj idb png jpg gif tif psd svg RData rdata doc docx mpp vsdx dot)
|
||||
default_type = %w(xlsx xls ppt pptx pdf zip 7z rar exe pdb obj idb png jpg gif tif psd svg RData rdata doc docx mpp vsdx dot otf eot ttf woff woff2)
|
||||
default_type.include?(str&.downcase)
|
||||
end
|
||||
|
||||
def image_type?(str)
|
||||
default_type = %w(png jpg gif tif psd svg)
|
||||
default_type = %w(png jpg gif tif psd svg gif bmp webp jpeg)
|
||||
default_type.include?(str&.downcase)
|
||||
end
|
||||
|
||||
|
|
@ -81,9 +81,47 @@ module RepositoriesHelper
|
|||
content = Gitea::Repository::Entries::GetService.call(owner, repo.identifier, entry['path'], ref: ref)['content']
|
||||
readme_render_decode64_content(content, path)
|
||||
else
|
||||
file_type = entry['name'].to_s.split(".").last
|
||||
return entry['content'] if download_type(file_type)
|
||||
file_type = File.extname(entry['name'].to_s)[1..-1]
|
||||
if download_type(file_type)
|
||||
return entry['content'].nil? ? Gitea::Repository::Entries::GetService.call(owner, repo.identifier, entry['path'], ref: ref)['content'] : entry['content']
|
||||
end
|
||||
render_decode64_content(entry['content'])
|
||||
end
|
||||
end
|
||||
|
||||
def base64_to_image(path, content)
|
||||
# generate to https://git.trusite.net/pawm36ozq/-/raw/branch/master/entrn.png"
|
||||
content = Base64.decode64(content)
|
||||
File.open(path, 'wb') { |f| f.write(content) }
|
||||
end
|
||||
|
||||
def render_download_image_url(dir_path, file_path, content)
|
||||
full_path = file_path.starts_with?("/") ? [dir_path, file_path].join("") : [dir_path, file_path].join("/")
|
||||
file_name = full_path.split("/")[-1]
|
||||
# 用户名/项目标识/文件路径
|
||||
dir_path = generate_dir_path(full_path.split("/"+file_name)[0])
|
||||
|
||||
file_path = [dir_path, file_name].join('/')
|
||||
|
||||
puts "##### render_download_image_url file_path: #{file_path}"
|
||||
base64_to_image(file_path, content)
|
||||
file_path = file_path[6..-1]
|
||||
File.join(base_url, file_path)
|
||||
end
|
||||
|
||||
def generate_dir_path(dir_path)
|
||||
# tmp_dir_path
|
||||
# eg: jasder/forgeplus/raw/branch/ref
|
||||
dir_path = ["public", tmp_dir, dir_path].join('/')
|
||||
puts "#### dir_path: #{dir_path}"
|
||||
unless Dir.exists?(dir_path)
|
||||
FileUtils.mkdir_p(dir_path) ##不成功这里会抛异常
|
||||
end
|
||||
dir_path
|
||||
end
|
||||
|
||||
def tmp_dir
|
||||
"repo"
|
||||
end
|
||||
|
||||
end
|
||||
|
|
|
|||
|
|
@ -20,10 +20,16 @@ module TagChosenHelper
|
|||
"done_ratio": render_complete_percentage,
|
||||
"issue_tag": render_issue_tags(project),
|
||||
"issue_type": render_issue_species,
|
||||
"all_issues": all_issues
|
||||
"all_issues": all_issues,
|
||||
"branches": render_branches(project)
|
||||
}
|
||||
end
|
||||
|
||||
def render_branches(project)
|
||||
branches = Gitea::Repository::Branches::ListService.call(project&.owner, project.identifier)
|
||||
branches.collect{|i| i["name"] if i.is_a?(Hash)}
|
||||
end
|
||||
|
||||
def render_cache_trackers
|
||||
cache_key = "all_trackers/#{Tracker.maximum('id')}"
|
||||
|
||||
|
|
@ -176,7 +182,7 @@ module TagChosenHelper
|
|||
real_name = user.try(:show_real_name)
|
||||
user_id = user.id
|
||||
is_chosen = ((user.id.to_s == issue_info[0].to_s) ? "1" : "0")
|
||||
member_info = {id: user_id, name: real_name,avatar_url: url_to_avatar(user),is_chosen: is_chosen}
|
||||
member_info = {id: user_id, name: real_name,avatar_url: url_to_avatar(user), permission: project.get_premission(user), is_chosen: is_chosen}
|
||||
project_members_info.push(member_info)
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -24,8 +24,14 @@ module Gitea
|
|||
|
||||
def run
|
||||
Contents::CreateForm.new(valid_params).validate!
|
||||
response = Gitea::Repository::Entries::CreateService.new(token, owner, @params[:identifier], @params[:filepath], file_params).call
|
||||
render_result(response)
|
||||
result = Gitea::Repository::Entries::CreateService.call(token,
|
||||
owner, @params[:identifier], @params[:filepath], file_params)
|
||||
|
||||
if result[:status] == :success
|
||||
@result = result[:body]
|
||||
else
|
||||
fail!(result[:message])
|
||||
end
|
||||
rescue Exception => exception
|
||||
Rails.logger.info "Exception ===========> #{exception.message}"
|
||||
fail!(exception.message)
|
||||
|
|
@ -56,7 +62,7 @@ module Gitea
|
|||
file_params = {}
|
||||
file_params = file_params.merge(branch: @params[:branch]) unless @params[:branch].blank?
|
||||
file_params = file_params.merge(new_branch: @params[:new_branch]) unless @params[:new_branch].blank?
|
||||
file_params = file_params.merge(content: Base64.encode64(@params[:content]))
|
||||
file_params = file_params.merge(content: Base64.encode64(@params[:content] || ""))
|
||||
file_params = file_params.merge(message: @params[:message]) unless @params[:message].blank?
|
||||
file_params = file_params.merge(committer: @params[:committer])
|
||||
file_params
|
||||
|
|
|
|||
|
|
@ -8,10 +8,13 @@ class MigrateRemoteRepositoryJob < ApplicationJob
|
|||
puts "############ MigrateRemoteRepositoryJob starting ... ############"
|
||||
|
||||
gitea_repository = Gitea::Repository::MigrateService.new(token, params).call
|
||||
if gitea_repository
|
||||
repo&.project&.update_columns(gpid: gitea_repository["id"])
|
||||
puts "#gitea_repository#{gitea_repository}"
|
||||
if gitea_repository[0]==201
|
||||
repo&.project&.update_columns(gpid: gitea_repository[2]["id"])
|
||||
repo&.mirror&.succeeded!
|
||||
puts "############ mirror status: #{repo.mirror.status} ############"
|
||||
else
|
||||
repo&.mirror&.failed!
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@ class ResetUserCacheJob < ApplicationJob
|
|||
queue_as :cache
|
||||
|
||||
def perform(user)
|
||||
return if user.nil?
|
||||
Cache::UserFollowCountService.new(user).reset
|
||||
Cache::UserIssueCountService.new(user).reset
|
||||
Cache::UserProjectCountService.new(user).reset
|
||||
|
|
|
|||
|
|
@ -0,0 +1,18 @@
|
|||
module EducoderOauth
|
||||
class << self
|
||||
attr_accessor :client_id, :client_secret, :base_url, :redirect_uri
|
||||
|
||||
def logger
|
||||
@_logger ||= STDOUT
|
||||
end
|
||||
|
||||
def logger=(l)
|
||||
@_logger = l
|
||||
end
|
||||
|
||||
def oauth_url
|
||||
"#{base_url}/oauth2?call_url=/oauth/authorize?client_id=#{client_id}&redirect_uri=#{URI.encode_www_form_component(redirect_uri)}&response_type=code"
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
|
|
@ -0,0 +1,37 @@
|
|||
require 'oauth2'
|
||||
|
||||
module EducoderOauth::Service
|
||||
module_function
|
||||
|
||||
def request(method, url, params)
|
||||
begin
|
||||
Rails.logger.info("[EducoderOauth] [#{method.to_s.upcase}] #{url} || #{params}")
|
||||
|
||||
client = Faraday.new(url: EducoderOauth.base_url)
|
||||
response = client.public_send(method, url, params)
|
||||
result = JSON.parse(response.body)
|
||||
|
||||
Rails.logger.info("[EducoderOauth] [#{response.status}] #{result}")
|
||||
|
||||
result
|
||||
rescue Exception => e
|
||||
raise Educoder::TipException.new(e.message)
|
||||
end
|
||||
end
|
||||
|
||||
def access_token(code)
|
||||
begin
|
||||
Rails.logger.info("[EducoderOauth] [code] #{code} ")
|
||||
Rails.logger.info("[EducoderOauth] [redirect_uri] #{EducoderOauth.redirect_uri} ")
|
||||
client = OAuth2::Client.new(EducoderOauth.client_id, EducoderOauth.client_secret, site: EducoderOauth.base_url)
|
||||
result = client.auth_code.get_token(code, redirect_uri: EducoderOauth.redirect_uri).to_hash
|
||||
return result
|
||||
rescue Exception => e
|
||||
raise Educoder::TipException.new(e.message)
|
||||
end
|
||||
end
|
||||
|
||||
def user_info(access_token)
|
||||
request(:get, '/api/users/info.json', {access_token: access_token})
|
||||
end
|
||||
end
|
||||
|
|
@ -1,19 +1,26 @@
|
|||
# == Schema Information
|
||||
#
|
||||
# Table name: applied_messages
|
||||
# Table name: forge_applied_messages
|
||||
#
|
||||
# id :integer not null, primary key
|
||||
# user_id :integer
|
||||
# applied_id :integer
|
||||
# applied_type :string(255)
|
||||
# applied_id :integer
|
||||
# viewed :integer default("0")
|
||||
# status :integer default("0")
|
||||
# created_at :datetime not null
|
||||
# updated_at :datetime not null
|
||||
# name :string(255)
|
||||
# applied_user_id :integer
|
||||
# role :integer
|
||||
# project_id :integer
|
||||
# created_at :datetime not null
|
||||
# updated_at :datetime not null
|
||||
#
|
||||
# Indexes
|
||||
#
|
||||
# index_forge_applied_messages_on_applied_type_and_applied_id (applied_type,applied_id)
|
||||
# index_forge_applied_messages_on_applied_user_id (applied_user_id)
|
||||
# index_forge_applied_messages_on_project_id (project_id)
|
||||
# index_forge_applied_messages_on_user_id (user_id)
|
||||
#
|
||||
|
||||
class AppliedMessage < ApplicationRecord
|
||||
|
|
|
|||
|
|
@ -1,14 +1,19 @@
|
|||
# == Schema Information
|
||||
#
|
||||
# Table name: applied_projects
|
||||
# Table name: forge_applied_projects
|
||||
#
|
||||
# id :integer not null, primary key
|
||||
# project_id :integer not null
|
||||
# user_id :integer not null
|
||||
# project_id :integer
|
||||
# user_id :integer
|
||||
# role :integer default("0")
|
||||
# status :integer default("0")
|
||||
# created_at :datetime
|
||||
# updated_at :datetime
|
||||
# created_at :datetime not null
|
||||
# updated_at :datetime not null
|
||||
#
|
||||
# Indexes
|
||||
#
|
||||
# index_forge_applied_projects_on_project_id (project_id)
|
||||
# index_forge_applied_projects_on_user_id (user_id)
|
||||
#
|
||||
|
||||
class AppliedProject < ApplicationRecord
|
||||
|
|
|
|||
|
|
@ -1,41 +1,42 @@
|
|||
# == Schema Information
|
||||
#
|
||||
# Table name: attachments
|
||||
#
|
||||
# id :integer not null, primary key
|
||||
# container_id :integer
|
||||
# container_type :string(30)
|
||||
# filename :string(255) default(""), not null
|
||||
# disk_filename :string(255) default(""), not null
|
||||
# filesize :integer default("0"), not null
|
||||
# content_type :string(255) default("")
|
||||
# digest :string(60) default(""), not null
|
||||
# downloads :integer default("0"), not null
|
||||
# author_id :integer default("0"), not null
|
||||
# created_on :datetime
|
||||
# description :text(65535)
|
||||
# disk_directory :string(255)
|
||||
# attachtype :integer default("1")
|
||||
# is_public :integer default("1")
|
||||
# copy_from :integer
|
||||
# quotes :integer default("0")
|
||||
# is_publish :integer default("1")
|
||||
# publish_time :datetime
|
||||
# resource_bank_id :integer
|
||||
# unified_setting :boolean default("1")
|
||||
# cloud_url :string(255) default("")
|
||||
# course_second_category_id :integer default("0")
|
||||
# delay_publish :boolean default("0")
|
||||
#
|
||||
# Indexes
|
||||
#
|
||||
# index_attachments_on_author_id (author_id)
|
||||
# index_attachments_on_container_id_and_container_type (container_id,container_type)
|
||||
# index_attachments_on_course_second_category_id (course_second_category_id)
|
||||
# index_attachments_on_created_on (created_on)
|
||||
# index_attachments_on_is_public (is_public)
|
||||
# index_attachments_on_quotes (quotes)
|
||||
#
|
||||
# == Schema Information
|
||||
#
|
||||
# Table name: attachments
|
||||
#
|
||||
# id :integer not null, primary key
|
||||
# container_id :integer
|
||||
# container_type :string(30)
|
||||
# filename :string(255) default(""), not null
|
||||
# disk_filename :string(255) default(""), not null
|
||||
# filesize :integer default("0"), not null
|
||||
# content_type :string(255) default("")
|
||||
# digest :string(60) default(""), not null
|
||||
# downloads :integer default("0"), not null
|
||||
# author_id :integer default("0"), not null
|
||||
# created_on :datetime
|
||||
# description :text(65535)
|
||||
# disk_directory :string(255)
|
||||
# attachtype :integer default("1")
|
||||
# is_public :integer default("1")
|
||||
# copy_from :string(255)
|
||||
# quotes :integer default("0")
|
||||
# is_publish :integer default("1")
|
||||
# publish_time :datetime
|
||||
# resource_bank_id :integer
|
||||
# unified_setting :boolean default("1")
|
||||
# cloud_url :string(255) default("")
|
||||
# course_second_category_id :integer default("0")
|
||||
# delay_publish :boolean default("0")
|
||||
# link :string(255)
|
||||
# clone_id :integer
|
||||
#
|
||||
# Indexes
|
||||
#
|
||||
# index_attachments_on_author_id (author_id)
|
||||
# index_attachments_on_clone_id (clone_id)
|
||||
# index_attachments_on_container_id_and_container_type (container_id,container_type)
|
||||
# index_attachments_on_created_on (created_on)
|
||||
#
|
||||
|
||||
|
||||
|
||||
class Attachment < ApplicationRecord
|
||||
|
|
|
|||
|
|
@ -39,17 +39,15 @@
|
|||
# business :boolean default("0")
|
||||
# profile_completed :boolean default("0")
|
||||
# laboratory_id :integer
|
||||
# platform :string(255) default("0")
|
||||
# gitea_token :string(255)
|
||||
# gitea_uid :integer
|
||||
# is_shixun_marker :boolean default("0")
|
||||
# admin_visitable :boolean default("0")
|
||||
# collaborator :boolean default("0")
|
||||
# gitea_uid :integer
|
||||
# is_sync_pwd :boolean default("1")
|
||||
# watchers_count :integer default("0")
|
||||
# devops_step :integer default("0")
|
||||
# sponsor_certification :integer default("0")
|
||||
# sponsor_num :integer default("0")
|
||||
# sponsored_num :integer default("0")
|
||||
# award_time :datetime
|
||||
# gitea_token :string(255)
|
||||
# platform :string(255)
|
||||
#
|
||||
# Indexes
|
||||
#
|
||||
|
|
@ -57,8 +55,9 @@
|
|||
# index_users_on_homepage_engineer (homepage_engineer)
|
||||
# index_users_on_homepage_teacher (homepage_teacher)
|
||||
# index_users_on_laboratory_id (laboratory_id)
|
||||
# index_users_on_login (login)
|
||||
# index_users_on_mail (mail)
|
||||
# index_users_on_login (login) UNIQUE
|
||||
# index_users_on_mail (mail) UNIQUE
|
||||
# index_users_on_phone (phone) UNIQUE
|
||||
# index_users_on_type (type)
|
||||
#
|
||||
|
||||
|
|
|
|||
|
|
@ -65,7 +65,7 @@ module ProjectOperable
|
|||
if owner.is_a?(User)
|
||||
managers.exists?(user_id: user.id)
|
||||
elsif owner.is_a?(Organization)
|
||||
managers.exists?(user_id: user.id) || owner.is_only_admin?(user.id)
|
||||
managers.exists?(user_id: user.id) || owner.is_owner?(user.id) || owner.is_only_admin?(user.id)
|
||||
else
|
||||
false
|
||||
end
|
||||
|
|
@ -94,7 +94,7 @@ module ProjectOperable
|
|||
end
|
||||
|
||||
def operator?(user)
|
||||
user.admin? || !reporter?(user)
|
||||
user.admin? || (member?(user.id) && !reporter?(user))
|
||||
end
|
||||
|
||||
def set_developer_role(member, role_name)
|
||||
|
|
|
|||
|
|
@ -1,4 +1,6 @@
|
|||
class Gitea::Base < Gitea::Database
|
||||
self.abstract_class = true
|
||||
|
||||
class Gitea::Base < ApplicationRecord
|
||||
db_config = Rails.configuration.database_configuration[Rails.env]["gitea_server"]
|
||||
raise 'gitea database config missing' if db_config.blank?
|
||||
|
||||
establish_connection db_config
|
||||
end
|
||||
|
|
|
|||
|
|
@ -0,0 +1,9 @@
|
|||
class Gitea::PublicKey < Gitea::Base
|
||||
self.inheritance_column = nil # FIX The single-table inheritance mechanism failed
|
||||
# establish_connection :gitea_db
|
||||
|
||||
self.table_name = "public_key"
|
||||
|
||||
belongs_to :user, class_name: '::User', primary_key: :gitea_uid, foreign_key: :owner_id, optional: true
|
||||
|
||||
end
|
||||
|
|
@ -0,0 +1,44 @@
|
|||
# == Schema Information
|
||||
#
|
||||
# Table name: pull_request
|
||||
#
|
||||
# id :integer not null, primary key
|
||||
# type :integer
|
||||
# status :integer
|
||||
# conflicted_files :text(65535)
|
||||
# commits_ahead :integer
|
||||
# commits_behind :integer
|
||||
# changed_protected_files :text(65535)
|
||||
# issue_id :integer
|
||||
# index :integer
|
||||
# head_repo_id :integer
|
||||
# base_repo_id :integer
|
||||
# head_branch :string(255)
|
||||
# base_branch :string(255)
|
||||
# merge_base :string(40)
|
||||
# has_merged :boolean
|
||||
# merged_commit_id :string(40)
|
||||
# merger_id :integer
|
||||
# merged_unix :integer
|
||||
#
|
||||
# Indexes
|
||||
#
|
||||
# IDX_pull_request_base_repo_id (base_repo_id)
|
||||
# IDX_pull_request_has_merged (has_merged)
|
||||
# IDX_pull_request_head_repo_id (head_repo_id)
|
||||
# IDX_pull_request_issue_id (issue_id)
|
||||
# IDX_pull_request_merged_unix (merged_unix)
|
||||
# IDX_pull_request_merger_id (merger_id)
|
||||
#
|
||||
|
||||
class Gitea::Pull < Gitea::Base
|
||||
self.inheritance_column = nil # FIX The single-table inheritance mechanism failed
|
||||
# establish_connection :gitea_db
|
||||
|
||||
self.table_name = "pull_request"
|
||||
|
||||
serialize :conflicted_files, Array
|
||||
|
||||
belongs_to :pull_request, class_name: '::PullRequest', foreign_key: :id, primary_key: :gitea_id, optional: true
|
||||
|
||||
end
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
class Gitea::Webhook < Gitea::Base
|
||||
serialize :events, JSON
|
||||
self.inheritance_column = nil
|
||||
|
||||
self.table_name = 'webhook'
|
||||
|
||||
has_many :tasks, class_name: "Gitea::WebhookTask", foreign_key: :hook_id
|
||||
belongs_to :project, class_name: "::Project", primary_key: :gpid, foreign_key: :repo_id, optional: true
|
||||
|
||||
enum hook_task_type: {gogs: 1, slack: 2, gitea: 3, discord: 4, dingtalk: 5, telegram: 6, msteams: 7, feishu: 8, matrix: 9}
|
||||
enum last_status: {waiting: 0, succeed: 1, fail: 2}
|
||||
enum content_type: {json: 1, form: 2}
|
||||
end
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
class Gitea::WebhookTask < Gitea::Base
|
||||
serialize :payload_content, JSON
|
||||
serialize :request_content, JSON
|
||||
serialize :response_content, JSON
|
||||
|
||||
self.inheritance_column = nil
|
||||
|
||||
self.table_name = 'hook_task'
|
||||
|
||||
belongs_to :webhook, class_name: "Gitea::Webhook", foreign_key: :hook_id
|
||||
|
||||
enum type: {gogs: 1, slack: 2, gitea: 3, discord: 4, dingtalk: 5, telegram: 6, msteams: 7, feishu: 8, matrix: 9}
|
||||
end
|
||||
|
|
@ -10,6 +10,7 @@
|
|||
# sync_course :boolean default("0")
|
||||
# sync_subject :boolean default("0")
|
||||
# sync_shixun :boolean default("0")
|
||||
# is_local :boolean default("0")
|
||||
#
|
||||
# Indexes
|
||||
#
|
||||
|
|
|
|||
|
|
@ -7,7 +7,6 @@
|
|||
# content :text(65535)
|
||||
# created_at :datetime not null
|
||||
# updated_at :datetime not null
|
||||
# is_secret :boolean default("0")
|
||||
#
|
||||
|
||||
class License < ApplicationRecord
|
||||
|
|
|
|||
|
|
@ -11,7 +11,6 @@
|
|||
# course_group_id :integer default("0")
|
||||
# is_collect :integer default("1")
|
||||
# graduation_group_id :integer default("0")
|
||||
# is_apply_signature :boolean default("0")
|
||||
#
|
||||
# Indexes
|
||||
#
|
||||
|
|
|
|||
|
|
@ -39,17 +39,15 @@
|
|||
# business :boolean default("0")
|
||||
# profile_completed :boolean default("0")
|
||||
# laboratory_id :integer
|
||||
# platform :string(255) default("0")
|
||||
# gitea_token :string(255)
|
||||
# gitea_uid :integer
|
||||
# is_shixun_marker :boolean default("0")
|
||||
# admin_visitable :boolean default("0")
|
||||
# collaborator :boolean default("0")
|
||||
# gitea_uid :integer
|
||||
# is_sync_pwd :boolean default("1")
|
||||
# watchers_count :integer default("0")
|
||||
# devops_step :integer default("0")
|
||||
# sponsor_certification :integer default("0")
|
||||
# sponsor_num :integer default("0")
|
||||
# sponsored_num :integer default("0")
|
||||
# award_time :datetime
|
||||
# gitea_token :string(255)
|
||||
# platform :string(255)
|
||||
#
|
||||
# Indexes
|
||||
#
|
||||
|
|
@ -57,8 +55,9 @@
|
|||
# index_users_on_homepage_engineer (homepage_engineer)
|
||||
# index_users_on_homepage_teacher (homepage_teacher)
|
||||
# index_users_on_laboratory_id (laboratory_id)
|
||||
# index_users_on_login (login)
|
||||
# index_users_on_mail (mail)
|
||||
# index_users_on_login (login) UNIQUE
|
||||
# index_users_on_mail (mail) UNIQUE
|
||||
# index_users_on_phone (phone) UNIQUE
|
||||
# index_users_on_type (type)
|
||||
#
|
||||
|
||||
|
|
|
|||
|
|
@ -1,79 +1,79 @@
|
|||
# == Schema Information
|
||||
#
|
||||
# Table name: projects
|
||||
#
|
||||
# id :integer not null, primary key
|
||||
# name :string(255) default(""), not null
|
||||
# description :text(4294967295)
|
||||
# homepage :string(255) default("")
|
||||
# is_public :boolean default("1"), not null
|
||||
# parent_id :integer
|
||||
# created_on :datetime
|
||||
# updated_on :datetime
|
||||
# identifier :string(255)
|
||||
# status :integer default("1"), not null
|
||||
# lft :integer
|
||||
# rgt :integer
|
||||
# inherit_members :boolean default("0"), not null
|
||||
# project_type :integer default("0")
|
||||
# hidden_repo :boolean default("0"), not null
|
||||
# attachmenttype :integer default("1")
|
||||
# user_id :integer
|
||||
# dts_test :integer default("0")
|
||||
# enterprise_name :string(255)
|
||||
# organization_id :integer
|
||||
# project_new_type :integer
|
||||
# gpid :integer
|
||||
# forked_from_project_id :integer
|
||||
# forked_count :integer default("0")
|
||||
# publish_resource :integer default("0")
|
||||
# visits :integer default("0")
|
||||
# hot :integer default("0")
|
||||
# invite_code :string(255)
|
||||
# qrcode :string(255)
|
||||
# qrcode_expiretime :integer default("0")
|
||||
# script :text(65535)
|
||||
# training_status :integer default("0")
|
||||
# rep_identifier :string(255)
|
||||
# project_category_id :integer
|
||||
# project_language_id :integer
|
||||
# license_id :integer
|
||||
# ignore_id :integer
|
||||
# praises_count :integer default("0")
|
||||
# watchers_count :integer default("0")
|
||||
# issues_count :integer default("0")
|
||||
# pull_requests_count :integer default("0")
|
||||
# language :string(255)
|
||||
# versions_count :integer default("0")
|
||||
# issue_tags_count :integer default("0")
|
||||
# closed_issues_count :integer default("0")
|
||||
# open_devops :boolean default("0")
|
||||
# gitea_webhook_id :integer
|
||||
# open_devops_count :integer default("0")
|
||||
# recommend :boolean default("0")
|
||||
# platform :integer default("0")
|
||||
# default_branch :string(255) default("master")
|
||||
# website :string(255)
|
||||
# order_index :integer default("0")
|
||||
# lesson_url :string(255)
|
||||
#
|
||||
# Indexes
|
||||
#
|
||||
# index_projects_on_forked_from_project_id (forked_from_project_id)
|
||||
# index_projects_on_identifier (identifier)
|
||||
# index_projects_on_invite_code (invite_code)
|
||||
# index_projects_on_is_public (is_public)
|
||||
# index_projects_on_lft (lft)
|
||||
# index_projects_on_name (name)
|
||||
# index_projects_on_platform (platform)
|
||||
# index_projects_on_project_type (project_type)
|
||||
# index_projects_on_recommend (recommend)
|
||||
# index_projects_on_rgt (rgt)
|
||||
# index_projects_on_status (status)
|
||||
# index_projects_on_updated_on (updated_on)
|
||||
#
|
||||
|
||||
|
||||
# == Schema Information
|
||||
#
|
||||
# Table name: projects
|
||||
#
|
||||
# id :integer not null, primary key
|
||||
# name :string(255) default(""), not null
|
||||
# description :text(4294967295)
|
||||
# homepage :string(255) default("")
|
||||
# is_public :boolean default("1"), not null
|
||||
# parent_id :integer
|
||||
# created_on :datetime
|
||||
# updated_on :datetime
|
||||
# identifier :string(255)
|
||||
# status :integer default("1"), not null
|
||||
# lft :integer
|
||||
# rgt :integer
|
||||
# inherit_members :boolean default("0"), not null
|
||||
# project_type :integer default("0")
|
||||
# hidden_repo :boolean default("0"), not null
|
||||
# attachmenttype :integer default("1")
|
||||
# user_id :integer
|
||||
# dts_test :integer default("0")
|
||||
# enterprise_name :string(255)
|
||||
# organization_id :integer
|
||||
# project_new_type :integer
|
||||
# gpid :integer
|
||||
# forked_from_project_id :integer
|
||||
# forked_count :integer default("0")
|
||||
# publish_resource :integer default("0")
|
||||
# visits :integer default("0")
|
||||
# hot :integer default("0")
|
||||
# invite_code :string(255)
|
||||
# qrcode :string(255)
|
||||
# qrcode_expiretime :integer default("0")
|
||||
# script :text(65535)
|
||||
# training_status :integer default("0")
|
||||
# rep_identifier :string(255)
|
||||
# project_category_id :integer
|
||||
# project_language_id :integer
|
||||
# praises_count :integer default("0")
|
||||
# watchers_count :integer default("0")
|
||||
# issues_count :integer default("0")
|
||||
# pull_requests_count :integer default("0")
|
||||
# language :string(255)
|
||||
# versions_count :integer default("0")
|
||||
# issue_tags_count :integer default("0")
|
||||
# closed_issues_count :integer default("0")
|
||||
# open_devops :boolean default("0")
|
||||
# gitea_webhook_id :integer
|
||||
# open_devops_count :integer default("0")
|
||||
# recommend :boolean default("0")
|
||||
# platform :integer default("0")
|
||||
# license_id :integer
|
||||
# ignore_id :integer
|
||||
# default_branch :string(255) default("master")
|
||||
# website :string(255)
|
||||
# lesson_url :string(255)
|
||||
#
|
||||
# Indexes
|
||||
#
|
||||
# index_projects_on_forked_from_project_id (forked_from_project_id)
|
||||
# index_projects_on_identifier (identifier)
|
||||
# index_projects_on_invite_code (invite_code)
|
||||
# index_projects_on_is_public (is_public)
|
||||
# index_projects_on_lft (lft)
|
||||
# index_projects_on_license_id (license_id)
|
||||
# index_projects_on_name (name)
|
||||
# index_projects_on_platform (platform)
|
||||
# index_projects_on_project_category_id (project_category_id)
|
||||
# index_projects_on_project_language_id (project_language_id)
|
||||
# index_projects_on_project_type (project_type)
|
||||
# index_projects_on_recommend (recommend)
|
||||
# index_projects_on_rgt (rgt)
|
||||
# index_projects_on_status (status)
|
||||
# index_projects_on_updated_on (updated_on)
|
||||
#
|
||||
|
||||
|
||||
class Project < ApplicationRecord
|
||||
|
|
@ -98,10 +98,12 @@ class Project < ApplicationRecord
|
|||
belongs_to :organization_extension, foreign_key: :user_id, primary_key: :organization_id, optional: true, counter_cache: :num_projects
|
||||
belongs_to :project_category, optional: true , :counter_cache => true
|
||||
belongs_to :project_language, optional: true , :counter_cache => true
|
||||
belongs_to :forked_from_project, class_name: 'Project', optional: true, foreign_key: :forked_from_project_id
|
||||
has_many :project_trends, dependent: :destroy
|
||||
has_many :watchers, as: :watchable, dependent: :destroy
|
||||
has_many :fork_users, dependent: :destroy
|
||||
has_many :forked_users, class_name: 'ForkUser', foreign_key: :fork_project_id, dependent: :destroy
|
||||
has_many :forked_projects, class_name: 'Project', foreign_key: :forked_from_project_id
|
||||
has_one :project_educoder, dependent: :destroy
|
||||
|
||||
has_one :project_score, dependent: :destroy
|
||||
|
|
@ -120,6 +122,7 @@ class Project < ApplicationRecord
|
|||
has_one :applied_transfer_project,-> { order created_at: :desc }, dependent: :destroy
|
||||
has_many :pinned_projects, dependent: :destroy
|
||||
has_many :has_pinned_users, through: :pinned_projects, source: :user
|
||||
has_many :webhooks, class_name: "Gitea::Webhook", primary_key: :gpid, foreign_key: :repo_id
|
||||
|
||||
after_save :check_project_members, :reset_cache_data
|
||||
before_save :set_invite_code
|
||||
|
|
|
|||
|
|
@ -8,11 +8,6 @@
|
|||
# projects_count :integer default("0")
|
||||
# created_at :datetime not null
|
||||
# updated_at :datetime not null
|
||||
# ancestry :string(255)
|
||||
#
|
||||
# Indexes
|
||||
#
|
||||
# index_project_categories_on_ancestry (ancestry)
|
||||
#
|
||||
|
||||
class ProjectCategory < ApplicationRecord
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@
|
|||
class ProjectUnit < ApplicationRecord
|
||||
belongs_to :project
|
||||
|
||||
enum unit_type: {code: 1, issues: 2, pulls: 3, devops: 4, versions: 5, resources: 6}
|
||||
enum unit_type: {code: 1, issues: 2, pulls: 3, wiki:4, devops: 5, versions: 6, resources: 7}
|
||||
|
||||
validates :unit_type, uniqueness: { scope: :project_id}
|
||||
|
||||
|
|
|
|||
|
|
@ -37,6 +37,7 @@ class PullRequest < ApplicationRecord
|
|||
has_many :pull_request_tags, foreign_key: :pull_request_id
|
||||
has_many :project_trends, as: :trend, dependent: :destroy
|
||||
has_many :attachments, as: :container, dependent: :destroy
|
||||
has_one :gitea_pull, foreign_key: :id, primary_key: :gitea_id, class_name: 'Gitea::Pull'
|
||||
|
||||
scope :merged_and_closed, ->{where.not(status: 0)}
|
||||
scope :opening, -> {where(status: 0)}
|
||||
|
|
@ -53,8 +54,10 @@ class PullRequest < ApplicationRecord
|
|||
Project.find_by(id: self.fork_project_id)
|
||||
end
|
||||
|
||||
def bind_gitea_pull_request!(gitea_pull_number)
|
||||
update_column(:gpid, gitea_pull_number)
|
||||
def bind_gitea_pull_request!(gitea_pull_number, gitea_pull_id)
|
||||
update_columns(
|
||||
gitea_number: gitea_pull_number,
|
||||
gitea_id: gitea_pull_id)
|
||||
end
|
||||
|
||||
def merge!
|
||||
|
|
@ -67,19 +70,26 @@ class PullRequest < ApplicationRecord
|
|||
|
||||
# TODO: sync educoder platform repo's for update some statistics count
|
||||
def self.update_some_count
|
||||
PullRequest.includes(:user, :project).select(:id, :user_id, :gpid, :project_id, :fork_project_id).each do |pr|
|
||||
PullRequest.includes(:user, :project).select(:id, :user_id, :gitea_number, :project_id, :fork_project_id).each do |pr|
|
||||
puts pr.id
|
||||
next if pr.gpid.blank?
|
||||
next if pr.gitea_number.blank?
|
||||
project = pr.project
|
||||
|
||||
next if project.blank?
|
||||
user = project.owner
|
||||
next if pr.gpid === 6 || pr.gpid === 7
|
||||
files_result = Gitea::PullRequest::FilesService.call(user.login, project.identifier, pr.gpid)
|
||||
next if pr.gitea_number === 6 || pr.gitea_number === 7
|
||||
files_result = Gitea::PullRequest::FilesService.call(user.login, project.identifier, pr.gitea_number)
|
||||
pr.update_column(:files_count, files_result['NumFiles']) unless files_result.blank?
|
||||
|
||||
commits_result = Gitea::PullRequest::CommitsService.call(user.login, project.identifier, pr.gpid)
|
||||
commits_result = Gitea::PullRequest::CommitsService.call(user.login, project.identifier, pr.gitea_number)
|
||||
pr.update_column(:commits_count, commits_result.size) unless commits_result.blank?
|
||||
end
|
||||
end
|
||||
|
||||
def conflict_files
|
||||
file_names = self&.gitea_pull&.conflicted_files
|
||||
return [] if file_names.blank?
|
||||
|
||||
JSON.parse file_names
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -27,7 +27,6 @@
|
|||
#
|
||||
# Indexes
|
||||
#
|
||||
# index_repositories_on_identifier (identifier)
|
||||
# index_repositories_on_project_id (project_id)
|
||||
# index_repositories_on_user_id (user_id)
|
||||
#
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@ class Team < ApplicationRecord
|
|||
|
||||
validates :name, uniqueness: {scope: :organization_id}
|
||||
|
||||
enum authorize: {common: 0, read: 1, write: 2, admin: 3, owner: 4}
|
||||
enum authorize: {read: 1, write: 2, admin: 3, owner: 4}
|
||||
|
||||
def self.build(organization_id, name, nickname, description, authorize, includes_all_project, can_create_org_project)
|
||||
self.create!(organization_id: organization_id,
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@ class TeamUnit < ApplicationRecord
|
|||
belongs_to :organization
|
||||
belongs_to :team
|
||||
|
||||
enum unit_type: {code: 1, issues: 2, pulls: 3, releases: 4}
|
||||
enum unit_type: {code: 1, issues: 2, pulls: 3, wiki: 4, releases: 5}
|
||||
|
||||
validates :unit_type, uniqueness: { scope: [:organization_id, :team_id]}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,19 +1,19 @@
|
|||
# == Schema Information
|
||||
#
|
||||
# Table name: tokens
|
||||
#
|
||||
# id :integer not null, primary key
|
||||
# user_id :integer default("0"), not null
|
||||
# action :string(30) default(""), not null
|
||||
# value :string(40) default(""), not null
|
||||
# created_on :datetime not null
|
||||
#
|
||||
# Indexes
|
||||
#
|
||||
# index_tokens_on_user_id (user_id)
|
||||
# tokens_value (value) UNIQUE
|
||||
#
|
||||
|
||||
# == Schema Information
|
||||
#
|
||||
# Table name: tokens
|
||||
#
|
||||
# id :integer not null, primary key
|
||||
# user_id :integer default("0"), not null
|
||||
# action :string(30) default(""), not null
|
||||
# value :string(40) default(""), not null
|
||||
# created_on :datetime not null
|
||||
#
|
||||
# Indexes
|
||||
#
|
||||
# index_tokens_on_user_id (user_id)
|
||||
# tokens_value (value) UNIQUE
|
||||
#
|
||||
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License
|
||||
|
|
@ -76,7 +76,7 @@ class Token < ActiveRecord::Base
|
|||
# Returns the active user who owns the key for the given action
|
||||
def self.find_active_user(action, key, validity_days=nil)
|
||||
user = find_user(action, key, validity_days)
|
||||
if user && user.active?
|
||||
if user && (user.active? || user.need_edit_info?)
|
||||
user
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -39,17 +39,15 @@
|
|||
# business :boolean default("0")
|
||||
# profile_completed :boolean default("0")
|
||||
# laboratory_id :integer
|
||||
# platform :string(255) default("0")
|
||||
# gitea_token :string(255)
|
||||
# gitea_uid :integer
|
||||
# is_shixun_marker :boolean default("0")
|
||||
# admin_visitable :boolean default("0")
|
||||
# collaborator :boolean default("0")
|
||||
# gitea_uid :integer
|
||||
# is_sync_pwd :boolean default("1")
|
||||
# watchers_count :integer default("0")
|
||||
# devops_step :integer default("0")
|
||||
# sponsor_certification :integer default("0")
|
||||
# sponsor_num :integer default("0")
|
||||
# sponsored_num :integer default("0")
|
||||
# award_time :datetime
|
||||
# gitea_token :string(255)
|
||||
# platform :string(255)
|
||||
#
|
||||
# Indexes
|
||||
#
|
||||
|
|
@ -57,8 +55,9 @@
|
|||
# index_users_on_homepage_engineer (homepage_engineer)
|
||||
# index_users_on_homepage_teacher (homepage_teacher)
|
||||
# index_users_on_laboratory_id (laboratory_id)
|
||||
# index_users_on_login (login)
|
||||
# index_users_on_mail (mail)
|
||||
# index_users_on_login (login) UNIQUE
|
||||
# index_users_on_mail (mail) UNIQUE
|
||||
# index_users_on_phone (phone) UNIQUE
|
||||
# index_users_on_type (type)
|
||||
#
|
||||
|
||||
|
|
@ -84,6 +83,7 @@ class User < Owner
|
|||
STATUS_ACTIVE = 1
|
||||
STATUS_REGISTERED = 2
|
||||
STATUS_LOCKED = 3
|
||||
STATUS_EDIT_INFO = 4
|
||||
|
||||
# tpi tpm权限控制
|
||||
EDU_ADMIN = 1 # 超级管理员
|
||||
|
|
@ -170,9 +170,10 @@ class User < Owner
|
|||
accepts_nested_attributes_for :is_pinned_projects
|
||||
has_many :issues, dependent: :destroy, foreign_key: :author_id
|
||||
has_many :pull_requests, dependent: :destroy
|
||||
has_many :public_keys, class_name: "Gitea::PublicKey",primary_key: :gitea_uid, foreign_key: :owner_id, dependent: :destroy
|
||||
|
||||
# Groups and active users
|
||||
scope :active, lambda { where(status: STATUS_ACTIVE) }
|
||||
scope :active, lambda { where(status: [STATUS_ACTIVE, STATUS_EDIT_INFO]) }
|
||||
scope :like, lambda { |keywords|
|
||||
sql = "CONCAT(lastname, firstname) LIKE :search OR nickname LIKE :search OR login LIKE :search OR mail LIKE :search OR nickname LIKE :search"
|
||||
where(sql, :search => "%#{keywords.split(" ").join('|')}%") unless keywords.blank?
|
||||
|
|
@ -186,7 +187,7 @@ class User < Owner
|
|||
:show_email, :show_location, :show_department,
|
||||
:technical_title, :province, :city, :custom_department, to: :user_extension, allow_nil: true
|
||||
|
||||
before_save :update_hashed_password
|
||||
before_save :update_hashed_password, :set_lastname
|
||||
after_create do
|
||||
SyncTrustieJob.perform_later("user", 1) if allow_sync_to_trustie?
|
||||
end
|
||||
|
|
@ -410,6 +411,10 @@ class User < Owner
|
|||
status == STATUS_LOCKED
|
||||
end
|
||||
|
||||
def need_edit_info?
|
||||
status == STATUS_EDIT_INFO
|
||||
end
|
||||
|
||||
def activate
|
||||
self.status = STATUS_ACTIVE
|
||||
end
|
||||
|
|
@ -422,6 +427,10 @@ class User < Owner
|
|||
self.status = STATUS_LOCKED
|
||||
end
|
||||
|
||||
def need_edit_info
|
||||
self.status = STATUS_EDIT_INFO
|
||||
end
|
||||
|
||||
def activate!
|
||||
update_attribute(:status, STATUS_ACTIVE)
|
||||
end
|
||||
|
|
@ -434,6 +443,10 @@ class User < Owner
|
|||
update_attribute(:status, STATUS_LOCKED)
|
||||
end
|
||||
|
||||
def need_edit_info!
|
||||
update_attribute(:status, STATUS_EDIT_INFO)
|
||||
end
|
||||
|
||||
# 课程用户身份
|
||||
def course_identity(course)
|
||||
if !logged?
|
||||
|
|
@ -779,6 +792,10 @@ class User < Owner
|
|||
|
||||
self.laboratory = Laboratory.current if laboratory_id.blank?
|
||||
end
|
||||
|
||||
def set_lastname
|
||||
self.lastname = self.nickname if changes[:nickname].present?
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -12,7 +12,9 @@
|
|||
#
|
||||
# Indexes
|
||||
#
|
||||
# index_user_actions_on_ip (ip)
|
||||
# index_user_actions_on_ip (ip)
|
||||
# index_user_actions_on_user_id (user_id)
|
||||
# index_user_actions_on_user_id_and_action_type (user_id,action_type)
|
||||
#
|
||||
|
||||
class UserAction < ApplicationRecord
|
||||
|
|
|
|||
|
|
@ -10,10 +10,13 @@
|
|||
# updated_at :datetime not null
|
||||
# register_status :integer default("0")
|
||||
# action_status :integer default("0")
|
||||
# is_delete :boolean default("0")
|
||||
# user_id :integer
|
||||
#
|
||||
# Indexes
|
||||
#
|
||||
# index_user_agents_on_ip (ip) UNIQUE
|
||||
# index_user_agents_on_ip (ip)
|
||||
# index_user_agents_on_user_id (user_id)
|
||||
#
|
||||
|
||||
class UserAgent < ApplicationRecord
|
||||
|
|
|
|||
|
|
@ -22,6 +22,9 @@
|
|||
# school_id :integer
|
||||
# description :string(255) default("")
|
||||
# department_id :integer
|
||||
# honor :text(65535)
|
||||
# edu_background :integer
|
||||
# edu_entry_year :integer
|
||||
# province :string(255)
|
||||
# city :string(255)
|
||||
# custom_department :string(255)
|
||||
|
|
|
|||
|
|
@ -46,11 +46,11 @@ class Cache::PlatformProjectLanguagesCountService < ApplicationService
|
|||
|
||||
def reset_platform_project_language_count_by_key
|
||||
return if key.nil?
|
||||
$redis_cache.hset(platform_project_language_count_key, key, Project.joins(:project_language).where(project_languages: {name: key}).count)
|
||||
$redis_cache.hset(platform_project_language_count_key, key, ProjectLanguage.where(name: key).projects_count)
|
||||
end
|
||||
|
||||
def reset_platform_project_language_count
|
||||
Project.joins(:project_language).group("project_languages.name").count.each do |k, v|
|
||||
ProjectLanguage.where.not(projects_count: 0).group("project_languages.name").sum(:projects_count).each do |k, v|
|
||||
$redis_cache.hset(platform_project_language_count_key, k, v)
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -44,7 +44,7 @@ class Gitea::Accelerator::MigrateService < Gitea::Accelerator::BaseService
|
|||
clone_addr: params[:clone_addr],
|
||||
repo_name: params[:repository_name],
|
||||
auth_username: params[:auth_username],
|
||||
auth_password: params[:auth_password],
|
||||
auth_password: Base64.decode64(params[:auth_password]),
|
||||
mirror: ActiveModel::Type::Boolean.new.cast(params[:is_mirror])
|
||||
}
|
||||
end
|
||||
|
|
|
|||
|
|
@ -108,6 +108,7 @@ class Gitea::ClientService < ApplicationService
|
|||
def full_url(api_rest, action='post')
|
||||
url = [api_url, api_rest].join('').freeze
|
||||
url = action === 'get' ? url : URI.escape(url)
|
||||
url = URI.escape(url) unless url.ascii_only?
|
||||
puts "[gitea] request url: #{url}"
|
||||
return url
|
||||
end
|
||||
|
|
@ -214,6 +215,14 @@ class Gitea::ClientService < ApplicationService
|
|||
[body, message]
|
||||
end
|
||||
|
||||
def json_parse!(body)
|
||||
return nil unless body.present?
|
||||
|
||||
body = JSON.parse(body)
|
||||
body, message = fix_body(body)
|
||||
body
|
||||
end
|
||||
|
||||
def log_error(status, body)
|
||||
puts "[gitea] status: #{status}"
|
||||
puts "[gitea] body: #{body&.force_encoding('UTF-8')}"
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ class Gitea::PullRequest::CloseService < Gitea::PullRequest::UpdateService
|
|||
# number: number of pull request
|
||||
# token: token of gitea user
|
||||
# eq:
|
||||
# Gitea::PullRequest::CloseService.call(owner.login, repo.identifier, pull.gpid, pull.base, current_user.gitea_token)
|
||||
# Gitea::PullRequest::CloseService.call(owner.login, repo.identifier, pull.gitea_number, pull.base, current_user.gitea_token)
|
||||
def initialize(owner, repo, number, base,token=nil)
|
||||
colse_pull_params = Hash.new.merge(base: base, state: 'closed').compact
|
||||
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ class Gitea::PullRequest::GetService < Gitea::ClientService
|
|||
attr_reader :owner, :repo, :number, :token
|
||||
|
||||
#eq:
|
||||
# Gitea::PullRequest::GetService.call(user.login, repository.identifier, pull.gpid, user.gitea_token)
|
||||
# Gitea::PullRequest::GetService.call(user.login, repository.identifier, pull.gitea_number, user.gitea_token)
|
||||
def initialize(owner, repo, number, token=nil)
|
||||
@owner = owner
|
||||
@repo = repo
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ class Gitea::PullRequest::OpenService < Gitea::PullRequest::UpdateService
|
|||
# number: number of pull request
|
||||
# token: token of gitea user
|
||||
# eq:
|
||||
# Gitea::PullRequest::OpenService.new(owner.login, repo.identifier, pr.gpid, pr.base, current_user.gitea_token)
|
||||
# Gitea::PullRequest::OpenService.new(owner.login, repo.identifier, pr.gitea_number, pr.base, current_user.gitea_token)
|
||||
def initialize(owner, repo, number, base, token=nil)
|
||||
open_pull_params = Hash.new.merge(base: base, state: 'open').compact
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,40 @@
|
|||
class Gitea::Repository::ArchiveService < Gitea::ClientService
|
||||
attr_reader :owner, :repo, :archive, :token
|
||||
|
||||
def initialize(owner, repo, archive, token=nil)
|
||||
@owner = owner
|
||||
@repo = repo
|
||||
@archive = archive
|
||||
@token = token
|
||||
end
|
||||
|
||||
def call
|
||||
response = get(url, params)
|
||||
response_payload(response)
|
||||
end
|
||||
|
||||
private
|
||||
def params
|
||||
Hash.new.merge(token: token)
|
||||
end
|
||||
|
||||
def url
|
||||
"/repos/#{owner}/#{repo}/archive/#{archive}".freeze
|
||||
end
|
||||
|
||||
def response_payload(response)
|
||||
status = response.status
|
||||
body = response&.body
|
||||
|
||||
log_error(status, body)
|
||||
status_payload(status, body)
|
||||
end
|
||||
|
||||
def status_payload(status, body)
|
||||
case status
|
||||
when 200 then success
|
||||
when 404 then error("你操作的链接不存在!")
|
||||
else error("系统错误!")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -30,8 +30,7 @@ class Gitea::Repository::Entries::CreateService < Gitea::ClientService
|
|||
|
||||
def call
|
||||
response = post(url, params)
|
||||
|
||||
render_201_response(response)
|
||||
response_payload(response)
|
||||
end
|
||||
|
||||
private
|
||||
|
|
@ -43,4 +42,21 @@ class Gitea::Repository::Entries::CreateService < Gitea::ClientService
|
|||
"/repos/#{owner}/#{repo_name}/contents/#{filepath}".freeze
|
||||
end
|
||||
|
||||
def response_payload(response)
|
||||
status = response.status
|
||||
body = response&.body
|
||||
|
||||
log_error(status, body)
|
||||
status_payload(status, body)
|
||||
end
|
||||
|
||||
def status_payload(status, body)
|
||||
case status
|
||||
when 201 then success(json_parse!(body))
|
||||
when 403 then error("你没有权限操作!")
|
||||
when 404 then error("你操作的链接不存在!")
|
||||
when 422 then error("#{filepath}文件已存在,不能重复创建!")
|
||||
else error("系统错误!")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@ class Gitea::Repository::MigrateService < Gitea::ClientService
|
|||
def call
|
||||
response = post(url, request_params)
|
||||
|
||||
render_201_response(response)
|
||||
render_response(response)
|
||||
end
|
||||
|
||||
private
|
||||
|
|
|
|||
|
|
@ -0,0 +1,23 @@
|
|||
class Gitea::Repository::Webhooks::CreateService < Gitea::ClientService
|
||||
attr_reader :token, :owner, :repo, :params
|
||||
def initialize(token, owner, repo, params)
|
||||
@token = token
|
||||
@owner = owner
|
||||
@repo = repo
|
||||
@params = params
|
||||
end
|
||||
|
||||
def call
|
||||
response = post(url, request_params)
|
||||
render_response(response)
|
||||
end
|
||||
|
||||
private
|
||||
def request_params
|
||||
Hash.new.merge({token: token, data: params})
|
||||
end
|
||||
|
||||
def url
|
||||
"/repos/#{owner}/#{repo}/hooks".freeze
|
||||
end
|
||||
end
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
class Gitea::Repository::Webhooks::DeleteService < Gitea::ClientService
|
||||
attr_reader :token, :owner, :repo, :id
|
||||
|
||||
def initialize(token, owner, repo, id)
|
||||
@token = token
|
||||
@owner = owner
|
||||
@repo = repo
|
||||
@id = id
|
||||
end
|
||||
|
||||
def call
|
||||
response = delete(url, params)
|
||||
render_response(response)
|
||||
end
|
||||
|
||||
private
|
||||
def params
|
||||
Hash.new.merge(token: token)
|
||||
end
|
||||
|
||||
def url
|
||||
"/repos/#{owner}/#{repo}/hooks/#{id}".freeze
|
||||
end
|
||||
end
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
class Gitea::Repository::Webhooks::TasksService < Gitea::ClientService
|
||||
attr_reader :token, :owner, :repo, :webhook_id
|
||||
|
||||
# ref: The name of the commit/branch/tag. Default the repository’s default branch (usually master)
|
||||
# repo_name: the name of repository
|
||||
def initialize(token, owner, repo, webhook_id)
|
||||
@token = token
|
||||
@owner = owner
|
||||
@repo = repo
|
||||
@webhook_id = webhook_id
|
||||
end
|
||||
|
||||
def call
|
||||
response = get(url, params)
|
||||
render_response(response)
|
||||
end
|
||||
|
||||
private
|
||||
def params
|
||||
Hash.new.merge(token: user.gitea_token)
|
||||
end
|
||||
|
||||
def url
|
||||
"/repos/#{owner}/#{repo}/hooks/#{webhook_id}/hook_tasks".freeze
|
||||
end
|
||||
|
||||
end
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
class Gitea::Repository::Webhooks::TestService < Gitea::ClientService
|
||||
attr_reader :token, :owner, :repo, :webhook_id
|
||||
|
||||
def initialize(token, owner, repo, webhook_id)
|
||||
@token = token
|
||||
@owner = owner
|
||||
@repo = repo
|
||||
@webhook_id = webhook_id
|
||||
end
|
||||
|
||||
def call
|
||||
response = post(url, request_params)
|
||||
render_response(response)
|
||||
end
|
||||
|
||||
private
|
||||
def request_params
|
||||
Hash.new.merge({token: token})
|
||||
end
|
||||
|
||||
def url
|
||||
"/repos/#{owner}/#{repo}/hooks/#{webhook_id}/tests".freeze
|
||||
end
|
||||
end
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
class Gitea::Repository::Webhooks::UpdateService < Gitea::ClientService
|
||||
attr_reader :token, :owner, :repo, :id, :params
|
||||
def initialize(token, owner, repo, id, params)
|
||||
@token = token
|
||||
@owner = owner
|
||||
@repo = repo
|
||||
@id = id
|
||||
@params = params
|
||||
end
|
||||
|
||||
def call
|
||||
response = patch(url, data_params)
|
||||
render_response(response)
|
||||
end
|
||||
|
||||
private
|
||||
def url
|
||||
"/repos/#{owner}/#{repo}/hooks/#{id}"
|
||||
end
|
||||
|
||||
def data_params
|
||||
Hash.new.merge(token: token, data: params).compact
|
||||
end
|
||||
end
|
||||
|
|
@ -0,0 +1,21 @@
|
|||
class Gitea::User::Keys::CreateService < Gitea::ClientService
|
||||
attr_reader :token, :params
|
||||
def initialize(token, params)
|
||||
@token = token
|
||||
@params = params
|
||||
end
|
||||
|
||||
def call
|
||||
response = post(url, request_params)
|
||||
render_response(response)
|
||||
end
|
||||
|
||||
private
|
||||
def request_params
|
||||
Hash.new.merge({token: token, data: params})
|
||||
end
|
||||
|
||||
def url
|
||||
'/user/keys'.freeze
|
||||
end
|
||||
end
|
||||
|
|
@ -0,0 +1,23 @@
|
|||
class Gitea::User::Keys::DeleteService < Gitea::ClientService
|
||||
attr_reader :token, :key_id
|
||||
|
||||
def initialize(token, key_id)
|
||||
@token = token
|
||||
@key_id = key_id
|
||||
end
|
||||
|
||||
def call
|
||||
response = delete(url, params)
|
||||
render_response(response)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def params
|
||||
Hash.new.merge(token: token)
|
||||
end
|
||||
|
||||
def url
|
||||
"/user/keys/#{key_id}".freeze
|
||||
end
|
||||
end
|
||||
|
|
@ -0,0 +1,22 @@
|
|||
class Gitea::User::Keys::GetService < Gitea::ClientService
|
||||
attr_reader :token, :key_id
|
||||
|
||||
def initialize(token, key_id)
|
||||
@token = token
|
||||
@key_id = key_id
|
||||
end
|
||||
|
||||
def call
|
||||
response = get(url, params)
|
||||
render_response(response)
|
||||
end
|
||||
|
||||
private
|
||||
def params
|
||||
Hash.new.merge({token: token})
|
||||
end
|
||||
|
||||
def url
|
||||
"/user/keys/#{key_id}".freeze
|
||||
end
|
||||
end
|
||||
|
|
@ -0,0 +1,26 @@
|
|||
class Gitea::User::Keys::ListService < Gitea::ClientService
|
||||
attr_reader :token, :page, :limit, :fingerprint
|
||||
|
||||
def initialize(token, page, limit, fingerprint="")
|
||||
@token = token
|
||||
@page = page
|
||||
@limit = limit
|
||||
@fingerprint = fingerprint
|
||||
end
|
||||
|
||||
def call
|
||||
response = get(url, params)
|
||||
render_response(response)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def params
|
||||
Hash.new.merge({token: token, fingerprint: fingerprint, page: page, limit: limit})
|
||||
end
|
||||
|
||||
def url
|
||||
'/user/keys'.freeze
|
||||
end
|
||||
|
||||
end
|
||||
|
|
@ -37,7 +37,7 @@ class Organizations::Teams::CreateService < ApplicationService
|
|||
end
|
||||
|
||||
def authorize
|
||||
params[:authorize].present? ? params[:authorize] : "common"
|
||||
params[:authorize].present? ? params[:authorize] : "read"
|
||||
end
|
||||
|
||||
def includes_all_project
|
||||
|
|
@ -54,7 +54,7 @@ class Organizations::Teams::CreateService < ApplicationService
|
|||
end
|
||||
|
||||
def units_params
|
||||
%w(admin owner).include?(authorize) ? %w(code issues pulls releases) : params[:unit_types]
|
||||
%w(code issues pulls wiki releases)
|
||||
end
|
||||
|
||||
def create_units
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@ class Organizations::Teams::UpdateService < ApplicationService
|
|||
end
|
||||
|
||||
def units_params
|
||||
%w(admin owner).include?(team.authorize) ? %w(code issues pulls releases) : params[:unit_types]
|
||||
%w(code issues pulls wiki releases)
|
||||
end
|
||||
|
||||
def update_team(update_params)
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@ class Projects::ApplyTransferService < ApplicationService
|
|||
|
||||
def is_permit_owner
|
||||
return true unless @owner.is_a?(Organization)
|
||||
return @owner.is_owner?(@user)
|
||||
return @owner.is_admin?(@user)
|
||||
end
|
||||
|
||||
def create_apply
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@ class Projects::CreateService < ApplicationService
|
|||
|
||||
def call
|
||||
Rails.logger.info("#############__________project_params______###########{project_params}")
|
||||
raise Error, "user_id不正确." unless authroize_user_id_success
|
||||
|
||||
@project = Project.new(project_params)
|
||||
ActiveRecord::Base.transaction do
|
||||
|
|
@ -27,6 +28,10 @@ class Projects::CreateService < ApplicationService
|
|||
|
||||
private
|
||||
|
||||
def authroize_user_id_success
|
||||
(user.id == params[:user_id].to_i) || (user.organizations.find_by_id(params[:user_id]).present?)
|
||||
end
|
||||
|
||||
def project_params
|
||||
{
|
||||
name: params[:name],
|
||||
|
|
|
|||
|
|
@ -15,8 +15,11 @@ class Projects::ForkService < ApplicationService
|
|||
:rep_identifier, :project_category_id, :project_language_id,
|
||||
:license_id, :ignore_id, {repository: [:identifier, :hidden]}]
|
||||
|
||||
result = Gitea::Repository::ForkService.new(@project.owner, @target_owner, @project.identifier, @organization).call
|
||||
|
||||
clone_project.owner = @target_owner
|
||||
clone_project.forked_from_project_id = @project.id
|
||||
clone_project.gpid = result['id']
|
||||
clone_project.save!
|
||||
|
||||
new_repository = clone_project.repository
|
||||
|
|
@ -26,8 +29,6 @@ class Projects::ForkService < ApplicationService
|
|||
|
||||
ProjectUnit.init_types(clone_project.id)
|
||||
|
||||
result = Gitea::Repository::ForkService.new(@project.owner, @target_owner, @project.identifier, @organization).call
|
||||
|
||||
@project.update_column('forked_count', @project&.forked_count.to_i + 1)
|
||||
new_repository.update_column('url', result['clone_url']) if result
|
||||
|
||||
|
|
|
|||
|
|
@ -8,6 +8,8 @@ class Projects::MigrateService < ApplicationService
|
|||
end
|
||||
|
||||
def call
|
||||
raise Error, "user_id不正确." unless authroize_user_id_success
|
||||
|
||||
@project = Project.new(project_params)
|
||||
if @project.save!
|
||||
ProjectUnit.init_types(@project.id, project.project_type)
|
||||
|
|
@ -24,6 +26,9 @@ class Projects::MigrateService < ApplicationService
|
|||
end
|
||||
|
||||
private
|
||||
def authroize_user_id_success
|
||||
(user.id == params[:user_id].to_i) || (user.organizations.find_by_id(params[:user_id]).present?)
|
||||
end
|
||||
|
||||
def project_params
|
||||
{
|
||||
|
|
|
|||
|
|
@ -23,12 +23,12 @@ class Projects::TransferService < ApplicationService
|
|||
|
||||
private
|
||||
def update_owner
|
||||
project.members.find_by(user_id: owner.id).destroy! if owner.is_a?(User)
|
||||
project.members.map{|m| m.destroy! if m.user_id == owner.id || (new_owner.is_a?(Organization) && new_owner.is_member?(m.user_id)) }
|
||||
project.update!(user_id: new_owner.id)
|
||||
end
|
||||
|
||||
def update_repo_url
|
||||
project.repository.update!(url: @gitea_repo["clone_url"])
|
||||
project.repository.update!(user_id: new_owner.id, url: @gitea_repo["clone_url"])
|
||||
end
|
||||
|
||||
def update_visit_teams
|
||||
|
|
|
|||
|
|
@ -23,7 +23,7 @@ class PullRequests::CloseService < ApplicationService
|
|||
|
||||
def close_gitea_pull
|
||||
Gitea::PullRequest::CloseService.call(@owner.login, @repo.identifier,
|
||||
@pull.gpid, @pull.base, current_user.gitea_token)
|
||||
@pull.gitea_number, @pull.base, current_user.gitea_token)
|
||||
end
|
||||
|
||||
def update_pull_status!
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@ class PullRequests::MergeService < ApplicationService
|
|||
|
||||
def gitea_pull_merge!
|
||||
result = Gitea::PullRequest::MergeService.call(@current_user.gitea_token, @owner.login,
|
||||
@repo.identifier, @pull.gpid, gitea_merge_pull_params)
|
||||
@repo.identifier, @pull.gitea_number, gitea_merge_pull_params)
|
||||
@status, @message = result
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -23,7 +23,7 @@ class PullRequests::OpenService < ApplicationService
|
|||
|
||||
def open_gitea_pull
|
||||
Gitea::PullRequest::OpenService.call(@owner.login, @repo.identifier,
|
||||
@pull.gpid, @pull.base, @current_user.gitea_token)
|
||||
@pull.gitea_number, @pull.base, @current_user.gitea_token)
|
||||
end
|
||||
|
||||
def update_pull_status!
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@ class Repositories::MigrateService < ApplicationService
|
|||
private: params[:hidden],
|
||||
mirror: wrapper_mirror || false,
|
||||
auth_username: params[:login],
|
||||
auth_password: params[:password]
|
||||
auth_password: Base64.decode64(params[:password])
|
||||
}
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -83,3 +83,5 @@ json.diff do
|
|||
|
||||
end
|
||||
end
|
||||
json.status @merge_status
|
||||
json.message @merge_message
|
||||
|
|
@ -1,14 +1,19 @@
|
|||
<div class="indexPanel">
|
||||
<p class="indexTitle">完善信息,进入比赛</p>
|
||||
<p class="indexTitle">平台已检测到您的如下信息,完善即可进入比赛</p>
|
||||
<div class="indexInfos">
|
||||
|
||||
<%= form_tag('', method: :post, id: 'oauth_form', class: 'form-inline search-form flex-1', remote: true) do %>
|
||||
<%= hidden_field_tag 'callback_url', params[:callback_url] %>
|
||||
<div class="indexInfo">
|
||||
<span>用户名:</span>
|
||||
<%= text_field_tag :login, params[:login], placeholder: '请输入用户名', readonly: true, id: 'login' %>
|
||||
<span>登录名:</span>
|
||||
<%= text_field_tag :login, params[:login], placeholder: '请输入登录名', readonly: true, id: 'login' %>
|
||||
<p class="checkInfo loginCheck"><span></span></p>
|
||||
</div>
|
||||
<div class="indexInfo">
|
||||
<span>用户名称:</span>
|
||||
<%= text_field_tag :lastname, params[:lastname], placeholder: '登录平台后显示的用户名称', maxlength: 40, id: 'lastname' %>
|
||||
<p class="checkInfo lastnameCheck"><span></span></p>
|
||||
</div>
|
||||
<div class="indexInfo">
|
||||
<span>邮箱:</span>
|
||||
<%= text_field_tag :mail, params[:mail], placeholder: '请输入绑定邮箱', maxlength: 40, id: 'email' %>
|
||||
|
|
@ -16,7 +21,7 @@
|
|||
</div>
|
||||
<div class="indexInfo">
|
||||
<span>密码:</span>
|
||||
<%= password_field_tag :password, '', placeholder: '请输入账号密码', id: 'password' %>
|
||||
<%= password_field_tag :password, '', placeholder: '输入EduCoder账号密码或新的密码',maxlength: 15, id: 'password' %>
|
||||
<p class="checkInfo passwordCheck"><span></span></p>
|
||||
</div>
|
||||
<div class="indexBtn">
|
||||
|
|
@ -29,6 +34,7 @@
|
|||
function submitdata(){
|
||||
var login = $("#login").val();
|
||||
var email = $("#email").val();
|
||||
var lastname = $("#lastname").val();
|
||||
var password = $("#password").val();
|
||||
|
||||
if(!login){
|
||||
|
|
@ -37,6 +43,12 @@
|
|||
}else{
|
||||
$(".loginCheck span").html("");
|
||||
}
|
||||
if(!lastname){
|
||||
$(".lastnameCheck span").html("请输入用户名称");
|
||||
return;
|
||||
}else{
|
||||
$(".lastnameCheck span").html("");
|
||||
}
|
||||
if(!email){
|
||||
$(".emailCheck span").html("请输入绑定的邮箱");
|
||||
return;
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@ json.total_count @owners.size
|
|||
json.owners @owners.each do |owner|
|
||||
json.id owner.id
|
||||
json.type owner.type
|
||||
json.name owner.login
|
||||
json.login owner.login
|
||||
json.name owner&.show_real_name
|
||||
json.avatar_url url_to_avatar(owner)
|
||||
end
|
||||
|
|
@ -4,8 +4,8 @@ json.array! @branches do |branch|
|
|||
json.user_can_merge branch['user_can_merge']
|
||||
json.protected branch['protected']
|
||||
json.http_url render_http_url(@project)
|
||||
json.zip_url render_zip_url(@project, branch['name'])
|
||||
json.tar_url render_tar_url(@project, branch['name'])
|
||||
json.zip_url render_zip_url(@owner, @repository, branch['name'])
|
||||
json.tar_url render_tar_url(@owner, @repository, branch['name'])
|
||||
json.last_commit do
|
||||
json.sha branch['commit']['id']
|
||||
json.message branch['commit']['message']
|
||||
|
|
|
|||
|
|
@ -1 +1,2 @@
|
|||
json.extract! @project, :id, :name,:identifier
|
||||
json.login @project&.owner.login
|
||||
|
|
|
|||
|
|
@ -1 +1,2 @@
|
|||
json.extract! @project, :id, :name, :identifier
|
||||
json.login @project&.owner&.login
|
||||
|
|
@ -1,5 +1,6 @@
|
|||
json.total_count @teams.total_count
|
||||
json.can_add @owner.is_owner?(current_user.id) || @owner&.repo_admin_change_team_access
|
||||
json.teams @teams.each do |team|
|
||||
json.(team, :id, :name, :authorize)
|
||||
json.can_remove !team.includes_all_project && team&.organization&.repo_admin_change_team_access
|
||||
json.can_remove !team.includes_all_project && (@owner.is_owner?(current_user.id) || team&.organization&.repo_admin_change_team_access)
|
||||
end
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
json.(webhook, :id, :url, :http_method, :is_active)
|
||||
json.type webhook.hook_task_type
|
||||
json.last_status webhook.last_status
|
||||
json.create_time Time.at(webhook.created_unix).strftime("%Y-%m-%d %H:%M:%S")
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
json.id @webhook["id"]
|
||||
json.type @webhook["type"]
|
||||
json.content_type @webhook["config"]["content_type"]
|
||||
json.url @webhook["config"]["url"]
|
||||
json.events @webhook["events"]
|
||||
json.active @webhook["active"]
|
||||
json.create_time @webhook["created_at"].to_time.strftime("%Y-%m-%d %H:%M:%S")
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
json.id @webhook.id
|
||||
json.(@webhook, :id, :http_method, :content_type, :url, :secret, :last_status, :is_active)
|
||||
json.type @webhook.hook_task_type
|
||||
json.create_time Time.at(@webhook.created_unix).strftime("%Y-%m-%d %H:%M:%S")
|
||||
event = @webhook.events
|
||||
json.branch_filter event["branch_filter"]
|
||||
if event["send_everything"]
|
||||
json.events event["events"].keys.collect{|i| i == "pull_request" ? i + "_only" : i}
|
||||
else
|
||||
json.events event["events"].select{|k, v| v}.keys.collect{|i| i == "pull_request" ? i + "_only" : i}
|
||||
end
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
json.total_count @webhooks.total_count
|
||||
json.webhooks @webhooks.each do |webhook|
|
||||
json.partial! 'detail', webhook: webhook
|
||||
end
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue