forked from Gitlink/forgeplus
Compare commits
171 Commits
standalone
...
mulanoss_s
| Author | SHA1 | Date |
|---|---|---|
|
|
5d88b6cb90 | |
|
|
9e2d8fba0e | |
|
|
a28589cce5 | |
|
|
c860e7bc43 | |
|
|
2743da824e | |
|
|
1822ade2db | |
|
|
91fa87ada5 | |
|
|
38e55cea40 | |
|
|
2f038117f7 | |
|
|
d0b3ea7a5a | |
|
|
734ff6463a | |
|
|
3e399af371 | |
|
|
f7ca0c3a13 | |
|
|
8343c625c3 | |
|
|
eec57f26b9 | |
|
|
5930a93b8f | |
|
|
b5dd2ade82 | |
|
|
7812996894 | |
|
|
8c2f0e9fdb | |
|
|
ab9bdfd109 | |
|
|
8d81672ac5 | |
|
|
a721968938 | |
|
|
0bacc4c969 | |
|
|
d63df944c8 | |
|
|
eb593c384b | |
|
|
0cbfc895ca | |
|
|
2fab120118 | |
|
|
629729436c | |
|
|
00ed177089 | |
|
|
26c0d36227 | |
|
|
86c98a1716 | |
|
|
143e88593f | |
|
|
99e3aaf780 | |
|
|
7d12a25088 | |
|
|
85d1aa3a85 | |
|
|
0f57844106 | |
|
|
c3b9d2e0b5 | |
|
|
299e8534d1 | |
|
|
d7362925f2 | |
|
|
43945b00b8 | |
|
|
b11d515ec6 | |
|
|
07a38ac3f7 | |
|
|
18227c232b | |
|
|
f1d79e4d9f | |
|
|
20e2e22be5 | |
|
|
27e5febef2 | |
|
|
fb23e733d6 | |
|
|
512bff426d | |
|
|
671c2c2257 | |
|
|
c6f2021017 | |
|
|
581b147b3c | |
|
|
deebfc3292 | |
|
|
6c4d17bed8 | |
|
|
e68c13f1a2 | |
|
|
15eb1f4a17 | |
|
|
a1cb9a11d6 | |
|
|
0884a0de1b | |
|
|
900fdd2691 | |
|
|
4520055de2 | |
|
|
193d1b21df | |
|
|
ed8e079595 | |
|
|
55a0bcfb82 | |
|
|
8f1aa3f4b1 | |
|
|
b054094798 | |
|
|
2d648e516e | |
|
|
7c23b40661 | |
|
|
ff21916f18 | |
|
|
d9162cb3bf | |
|
|
ca1fd3cd4f | |
|
|
913bc45a9f | |
|
|
8131d8cd48 | |
|
|
b45ab12279 | |
|
|
259090b8e3 | |
|
|
c3bc4166d9 | |
|
|
7e474cab70 | |
|
|
01341d4389 | |
|
|
3a475a4674 | |
|
|
83b7b8cd9c | |
|
|
c298ff02b8 | |
|
|
16ea03dcc8 | |
|
|
7bb4cf7391 | |
|
|
23f7439a8c | |
|
|
fa8f1155f5 | |
|
|
484f8a854a | |
|
|
7bedac263d | |
|
|
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 |
1
Gemfile
1
Gemfile
|
|
@ -63,6 +63,7 @@ end
|
|||
|
||||
group :development do
|
||||
gem 'prettier'
|
||||
gem 'pry-rails', '~> 0.3.9'
|
||||
gem 'rubocop', '~> 0.52.0'
|
||||
gem 'solargraph', '~> 0.38.0'
|
||||
gem 'awesome_print'
|
||||
|
|
|
|||
|
|
@ -99,6 +99,7 @@ GEM
|
|||
archive-zip (~> 0.10)
|
||||
nokogiri (~> 1.8)
|
||||
chunky_png (1.3.11)
|
||||
coderay (1.1.3)
|
||||
concurrent-ruby (1.1.6)
|
||||
connection_pool (2.2.2)
|
||||
crass (1.0.6)
|
||||
|
|
@ -217,6 +218,11 @@ GEM
|
|||
popper_js (1.16.0)
|
||||
powerpack (0.1.2)
|
||||
prettier (0.18.2)
|
||||
pry (0.12.2)
|
||||
coderay (~> 1.1.0)
|
||||
method_source (~> 0.9.0)
|
||||
pry-rails (0.3.9)
|
||||
pry (>= 0.10.4)
|
||||
public_suffix (4.0.3)
|
||||
puma (3.12.2)
|
||||
raabro (1.4.0)
|
||||
|
|
@ -469,6 +475,7 @@ DEPENDENCIES
|
|||
parallel (~> 1.19, >= 1.19.1)
|
||||
pdfkit
|
||||
prettier
|
||||
pry-rails (~> 0.3.9)
|
||||
puma (~> 3.11)
|
||||
rack-cors
|
||||
rack-mini-profiler
|
||||
|
|
|
|||
|
|
@ -337,7 +337,6 @@ class ApplicationController < ActionController::Base
|
|||
User.current = user
|
||||
end
|
||||
end
|
||||
|
||||
# if !User.current.logged? && Rails.env.development?
|
||||
# User.current = User.find 1
|
||||
# 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
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
class JournalsController < ApplicationController
|
||||
before_action :require_login, except: [:index, :get_children_journals]
|
||||
before_action :require_login, except: [:index, :get_children_journals,:beihang]
|
||||
before_action :require_profile_completed, only: [:create]
|
||||
before_action :set_issue
|
||||
before_action :check_issue_permission
|
||||
|
|
@ -13,8 +13,8 @@ class JournalsController < ApplicationController
|
|||
parent_journals = total_journals.parent_journals.order("created_on desc")
|
||||
@journals = parent_journals.order("created_on desc").page(@page).per(@limit)
|
||||
@journals_size = parent_journals.size
|
||||
|
||||
|
||||
|
||||
|
||||
end
|
||||
|
||||
def create
|
||||
|
|
@ -52,6 +52,31 @@ class JournalsController < ApplicationController
|
|||
end
|
||||
end
|
||||
|
||||
def beihang
|
||||
token = request.headers["HTTP_TOKEN"]
|
||||
playod = JWT.decode(token,EducoderOauth.client_id)[0]
|
||||
data = HashWithIndifferentAccess.new playod
|
||||
|
||||
notes = params[:content]
|
||||
return normal_status(-1, "评论内容不能为空") if notes.blank?
|
||||
return normal_status(-1, "验证失败") if data["user_id"].blank?
|
||||
journal_params = {
|
||||
journalized_id: @issue.id ,
|
||||
journalized_type: "Issue",
|
||||
user_id: data["user_id"] ,
|
||||
notes: notes.to_s.strip,
|
||||
parent_id: params[:parent_id]
|
||||
}
|
||||
journal = Journal.new journal_params
|
||||
if journal.save
|
||||
# @issue.project_trends.create(user_id: current_user.id, project_id: @project.id, action_type: "journal")
|
||||
render :json => { status: 0, message: "评论成功", id: journal.id}
|
||||
# normal_status(0, "评论成功")
|
||||
else
|
||||
normal_status(-1, "评论失败")
|
||||
end
|
||||
end
|
||||
|
||||
def destroy
|
||||
if @journal.destroy #如果有子评论,子评论删除吗?
|
||||
Journal.children_journals(@journal.id).destroy_all
|
||||
|
|
@ -110,4 +135,4 @@ class JournalsController < ApplicationController
|
|||
normal_status(-1, "评论不存在")
|
||||
end
|
||||
end
|
||||
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
|
||||
|
|
|
|||
|
|
@ -0,0 +1,34 @@
|
|||
class Oauth::MulanossController < Oauth::BaseController
|
||||
include RegisterHelper
|
||||
# 需要educoder那边设置回调地址
|
||||
def create
|
||||
# user, new_user = Oauth::CreateOrFindWechatAccountService.call(current_user ,params)
|
||||
|
||||
begin
|
||||
code = params['code'].to_s.strip
|
||||
tip_exception("code不能为空") if code.blank?
|
||||
result = MulanossOauth::Service.access_token(code)
|
||||
result = MulanossOauth::Service.user_info(result[:access_token])
|
||||
|
||||
# 存在该用户
|
||||
open_user = OpenUsers::Mulan.find_by(uid: result['id'])
|
||||
if open_user.present? && open_user.user.present?
|
||||
successful_authentication(open_user.user)
|
||||
else
|
||||
if current_user.blank? || !current_user.logged?
|
||||
login = User.generate_login('ML')
|
||||
mail = result["email"].to_s.match(CustomRegexp::EMAIL).present? ? result["email"].to_s : "#{login}@mulan.com"
|
||||
reg_result = autologin_register(login, mail , "M#{login}2021#", 'mulan', true)
|
||||
open_user = OpenUsers::Mulan.create!(user_id: reg_result[:user][:id], uid: result['id'], extra: result)
|
||||
successful_authentication(open_user.user)
|
||||
else
|
||||
OpenUsers::Mulan.create!(user: current_user, uid: result["id"])
|
||||
end
|
||||
end
|
||||
|
||||
redirect_to "/explore"
|
||||
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
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ class ProjectsController < ApplicationController
|
|||
include ProjectsHelper
|
||||
include Acceleratorable
|
||||
|
||||
before_action :require_login, except: %i[index branches branches_slice group_type_list simple show fork_users praise_users watch_users recommend about menu_list]
|
||||
before_action :require_login, except: %i[index branches branches_slice group_type_list simple show fork_users praise_users watch_users recommend about menu_list sonar_url]
|
||||
before_action :require_profile_completed, only: [:create, :migrate]
|
||||
before_action :load_repository, except: %i[index group_type_list migrate create recommend]
|
||||
before_action :authorizate_user_can_edit_project!, only: %i[update]
|
||||
|
|
@ -30,8 +30,8 @@ class ProjectsController < ApplicationController
|
|||
def index
|
||||
scope = current_user.logged? ? Projects::ListQuery.call(params, current_user.id) : Projects::ListQuery.call(params)
|
||||
|
||||
# @projects = kaminari_paginate(scope)
|
||||
@projects = paginate scope.includes(:project_category, :project_language, :repository, :project_educoder, :owner, :project_units)
|
||||
@projects = kaminari_paginate(scope.includes(:project_category, :project_language, :repository, :project_educoder, :owner, :project_units))
|
||||
#@projects = paginate scope.includes(:project_category, :project_language, :repository, :project_educoder, :owner, :project_units)
|
||||
|
||||
category_id = params[:category_id]
|
||||
@total_count =
|
||||
|
|
@ -58,14 +58,14 @@ class ProjectsController < ApplicationController
|
|||
def migrate
|
||||
Projects::MigrateForm.new(mirror_params).validate!
|
||||
|
||||
@project =
|
||||
@project =
|
||||
if enable_accelerator?(mirror_params[:clone_addr])
|
||||
source_clone_url = mirror_params[:clone_addr]
|
||||
uid_logger("########## 已动加速器 ##########")
|
||||
result = Gitea::Accelerator::MigrateService.call(mirror_params)
|
||||
if result[:status] == :success
|
||||
Rails.logger.info "########## 加速镜像成功 ########## "
|
||||
Projects::MigrateService.call(current_user,
|
||||
Projects::MigrateService.call(current_user,
|
||||
mirror_params.merge(source_clone_url: source_clone_url,
|
||||
clone_addr: accelerator_url(mirror_params[:repository_name])))
|
||||
else
|
||||
|
|
@ -117,7 +117,7 @@ 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)
|
||||
|
|
@ -126,11 +126,11 @@ class ProjectsController < ApplicationController
|
|||
}
|
||||
Gitea::Repository::UpdateService.call(@owner, @project.identifier, gitea_params)
|
||||
else
|
||||
validate_params = project_params.slice(:name, :description,
|
||||
validate_params = project_params.slice(:name, :description,
|
||||
:project_category_id, :project_language_id, :private, :identifier)
|
||||
|
||||
|
||||
Projects::UpdateForm.new(validate_params.merge(user_id: @project.user_id, project_identifier: @project.identifier)).validate!
|
||||
|
||||
|
||||
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)
|
||||
|
|
@ -225,6 +225,14 @@ class ProjectsController < ApplicationController
|
|||
end
|
||||
end
|
||||
|
||||
def sonar_url
|
||||
token = request.headers["HTTP_SONAR_TOKEN"]
|
||||
playod = JWT.decode(token,EducoderOauth.client_id)[0]
|
||||
data = HashWithIndifferentAccess.new playod
|
||||
return normal_status(-1, "sonar_url不能为空") if data["sonar_url"].blank?
|
||||
@project.update(sonar_url:data["sonar_url"])
|
||||
render :json => { status: 0, message: "更新成功"}
|
||||
end
|
||||
|
||||
private
|
||||
def project_params
|
||||
|
|
|
|||
|
|
@ -347,7 +347,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,6 +4,7 @@ class SettingsController < ApplicationController
|
|||
get_add_menu
|
||||
get_common_menu
|
||||
get_personal_menu
|
||||
get_third_party
|
||||
get_top_system_notification
|
||||
end
|
||||
|
||||
|
|
@ -40,6 +41,14 @@ class SettingsController < ApplicationController
|
|||
end
|
||||
end
|
||||
|
||||
def get_third_party
|
||||
@third_party = []
|
||||
@third_party << {
|
||||
name: 'mulan',
|
||||
url: MulanossOauth.oauth_url
|
||||
}
|
||||
end
|
||||
|
||||
def get_top_system_notification
|
||||
@top_system_notification = SystemNotification.is_top.first
|
||||
end
|
||||
|
|
|
|||
|
|
@ -273,7 +273,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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -0,0 +1,18 @@
|
|||
module MulanossOauth
|
||||
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
|
||||
"https://portal.mulanos.cn/api/auth/oschina?client_id=#{client_id}&redirect_uri=#{URI.encode_www_form_component(redirect_uri)}&response_type=code"
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
|
|
@ -0,0 +1,38 @@
|
|||
require 'oauth2'
|
||||
|
||||
module MulanossOauth::Service
|
||||
module_function
|
||||
|
||||
def request(method, url, params)
|
||||
begin
|
||||
Rails.logger.info("[MulanossOauth] [#{method.to_s.upcase}] #{url} || #{params}")
|
||||
|
||||
client = Faraday.new(url: MulanossOauth.base_url)
|
||||
response = client.public_send(method, url, params)
|
||||
result = JSON.parse(response.body)
|
||||
|
||||
Rails.logger.info("[MulanossOauth] [#{response.status}] #{result}")
|
||||
|
||||
result
|
||||
rescue Exception => e
|
||||
raise Educoder::TipException.new(e.message)
|
||||
end
|
||||
end
|
||||
|
||||
def access_token(code)
|
||||
begin
|
||||
Rails.logger.info("[MulanossOauth] [code] #{code} ")
|
||||
Rails.logger.info("[MulanossOauth] [redirect_uri] #{MulanossOauth.redirect_uri} ")
|
||||
client = OAuth2::Client.new(MulanossOauth.client_id, MulanossOauth.client_secret, site: MulanossOauth.base_url, token_url:"/action/openapi/token")
|
||||
result = client.auth_code.get_token(code, redirect_uri: MulanossOauth.redirect_uri).to_hash
|
||||
Rails.logger.info("[MulanossOauth] [GetToken] #{result[:access_token]}")
|
||||
return result
|
||||
rescue Exception => e
|
||||
raise Educoder::TipException.new(e.message)
|
||||
end
|
||||
end
|
||||
|
||||
def user_info(access_token)
|
||||
request(:get, '/action/openapi/user', {access_token: access_token})
|
||||
end
|
||||
end
|
||||
|
|
@ -39,6 +39,6 @@ class Gitea::Pull < Gitea::Base
|
|||
|
||||
serialize :conflicted_files, Array
|
||||
|
||||
belongs_to :pull_request, class_name: '::PullRequest', foreign_key: :id, primary_key: :gitea_number, optional: true
|
||||
belongs_to :pull_request, class_name: '::PullRequest', foreign_key: :id, primary_key: :gitea_id, optional: true
|
||||
|
||||
end
|
||||
|
|
|
|||
|
|
@ -0,0 +1,27 @@
|
|||
# == Schema Information
|
||||
#
|
||||
# Table name: open_users
|
||||
#
|
||||
# id :integer not null, primary key
|
||||
# user_id :integer
|
||||
# type :string(255)
|
||||
# uid :string(255)
|
||||
# created_at :datetime not null
|
||||
# updated_at :datetime not null
|
||||
# extra :text(65535)
|
||||
#
|
||||
# Indexes
|
||||
#
|
||||
# index_open_users_on_type_and_uid (type,uid) UNIQUE
|
||||
# index_open_users_on_user_id (user_id)
|
||||
#
|
||||
|
||||
class OpenUsers::Mulan < OpenUser
|
||||
def nickname
|
||||
extra&.[]('name')
|
||||
end
|
||||
|
||||
def en_type
|
||||
'mulan'
|
||||
end
|
||||
end
|
||||
|
|
@ -1,4 +1,3 @@
|
|||
|
||||
# == Schema Information
|
||||
#
|
||||
# Table name: projects
|
||||
|
|
@ -38,8 +37,6 @@
|
|||
# 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")
|
||||
|
|
@ -53,9 +50,10 @@
|
|||
# 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)
|
||||
# order_index :integer default("0")
|
||||
# lesson_url :string(255)
|
||||
#
|
||||
# Indexes
|
||||
|
|
@ -78,7 +76,6 @@
|
|||
#
|
||||
|
||||
|
||||
|
||||
class Project < ApplicationRecord
|
||||
include Matchable
|
||||
include Publicable
|
||||
|
|
|
|||
|
|
@ -37,7 +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_number, class_name: 'Gitea::Pull'
|
||||
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)}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -83,6 +83,7 @@ class User < Owner
|
|||
STATUS_ACTIVE = 1
|
||||
STATUS_REGISTERED = 2
|
||||
STATUS_LOCKED = 3
|
||||
STATUS_EDIT_INFO = 4
|
||||
|
||||
# tpi tpm权限控制
|
||||
EDU_ADMIN = 1 # 超级管理员
|
||||
|
|
@ -113,7 +114,7 @@ class User < Owner
|
|||
# trustie: 来自Trustie平台
|
||||
# forge: 平台本身注册的用户
|
||||
# military: 军科的用户
|
||||
enumerize :platform, in: [:forge, :educoder, :trustie, :military], default: :forge, scope: :shallow
|
||||
enumerize :platform, in: [:forge, :educoder, :trustie, :military, :mulan], default: :forge, scope: :shallow
|
||||
|
||||
belongs_to :laboratory, optional: true
|
||||
has_many :composes, dependent: :destroy
|
||||
|
|
@ -153,7 +154,7 @@ class User < Owner
|
|||
# 项目
|
||||
has_many :applied_projects, dependent: :destroy
|
||||
has_many :operate_applied_transfer_projects, class_name: 'AppliedTransferProject', dependent: :destroy
|
||||
has_many :members, dependent: :destroy
|
||||
has_many :members, dependent: :destroy
|
||||
has_many :team_users, dependent: :destroy
|
||||
has_many :teams, through: :team_users
|
||||
|
||||
|
|
@ -167,12 +168,12 @@ class User < Owner
|
|||
has_many :pinned_projects, dependent: :destroy
|
||||
has_many :is_pinned_projects, through: :pinned_projects, source: :project
|
||||
accepts_nested_attributes_for :is_pinned_projects
|
||||
has_many :issues, dependent: :destroy, foreign_key: :author_id
|
||||
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?
|
||||
|
|
@ -204,14 +205,14 @@ class User < Owner
|
|||
validate :validate_password_length
|
||||
|
||||
# 用户参与的所有项目
|
||||
def full_member_projects
|
||||
def full_member_projects
|
||||
normal_projects = Project.members_projects(self.id).to_sql
|
||||
org_projects = Project.joins(teams: :team_users).where(team_users: {user_id: self.id}).to_sql
|
||||
return Project.from("( #{ normal_projects} UNION #{ org_projects } ) AS projects").distinct
|
||||
end
|
||||
|
||||
# 用户管理的所有项目
|
||||
def full_admin_projects
|
||||
def full_admin_projects
|
||||
normal_projects = Project.joins(members: :roles).where(roles: {name: 'Manager'}, members: {user_id: self.id}).to_sql
|
||||
org_projects = Project.joins(teams: :team_users).where(teams: {authorize: %w(admin owner)}, team_users: {user_id: self.id}).to_sql
|
||||
return Project.from("( #{ normal_projects} UNION #{ org_projects } ) AS projects").distinct
|
||||
|
|
@ -220,7 +221,7 @@ class User < Owner
|
|||
def name
|
||||
login
|
||||
end
|
||||
|
||||
|
||||
# 删除自动登录的token,一旦退出下次会提示需要登录
|
||||
def delete_autologin_token(value)
|
||||
Token.where(:user_id => id, :action => 'autologin', :value => value).delete_all
|
||||
|
|
@ -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?
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
json.total_count @total_count
|
||||
json.total_count @projects.total_count
|
||||
json.projects @projects do |project|
|
||||
# json.partial! "/projects/project_detail", project: project
|
||||
json.id project.id
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@ json.issues do
|
|||
pr = issue.pull_request
|
||||
json.pull_request_id pr.id
|
||||
json.pull_request_status pr.status
|
||||
json.pull_request_head pr.head
|
||||
json.pull_request_head pr.head
|
||||
json.pull_request_base pr.base
|
||||
json.pull_request_staus pr.status == 1 ? "merged" : (pr.status == 2 ? "closed" : "open")
|
||||
json.is_original pr.is_original
|
||||
|
|
@ -22,9 +22,10 @@ json.issues do
|
|||
json.fork_project_identifier pr&.fork_project&.identifier
|
||||
json.fork_project_user pr&.fork_project&.owner.try(:login)
|
||||
|
||||
|
||||
|
||||
json.id issue.id
|
||||
json.name issue.subject
|
||||
json.description issue.description
|
||||
json.pr_time time_from_now(pr.status == 1 ? pr.updated_at : issue.updated_on)
|
||||
json.assign_user_name issue.get_assign_user.try(:show_real_name)
|
||||
json.assign_user_login issue.get_assign_user.try(:login)
|
||||
|
|
@ -37,4 +38,3 @@ json.issues do
|
|||
json.issue_tags issue.get_issue_tags
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
json.content @project.content
|
||||
json.website @project.website
|
||||
json.lesson_url @project.lesson_url
|
||||
json.sonar_url @project.sonar_url
|
||||
json.identifier render_identifier(@project)
|
||||
json.invite_code @project.invite_code
|
||||
json.name @project.name
|
||||
|
|
|
|||
|
|
@ -56,6 +56,7 @@ json.setting do
|
|||
end
|
||||
|
||||
json.common @common
|
||||
json.third_party @third_party
|
||||
|
||||
if @top_system_notification.present?
|
||||
json.system_notification do
|
||||
|
|
|
|||
|
|
@ -10,6 +10,7 @@ json.is_teacher @user.user_extension&.teacher?
|
|||
json.user_identity @user.identity
|
||||
json.tidding_count 0
|
||||
json.user_phone_binded @user.phone.present?
|
||||
json.need_edit_info @user.need_edit_info?
|
||||
# json.phone @user.phone
|
||||
# json.email @user.mail
|
||||
json.profile_completed @user.profile_is_completed?
|
||||
|
|
@ -22,4 +23,4 @@ json.city @user.city
|
|||
json.custom_department @user.custom_department
|
||||
json.description @user.description
|
||||
json.(@user, :show_email, :show_department, :show_location)
|
||||
json.message_unread_total @message_unread_total
|
||||
json.message_unread_total @message_unread_total
|
||||
|
|
|
|||
|
|
@ -44,6 +44,11 @@ default: &default
|
|||
cate_id: '-1'
|
||||
callback_url: 'callback_url'
|
||||
signature_key: 'test12345678'
|
||||
educoder:
|
||||
client_id: 'e9ce4d5ba1698d6f7d01d8ee2959776c7a6d743ebe94da2341e288fd2fbf60aa'
|
||||
client_secret: '6ff84dd75eddd859c5bd0e7a791b58bc5ad1ba4fbb30bc9db37cb0baf9f33012'
|
||||
base_url: 'https://test-data.educoder.net'
|
||||
redirect_uri: 'https://testforgeplus.trustie.net/api/auth/educoder/callback'
|
||||
|
||||
gitea:
|
||||
access_key_id: ''
|
||||
|
|
|
|||
|
|
@ -0,0 +1,16 @@
|
|||
oauth_config = {}
|
||||
begin
|
||||
config = Rails.application.config_for(:configuration)
|
||||
oauth_config = config.dig('oauth', 'educoder')
|
||||
raise 'oauth educoder config missing' if oauth_config.blank?
|
||||
rescue => ex
|
||||
raise ex if Rails.env.production?
|
||||
|
||||
puts %Q{\033[33m [warning] wechat oauth config or configuration.yml missing,
|
||||
please add it or execute 'cp config/configuration.yml.example config/configuration.yml' \033[0m}
|
||||
end
|
||||
|
||||
EducoderOauth.client_id = oauth_config['client_id']
|
||||
EducoderOauth.client_secret = oauth_config['client_secret']
|
||||
EducoderOauth.base_url = oauth_config['base_url']
|
||||
EducoderOauth.redirect_uri = oauth_config['redirect_uri']
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
oauth_config = {}
|
||||
begin
|
||||
config = Rails.application.config_for(:configuration)
|
||||
oauth_config = config.dig('oauth', 'mulan')
|
||||
raise 'oauth educoder config missing' if oauth_config.blank?
|
||||
rescue => ex
|
||||
raise ex if Rails.env.production?
|
||||
|
||||
puts %Q{\033[33m [warning] wechat oauth config or configuration.yml missing,
|
||||
please add it or execute 'cp config/configuration.yml.example config/configuration.yml' \033[0m}
|
||||
end
|
||||
|
||||
MulanossOauth.client_id = oauth_config['client_id']
|
||||
MulanossOauth.client_secret = oauth_config['client_secret']
|
||||
MulanossOauth.base_url = oauth_config['base_url']
|
||||
MulanossOauth.redirect_uri = oauth_config['redirect_uri']
|
||||
|
|
@ -138,6 +138,9 @@ Rails.application.routes.draw do
|
|||
|
||||
resources :issues, except: [:index, :new,:create, :update, :edit, :destroy] do
|
||||
resources :journals, only: [:index, :create, :destroy, :edit, :update] do
|
||||
collection do
|
||||
post :beihang
|
||||
end
|
||||
member do
|
||||
get :get_children_journals
|
||||
end
|
||||
|
|
@ -264,29 +267,29 @@ Rails.application.routes.draw do
|
|||
|
||||
scope module: :users do
|
||||
resources :applied_messages, only: [:index]
|
||||
resources :applied_transfer_projects, only: [:index] do
|
||||
member do
|
||||
resources :applied_transfer_projects, only: [:index] do
|
||||
member do
|
||||
post :accept
|
||||
post :refuse
|
||||
end
|
||||
end
|
||||
resources :applied_projects, only: [:index] do
|
||||
member do
|
||||
resources :applied_projects, only: [:index] do
|
||||
member do
|
||||
post :accept
|
||||
post :refuse
|
||||
end
|
||||
end
|
||||
resources :headmaps, only: [:index]
|
||||
resources :is_pinned_projects, only: [:index, :update] do
|
||||
collection do
|
||||
post :pin
|
||||
resources :is_pinned_projects, only: [:index, :update] do
|
||||
collection do
|
||||
post :pin
|
||||
end
|
||||
end
|
||||
resources :statistics, only: [:index] do
|
||||
collection do
|
||||
get :activity
|
||||
get :develop
|
||||
get :role
|
||||
resources :statistics, only: [:index] do
|
||||
collection do
|
||||
get :activity
|
||||
get :develop
|
||||
get :role
|
||||
get :major
|
||||
end
|
||||
end
|
||||
|
|
@ -302,7 +305,7 @@ Rails.application.routes.draw do
|
|||
# resource :unread_message_info, only: [:show]
|
||||
|
||||
# 通知中心
|
||||
resources :messages, only: [:index, :create] do
|
||||
resources :messages, only: [:index, :create] do
|
||||
collection do
|
||||
post :read
|
||||
|
||||
|
|
@ -358,6 +361,7 @@ Rails.application.routes.draw do
|
|||
get '/auth/qq/callback', to: 'oauth/qq#create'
|
||||
get '/auth/wechat/callback', to: 'oauth/wechat#create'
|
||||
get '/auth/educoder/callback', to: 'oauth/educoder#create'
|
||||
get '/auth/mulanoss/callback', to: 'oauth/mulanoss#create'
|
||||
resource :bind_user, only: [:create]
|
||||
|
||||
resources :hot_keywords, only: [:index]
|
||||
|
|
@ -418,6 +422,7 @@ Rails.application.routes.draw do
|
|||
get :branches
|
||||
get :branches_slice
|
||||
get :simple
|
||||
post :sonar_url
|
||||
get :watchers, to: 'projects#watch_users'
|
||||
get :stargazers, to: 'projects#praise_users'
|
||||
get :members, to: 'projects#fork_users'
|
||||
|
|
@ -578,15 +583,15 @@ Rails.application.routes.draw do
|
|||
scope module: :projects do
|
||||
resources :teams, only: [:index, :create, :destroy]
|
||||
resources :project_units, only: [:index, :create]
|
||||
resources :applied_transfer_projects, only: [:create] do
|
||||
collection do
|
||||
resources :applied_transfer_projects, only: [:create] do
|
||||
collection do
|
||||
get :organizations
|
||||
post :cancel
|
||||
end
|
||||
end
|
||||
resources :webhooks, except: [:show, :new] do
|
||||
member do
|
||||
get :tasks
|
||||
resources :webhooks, except: [:show, :new] do
|
||||
member do
|
||||
get :tasks
|
||||
post :test
|
||||
end
|
||||
end
|
||||
|
|
@ -670,9 +675,9 @@ Rails.application.routes.draw do
|
|||
resources :project_licenses
|
||||
resources :project_ignores
|
||||
resources :reversed_keywords
|
||||
resources :system_notifications
|
||||
resources :message_templates, only: [:index, :edit, :update] do
|
||||
collection do
|
||||
resources :system_notifications
|
||||
resources :message_templates, only: [:index, :edit, :update] do
|
||||
collection do
|
||||
get :init_data
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -0,0 +1,5 @@
|
|||
class AddSonarUrlToProjects < ActiveRecord::Migration[5.2]
|
||||
def change
|
||||
add_column :projects, :sonar_url, :string
|
||||
end
|
||||
end
|
||||
Loading…
Reference in New Issue