dev_forge
caicai8 5 years ago
commit e1417b48e9

@ -1039,22 +1039,17 @@ http://localhost:3000/api/18816895620/mirror_demo/commits | jq
### 点赞
```
POST /api/praise_tread/like
POST /api/projects/:id/praise_tread/like
```
*示例*
```
curl -X POST \
-d 'object_id=1' \
-d 'object_type=project' \
http://localhost:3000/api/praise_tread/like | jq
curl -X POST http://localhost:3000/api/projects/3263/praise_tread/like | jq
```
*请求参数说明:*
|参数名|必选|类型|说明|
-|-|-|-
|object_id |是 |int |项目id |
|object_type |否 |string | 点赞类型默认为project|
|id |是 |int |项目id |
*返回参数说明:*
@ -1067,28 +1062,24 @@ http://localhost:3000/api/praise_tread/like | jq
```
{
"status": 0,
"message": "响应成功"
"message": "success"
}
```
---
### 取消点赞
```
DELETE /api/praise_tread/unlike
DELETE /api/projects/:id/praise_tread/unlike
```
*示例*
```
curl -X DELETE \
-d 'object_id=1' \
-d 'object_type=project' \
http://localhost:3000/api/praise_tread/unlike | jq
curl -X DELETE http://localhost:3000/api/projects/3263/praise_tread/unlike | jq
```
*请求参数说明:*
|参数名|必选|类型|说明|
-|-|-|-
|object_id |是 |string |点赞对象的唯一标识如项目的identifier字段 |
|object_type |是 |string | 点赞类型默认为project|
|id |是 |int |项目id |
*返回参数说明:*
@ -1102,7 +1093,38 @@ http://localhost:3000/api/praise_tread/unlike | jq
```
{
"status": 0,
"message": "响应成功"
"message": "success"
}
```
---
### 用户是否点过赞
```
GET /api/projects/:id/praise_tread/check_like
```
*示例*
```
curl -X GET http://localhost:3000/api/projects/3263/praise_tread/check_like | jq
```
*请求参数说明:*
|参数名|必选|类型|说明|
-|-|-|-
|id |是 |int |项目id |
*返回参数说明:*
|参数名|类型|说明|
-|-|-
|status |int|1:已点过赞0:未点过赞, -1:请求操作失败|
返回值
```
{
"status": 0,
"message": "success"
}
```
---
@ -1114,30 +1136,42 @@ GET /api/projects/:id/praise_tread
*示例*
```
curl -X GET \
-d 'object_id=1' \
-d 'object_type=project' \
http://localhost:3000/api/projects/mirror_demo/praise_tread | jq
-d "page=1" \
-d "limit=5" \
http://localhost:3000/api/projects/3263/praise_tread | jq
```
*请求参数说明:*
|参数名|必选|类型|说明|
-|-|-|-
|object_id |是 |int |项目id |
|object_type |否 |string | 点赞类型默认为project|
|id |是|int |项目id |
|page |否|string |页数,第几页 |
|limit |否|string |每页多少条数据默认15条 |
*返回参数说明:*
|参数名|类型|说明|
-|-|-
|status |int|0:点赞成功,-1:操作失败2:表示已经点过赞了|
|total_count |int|总条数|
|praises |array|关注数据|
|-- name |string|用户名称|
|-- login |string|用户标识/登录名(login)|
|-- image_url |string|用户头像|
返回值
```
{
"status": 0,
"message": "响应成功"
"total_count": 1,
"praises": [
{
"name": "18816895620",
"login": "18816895620",
"image_url": "avatars/User/b"
}
]
}
```
---
@ -1204,6 +1238,37 @@ curl -X DELETE http://localhost:3000//api/projects/3263/watchers/unfollow | jq
```
---
### 用户是否关注过项目
```
GET /api/projects/:id/watchers/check_watch
```
*示例*
```
curl -X GET http://localhost:3000/api/projects/3263/watchers/check_watch | jq
```
*请求参数说明:*
|参数名|必选|类型|说明|
-|-|-|-
|id |是 |int |项目id |
*返回参数说明:*
|参数名|类型|说明|
-|-|-
|status |int|1:已关注0:未关注, -1:请求操作失败|
返回值
```
{
"status": 0,
"message": "success"
}
```
---
### 项目的关注者列表
```
GET /api/projects/:id/watchers

@ -642,6 +642,13 @@ class ApplicationController < ActionController::Base
render_not_found("未找到’#{params[:id]}’相关的项目") unless @project
end
def find_project_with_id
@project = Project.find params[:project_id]
rescue Exception => e
logger_error(e.message)
tip_exception(e.message)
end
private
def object_not_found
uid_logger("Missing template or cant't find record, responding with 404")

@ -24,4 +24,8 @@ module RenderHelper
def render_unauthorized(message = I18n.t('error.unauthorized'))
render json: { status: 401, message: message }
end
def render_result(status=1, message='success')
render json: { status: status, message: message }
end
end

@ -33,18 +33,28 @@ class IssueTagsController < ApplicationController
if IssueTag.exists?(name: title, project_id: @project.id)
normal_status(-1, "标签已存在")
else
issue_tag = IssueTag.new(tag_params.merge(project_id: @project.id, user_id: current_user.id))
if issue_tag.save
normal_status(0, "标签创建成功")
else
normal_status(-1, "标签创建失败")
ActiveRecord::Base.transaction do
begin
issue_tag = IssueTag.new(tag_params.merge(project_id: @project.id, user_id: current_user.id))
if issue_tag.save
gitea_tag = Gitea::Labels::CreateService.new(current_user, @repository.try(:identifier), tag_params).call
if gitea_tag && issue_tag.update_attributes(gid: gitea_tag["id"], gitea_url: gitea_tag["url"])
normal_status(0, "标签创建成功")
else
normal_status(-1, "标签创建失败")
end
else
normal_status(-1, "标签创建失败")
end
rescue => e
puts "create version release error: #{e.message}"
raise Error, e.message
end
end
end
else
normal_status(-1, "标签名称不能为空")
end
end
def edit
@ -65,34 +75,58 @@ class IssueTagsController < ApplicationController
if IssueTag.exists?(name: title, project_id: @project.id) && (@issue_tag.name != title)
normal_status(-1, "标签已存在")
else
if @issue_tag.update_attributes(tag_params)
normal_status(0, "标签更新成功")
else
normal_status(-1, "标签更新失败")
ActiveRecord::Base.transaction do
begin
if @issue_tag.update_attributes(tag_params)
gitea_tag = Gitea::Labels::UpdateService.new(current_user, @repository.try(:identifier),@issue_tag.try(:gid), tag_params).call
if gitea_tag
normal_status(0, "标签更新成功")
else
normal_status(-1, "标签更新失败")
end
else
normal_status(-1, "标签更新失败")
end
rescue => e
puts "create version release error: #{e.message}"
raise Error, e.message
end
end
end
else
normal_status(-1, "标签名称不能为空")
end
end
def destroy
if @issue_tag.destroy
normal_status(0, "标签删除成功")
else
normal_status(-1, "标签删除失败")
ActiveRecord::Base.transaction do
begin
if @issue_tag.destroy
issue_tag = Gitea::Labels::DeleteService.new(@user, @repository.try(:identifier), @issue_tag.try(:gid)).call
if issue_tag
normal_status(0, "标签删除成功")
else
normal_status(-1, "标签删除失败")
end
else
normal_status(-1, "标签删除失败")
end
rescue => e
puts "create version release error: #{e.message}"
raise Error, e.message
end
end
end
private
def set_project
@project = Project.find_by_id(params[:project_id])
unless @project.present?
normal_status(-1, "项目不存在")
end
@repository = @project.repository
@user = @project.owner
normal_status(-1, "项目不存在") unless @project.present?
normal_status(-1, "仓库不存在") unless @repository.present?
normal_status(-1, "用户不存在") unless @user.present?
end
def check_issue_permission

