From b43926f69ffcddef5ad2f5fae0dd7c521ef0675c Mon Sep 17 00:00:00 2001 From: "vilet.yy" Date: Mon, 15 Mar 2021 19:01:35 +0800 Subject: [PATCH] add: new project detail --- app/controllers/projects_controller.rb | 5 +- app/controllers/repositories_controller.rb | 16 +- app/models/project.rb | 145 +++++++++--------- app/models/repository.rb | 2 + .../repository/contributors/get_service.rb | 22 +++ app/services/gitea/versions/create_service.rb | 3 +- app/services/projects/create_service.rb | 2 + app/services/repositories/create_service.rb | 1 + app/services/repositories/detail_service.rb | 64 ++++++++ app/views/repositories/detail.json.jbuilder | 90 +++++++++++ app/views/repositories/entries.json.jbuilder | 2 +- config/routes.rb | 1 + .../20210315093350_add_website_to_projects.rb | 6 + 13 files changed, 284 insertions(+), 75 deletions(-) create mode 100644 app/services/gitea/repository/contributors/get_service.rb create mode 100644 app/services/repositories/detail_service.rb create mode 100644 app/views/repositories/detail.json.jbuilder create mode 100644 db/migrate/20210315093350_add_website_to_projects.rb diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index c8f3027d..5358a554 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -73,7 +73,8 @@ class ProjectsController < ApplicationController private = params[:private] gitea_params = { private: private, - default_branch: params[:default_branch] + default_branch: params[:default_branch], + website: params[:website] } if [true, false].include? private new_project_params = project_params.except(:private).merge(is_public: !private) @@ -162,7 +163,7 @@ class ProjectsController < ApplicationController private def project_params - params.permit(:user_id, :name, :description, :repository_name, + params.permit(:user_id, :name, :description, :repository_name, :website, :project_category_id, :project_language_id, :license_id, :ignore_id, :private) end diff --git a/app/controllers/repositories_controller.rb b/app/controllers/repositories_controller.rb index 6683dde4..e327554a 100644 --- a/app/controllers/repositories_controller.rb +++ b/app/controllers/repositories_controller.rb @@ -11,6 +11,20 @@ class RepositoriesController < ApplicationController before_action :get_latest_commit, only: %i[entries sub_entries top_counts] before_action :get_statistics, only: %i[top_counts] + # 新版项目详情 + def detail + @user = current_user + @result = Repositories::DetailService.call(@owner, @repository, @user) + @project_fork_id = @project.try(:forked_from_project_id) + if @project_fork_id.present? + @fork_project = Project.find_by(id: @project_fork_id) + @fork_project_user = @fork_project.owner + end + rescue Exception => e + uid_logger_error(e.message) + tip_exception(e.message) + end + def show @user = current_user @repo = @project.repository @@ -187,7 +201,7 @@ class RepositoriesController < ApplicationController end def get_ref - @ref = params[:ref] || "master" + @ref = params[:ref] || @project.default_branch end def get_latest_commit diff --git a/app/models/project.rb b/app/models/project.rb index a5beb448..5b05def1 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -1,73 +1,76 @@ -# == Schema Information -# -# Table name: projects -# -# id :integer not null, primary key -# name :string(255) default(""), not null -# description :text(4294967295) -# homepage :string(255) default("") -# is_public :boolean default("1"), not null -# parent_id :integer -# created_on :datetime -# updated_on :datetime -# identifier :string(255) -# status :integer default("1"), not null -# lft :integer -# rgt :integer -# inherit_members :boolean default("0"), not null -# project_type :integer default("0") -# hidden_repo :boolean default("0"), not null -# attachmenttype :integer default("1") -# user_id :integer -# dts_test :integer default("0") -# enterprise_name :string(255) -# organization_id :integer -# project_new_type :integer -# gpid :integer -# forked_from_project_id :integer -# forked_count :integer default("0") -# publish_resource :integer default("0") -# visits :integer default("0") -# hot :integer default("0") -# invite_code :string(255) -# qrcode :string(255) -# qrcode_expiretime :integer default("0") -# script :text(65535) -# training_status :integer default("0") -# rep_identifier :string(255) -# project_category_id :integer -# project_language_id :integer -# license_id :integer -# ignore_id :integer -# praises_count :integer default("0") -# watchers_count :integer default("0") -# issues_count :integer default("0") -# pull_requests_count :integer default("0") -# language :string(255) -# versions_count :integer default("0") -# issue_tags_count :integer default("0") -# closed_issues_count :integer default("0") -# open_devops :boolean default("0") -# gitea_webhook_id :integer -# open_devops_count :integer default("0") -# recommend :boolean default("0") -# platform :integer default("0") -# -# Indexes -# -# index_projects_on_forked_from_project_id (forked_from_project_id) -# index_projects_on_identifier (identifier) -# index_projects_on_is_public (is_public) -# index_projects_on_lft (lft) -# index_projects_on_name (name) -# index_projects_on_platform (platform) -# index_projects_on_project_type (project_type) -# index_projects_on_recommend (recommend) -# index_projects_on_rgt (rgt) -# index_projects_on_status (status) -# index_projects_on_updated_on (updated_on) -# - +# == Schema Information +# +# Table name: projects +# +# id :integer not null, primary key +# name :string(255) default(""), not null +# description :text(4294967295) +# homepage :string(255) default("") +# is_public :boolean default("1"), not null +# parent_id :integer +# created_on :datetime +# updated_on :datetime +# identifier :string(255) +# status :integer default("1"), not null +# lft :integer +# rgt :integer +# inherit_members :boolean default("0"), not null +# project_type :integer default("0") +# hidden_repo :boolean default("0"), not null +# attachmenttype :integer default("1") +# user_id :integer +# dts_test :integer default("0") +# enterprise_name :string(255) +# organization_id :integer +# project_new_type :integer +# gpid :integer +# forked_from_project_id :integer +# forked_count :integer default("0") +# publish_resource :integer default("0") +# visits :integer default("0") +# hot :integer default("0") +# invite_code :string(255) +# qrcode :string(255) +# qrcode_expiretime :integer default("0") +# script :text(65535) +# training_status :integer default("0") +# rep_identifier :string(255) +# project_category_id :integer +# project_language_id :integer +# license_id :integer +# ignore_id :integer +# praises_count :integer default("0") +# watchers_count :integer default("0") +# issues_count :integer default("0") +# pull_requests_count :integer default("0") +# language :string(255) +# versions_count :integer default("0") +# issue_tags_count :integer default("0") +# closed_issues_count :integer default("0") +# open_devops :boolean default("0") +# gitea_webhook_id :integer +# open_devops_count :integer default("0") +# recommend :boolean default("0") +# platform :integer default("0") +# default_branch :string(255) default("master") +# website :string(255) +# +# Indexes +# +# index_projects_on_forked_from_project_id (forked_from_project_id) +# index_projects_on_identifier (identifier) +# index_projects_on_is_public (is_public) +# index_projects_on_lft (lft) +# index_projects_on_name (name) +# index_projects_on_platform (platform) +# index_projects_on_project_type (project_type) +# index_projects_on_recommend (recommend) +# index_projects_on_rgt (rgt) +# index_projects_on_status (status) +# index_projects_on_updated_on (updated_on) +# + + class Project < ApplicationRecord @@ -116,6 +119,8 @@ class Project < ApplicationRecord scope :no_anomory_projects, -> {where("projects.user_id is not null and projects.user_id != ?", 2)} scope :recommend, -> { visible.project_statics_select.where(recommend: true) } + delegate :content, to: :project_detail, allow_nil: true + delegate :name, to: :license, prefix: true, allow_nil: true def self.search_project(search) diff --git a/app/models/repository.rb b/app/models/repository.rb index 934eaa0e..b6d2321f 100644 --- a/app/models/repository.rb +++ b/app/models/repository.rb @@ -41,6 +41,8 @@ class Repository < ApplicationRecord validates :identifier, presence: true + delegate :default_branch, to: :project, allow_nil: true + def to_param self.identifier.parameterize end diff --git a/app/services/gitea/repository/contributors/get_service.rb b/app/services/gitea/repository/contributors/get_service.rb new file mode 100644 index 00000000..1ee1c395 --- /dev/null +++ b/app/services/gitea/repository/contributors/get_service.rb @@ -0,0 +1,22 @@ +class Gitea::Repository::Contributors::GetService < Gitea::ClientService + attr_reader :owner, :repo_name + + def initialize(owner, repo_name) + @owner = owner + @repo_name = repo_name + end + + def call + response = get(url, params) + render_status(response) + end + + private + def params + Hash.new.merge(token: owner.gitea_token) + end + + def url + "/repos/#{owner.login}/#{repo_name}/contributors" + end +end \ No newline at end of file diff --git a/app/services/gitea/versions/create_service.rb b/app/services/gitea/versions/create_service.rb index de21ad97..04fed00f 100644 --- a/app/services/gitea/versions/create_service.rb +++ b/app/services/gitea/versions/create_service.rb @@ -18,7 +18,8 @@ class Gitea::Versions::CreateService < Gitea::ClientService end def call - post(url, request_params) + response = post(url, request_params) + render_status(response) end private diff --git a/app/services/projects/create_service.rb b/app/services/projects/create_service.rb index dc14d10d..25053e95 100644 --- a/app/services/projects/create_service.rb +++ b/app/services/projects/create_service.rb @@ -36,6 +36,7 @@ class Projects::CreateService < ApplicationService is_public: repo_is_public, ignore_id: params[:ignore_id], license_id: params[:license_id], + website: params[:website], identifier: params[:repository_name] #新增,hs } end @@ -44,6 +45,7 @@ class Projects::CreateService < ApplicationService { hidden: !repo_is_public, user_id: params[:user_id], + website: params[:website], identifier: params[:repository_name] } end diff --git a/app/services/repositories/create_service.rb b/app/services/repositories/create_service.rb index 4c5519f2..18e72644 100644 --- a/app/services/repositories/create_service.rb +++ b/app/services/repositories/create_service.rb @@ -62,6 +62,7 @@ class Repositories::CreateService < ApplicationService project.update_columns( gpid: gitea_repository["id"], identifier: repository.identifier, + default_branch: gitea_repository["default_branch"], forked_count: gitea_repository["forks_count"]) end end diff --git a/app/services/repositories/detail_service.rb b/app/services/repositories/detail_service.rb new file mode 100644 index 00000000..0dbbb490 --- /dev/null +++ b/app/services/repositories/detail_service.rb @@ -0,0 +1,64 @@ +class Repositories::DetailService < ApplicationService + include Repository::LanguagesPercentagable + attr_reader :owner, :repo, :user + def initialize(owner, repo, user) + @owner = owner + @repo = repo + @user = user + end + + def call + if @repo.project.educoder? + return { + repo: {}, + release: [], + branch: [], + tag: [], + contributor: [], + language: {}, + readme: {} + } + else + return { + repo: repo_suitable, + release: release_suitable, + branch: branch_suitable, + tag: tag_suitable, + contributor: contributor_suitable, + language: language_suitable, + readme: readme_suitable + } + end + end + + private + def repo_suitable + Gitea::Repository::GetService.call(@owner, @repo.identifier) + end + + def release_suitable + Gitea::Versions::ListService.call(@owner.gitea_token, @owner.try(:login), @repo.try(:identifier)) + end + + def branch_suitable + Gitea::Repository::Branches::ListService.call(@owner, @repo.identifier) + end + + def tag_suitable + Gitea::Repository::Tags::ListService.call(@user&.gitea_token, @owner.login, @repo.identifier) + end + + def contributor_suitable + Gitea::Repository::Contributors::GetService.call(@owner, @repo.identifier) + end + + def language_suitable + result = Gitea::Repository::Languages::ListService.call(@owner.login, @repo.identifier, @user&.gitea_token) + result[:status] === :success ? hash_transform_precentagable(result[:body]) : nil + end + + def readme_suitable + result = Gitea::Repository::Readme::GetService.call(@owner.login, @repo.identifier, @repo.default_branch, @owner.gitea_token) + result[:status] === :success ? result[:body] : nil + end +end \ No newline at end of file diff --git a/app/views/repositories/detail.json.jbuilder b/app/views/repositories/detail.json.jbuilder new file mode 100644 index 00000000..0931802e --- /dev/null +++ b/app/views/repositories/detail.json.jbuilder @@ -0,0 +1,90 @@ +json.content @project.content +json.website @project.website +json.readme @result[:readme].merge(content: readme_render_decode64_content(@result[:readme]["content"], nil)) +json.identifier render_identifier(@project) +json.name @project.name +json.project_id @project.id +json.repo_id @repository.id +json.issues_count @project.issues_count.to_i - @project.pull_requests_count.to_i +json.pull_requests_count @project.pull_requests_count +json.project_identifier render_identifier(@project) +json.praises_count @project.praises_count.to_i +json.forked_count @project.forked_count.to_i +json.watchers_count @project.watchers_count.to_i +json.versions_count @project.versions_count #里程碑数量 +json.version_releases_count @project.releases_size(@user.try(:id), "all") +json.version_releasesed_count @project.releases_size(@user.try(:id), "released") #已发行的版本 +json.permission render_permission(@user, @project) +json.mirror_url @project&.repository.mirror_url +json.mirror @project&.repository.mirror_url.present? +json.type @project.numerical_for_project_type +json.open_devops @project.open_devops? + +unless @project.common? + json.mirror_status @repository.mirror_status + json.mirror_num @repository.mirror_num + json.first_sync @repository.first_sync? +end + +json.watched @project.watched_by? @user +json.praised @project.praised_by? @user +json.status @project.status +json.forked_from_project_id @project_fork_id +json.fork_info do + if @fork_project.present? + json.fork_form_name @fork_project.try(:name) + json.fork_project_user_login @fork_project_user.try(:login) + json.fork_project_identifier @fork_project.identifier + json.fork_project_user_name @fork_project_user.try(:show_real_name) + end +end +if @result[:repo] + json.size replace_bytes_to_b(number_to_human_size(@result[:repo]['size'].to_i*1024)) + json.ssh_url @result[:repo]['ssh_url'] + json.clone_url @result[:repo]['clone_url'] + json.default_branch @result[:repo]['default_branch'] + json.empty @result[:repo]['empty'] + json.full_name @result[:repo]['full_name'] + json.private @result[:repo]['private'] +end +json.license_name @project.license_name +json.release_versions do + json.list @result[:release].each do |release| + forge_version = VersionRelease.find_by(version_gid: release["id"]) + json.id forge_version.id + json.name release["name"] + json.tag_name release["tag_name"] + json.created_at format_time(release["created_at"].to_time) + end + json.total_count @result[:release].size +end +json.branches do + json.list @result[:branch].each do |branch| + json.name branch["name"] + end + json.total_count @result[:branch].size +end +json.tags do + json.list @result[:tag].each do |tag| + json.name tag["name"] + end + json.total_count @result[:tag].size +end +json.contributors do + total_count = @result[:contributor].size + json.list @result[:contributor].each do |contributor| + user = User.find_by(gitea_uid: contributor["id"]) + if contributor["login"] == "root" + total_count -= 1 + next + end + json.contributions contributor["contributions"] + json.gid contributor["id"] + json.login user.login + json.type user&.type + json.name user.real_name + json.image_url url_to_avatar(user) + end + json.total_count total_count +end +json.languages @result[:language] diff --git a/app/views/repositories/entries.json.jbuilder b/app/views/repositories/entries.json.jbuilder index 9efa0c11..6964c1c5 100644 --- a/app/views/repositories/entries.json.jbuilder +++ b/app/views/repositories/entries.json.jbuilder @@ -41,7 +41,7 @@ if @project.forge? end #json.tags_count @tags_count #json.branches_count @branches_count - #json.commits_count @commits_count + json.commits_count @commits_count json.zip_url render_zip_url(@project, @ref) json.tar_url render_tar_url(@project, @ref) json.entries do diff --git a/config/routes.rb b/config/routes.rb index 228c546c..4f350314 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -380,6 +380,7 @@ Rails.application.routes.draw do resource :repositories, path: '/', only: [:show, :create, :edit] do member do + get :detail get :archive get :top_counts get :entries diff --git a/db/migrate/20210315093350_add_website_to_projects.rb b/db/migrate/20210315093350_add_website_to_projects.rb new file mode 100644 index 00000000..a3918dda --- /dev/null +++ b/db/migrate/20210315093350_add_website_to_projects.rb @@ -0,0 +1,6 @@ +class AddWebsiteToProjects < ActiveRecord::Migration[5.2] + def change + add_column :projects, :default_branch, :string, default: 'master' + add_column :projects, :website, :string + end +end