From f6b2e1748bb9f7b0a7464de44ddd92d61c056317 Mon Sep 17 00:00:00 2001 From: caicai8 <1149225589@qq.com> Date: Mon, 6 Jan 2020 10:37:25 +0800 Subject: [PATCH 1/4] component --- public/react/src/forge/Branch/CloneAddress.js | 32 +++++++++++++++++++ public/react/src/forge/Branch/SelectBranch.js | 2 ++ public/react/src/forge/Branch/branch.css | 9 ++++++ .../src/forge/Main/CoderRootDirectory.js | 21 ++---------- public/react/src/forge/Main/list.css | 10 +----- 5 files changed, 47 insertions(+), 27 deletions(-) create mode 100644 public/react/src/forge/Branch/CloneAddress.js create mode 100644 public/react/src/forge/Branch/branch.css diff --git a/public/react/src/forge/Branch/CloneAddress.js b/public/react/src/forge/Branch/CloneAddress.js new file mode 100644 index 000000000..a983612d5 --- /dev/null +++ b/public/react/src/forge/Branch/CloneAddress.js @@ -0,0 +1,32 @@ +import React , { Component } from 'react'; +import { Dropdown , Icon , Menu } from 'antd'; + +import "./branch.css" + +// 点击按钮复制功能 +function jsCopy(){ + var e = document.getElementById("copy_rep_content"); + e.select(); + document.execCommand("Copy"); +} +class CloneAddress extends Component{ + + render(){ + const { http_url , downloadUrl } = this.props; + return( +
+ this.changeAddress("http")}>HTTP + {/* this.changeAddress("ssh")}>SSH */} + + jsCopy()}> + + + + + + +
+ ) + } +} +export default CloneAddress; \ No newline at end of file diff --git a/public/react/src/forge/Branch/SelectBranch.js b/public/react/src/forge/Branch/SelectBranch.js index ca5ee9413..a3fcff973 100644 --- a/public/react/src/forge/Branch/SelectBranch.js +++ b/public/react/src/forge/Branch/SelectBranch.js @@ -1,6 +1,8 @@ import React , { Component } from 'react'; import { Dropdown , Icon , Menu } from 'antd'; +import "./branch.css" + class SelectBranch extends Component{ render(){ diff --git a/public/react/src/forge/Branch/branch.css b/public/react/src/forge/Branch/branch.css new file mode 100644 index 000000000..f54901088 --- /dev/null +++ b/public/react/src/forge/Branch/branch.css @@ -0,0 +1,9 @@ +.branchDropdown{ + border:1px solid #eee; + border-radius: 4px; + display: flex; + justify-content: center; + padding:0px 10px; + height: 35px; + line-height: 35px; +} \ No newline at end of file diff --git a/public/react/src/forge/Main/CoderRootDirectory.js b/public/react/src/forge/Main/CoderRootDirectory.js index 038f841a8..5e6be652e 100644 --- a/public/react/src/forge/Main/CoderRootDirectory.js +++ b/public/react/src/forge/Main/CoderRootDirectory.js @@ -6,13 +6,9 @@ import { getImageUrl } from 'educoder'; import axios from 'axios'; import SelectBranch from '../Branch/SelectBranch' +import CloneAddress from '../Branch/CloneAddress' + -// 点击按钮复制功能 -function jsCopy(){ - var e = document.getElementById("copy_rep_content"); - e.select(); - document.execCommand("Copy"); -} class CoderRootDirectory extends Component{ constructor(props){ super(props); @@ -163,18 +159,7 @@ class CoderRootDirectory extends Component{
-
- this.changeAddress("http")}>HTTP - {/* this.changeAddress("ssh")}>SSH */} - - jsCopy()}> - - - - - - -
+
Date: Mon, 6 Jan 2020 14:14:25 +0800 Subject: [PATCH 2/4] =?UTF-8?q?issue=E7=9A=84=E5=8A=A8=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/application_controller.rb | 2 +- app/controllers/issues_controller.rb | 4 +- app/controllers/journals_controller.rb | 2 + app/controllers/project_trends_controller.rb | 49 +++++++++++++++++++ app/models/issue.rb | 6 +++ app/models/project.rb | 10 ++++ app/models/project_trend.rb | 5 ++ app/models/user.rb | 2 + .../issues/_simple_issue_item.json.jbuilder | 18 +++++++ app/views/project_trends/index.json.jbuilder | 24 +++++++++ config/locales/zh-CN.yml | 9 ++++ config/routes.rb | 1 + .../20200106022157_create_project_trends.rb | 12 +++++ spec/models/project_trend_spec.rb | 5 ++ 14 files changed, 147 insertions(+), 2 deletions(-) create mode 100644 app/controllers/project_trends_controller.rb create mode 100644 app/models/project_trend.rb create mode 100644 app/views/issues/_simple_issue_item.json.jbuilder create mode 100644 app/views/project_trends/index.json.jbuilder create mode 100644 db/migrate/20200106022157_create_project_trends.rb create mode 100644 spec/models/project_trend_spec.rb diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index aa0b0188f..d3f65a6bc 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -328,7 +328,7 @@ class ApplicationController < ActionController::Base def current_user # User.current - User.find_by_id 36401 + User.find_by_id 1 end ## 默认输出json diff --git a/app/controllers/issues_controller.rb b/app/controllers/issues_controller.rb index 5d515b36e..436e56702 100644 --- a/app/controllers/issues_controller.rb +++ b/app/controllers/issues_controller.rb @@ -49,7 +49,7 @@ class IssuesController < ApplicationController order_name = params[:order_name] || "created_on" #或者"updated_on" @page = params[:page] - @limit = params[:limit] || "15" + @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) @@ -175,6 +175,7 @@ class IssuesController < ApplicationController parent_container_id: @project.id, parent_container_type: "Project", tiding_type: 'issue', status: 0) end + @issue.project_trends.create(user_id: current_user.id, project_id: @project.id, action_type: "create") normal_status(0, "创建成功") else normal_status(-1, "创建失败") @@ -300,6 +301,7 @@ class IssuesController < ApplicationController end if @issue.update_attribute(:status_id, type) if type == 5 + @issue.project_trends.create(user_id: current_user.id, project_id: @project.id, action_type: "close") @issue.issue_times.update_all(end_time: Time.now) end @issue.create_journal_detail(false, [], []) diff --git a/app/controllers/journals_controller.rb b/app/controllers/journals_controller.rb index 6c3bc49ed..edcec73cd 100644 --- a/app/controllers/journals_controller.rb +++ b/app/controllers/journals_controller.rb @@ -35,6 +35,8 @@ class JournalsController < ApplicationController end end end + @issue.project_trends.create(user_id: current_user.id, project_id: @project.id, action_type: "journal") + normal_status(0, "评论成功") else normal_status(-1, "评论失败") diff --git a/app/controllers/project_trends_controller.rb b/app/controllers/project_trends_controller.rb new file mode 100644 index 000000000..84821ba65 --- /dev/null +++ b/app/controllers/project_trends_controller.rb @@ -0,0 +1,49 @@ +class ProjectTrendsController < ApplicationController + before_action :set_project + before_action :check_project_public + + def index + @project_issues_count = @project.get_issues_count(nil) + @project_open_issues_count = @project.get_issues_count([1,2,3,4,6]) + @project_close_issues_count = @project.get_issues_count(5) + + project_trends = @project.project_trends.includes(:user, trend: :user) + check_time = params[:time] #时间的筛选 + check_type = params[:type] #动态类型的筛选,目前已知的有 Issue, PullRequest, Version + check_status = params[:status] #类型的选择 "create", "close", "journal", + + if check_time.present? + check_time = check_time.to_i + project_trends = project_trends.where("created_at between ? and ?",(Time.now.beginning_of_day - check_time.days), Time.now.end_of_day) + end + + if check_type.present? + project_trends = project_trends.where(trend_type: check_type.to_s.titleize) + end + + if check_status.present? + project_trends = project_trends.where(action_type: check_status.to_s) + end + project_trends = project_trends.order("created_at desc") + + @page = params[:page] + @limit = params[:limit] || 15 + @project_trends_size = project_trends.size + @project_trends = project_trends.page(@page).per(@limit) + end + + private + + def set_project + @project = Project.find_by_id(params[:project_id]) + unless @project.present? + normal_status(-1, "项目不存在") + end + end + + def check_project_public + unless @project.is_public || @project.member?(current_user) || current_user.admin? + normal_status(-1, "您没有权限") + end + end +end \ No newline at end of file diff --git a/app/models/issue.rb b/app/models/issue.rb index 4c995be55..64fa4c368 100644 --- a/app/models/issue.rb +++ b/app/models/issue.rb @@ -2,6 +2,7 @@ class Issue < ApplicationRecord #issue_type 1为普通,2为悬赏 belongs_to :project belongs_to :tracker + has_many :project_trends, as: :trend, dependent: :destroy # belongs_to :issue_tag,optional: true belongs_to :priority, :class_name => 'IssuePriority', foreign_key: :priority_id,optional: true # belongs_to :version, foreign_key: :fixed_version_id,optional: true @@ -17,6 +18,7 @@ class Issue < ApplicationRecord has_many :issue_times, dependent: :destroy has_many :issue_depends, dependent: :destroy scope :issue_includes, ->{includes(:user)} + scope :issue_many_includes, ->{includes(journals: :user)} def get_assign_user @@ -78,4 +80,8 @@ class Issue < ApplicationRecord end end + def only_reply_journals + journals.where.not(notes: [nil, ""]).journal_includes.limit(2) + end + end \ No newline at end of file diff --git a/app/models/project.rb b/app/models/project.rb index 6c3938d6c..7a3df8e2b 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -9,6 +9,7 @@ class Project < ApplicationRecord belongs_to :owner, class_name: 'User', foreign_key: :user_id belongs_to :project_category , :counter_cache => true belongs_to :project_language , :counter_cache => true + has_many :project_trends, dependent: :destroy has_many :commits @@ -51,4 +52,13 @@ class Project < ApplicationRecord self.identifier.parameterize end + def get_issues_count(status_id) + if status_id.present? + self&.issues.select(:id, :status_id).where(status_id: status_id)&.pluck(:id).size + else + self&.issues.select(:id)&.pluck(:id).size + end + + end + end diff --git a/app/models/project_trend.rb b/app/models/project_trend.rb new file mode 100644 index 000000000..28fd0ffad --- /dev/null +++ b/app/models/project_trend.rb @@ -0,0 +1,5 @@ +class ProjectTrend < ApplicationRecord + belongs_to :project + belongs_to :trend, polymorphic: true, optional: true + belongs_to :user +end diff --git a/app/models/user.rb b/app/models/user.rb index b136db2a8..45c20e6e7 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -166,6 +166,8 @@ class User < ApplicationRecord has_many :composes, dependent: :destroy has_many :compose_users, dependent: :destroy + has_many :project_trends, dependent: :destroy + # Groups and active users scope :active, lambda { where(status: STATUS_ACTIVE) } diff --git a/app/views/issues/_simple_issue_item.json.jbuilder b/app/views/issues/_simple_issue_item.json.jbuilder new file mode 100644 index 000000000..e701d179e --- /dev/null +++ b/app/views/issues/_simple_issue_item.json.jbuilder @@ -0,0 +1,18 @@ +json.name issue.subject +json.created_at format_time(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.issue_journal_size issue.get_journals_size +journals = issue.only_reply_journals + +json.issue_journals do + json.array! journals.to_a.each do |j| + json.user_name j.user.try(:show_real_name) + json.user_login j.user.try(:login) + json.user_picture url_to_avatar(j.user) + json.content j.try(:notes) + json.created_at time_from_now(j.created_on) + end +end + diff --git a/app/views/project_trends/index.json.jbuilder b/app/views/project_trends/index.json.jbuilder new file mode 100644 index 000000000..1a573007f --- /dev/null +++ b/app/views/project_trends/index.json.jbuilder @@ -0,0 +1,24 @@ +json.partial! "commons/success" +json.issues_count @project_issues_count +json.open_issues_count @project_open_issues_count +json.close_issues_count @project_close_issues_count +json.limit @limit +json.project_trends_size @project_trends_size +json.project_trends do + json.array! @project_trends.to_a.each do |trend| + json.id trend.id + json.trend_type trend.trend_type + json.action_type l("trend.#{trend.action_type}") + l("trend.#{trend.trend_type}") + json.trend_id trend.trend_id + json.user_login trend.user.login + json.user_avatar url_to_avatar(trend.user) + + if trend.trend_type == "Issue" + json.partial! "issues/simple_issue_item", locals: {issue: trend.trend} + end + + #后续需要天际pullrequest 和 版本的内容 + + end +end + diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index 0b1cdf0fe..5d24def63 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -14,6 +14,15 @@ zh-CN: 'processed': '已审批' 'refused': '已拒绝' 'agreed': '已同意' + trend: + Issue: 工单 + PullRequest: 合并请求 + Version: 版本发布 + create: 创建了 + journal: 回复了 + close: 关闭了 + merge: 合并了 + push: 发布了 journal_detail: issue_tags_value: 标签 diff --git a/config/routes.rb b/config/routes.rb index 675c00683..5cc9a565e 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -45,6 +45,7 @@ Rails.application.routes.draw do resources :licenses, only: [:index, :show] resources :projects, only: [:index, :create, :show] do + resources :project_trends, only: [:index, :create] resources :issues do collection do get :commit_issues diff --git a/db/migrate/20200106022157_create_project_trends.rb b/db/migrate/20200106022157_create_project_trends.rb new file mode 100644 index 000000000..70bcb8cdc --- /dev/null +++ b/db/migrate/20200106022157_create_project_trends.rb @@ -0,0 +1,12 @@ +class CreateProjectTrends < ActiveRecord::Migration[5.2] + def change + create_table :project_trends do |t| + t.integer :user_id + t.integer :project_id + t.references :trend, polymorphic: true, index: true + t.string :action_type + t.timestamps + end + add_index :project_trends, [:user_id, :project_id] + end +end diff --git a/spec/models/project_trend_spec.rb b/spec/models/project_trend_spec.rb new file mode 100644 index 000000000..06d3dac5c --- /dev/null +++ b/spec/models/project_trend_spec.rb @@ -0,0 +1,5 @@ +require 'rails_helper' + +RSpec.describe ProjectTrend, type: :model do + pending "add some examples to (or delete) #{__FILE__}" +end From 26e2093f77479df6ad77a0b28bb9597ea15b0744 Mon Sep 17 00:00:00 2001 From: SylorHuang Date: Mon, 6 Jan 2020 17:56:19 +0800 Subject: [PATCH 3/4] version release --- app/assets/javascripts/version_releases.js | 2 + app/assets/stylesheets/version_releases.scss | 3 + .../version_releases_controller.rb | 125 ++++++++++++++++++ app/helpers/version_releases_helper.rb | 2 + app/models/repository.rb | 1 + app/models/version_release.rb | 4 + app/services/gitea/client_service.rb | 12 ++ app/services/gitea/versions/create_service.rb | 34 +++++ app/services/gitea/versions/delete_service.rb | 24 ++++ app/services/gitea/versions/update_service.rb | 35 +++++ app/views/version_releases/edit.json.jbuilder | 1 + .../version_releases/index.json.jbuilder | 21 +++ config/locales/zh-CN.yml | 3 + config/routes.rb | 3 +- .../20200106082806_create_version_releases.rb | 18 +++ ...93141_add_project_id_to_version_release.rb | 6 + .../version_releases_controller_spec.rb | 5 + spec/helpers/version_releases_helper_spec.rb | 15 +++ spec/models/version_release_spec.rb | 5 + 19 files changed, 318 insertions(+), 1 deletion(-) create mode 100644 app/assets/javascripts/version_releases.js create mode 100644 app/assets/stylesheets/version_releases.scss create mode 100644 app/controllers/version_releases_controller.rb create mode 100644 app/helpers/version_releases_helper.rb create mode 100644 app/models/version_release.rb create mode 100644 app/services/gitea/versions/create_service.rb create mode 100644 app/services/gitea/versions/delete_service.rb create mode 100644 app/services/gitea/versions/update_service.rb create mode 100644 app/views/version_releases/edit.json.jbuilder create mode 100644 app/views/version_releases/index.json.jbuilder create mode 100644 db/migrate/20200106082806_create_version_releases.rb create mode 100644 db/migrate/20200106093141_add_project_id_to_version_release.rb create mode 100644 spec/controllers/version_releases_controller_spec.rb create mode 100644 spec/helpers/version_releases_helper_spec.rb create mode 100644 spec/models/version_release_spec.rb diff --git a/app/assets/javascripts/version_releases.js b/app/assets/javascripts/version_releases.js new file mode 100644 index 000000000..dee720fac --- /dev/null +++ b/app/assets/javascripts/version_releases.js @@ -0,0 +1,2 @@ +// Place all the behaviors and hooks related to the matching controller here. +// All this logic will automatically be available in application.js. diff --git a/app/assets/stylesheets/version_releases.scss b/app/assets/stylesheets/version_releases.scss new file mode 100644 index 000000000..e9f35f1b2 --- /dev/null +++ b/app/assets/stylesheets/version_releases.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the version_releases controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/controllers/version_releases_controller.rb b/app/controllers/version_releases_controller.rb new file mode 100644 index 000000000..41a1a062c --- /dev/null +++ b/app/controllers/version_releases_controller.rb @@ -0,0 +1,125 @@ +class VersionReleasesController < ApplicationController + before_action :set_user_and_project + before_action :require_login, except: [:index] + before_action :find_version , only: [:edit, :update, :destroy] + + def index + version_releases = @repository.version_releases.includes(:user) + version_releases = version_releases.where(draft: false) unless current_user.present? && (current_user == @user || current_user.admin?) + + @version_releases_size = version_releases.size + page = params[:page] + @limit = params[:limit] || 15 + @version_releases = version_releases.order("created_at desc").page(page).limit(@limit) + end + + def create + if params[:name].nil? + normal_status(-1, "名称不能为空") + elsif params[:tag_name].blank? + normal_status(-1, "标签名称不能为空") + else + ActiveRecord::Base.transaction do + version_params = { + body: params[:body], + draft: params[:draft] || false, + name: params[:name], + prerelease: params[:prerelease], + tag_name: params[:tag_name], + target_commitish: params[:target_commitish] || "master" #分支 + } + version_release = VersionRelease.new(version_params.merge(user_id: current_user.id, repository_id: @repository.id)) + if version_release.save! + git_version_release = Gitea::Versions::CreateService.new(@user.gitea_token, @repository.try(:login), @repository.try(:identifier), version_params).call + + if git_version_release + update_params = { + tarball_url: git_version_release["tarball_url"], + zipball_url: git_version_release["zipball_url"], + url: git_version_release["url"], + version_gid: git_version_release["id"], + } + version_release.update_attributes!(update_params) + end + end + rescue => e + puts "create version release error: #{e.message}" + raise Error, e.message + end + end + end + + def edit + + end + + def update + if params[:name].nil? + normal_status(-1, "名称不能为空") + elsif params[:tag_name].blank? + normal_status(-1, "标签名称不能为空") + else + ActiveRecord::Base.transaction do + version_params = { + body: params[:body], + draft: params[:draft] || false, + name: params[:name], + prerelease: params[:prerelease], + tag_name: params[:tag_name], + target_commitish: params[:target_commitish] || "master" #分支 + } + if @version.update_attributes!(version_params) + git_version_release = Gitea::Versions::UpdateService.new(@user.gitea_token, @repository.try(:login), @repository.try(:identifier), version_params, @version.try(:version_gid)).call + unless git_version_release + raise Error, "更新失败" + end + end + rescue => e + puts "update version release error: #{e.message}" + raise Error, e.message + end + end + end + + def destroy + ActiveRecord::Base.transaction do + if @version.destroy + git_version_release = Gitea::Versions::UpdateService.new(@user.gitea_token, @repository.try(:login), @repository.try(:identifier), version_params, @version.try(:version_gid)).call + unless git_version_release + raise Error, "删除失败" + end + end + rescue => e + puts "destroy version release error: #{e.message}" + raise Error, e.message + end + end + + + private + + # def set_project + # @project = Project.find_by_id(params[:project_id]) + # @repository = @project.repository #项目的仓库 + # unless @project.present? && @repository.present? + # normal_status(-1, "仓库不存在") + # end + # end + + def set_user_and_project + @project = Project.find_by_id(params[:project_id]) + @repository = @project.repository #项目的仓库 + @user = @project.owner + unless @user.present? && @project.present? && @repository.present? + normal_status(-1, "仓库不存在") + end + end + + def find_version + @version = VersionRelease.find_by_id(params[:id]) + unless @version.present? + normal_status(-1, "版本不存在") + end + end + +end diff --git a/app/helpers/version_releases_helper.rb b/app/helpers/version_releases_helper.rb new file mode 100644 index 000000000..cea9ee693 --- /dev/null +++ b/app/helpers/version_releases_helper.rb @@ -0,0 +1,2 @@ +module VersionReleasesHelper +end diff --git a/app/models/repository.rb b/app/models/repository.rb index b51463c4b..441a3b236 100644 --- a/app/models/repository.rb +++ b/app/models/repository.rb @@ -2,6 +2,7 @@ class Repository < ApplicationRecord self.inheritance_column = nil # FIX The single-table inheritance mechanism failed belongs_to :project, :touch => true belongs_to :user + has_many :version_releases, dependent: :destroy validates :identifier, presence: true, uniqueness: true diff --git a/app/models/version_release.rb b/app/models/version_release.rb new file mode 100644 index 000000000..22157e8a0 --- /dev/null +++ b/app/models/version_release.rb @@ -0,0 +1,4 @@ +class VersionRelease < ApplicationRecord + belongs_to :repository + belongs_to :user +end diff --git a/app/services/gitea/client_service.rb b/app/services/gitea/client_service.rb index 0d12c39ed..2995e7207 100644 --- a/app/services/gitea/client_service.rb +++ b/app/services/gitea/client_service.rb @@ -50,6 +50,18 @@ class Gitea::ClientService < ApplicationService render_status(response) end + def update(url, params={}) + puts "[gitea] request params: #{params}" + request_url = [api_url, url].join('').freeze + auth_token = authen_params(params[:token]) + + response = conn(auth_token).put do |req| + req.url "#{request_url}" + req.body = params[:data].to_json + end + render_status(response) + end + private def conn(auth={}) username = auth[:username] || access_key_id diff --git a/app/services/gitea/versions/create_service.rb b/app/services/gitea/versions/create_service.rb new file mode 100644 index 000000000..6f9b6e445 --- /dev/null +++ b/app/services/gitea/versions/create_service.rb @@ -0,0 +1,34 @@ +class Gitea::Versions::CreateService < Gitea::ClientService + attr_reader :token, :user_name, :repo, :params + + # params EX: + # { + # "body": "sylor", #user_name + # "draft": false, + # "name": "string", + # "prerelease": true, + # "tag_name": "string", + # "target_commitish": "string" + # } + def initialize(token, user_name, repo, params) + @token = token + @params = params + @user_name = user_name + @repo = repo + end + + def call + post(url, request_params) + end + + private + + def request_params + Hash.new.merge(token: token, data: params) + end + + def url + "/repos/#{@user}/#{@repo}/releases".freeze + end + +end diff --git a/app/services/gitea/versions/delete_service.rb b/app/services/gitea/versions/delete_service.rb new file mode 100644 index 000000000..98a649932 --- /dev/null +++ b/app/services/gitea/versions/delete_service.rb @@ -0,0 +1,24 @@ +class Gitea::Versions::DeleteService < Gitea::ClientService + attr_reader :token, :user_name, :repo,:version_gid + + def initialize(token, user_name, repo,version_gid) + @token = token + @user_name = user_name + @repo = repo + @version_gid = version_gid + end + + def call + delete(url, params) + end + + private + + def params + Hash.new.merge(token: @token) + end + + def url + "/repos/#{@user}/#{@repo}/releases/#{@version_gid}".freeze + end +end diff --git a/app/services/gitea/versions/update_service.rb b/app/services/gitea/versions/update_service.rb new file mode 100644 index 000000000..d9bc778e5 --- /dev/null +++ b/app/services/gitea/versions/update_service.rb @@ -0,0 +1,35 @@ +class Gitea::Versions::UpdateService < Gitea::ClientService + attr_reader :token, :user_name, :repo, :params, :version_gid + + # params EX: + # { + # "body": "sylor", #user_name + # "draft": false, + # "name": "string", + # "prerelease": true, + # "tag_name": "string", + # "target_commitish": "string" + # } + def initialize(token, user_name, repo, params,version_gid) + @token = token + @params = params + @user_name = user_name + @repo = repo + @version_gid = version_gid + end + + def call + update(url, request_params) + end + + private + + def request_params + Hash.new.merge(token: token, data: params) + end + + def url + "/repos/#{@user}/#{@repo}/releases/#{@version_gid}".freeze + end + +end diff --git a/app/views/version_releases/edit.json.jbuilder b/app/views/version_releases/edit.json.jbuilder new file mode 100644 index 000000000..4fbaca78d --- /dev/null +++ b/app/views/version_releases/edit.json.jbuilder @@ -0,0 +1 @@ +json.extract! @version, :id, :name, :body, :tag_name, :target_commitish, :draft, :prerelease,:version_gid \ No newline at end of file diff --git a/app/views/version_releases/index.json.jbuilder b/app/views/version_releases/index.json.jbuilder new file mode 100644 index 000000000..c2706aee9 --- /dev/null +++ b/app/views/version_releases/index.json.jbuilder @@ -0,0 +1,21 @@ +json.partial! "commons/success" +json.all_count @version_releases_size +json.limit @limit +json.version_releases do + json.array! @version_releases.to_a.each do |re| + json.id re.id + json.version_gid re.version_gid + json.name re.name + json.body re.body + json.tag_name re.tag_name + json.target_commitish re.target_commitish + json.release_type re.draft ? "草稿" : (re.prerelease ? "预发行" : "稳定") + json.tarball_url re.tarball_url + json.zipball_url re.zipball_url + json.url re.zipball_url + json.user_login re.user.try(:login) + json.user_avatar url_to_avatar(re.user) + json.created_at format_time(re.created_at) + json.format_created time_from_now(re.created_at) + end +end \ No newline at end of file diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index 5d24def63..63148bbd8 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -24,6 +24,9 @@ zh-CN: merge: 合并了 push: 发布了 + version: + draft: 草稿 + journal_detail: issue_tags_value: 标签 lock_issue: 锁定工单 diff --git a/config/routes.rb b/config/routes.rb index 5126e2ad0..d2ef92e8b 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,5 +1,5 @@ Rails.application.routes.draw do - + require 'sidekiq/web' require 'admin_constraint' mount Sidekiq::Web => '/sidekiq', :constraints => AdminConstraint.new @@ -46,6 +46,7 @@ Rails.application.routes.draw do resources :licenses, only: [:index, :show] resources :projects, only: [:index, :create, :show] do + resources :version_releases, only: [:index, :create, :edit, :update, :destroy] resources :project_trends, only: [:index, :create] resources :issues do collection do diff --git a/db/migrate/20200106082806_create_version_releases.rb b/db/migrate/20200106082806_create_version_releases.rb new file mode 100644 index 000000000..b061702ca --- /dev/null +++ b/db/migrate/20200106082806_create_version_releases.rb @@ -0,0 +1,18 @@ +class CreateVersionReleases < ActiveRecord::Migration[5.2] + def change + create_table :version_releases do |t| + t.integer :user_id + t.string :name + t.text :body + t.string :tag_name + t.string :target_commitish + t.boolean :draft, default: false + t.boolean :prerelease, default: false + t.string :tarball_url + t.string :zipball_url + t.string :url + t.string :version_gid + t.timestamps + end + end +end diff --git a/db/migrate/20200106093141_add_project_id_to_version_release.rb b/db/migrate/20200106093141_add_project_id_to_version_release.rb new file mode 100644 index 000000000..df75751b6 --- /dev/null +++ b/db/migrate/20200106093141_add_project_id_to_version_release.rb @@ -0,0 +1,6 @@ +class AddProjectIdToVersionRelease < ActiveRecord::Migration[5.2] + def change + add_column :version_releases, :repository_id, :integer + add_index :version_releases, [:repository_id] + end +end diff --git a/spec/controllers/version_releases_controller_spec.rb b/spec/controllers/version_releases_controller_spec.rb new file mode 100644 index 000000000..2bca43925 --- /dev/null +++ b/spec/controllers/version_releases_controller_spec.rb @@ -0,0 +1,5 @@ +require 'rails_helper' + +RSpec.describe VersionReleasesController, type: :controller do + +end diff --git a/spec/helpers/version_releases_helper_spec.rb b/spec/helpers/version_releases_helper_spec.rb new file mode 100644 index 000000000..d848552dc --- /dev/null +++ b/spec/helpers/version_releases_helper_spec.rb @@ -0,0 +1,15 @@ +require 'rails_helper' + +# Specs in this file have access to a helper object that includes +# the VersionReleasesHelper. For example: +# +# describe VersionReleasesHelper do +# describe "string concat" do +# it "concats two strings with spaces" do +# expect(helper.concat_strings("this","that")).to eq("this that") +# end +# end +# end +RSpec.describe VersionReleasesHelper, type: :helper do + pending "add some examples to (or delete) #{__FILE__}" +end diff --git a/spec/models/version_release_spec.rb b/spec/models/version_release_spec.rb new file mode 100644 index 000000000..2cccfcad7 --- /dev/null +++ b/spec/models/version_release_spec.rb @@ -0,0 +1,5 @@ +require 'rails_helper' + +RSpec.describe VersionRelease, type: :model do + pending "add some examples to (or delete) #{__FILE__}" +end From fd0398e3ca408aca1987a980e427676c12baefda Mon Sep 17 00:00:00 2001 From: SylorHuang Date: Mon, 6 Jan 2020 19:52:31 +0800 Subject: [PATCH 4/4] version release --- .../version_releases_controller.rb | 125 ++++++++++-------- app/views/version_releases/new.json.jbuilder | 2 + config/routes.rb | 2 +- 3 files changed, 76 insertions(+), 53 deletions(-) create mode 100644 app/views/version_releases/new.json.jbuilder diff --git a/app/controllers/version_releases_controller.rb b/app/controllers/version_releases_controller.rb index 41a1a062c..52f5f10a2 100644 --- a/app/controllers/version_releases_controller.rb +++ b/app/controllers/version_releases_controller.rb @@ -13,6 +13,18 @@ class VersionReleasesController < ApplicationController @version_releases = version_releases.order("created_at desc").page(page).limit(@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 + + end + def create if params[:name].nil? normal_status(-1, "名称不能为空") @@ -20,31 +32,38 @@ class VersionReleasesController < ApplicationController normal_status(-1, "标签名称不能为空") else ActiveRecord::Base.transaction do - version_params = { - body: params[:body], - draft: params[:draft] || false, - name: params[:name], - prerelease: params[:prerelease], - tag_name: params[:tag_name], - target_commitish: params[:target_commitish] || "master" #分支 - } - version_release = VersionRelease.new(version_params.merge(user_id: current_user.id, repository_id: @repository.id)) - if version_release.save! - git_version_release = Gitea::Versions::CreateService.new(@user.gitea_token, @repository.try(:login), @repository.try(:identifier), version_params).call + begin + version_params = { + body: params[:body], + draft: params[:draft] || false, + name: params[:name], + prerelease: params[:prerelease], + tag_name: params[:tag_name], + target_commitish: params[:target_commitish] || "master" #分支 + } + version_release = VersionRelease.new(version_params.merge(user_id: current_user.id, repository_id: @repository.id)) + if version_release.save! + git_version_release = Gitea::Versions::CreateService.new(@user.gitea_token, @repository.try(:login), @repository.try(:identifier), version_params).call - if git_version_release - update_params = { - tarball_url: git_version_release["tarball_url"], - zipball_url: git_version_release["zipball_url"], - url: git_version_release["url"], - version_gid: git_version_release["id"], - } - version_release.update_attributes!(update_params) + if git_version_release + update_params = { + tarball_url: git_version_release["tarball_url"], + zipball_url: git_version_release["zipball_url"], + url: git_version_release["url"], + version_gid: git_version_release["id"], + } + version_release.update_attributes!(update_params) + 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 - rescue => e - puts "create version release error: #{e.message}" - raise Error, e.message end end end @@ -60,52 +79,54 @@ class VersionReleasesController < ApplicationController normal_status(-1, "标签名称不能为空") else ActiveRecord::Base.transaction do - version_params = { - body: params[:body], - draft: params[:draft] || false, - name: params[:name], - prerelease: params[:prerelease], - tag_name: params[:tag_name], - target_commitish: params[:target_commitish] || "master" #分支 - } - if @version.update_attributes!(version_params) - git_version_release = Gitea::Versions::UpdateService.new(@user.gitea_token, @repository.try(:login), @repository.try(:identifier), version_params, @version.try(:version_gid)).call - unless git_version_release - raise Error, "更新失败" + begin + version_params = { + body: params[:body], + draft: params[:draft] || false, + name: params[:name], + prerelease: params[:prerelease], + tag_name: params[:tag_name], + target_commitish: params[:target_commitish] || "master" #分支 + } + if @version.update_attributes!(version_params) + git_version_release = Gitea::Versions::UpdateService.new(@user.gitea_token, @repository.try(:login), @repository.try(:identifier), version_params, @version.try(:version_gid)).call + unless git_version_release + raise Error, "更新失败" + end + normal_status(0, "更新成功") + else + normal_status(-1, "更新失败") end + rescue => e + puts "update version release error: #{e.message}" + raise Error, e.message end - rescue => e - puts "update version release error: #{e.message}" - raise Error, e.message end end end def destroy ActiveRecord::Base.transaction do - if @version.destroy - git_version_release = Gitea::Versions::UpdateService.new(@user.gitea_token, @repository.try(:login), @repository.try(:identifier), version_params, @version.try(:version_gid)).call - unless git_version_release - raise Error, "删除失败" + begin + if @version.destroy + git_version_release = Gitea::Versions::UpdateService.new(@user.gitea_token, @repository.try(:login), @repository.try(:identifier), version_params, @version.try(:version_gid)).call + unless git_version_release + raise Error, "删除失败" + end + normal_status(0, "删除成功") + else + normal_status(-1, "删除失败") end + rescue => e + puts "destroy version release error: #{e.message}" + raise Error, e.message end - rescue => e - puts "destroy version release error: #{e.message}" - raise Error, e.message end end private - # def set_project - # @project = Project.find_by_id(params[:project_id]) - # @repository = @project.repository #项目的仓库 - # unless @project.present? && @repository.present? - # normal_status(-1, "仓库不存在") - # end - # end - def set_user_and_project @project = Project.find_by_id(params[:project_id]) @repository = @project.repository #项目的仓库 diff --git a/app/views/version_releases/new.json.jbuilder b/app/views/version_releases/new.json.jbuilder new file mode 100644 index 000000000..f5c5fe67f --- /dev/null +++ b/app/views/version_releases/new.json.jbuilder @@ -0,0 +1,2 @@ +json.partial! "commons/success" +json.branches @all_branches \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index d2ef92e8b..fbaae68ac 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -46,7 +46,7 @@ Rails.application.routes.draw do resources :licenses, only: [:index, :show] resources :projects, only: [:index, :create, :show] do - resources :version_releases, only: [:index, :create, :edit, :update, :destroy] + resources :version_releases, only: [:index,:new, :create, :edit, :update, :destroy] resources :project_trends, only: [:index, :create] resources :issues do collection do