@ -6,9 +6,10 @@ class IssuesController < ApplicationController
before_action :set_issue, only: [:edit, :update, :destroy, :show, :copy, :index_chosen, :close_issue, :lock_issue]
include ApplicationHelper
include TagChosenHelper
def index
issues = @project.issues.includes(:user,:tracker, :priority, :version, :issue_status, :journals)
issues = @project.issues.issue_issue.includes(:user,:tracker, :priority, :version, :issue_status, :journals, :issue_times)
issues = issues.where(is_private: false) unless current_user.present? && (current_user.admin? || @project.member?(current_user))
@all_issues_size = issues.size
@open_issues_size = issues.where.not(status_id: 5).size
@ -70,7 +71,7 @@ class IssuesController < ApplicationController
end
def commit_issues
issues = @project.issues.includes(:user,:tracker)
issues = @project.issues.issue_issue.includes(:user,:tracker)
issues = issues.where(is_private: false) unless current_user.present? && (current_user.admin? || @project.member?(current_user))
@all_issues_size = issues.size
@open_issues_size = issues.where.not(status_id: 5).size
@ -124,6 +125,13 @@ class IssuesController < ApplicationController
end
def new
@all_branches = []
get_all_branches = Gitea::Repository::BranchesService.new(@user, @repository.try(:identifier)).call
if get_all_branches && get_all_branches.size > 0
get_all_branches.each do |b|
@all_branches.push(b["name"])
end
end
@issue_chosen = issue_left_chosen(@project, nil)
end
@ -152,6 +160,8 @@ class IssuesController < ApplicationController
token: params[:token],
issue_tags_value: params[:issue_tag_ids].present? ? params[:issue_tag_ids].join(",") : "",
closed_on: (params[:status_id].to_i == 5) ? Time.now : nil,
issue_classify: "issue",
branch_name: params[:branch_name].to_s
}
@issue = Issue.new(issue_params.merge(author_id: current_user.id, project_id: @project.id))
if @issue.save!
@ -333,9 +343,9 @@ class IssuesController < ApplicationController
private
def set_project
@project = Project.find_by_id(params[:project_id])
unless @project.present?
normal_status(-1, "项目不存在")
end
@user = @project.owner
normal_status(-1, "项目不存在") unless @project.present?
normal_status(-1, "用户不存在") unless @user.present?
end
def check_project_public
@ -359,215 +369,13 @@ class IssuesController < ApplicationController
end
end
def join_users(issue)
#协作者
issue_comment_users_array = []
issue_comment_users = issue.journals.select(:user_id).distinct
if issue.present? && issue_comment_users.size > 0
issue_comment_users.each do |j|
user_avatar = url_to_avatar(j.user)
issue_comment_users_array.push({login: j.user.try(:login), avatar_url: user_avatar})
end
end
issue_comment_users_array
end
def cost_time(issue)
#总耗时
@cost_time_array = []
@all_cost_time = 0
all_issue_times = issue.issue_times.includes(:user).where.not(end_time: nil)
if issue.present? && all_issue_times.size > 0
all_issue_times.each do |time|
cost_time = time.end_time.to_i - time.start_time.to_i
cost_time = cost_time > 0 ? cost_time : 0
@all_cost_time = @all_cost_time + cost_time
set_cost_time = Time.at(cost_time).utc.strftime('%H h %M min %S s')
@cost_time_array.push({login: time.user.try(:login), avatar_url: url_to_avatar(time.user), cost_time: set_cost_time})
end
end
end
def depended_issues(issue)
#依赖于
@depended_issues_id = []
@depended_issues_array = []
depended_issues = issue.issue_depends.pluck(:id,:depend_issue_id).uniq
if issue.present? && depended_issues.size > 0
depended_issues.each do |de|
@depended_issues_id.push(de[1])
issues = Issue.select(:id, :subject).where(id: de[1]).as_json
issues = issues.first.merge(depend_id: de[0])
@depended_issues_array.push(issues)
end
@depended_issues_id.delete(issue.id)
end
end
def be_depended_issues(issue)
be_depended_issues_array = []
be_depended_issues = IssueDepend.where(depend_issue_id: issue.id).pluck(:id,:issue_id).uniq
if issue.present? && be_depended_issues.size > 0
be_depended_issues.each do |de|
d_issues = Issue.select(:id, :subject).where(id: de[1]).as_json
d_issues = d_issues.first.merge(depend_id: de[0])
be_depended_issues_array.push(d_issues)
end
end
be_depended_issues_array
end
def issue_left_chosen(project,issue_id)
issue_info = Array.new(11)
use_tags = []
issue_comment_users_array = []
cost_time_array = []
all_cost_time = 0
be_depended_issues_array = []
depended_issues_array = []
all_issues = []
depended_issues_id = []
if issue_id.present?
issue = Issue.find(issue_id)
use_tags = issue.issue_tags.select(:id).pluck(:id)
select_arrays = [:assigned_to_id, :tracker_id, :status_id, :priority_id, :fixed_version_id, :start_date, :due_date, :estimated_hours, :done_ratio, :issue_type, :token]
issue_info = Issue.select(select_arrays).where(id: issue_id).pluck(select_arrays)
issue_info = issue_info[0]
issue_comment_users_array = join_users(issue)
#总耗时
cost_time(issue)
cost_time_array = @cost_time_array
all_cost_time = @all_cost_time
#被依赖
be_depended_issues_array = be_depended_issues(issue)
#依赖于
depended_issues(issue)
depended_issues_array = @depended_issues_array
depended_issues_id = @depended_issues_id
end
project_members = project.members_user_infos
project_members_info = [] #指派给
project_members.each do |member|
user = member.user
real_name = user.try(:show_real_name)
user_id = member[0]
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}
project_members_info.push(member_info)
end
tracker_info = project.trackers&.pluck(:id, :name, :position)
new_tracker_info = [] #类型
if tracker_info.size > 0
tracker_info.each do |t|
is_chosen = (t[0] == issue_info[1]) ? "1" : "0"
new_tracker = {id: t[0], name: t[1], position: t[2], is_chosen: is_chosen}
new_tracker_info.push(new_tracker)
end
end
issue_status = IssueStatus&.pluck(:id,:name,:position)
new_status_info = [] #缺陷类型
if issue_status.size > 0
issue_status.each do |t|
is_chosen = (t[0] == issue_info[2]) ? "1" : "0"
new_issue = {id: t[0], name: t[1], position: t[2], is_chosen: is_chosen}
new_status_info.push(new_issue)
end
end
issue_priority = IssuePriority&.pluck(:id,:name, :position)
new_priority_info = [] #优先度
if issue_priority.size > 0
issue_priority.each do |t|
is_chosen = (t[0] == issue_info[3]) ? "1" : "0"
new_issue = {id: t[0], name: t[1], position: t[2], is_chosen: is_chosen}
new_priority_info.push(new_issue)
end
end
issue_versions = project.versions&.pluck(:id,:name, :status)
new_version_info = [] #issue里程碑
if issue_versions.size > 0
issue_versions.each do |t|
is_chosen = (t[0] == issue_info[4]) ? "1" : "0"
new_issue = {id: t[0], name: t[1], status: t[2], is_chosen: is_chosen}
new_version_info.push(new_issue)
end
end
issue_done_ratio = %w(0 10 20 30 40 50 60 70 80 90 100)
new_done_info = [] #完成度
if issue_done_ratio.size > 0
issue_done_ratio.each do |t|
is_chosen = (t == issue_info[8].to_s) ? "1" : "0"
new_issue = {id:t.to_i, ratio: (t.to_s + "%"), is_chosen: is_chosen}
new_done_info.push(new_issue)
end
end
issue_tags = project.issue_tags&.pluck(:id,:name, :color)
new_tags_info = [] #issue标签
if issue_tags.size > 0
issue_tags.each do |t|
is_chosen = (use_tags.size > 0 && use_tags.include?(t[0])) ? "1" : "0"
new_issue = {id: t[0], name: t[1], color: t[2], is_chosen: is_chosen}
new_tags_info.push(new_issue)
end
end
issue_types = %w(普通 悬赏)
new_types_info = [] #issue标签
issue_types.each_with_index do |i, index|
is_chosen = (issue_info[9] == "#{index+1}") ? "1" : "0"
is_token = (index.to_s == "1") ? issue_info[10] : nil
new_type_info = {id: index+1, name: i, token: is_token, is_chosen: is_chosen}
new_types_info.push(new_type_info)
end
depend_other_issues = project.issues.where.not(id: issue_id)&.pluck(:id, :subject)
if depend_other_issues.size > 0
depend_other_issues.each do |t|
is_chosen = depended_issues_id.include?(t[0]) ? "1" : "0"
new_issue = {id: t[0], subject: t[1], is_chosen: is_chosen}
all_issues.push(new_issue)
end
end
{
"assign_user": project_members_info,
"tracker": new_tracker_info,
"issue_status": new_status_info,
"priority": new_priority_info,
"issue_version": new_version_info,
"start_date": issue_info[5],
"due_date": issue_info[6],
"joins_users": issue_comment_users_array,
"cost_time_users": cost_time_array,
"total_cost_time": Time.at(all_cost_time).utc.strftime('%H h %M min %S s'),
"be_depended_issues": be_depended_issues_array,
"depended_issues":depended_issues_array,
"estimated_hours": issue_info[7],
"done_ratio": new_done_info,
"issue_tag": new_tags_info,
"issue_type": new_types_info,
"all_issues": all_issues
}
end
def export_issues(issues)
@table_columns = %w(ID 类型 标题 描述 状态 指派给 优先级 标签 发布人 创建时间 里程碑 开始时间 截止时间 完成度 分类 金额)
@table_columns = %w(ID 类型 标题 描述 状态 指派给 优先级 标签 发布人 创建时间 里程碑 开始时间 截止时间 完成度 分类 金额 属于)
@export_issues = []
issues.each do |i|
issue_array = [i.id, i.tracker.try(:name), i.subject, i.description, i.issue_status.try(:name),i.get_assign_user.try(:show_real_name),
i.priority.try(:name), i.get_issue_tags_name, i.user.try(:show_real_name), format_time(i.created_on), i.version.try(:title),
i.start_date.to_s, i.due_date.to_s, i.done_ratio.to_s + "%", i.issue_type == "2" ? "悬赏" : "普通", i.token.to_s ]
i.start_date.to_s, i.due_date.to_s, i.done_ratio.to_s + "%", i.issue_type == "2" ? "悬赏" : "普通", i.token.to_s, i.issue_classify]
@export_issues.push(issue_array)

