| @@ -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 | |||
| @@ -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 | |||
| @@ -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) | |||
| @@ -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 | |||
| @@ -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 | |||
| @@ -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 | |||
| @@ -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 | |||
| @@ -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 | |||
| @@ -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 | |||
| @@ -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] | |||
| @@ -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 | |||
| @@ -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 | |||
| @@ -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 | |||