@ -1,14 +1,17 @@
class PraiseTreadController < ApplicationController
include MessagesHelper
before_action :require_login, :check_auth
before_action :validate_params, only: [:like, :unlike]
before_action :find_object
before_action :require_login, except: %i[index]
before_action :find_project_with_id
def index
scope = @project.praise_treads.includes(:user)
@praises = paginate(scope)
end
def like
begin
return normal_status(2, "你已点过赞了") if by_user_liked?(@obj, current_user)
@praise_tread = @obj.praise_treads.build(user_id: current_user.id)
@praise_tread.save!
return normal_status(2, "你已点过赞了") if current_user.liked?(@project)
current_user.like!(@project)
render_ok
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
@ -18,9 +21,9 @@ class PraiseTreadController < ApplicationController
def unlike
begin
return normal_status(2, "你还没有点过赞噢") unless by_user_liked?(@obj, current_user)
@praise_treads = @obj.praise_treads.user_liker(current_user)
@praise_treads.last.destroy! if @praise_treads.present?
return normal_status(2, "你还没有点过赞噢") unless current_user.liked?(@project)
current_user.unlike!(@project)
render_ok
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
@ -28,19 +31,12 @@ class PraiseTreadController < ApplicationController
end
end
private
def find_object
begin
object_type = params[:object_type] || 'project'
@obj = object_type.strip.classify.constantize.find_by_identifier params[:id]
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
return
end
def check_like
is_like = current_user.liked?(@project)
render_result(is_like ? 1 : 0)
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
def validate_params
return normal_status(2, "缺少参数object_id") if params[:object_id].blank?
end
end

@ -0,0 +1,363 @@
class PullRequestsController < ApplicationController
before_action :require_login
before_action :set_project
before_action :find_pull_request, except: [:index, :new, :create]
include TagChosenHelper
include ApplicationHelper
def index
# @issues = Gitea::PullRequest::ListService.new(@user,@repository.try(:identifier)).call #通过gitea获取
issues = @project.issues.issue_pull_request.includes(:user,:tracker, :priority, :version, :issue_status, :journals, :issue_times)
issues = issues.where(is_private: false) unless current_user.present? && (current_user.admin? || @project.member?(current_user))
@all_issues_size = issues.size
@open_issues_size = issues.where.not(status_id: 5).size
@close_issues_size = issues.where(status_id: 5).size
@assign_to_me_size = issues.where(assigned_to_id: current_user&.id).size
@my_published_size = issues.where(author_id: current_user&.id).size
status_type = params[:status_type].to_s #issue状态的选择
search_name = params[:search].to_s
start_time = params[:start_date]
end_time = params[:due_date]
if status_type.to_s == "1" #表示开启中的
issues = issues.where.not(status_id: 5)
elsif status_type.to_s == "2" #表示关闭中的
issues = issues.where(status_id: 5)
end
if search_name.present?
issues = issues.where("subject like ?", "%#{search_name}%")
end
if start_time&.present? || end_time&.present?
issues = issues.where("start_date between ? and ?",start_time&.present? ? start_time.to_date : Time.now.to_date, end_time&.present? ? end_time.to_date : Time.now.to_date)
end
issues = issues.where(author_id: params[:author_id]) if params[:author_id].present?
issues = issues.where(assigned_to_id: params[:assigned_to_id]) if params[:assigned_to_id].present?
issues = issues.where(tracker_id: params[:tracker_id]) if params[:tracker_id].present?
issues = issues.where(status_id: params[:status_id]) if params[:status_id].present?
issues = issues.where(priority_id: params[:priority_id]) if params[:priority_id].present?
issues = issues.where(fixed_version_id: params[:fixed_version_id]) if params[:fixed_version_id].present?
issues = issues.where(done_ratio: params[:done_ratio].to_i) if params[:done_ratio].present?
issues = issues.where(issue_type: params[:issue_type]) if params[:issue_type].present?
issues = issues.joins(:issue_tags).where(issue_tags: {id: params[:issue_tag_id].to_i}) if params[:issue_tag_id].present?
order_type = params[:order_type] || "desc" #或者"asc"
order_name = params[:order_name] || "created_on" #或者"updated_on"
@page = params[:page]
@limit = params[:limit] || 15
@issues = issues.order("#{order_name} #{order_type}")
@issues_size = issues.size
@issues = issues.order("#{order_name} #{order_type}").page(@page).per(@limit)
end
def new
@all_branches = []
get_all_branches = Gitea::Repository::BranchesService.new(@user, @repository.try(:identifier)).call
if get_all_branches && get_all_branches.size > 0
get_all_branches.each do |b|
@all_branches.push(b["name"])
end
end
@project_tags = @project.issue_tags&.select(:id,:name, :color).as_json
@project_versions = @project.versions&.select(:id,:name, :status).as_json
@project_members = @project.members_user_infos
end
def create
if params[:title].nil?
normal_status(-1, "名称不能为空")
elsif params[:issue_tag_ids].nil?
normal_status(-1, "标签不能为空")
else
ActiveRecord::Base.transaction do
begin
local_params = {
title: params[:title], #标题
body: params[:body], #内容
head: params[:head], #源分支
base: params[:base], #目标分支
milestone: params[:fixed_version_id].to_i, #里程碑
}
requests_params = local_params.merge({
assignee: current_user.try(:login),
assignees: ["#{params[:assigned_login].to_s}"],
labels: params[:issue_tag_ids],
due_date: Time.now
})
issue_params = {
author_id: current_user.id,
project_id: @project.id,
subject: params[:title],
description: params[:body],
assigned_to_id: params[:assigned_to_id].to_s,
fixed_version_id: params[:fixed_version_id],
issue_tags_value: params[:issue_tag_ids].present? ? params[:issue_tag_ids].join(",") : "",
issue_classify: "pull_request",
tracker_id: 2,
status_id: 1,
priority_id: 1
}
pull_issue = Issue.new(issue_params)
if pull_issue.save!
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, @repository.try(:identifier), requests_params).call
if gitea_request && local_requests.update_attributes(gpid: gitea_request["number"])
if params[:issue_tag_ids].present?
params[:issue_tag_ids].each do |tag|
IssueTagsRelate.create!(issue_id: pull_issue.id, issue_tag_id: tag)
end
end
if params[:attachment_ids].present?
params[:attachment_ids].each do |id|
attachment = Attachment.select(:id, :container_id, :container_type)&.find_by_id(id)
unless attachment.blank?
attachment.container = pull_issue
attachment.save
end
end
end
if params[:assigned_to_id].present?
Tiding.create!(user_id: params[:assigned_to_id], trigger_user_id: current_user.id,
container_id: local_requests.id, container_type: 'PullRequest',
parent_container_id: @project.id, parent_container_type: "Project",
tiding_type: 'pull_request', status: 0)
end
local_requests.project_trends.create(user_id: current_user.id, project_id: @project.id, action_type: "create")
if params[:title].to_s.include?("WIP:")
pull_issue.custom_journal_detail("WIP", "", "这个合并请求被标记为尚未完成的工作。完成后请从标题中移除WIP:前缀。")
end
normal_status(0, "PullRequest创建成功")
else
normal_status(-1, "PullRequest创建失败")
end
else
normal_status(-1, "PullRequest创建失败")
end
end
rescue => e
normal_status(-1, e.message)
raise ActiveRecord::Rollback
end
end
end
end
def edit
@issue_chosen = issue_left_chosen(@project, @issue.id)
@issue_attachments = @issue.attachments
end
def update
if params[:title].nil?
normal_status(-1, "名称不能为空")
elsif params[:issue_tag_ids].nil?
normal_status(-1, "标签不能为空")
else
ActiveRecord::Base.transaction do
begin
local_params = {
title: params[:title], #标题
body: params[:body], #内容
head: params[:head], #源分支
base: params[:base], #目标分支
milestone: params[:fixed_version_id].to_i, #里程碑
}
requests_params = local_params.merge({
assignee: current_user.try(:login),
assignees: ["#{params[:assigned_login].to_s}"],
labels: params[:issue_tag_ids]
})
issue_params = {
subject: params[:title],
description: params[:body],
assigned_to_id: params[:assigned_to_id].to_s,
fixed_version_id: params[:fixed_version_id],
issue_tags_value: params[:issue_tag_ids].present? ? params[:issue_tag_ids].join(",") : "",
}
if @issue.update_attributes(issue_params)
if @pull_request.update_attributes(local_params)
gitea_request = Gitea::PullRequest::UpdateService.new(current_user, @repository.try(:identifier), requests_params, @pull_request.try(:gpid)).call
if gitea_request
issue_files = params[:attachment_ids]
change_files = false
issue_file_ids = []
if issue_files.present?
issue_attachments = @issue&.attachments
issue_file_ids = issue_attachments&.pluck(:id)
left_file_ids = issue_file_ids - issue_files
new_file_ids = issue_files - issue_file_ids
if left_file_ids.size > 0
change_files = true
issue_attachments.where(id: left_file_ids).delete_all
end
if new_file_ids.size > 0
change_files = true
new_file_ids.each do |id|
attachment = Attachment.select(:id, :container_id, :container_type)&.find_by_id(id)
unless attachment.blank?
attachment.container = @issue
attachment.save
end
end
end
end
if params[:issue_tag_ids].present?
issue_current_tags = @issue&.issue_tags&.select(:id)&.pluck(:id)
new_tag_ids = params[:issue_tag_ids] - issue_current_tags
old_tag_ids = issue_current_tags - params[:issue_tag_ids]
if old_tag_ids.size > 0
@issue.issue_tags_relates.where(issue_tag_id: old_tag_ids).delete_all
end
if new_tag_ids.size > 0
new_tag_ids.each do |tag|
IssueTagsRelate.create(issue_id: @issue.id, issue_tag_id: tag)
end
end
end
if params[:status_id].to_i == 5
@issue.issue_times.update_all(end_time: Time.now)
end
@issue.create_journal_detail(change_files, issue_files, issue_file_ids)
normal_status(0, "PullRequest更新成功")
else
normal_status(-1, "PullRequest更新失败")
end
else
normal_status(-1, "PullRequest更新失败")
end
end
rescue => e
normal_status(-1, e.message)
raise ActiveRecord::Rollback
end
end
end
end
def show
@user_permission = current_user.present? && (!@issue.is_lock || @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
@join_users = join_users(@issue)
#总耗时
cost_time(@issue)
#被依赖
@be_depended_issues_array = be_depended_issues(@issue)
#依赖于
depended_issues(@issue)
end
def pr_merge
if params[:do].blank?
normal_status(-1, "请选择合并方式")
else
ActiveRecord::Base.transaction do
begin
requests_params = {
do: params[:do],
MergeMessageField: params[:body],
MergeTitleField: params[:title]
}
merge_pr = Gitea::PullRequest::MergeService.new(current_user, @repository.try(:identifier), @pull_request.try(:gpid), requests_params).call
if @pull_request.update_attribute(:status, 1) && merge_pr
@pull_request.project_trends.create(user_id: current_user.id, project_id: @project.id, action_type: "merge")
@issue.custom_journal_detail("merge", "", "该合并请求已被合并")
normal_status(1, "合并成功")
else
normal_status(-1, "合并失败")
end
rescue => e
normal_status(-1, e.message)
raise ActiveRecord::Rollback
end
end
end
end
#评审
def check_merge
notes = params[:content]
pull_request_status = params[:status]
if notes.blank?
normal_status(-1, "评论内容不能为空")
else
if @pull_request.status > 0
normal_status(-1, "已合并,不能评审")
else
if pull_request_status.to_i == 1
message = "评审通过:"
elsif pull_request_status.to_i == 2
message = "评审请求变更:"
else
message = ""
end
journal_params = {
journalized_id: @issue.id ,
journalized_type: "Issue",
user_id: current_user.id ,
notes: message + notes.to_s.strip
}
journal = Journal.new journal_params
if journal.save
if pull_request_status.present?
@pull_request.update_attribute(:status, pull_request_status.to_i)
end
if pull_request_status.to_i == 1
requests_params = {
do: "merge",
MergeMessageField: notes,
MergeTitleField: "Merge PullRequest ##{@pull_request.gpid}"
}
merge_pr = Gitea::PullRequest::MergeService.new(current_user, @repository.try(:identifier), @pull_request.try(:gpid), requests_params).call
if merge_pr
@pull_request.project_trends.create(user_id: current_user.id, project_id: @project.id, action_type: "merge")
@issue.custom_journal_detail("merge", "", "该合并请求已被合并")
normal_status(1, "评审成功")
else
normal_status(-1, "评审失败")
end
end
normal_status(0, "评审成功")
else
normal_status(-1, "评审失败")
end
end
end
end
private
def set_project
@project = Project.find_by_id(params[:project_id])
@repository = @project.repository
@user = @project.owner
normal_status(-1, "项目不存在") unless @project.present?
normal_status(-1, "仓库不存在") unless @repository.present?
normal_status(-1, "用户不存在") unless @user.present?
end
def find_pull_request
@pull_request = PullRequest.find_by_id(params[:id])
@issue = @pull_request.issue
if @pull_request.blank?
normal_status(-1, "合并请求不存在")
elsif @issue.is_lock &&!(@project.member?(current_user) || current_user.admin?)
normal_status(-1, "您没有权限")
end
end
end

@ -9,13 +9,16 @@ class RepositoriesController < ApplicationController
def entries
@entries = Gitea::Repository::Entries::ListService.new(@user, @repo.identifier, ref: params[:ref]).call
@entries = @entries.sort_by{ |hash| hash['type'] }
end
def sub_entries
interactor = Repositories::EntriesInteractor.call(@user, @repo.identifier, params[:filepath], ref: params[:ref])
if interactor.success?
@sub_entries = interactor.result
@sub_entries = [] << @sub_entries unless @sub_entries.is_a? Array
@entries = @entries.sort_by{ |hash| hash['type'] }
else
render_error(interactor.error)
end

@ -1,6 +1,6 @@
class WatchersController < ApplicationController
before_action :require_login, except: %i[index]
before_action :set_project
before_action :find_project_with_id
def index
scope = @project.watchers.includes(:user)
@ -31,11 +31,12 @@ class WatchersController < ApplicationController
end
end
private
def set_project
@project = Project.find params[:project_id]
rescue Exception => e
tip_exception(e.message)
def check_watch
is_watch = current_user.watched?(@project)
render_result(is_watch ? 1 : 0)
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
end

@ -0,0 +1,205 @@
module TagChosenHelper
def issue_left_chosen(project,issue_id)
issue_info = Array.new(11)
use_tags = []
issue_comment_users_array = []
cost_time_array = []
all_cost_time = 0
be_depended_issues_array = []
depended_issues_array = []
all_issues = []
depended_issues_id = []
if issue_id.present?
issue = Issue.find(issue_id)
use_tags = issue.issue_tags.select(:id).pluck(:id)
select_arrays = [:assigned_to_id, :tracker_id, :status_id, :priority_id, :fixed_version_id, :start_date, :due_date, :estimated_hours, :done_ratio, :issue_type, :token]
issue_info = Issue.select(select_arrays).where(id: issue_id).pluck(select_arrays)
issue_info = issue_info[0]
issue_comment_users_array = join_users(issue)
#总耗时
cost_time(issue)
cost_time_array = @cost_time_array
all_cost_time = @all_cost_time
#被依赖
be_depended_issues_array = be_depended_issues(issue)
#依赖于
depended_issues(issue)
depended_issues_array = @depended_issues_array
depended_issues_id = @depended_issues_id
end
project_members = project.members_user_infos
project_members_info = [] #指派给
project_members.each do |member|
user = member.user
real_name = user.try(:show_real_name)
user_id = member[0]
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}
project_members_info.push(member_info)
end
tracker_info = project.trackers&.pluck(:id, :name, :position)
new_tracker_info = [] #类型
if tracker_info.size > 0
tracker_info.each do |t|
is_chosen = (t[0] == issue_info[1]) ? "1" : "0"
new_tracker = {id: t[0], name: t[1], position: t[2], is_chosen: is_chosen}
new_tracker_info.push(new_tracker)
end
end
issue_status = IssueStatus&.pluck(:id,:name,:position)
new_status_info = [] #缺陷类型
if issue_status.size > 0
issue_status.each do |t|
is_chosen = (t[0] == issue_info[2]) ? "1" : "0"
new_issue = {id: t[0], name: t[1], position: t[2], is_chosen: is_chosen}
new_status_info.push(new_issue)
end
end
issue_priority = IssuePriority&.pluck(:id,:name, :position)
new_priority_info = [] #优先度
if issue_priority.size > 0
issue_priority.each do |t|
is_chosen = (t[0] == issue_info[3]) ? "1" : "0"
new_issue = {id: t[0], name: t[1], position: t[2], is_chosen: is_chosen}
new_priority_info.push(new_issue)
end
end
issue_versions = project.versions&.pluck(:id,:name, :status)
new_version_info = [] #issue里程碑
if issue_versions.size > 0
issue_versions.each do |t|
is_chosen = (t[0] == issue_info[4]) ? "1" : "0"
new_issue = {id: t[0], name: t[1], status: t[2], is_chosen: is_chosen}
new_version_info.push(new_issue)
end
end
issue_done_ratio = %w(0 10 20 30 40 50 60 70 80 90 100)
new_done_info = [] #完成度
if issue_done_ratio.size > 0
issue_done_ratio.each do |t|
is_chosen = (t == issue_info[8].to_s) ? "1" : "0"
new_issue = {id:t.to_i, ratio: (t.to_s + "%"), is_chosen: is_chosen}
new_done_info.push(new_issue)
end
end
issue_tags = project.issue_tags&.pluck(:id,:name, :color)
new_tags_info = [] #issue标签
if issue_tags.size > 0
issue_tags.each do |t|
is_chosen = (use_tags.size > 0 && use_tags.include?(t[0])) ? "1" : "0"
new_issue = {id: t[0], name: t[1], color: t[2], is_chosen: is_chosen}
new_tags_info.push(new_issue)
end
end
issue_types = %w(普通 悬赏)
new_types_info = [] #issue标签
issue_types.each_with_index do |i, index|
is_chosen = (issue_info[9] == "#{index+1}") ? "1" : "0"
is_token = (index.to_s == "1") ? issue_info[10] : nil
new_type_info = {id: index+1, name: i, token: is_token, is_chosen: is_chosen}
new_types_info.push(new_type_info)
end
depend_other_issues = project.issues.issue_issue.where.not(id: issue_id)&.pluck(:id, :subject)
if depend_other_issues.size > 0
depend_other_issues.each do |t|
is_chosen = depended_issues_id.include?(t[0]) ? "1" : "0"
new_issue = {id: t[0], subject: t[1], is_chosen: is_chosen}
all_issues.push(new_issue)
end
end
{
"assign_user": project_members_info,
"tracker": new_tracker_info,
"issue_status": new_status_info,
"priority": new_priority_info,
"issue_version": new_version_info,
"start_date": issue_info[5],
"due_date": issue_info[6],
"joins_users": issue_comment_users_array,
"cost_time_users": cost_time_array,
"total_cost_time": Time.at(all_cost_time).utc.strftime('%H h %M min %S s'),
"be_depended_issues": be_depended_issues_array,
"depended_issues":depended_issues_array,
"estimated_hours": issue_info[7],
"done_ratio": new_done_info,
"issue_tag": new_tags_info,
"issue_type": new_types_info,
"all_issues": all_issues
}
end
def join_users(issue)
#协作者
issue_comment_users_array = []
issue_comment_users = issue.journals.select(:user_id).distinct
if issue.present? && issue_comment_users.size > 0
issue_comment_users.each do |j|
user_avatar = url_to_avatar(j.user)
issue_comment_users_array.push({login: j.user.try(:login), avatar_url: user_avatar})
end
end
issue_comment_users_array
end
def cost_time(issue)
#总耗时
@cost_time_array = []
@all_cost_time = 0
all_issue_times = issue.issue_times.includes(:user).where.not(end_time: nil)
if issue.present? && all_issue_times.size > 0
all_issue_times.each do |time|
cost_time = time.end_time.to_i - time.start_time.to_i
cost_time = cost_time > 0 ? cost_time : 0
@all_cost_time = @all_cost_time + cost_time
set_cost_time = Time.at(cost_time).utc.strftime('%H h %M min %S s')
@cost_time_array.push({login: time.user.try(:login), avatar_url: url_to_avatar(time.user), cost_time: set_cost_time})
end
end
end
def depended_issues(issue)
#依赖于
@depended_issues_id = []
@depended_issues_array = []
depended_issues = issue.issue_depends.pluck(:id,:depend_issue_id).uniq
if issue.present? && depended_issues.size > 0
depended_issues.each do |de|
@depended_issues_id.push(de[1])
issues = Issue.select(:id, :subject).where(id: de[1]).as_json
issues = issues.first.merge(depend_id: de[0])
@depended_issues_array.push(issues)
end
@depended_issues_id.delete(issue.id)
end
end
def be_depended_issues(issue)
be_depended_issues_array = []
be_depended_issues = IssueDepend.where(depend_issue_id: issue.id).pluck(:id,:issue_id).uniq
if issue.present? && be_depended_issues.size > 0
be_depended_issues.each do |de|
d_issues = Issue.select(:id, :subject).where(id: de[1]).as_json
d_issues = d_issues.first.merge(depend_id: de[0])
be_depended_issues_array.push(d_issues)
end
end
be_depended_issues_array
end
end

@ -0,0 +1,21 @@
module Likeable
extend ActiveSupport::Concern
included do
has_many :praise_treads, as: :praise_tread_object, dependent: :destroy
end
def liked?(praiseable)
praiseable.praise_treads.exists?(user_id: self.id)
end
def like!(praiseable)
praiseable.praise_treads.create!(user_id: self.id)
end
def unlike!(praiseable)
obj = praiseable.praise_treads.find_by(user_id: self.id)
obj.destroy! if obj.present?
end
end

@ -1,10 +1,11 @@
class Issue < ApplicationRecord
#issue_type 1为普通2为悬赏
belongs_to :project
belongs_to :tracker
belongs_to :tracker,optional: true
has_many :project_trends, as: :trend, dependent: :destroy
has_one :pull_request
# belongs_to :issue_tag,optional: true
belongs_to :priority, :class_name => 'IssuePriority', foreign_key: :priority_id,optional: true #
belongs_to :priority, :class_name => 'IssuePriority', foreign_key: :priority_id,optional: true
belongs_to :version, foreign_key: :fixed_version_id,optional: true
belongs_to :user,optional: true, foreign_key: :author_id
belongs_to :issue_status, foreign_key: :status_id,optional: true
@ -19,6 +20,8 @@ class Issue < ApplicationRecord
has_many :issue_depends, dependent: :destroy
scope :issue_includes, ->{includes(:user)}
scope :issue_many_includes, ->{includes(journals: :user)}
scope :issue_issue, ->{where(issue_classify: [nil,"issue"])}
scope :issue_pull_request, ->{where(issue_classify: "pull_request")}
def get_assign_user

@ -1,11 +1,8 @@
class PraiseTread < ApplicationRecord
belongs_to :user
belongs_to :praise_tread_object, polymorphic: true, counter_cache: :praises_count
has_many :tidings, :as => :container, :dependent => :destroy
scope :liker, lambda { where(:praise_or_tread => 1) }
scope :user_liker, ->(user_id) { where(user_id: user_id, praise_or_tread: 1) }
scope :by_praise_tread_object_id_and_type, -> (object_id, object_type) { where(praise_tread_object_id: object_id, praise_tread_object_type: object_type)}
after_create :send_tiding
def send_tiding

@ -20,6 +20,7 @@ class Project < ApplicationRecord
has_one :repository, dependent: :destroy
has_many :issue_tags
has_many :issue_statuses
has_many :pull_requests, dependent: :destroy
has_many :issues
has_many :user_grades, dependent: :destroy
@ -57,9 +58,9 @@ class Project < ApplicationRecord
def get_issues_count(status_id)
if status_id.present?
self&.issues.select(:id, :status_id).where(status_id: status_id)&.pluck(:id).size
self&.issues.issue_issue.select(:id, :status_id).where(status_id: status_id)&.pluck(:id).size
else
self&.issues.select(:id)&.pluck(:id).size
self&.issues.issue_issue.select(:id)&.pluck(:id).size
end
end

@ -0,0 +1,9 @@
class PullRequest < ApplicationRecord
#status 0 默认未合并, 1表示合并, 2表示请求拒绝
belongs_to :issue
belongs_to :user
belongs_to :project
has_many :pull_request_assigns, foreign_key: :pull_request_id
has_many :pull_request_tags, foreign_key: :pull_request_id
has_many :project_trends, as: :trend, dependent: :destroy
end

@ -0,0 +1,4 @@
class PullRequestAssign < ApplicationRecord
belongs_to :user
belongs_to :pull_request
end

@ -0,0 +1,4 @@
class PullRequestTag < ApplicationRecord
belongs_to :issue_tag
belongs_to :pull_request
end

@ -1,5 +1,6 @@
class User < ApplicationRecord
include Watchable
include Likeable
include Searchable::Dependents::User
# Account statuses

@ -19,7 +19,6 @@ class Gitea::ClientService < ApplicationService
puts "[gitea] request params: #{params}"
request_url = [api_url, url].join('').freeze
auth_token = authen_params(params[:token])
response = conn(auth_token).post do |req|
req.url "#{request_url}"
req.body = params[:data].to_json
@ -53,11 +52,12 @@ class Gitea::ClientService < ApplicationService
puts "[gitea] request params: #{params}"
request_url = [api_url, url].join('').freeze
auth_token = authen_params(params[:token])
response = conn(auth_token).patch do |req|
req.url "#{request_url}"
req.body = params[:data].to_json
end
render_status(response)
end
@ -124,7 +124,11 @@ class Gitea::ClientService < ApplicationService
case response.status
when 201, 200
JSON.parse(response&.body)
if response.body.size > 0
JSON.parse(response&.body)
else
{status: 200}
end
when 401
raise Error, mark + "401"
when 422

@ -0,0 +1,29 @@
class Gitea::Labels::CreateService < Gitea::ClientService
attr_reader :user, :repo, :params
# params ex:
# {
# name: 'pull request title',
# description: 'pull request content',
# color: '#ffff',
# }
# repo: 仓库名称
def initialize(user, repo, params={})
@user = user
@repo = repo
@params = params
end
def call
post(url, request_params)
end
private
def url
"/repos/#{user.login}/#{repo}/labels".freeze
end
def request_params
Hash.new.merge(token: user.gitea_token, data: params)
end
end

@ -0,0 +1,34 @@
class Gitea::Labels::DeleteService < Gitea::ClientService
attr_reader :user, :repo_name,:label_id
def initialize(user, repo_name, label_id)
@user = user
@repo_name = repo_name
@label_id = label_id
end
def call
response = delete(url, params)
render_result(response)
end
private
def params
Hash.new.merge(token: user.gitea_token)
end
def url
"/repos/#{user.login}/#{repo_name}/labels/#{label_id}".freeze
end
def render_result(response)
body = JSON.parse(response.body)
case response.status
when 204
body
else
{status: -1, message: "#{body['message']}"}
end
end
end

@ -0,0 +1,32 @@
class Gitea::Labels::ListService < Gitea::ClientService
attr_reader :user, :repo_name
def initialize(user, repo_name)
@user = user
@repo_name = repo_name
end
def call
response = get(url, params)
render_result(response)
end
private
def params
Hash.new.merge(token: user.gitea_token)
end
def url
"/repos/#{user.login}/#{repo_name}/labels".freeze
end
def render_result(response)
body = JSON.parse(response.body)
case response.status
when 200 then body
else
{status: -1, message: "#{body['message']}"}
end
end
end

@ -0,0 +1,30 @@
class Gitea::Labels::UpdateService < Gitea::ClientService
attr_reader :user, :repo,:label_id, :params
# params ex:
# {
# name: 'pull request title',
# description: 'pull request content',
# color: '#ffff',
# }
# repo: 仓库名称
def initialize(user, repo,label_id, params={})
@user = user
@repo = repo
@params = params
@label_id = label_id
end
def call
update(url, request_params)
end
private
def url
"/repos/#{user.login}/#{repo}/labels/#{label_id}".freeze
end
def request_params
Hash.new.merge(token: user.gitea_token, data: params)
end
end

@ -1,4 +1,4 @@
# Create a pull request
class Gitea::PullRequest::CreateService < Gitea::ClientService
attr_reader :user, :repo, :params
@ -22,11 +22,13 @@ class Gitea::PullRequest::CreateService < Gitea::ClientService
end
private
def url
"/repos/#{user.login}/#{repo}/pulls".freeze
"/repos/#{@user.login}/#{@repo}/pulls".freeze
end
def request_params
Hash.new.merge(token: user.gitea_token, data: params)
Hash.new.merge(token: @user.gitea_token, data: @params)
end
end

@ -1,7 +1,34 @@
# List a repo's pull requests
# Get a list of all commits from a repository
class Gitea::PullRequest::ListService < Gitea::ClientService
attr_reader :user, :repo
# sha: SHA or branch to start listing commits from (usually 'master')
def initialize(user, repo)
@user = user
@repo = repo
end
def call
response = get(url, params)
render_result(response)
end
private
def params
Hash.new.merge(token: user.gitea_token)
end
def url
"/repos/{owner}/{repo}/pulls"
"/repos/#{@user.try(:login)}/#{@repo}/pulls".freeze
end
def render_result(response)
body = JSON.parse(response.body)
case response.status
when 200
body
else
{status: -1, message: "#{body['message']}"}
end
end
end

@ -16,7 +16,8 @@ class Gitea::PullRequest::MergeService < Gitea::ClientService
end
def call
post(url, request_params)
response = post(url, request_params)
render_status(response)
end
private
@ -25,18 +26,20 @@ class Gitea::PullRequest::MergeService < Gitea::ClientService
end
def request_params
Hash.new.merge(token: user.gitea_token, data: body)
Hash.new.merge(token: user.gitea_token, data: params)
end
def body
# TODO
# 暂时只支持 merge模式
#params Do: Enum [ merge, rebase, rebase-merge, squash ], default merge
body = {
Do: 'merge'
}
body = body.merge(MergeTitleField: params[:title]) if params[:title]
body = body.merge(MergeMessageField: params[:message]) if params[:message]
body
def render_status(response)
case response.status
when 404
raise Error, "合并请求不存在"
else
if response.body.size > 0
JSON.parse(response&.body)
else
{status: 200}
end
end
end
end

@ -0,0 +1,26 @@
class Gitea::PullRequest::UpdateService < Gitea::ClientService
attr_reader :user, :repo, :params,:pull_request_id
def initialize(user, repo, params,pull_request_id)
@user = user
@repo = repo
@params = params
@pull_request_id = pull_request_id
end
def call
update(url, request_params)
end
private
def request_params
Hash.new.merge(token: @user.gitea_token, data: @params)
end
def url
"/repos/#{@user.try(:login)}/#{@repo}/pulls/#{@pull_request_id}".freeze
end
end

@ -9,7 +9,8 @@ class Gitea::Versions::DeleteService < Gitea::ClientService
end
def call
delete(url, params)
response = delete(url, params)
render_result(response)
end
private
@ -22,4 +23,14 @@ class Gitea::Versions::DeleteService < Gitea::ClientService
"/repos/#{@user_name}/#{@repo}/releases/#{@version_gid}".freeze
end
def render_result(response)
body = JSON.parse(response.body)
case response.status
when 204
body
else
{status: -1, message: "#{body['message']}"}
end
end
end

@ -1,2 +1,2 @@
json.partial! "commons/success"
json.extract! @issue_tag, :id, :name, :description, :color,:project_id
json.extract! @issue_tag, :id, :name, :description, :color,:project_id, :gid, :gitea_url

@ -3,6 +3,6 @@ json.issue_tags_count @issue_tags_size
json.issue_tags do
json.array! @issue_tags.each.to_a do |tag|
json.extract! tag, :id, :name, :description, :color, :issues_count, :project_id
json.extract! tag, :id, :name, :description, :color, :issues_count, :project_id, :gid, :gitea_url
end
end

@ -1,6 +1,6 @@
json.partial! "commons/success"
json.extract! @issue, :id,:subject,:description,:is_private,:assigned_to_id,:tracker_id,:status_id,:priority_id,:fixed_version_id,
:start_date,:due_date,:estimated_hours, :issue_type, :token
:start_date,:due_date,:estimated_hours, :issue_type, :token,:issue_classify, :branch_name
json.done_ratio @issue.done_ratio.to_s + "%"
json.issue_tags @issue.get_issue_tags
json.issue_chosen @issue_chosen

@ -9,6 +9,7 @@ json.limit @limit
json.issues do
json.array! @issues.to_a do |issue|
cost_time(issue)
json.id issue.id
json.name issue.subject
json.format_time format_time(issue.created_on)
@ -27,6 +28,8 @@ json.issues do
json.issue_tags issue.get_issue_tags
json.issue_type issue.issue_type == "1" ? "普通" : "悬赏"
json.token issue.issue_type == "2" ? issue.token : ""
json.issue_classify issue.issue_classify
json.branch_name issue.branch_name
json.cost_time @all_cost_time
end
end

@ -1,2 +1,3 @@
json.partial! "commons/success"
json.branches @all_branches
json.issue_chosen @issue_chosen

@ -22,6 +22,8 @@ json.cost_time @cost_time_array
json.total_cost_time Time.at(@all_cost_time).utc.strftime('%H h %M min %S s')
json.be_depended_issues @be_depended_issues_array
json.depended_issues @depended_issues_array
json.issue_classify @issue.issue_classify
json.branch_name @issue.branch_name
json.attachments do
json.array! @issue_attachments do |attachment|
json.partial! "attachments/attachment_simple", locals: {attachment: attachment}

@ -0,0 +1,3 @@
json.name praise.user.real_name
json.login praise.user.login
json.image_url url_to_avatar(praise.user)

@ -0,0 +1,4 @@
json.total_count @praises.size
json.praises do
json.partial! 'praise', collection: @praises, as: :praise
end

@ -0,0 +1,18 @@
json.partial! "commons/success"
json.pull_request do
json.extract! @pull_request, :id,:base, :head, :status
end
json.issue do
json.extract! @issue, :id,:subject,:description,:is_private,:assigned_to_id,:tracker_id,:status_id,:priority_id,:fixed_version_id,
:start_date,:due_date,:estimated_hours, :issue_type, :token,:issue_classify, :branch_name
json.done_ratio @issue.done_ratio.to_s + "%"
json.issue_tags @issue.get_issue_tags
json.issue_chosen @issue_chosen
end
json.attachments do
json.array! @issue_attachments do |attachment|
json.partial! "attachments/attachment_simple", locals: {attachment: attachment}
end
end

@ -0,0 +1,39 @@
json.partial! "commons/success"
json.all_count @all_issues_size
json.open_count @open_issues_size
json.close_count @close_issues_size
json.assign_me_count @assign_to_me_size
json.my_published_count @my_published_size
json.search_count @issues_size
json.limit @limit
json.issues do
json.array! @issues.to_a do |issue|
cost_time(issue)
json.pull_request_id issue.pull_request.id
json.pull_request_status issue.pull_request.status
json.id issue.id
json.name issue.subject
json.format_time format_time(issue.created_on)
json.created_at time_from_now(issue.created_on)
json.updated_at format_time(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)
json.author_name issue.user.try(:show_real_name)
json.author_login issue.user.try(:login)
json.tracker issue.tracker.try(:name)
json.issue_status issue.issue_status.try(:name)
json.priority issue.priority.try(:title)
json.version issue.version.try(:title)
json.done_ratio issue.done_ratio.to_s + "%"
json.journals_count issue.get_journals_size
json.issue_tags issue.get_issue_tags
json.issue_type issue.issue_type == "1" ? "普通" : "悬赏"
json.token issue.issue_type == "2" ? issue.token : ""
json.issue_classify issue.issue_classify
json.branch_name issue.branch_name
json.cost_time @all_cost_time
end
end
# json.issues @issues

@ -0,0 +1,13 @@
json.partial! "commons/success"
json.branches @all_branches
json.issue_tags @project_tags
json.issue_versions @project_versions
json.members do
json.array! @project_members.to_a.each do |member|
json.id member.user_id
json.login member.user.try(:login)
json.name member.user.try(:show_real_name)
json.avatar_url url_to_avatar(member.user)
end
end

@ -0,0 +1,40 @@
json.partial! "commons/success"
json.pull_request do
json.extract! @pull_request, :id,:base, :head, :status, :gpid
end
json.issue do
json.extract! @issue, :id,:subject,:is_lock,:description,:is_private, :start_date,:due_date,:estimated_hours,:issue_classify, :branch_name
json.user_permission @user_permission
json.closed_on @issue.closed_on.present? ? format_time(@issue.closed_on) : ""
json.created_at format_time(@issue.created_on)
json.assign_user_name @issue_assign_to.try(:show_real_name)
json.assign_user_login @issue_assign_to.try(:login)
json.author_name @issue_user.try(:show_real_name)
json.author_login @issue_user.try(:login)
json.author_picture url_to_avatar(@issue_user)
json.tracker @issue.tracker.try(:name)
json.issue_status @issue.issue_status.try(:name)
json.priority @issue.priority.try(:name)
json.version @issue.version.try(:title)
json.issue_tags @issue.get_issue_tags
json.done_ratio @issue.done_ratio.to_s + "%"
json.issue_type @issue.issue_type == "1" ? "普通" : "悬赏"
json.token @issue.issue_type == "2" ? @issue.token : ""
json.join_users @join_users
json.cost_time @cost_time_array
json.total_cost_time Time.at(@all_cost_time).utc.strftime('%H h %M min %S s')
json.be_depended_issues @be_depended_issues_array
json.depended_issues @depended_issues_array
end
json.attachments do
json.array! @issue_attachments do |attachment|
json.partial! "attachments/attachment_simple", locals: {attachment: attachment}
end
end

@ -28,6 +28,7 @@ zh-CN:
draft: 草稿
journal_detail:
merge: 合并
issue_tags_value: 标签
lock_issue: 锁定工单
unlock_issue: 解锁工单

@ -18,10 +18,6 @@ Rails.application.routes.draw do
get 'home/search'
get 'search', to: 'searchs#index'
post 'praise_tread/like', to: 'praise_tread#like'
delete 'praise_tread/unlike', to: 'praise_tread#unlike'
put 'commons/hidden', to: 'commons#hidden'
put 'commons/unhidden', to: 'commons#unhidden'
delete 'commons/delete', to: 'commons#delete'
@ -44,6 +40,12 @@ Rails.application.routes.draw do
resources :licenses, only: [:index, :show]
resources :projects, only: [:index, :create, :show] do
resources :pull_requests, except: [:destroy] do
member do
post :pr_merge
post :check_merge
end
end
resources :version_releases, only: [:index,:new, :create, :edit, :update, :destroy]
resources :project_trends, only: [:index, :create]
resources :issues do
@ -67,9 +69,17 @@ Rails.application.routes.draw do
collection do
post :follow
delete :unfollow
get :check_watch
end
end
resources :praise_tread, only: [:index]
resources :praise_tread, only: [:index] do
collection do
post :like
delete :unlike
get :check_like
end
end
collection do
post :migrate
get :group_type_list

@ -0,0 +1,6 @@
class AddColumnToIssueTags < ActiveRecord::Migration[5.2]
def change
add_column :issue_tags, :gid, :integer
add_column :issue_tags, :gitea_url, :string
end
end

@ -0,0 +1,10 @@
class CreatePullRequestTags < ActiveRecord::Migration[5.2]
def change
create_table :pull_request_tags do |t|
t.integer :issue_tag_id
t.integer :pull_request_id
t.timestamps
end
add_index :pull_request_tags, [:issue_tag_id, :pull_request_id]
end
end

@ -0,0 +1,10 @@
class CreatePullRequestAssigns < ActiveRecord::Migration[5.2]
def change
create_table :pull_request_assigns do |t|
t.integer :user_id
t.integer :pull_request_id
t.timestamps
end
add_index :pull_request_assigns, [:user_id, :pull_request_id]
end
end

@ -0,0 +1,8 @@
class AddColumnToPullRequests < ActiveRecord::Migration[5.2]
def change
add_column :pull_requests, :version_id, :integer
add_column :pull_requests, :body, :text
add_column :pull_requests, :from_ref, :string
add_column :pull_requests, :to_ref, :string
end
end

@ -0,0 +1,14 @@
class ChangePullRequestsColumns < ActiveRecord::Migration[5.2]
def change
remove_column :pull_request_assigns, :user_id
add_column :pull_request_assigns, :user_login, :string
add_index :pull_request_assigns, [:user_login]
rename_column :pull_requests, :version_id, :milestone
rename_column :pull_requests, :from_ref, :head
rename_column :pull_requests, :to_ref, :base
end
end

@ -0,0 +1,6 @@
class AddColumnsToPullRequests < ActiveRecord::Migration[5.2]
def change
add_column :pull_requests, :issue_id, :integer
add_column :issues, :issue_classify, :string
end
end

@ -0,0 +1,6 @@
class AddIssuesRefNameAndBranchName < ActiveRecord::Migration[5.2]
def change
add_column :issues, :ref_name, :string
add_column :issues, :branch_name, :string
end
end

@ -0,0 +1,35 @@
/*
* @Author: your name
* @Date: 2019-12-20 11:40:56
* @LastEditTime : 2019-12-20 13:38:49
* @LastEditors : Please set LastEditors
* @Description: In User Settings Edit
* @FilePath: /notebook/Users/yangshuming/Desktop/new__educode/educoder/public/react/public/js/jupyter.js
*/
window.onload=function(){
require(["base/js/namespace"],function(Jupyter) {
Jupyter.notebook.save_checkpoint();
});
}
// //子目标父窗口接收子窗口发送的消息
// let message = {type: 'open', link:'需要发送的消息'};
//子窗口向父窗口发送消息,消息中包含我们想跳转的链接
window.parent.postMessage('jupytermessage','需要发送的消息');
// //目标父窗口接收子窗口发送的消息
// window.addEventListener('message', (e)=>{
// let origin = event.origin || event.originalEvent.origin;
// if (origin !== '需要发送的消息') {
// return;
// }else {
// //更换iframe的src,实现iframe页面跳转
// 执行方法
// }
// },false);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save