| @@ -73,7 +73,8 @@ class ProjectsController < ApplicationController | |||||
| private = params[:private] | private = params[:private] | ||||
| gitea_params = { | gitea_params = { | ||||
| private: private, | private: private, | ||||
| default_branch: params[:default_branch] | |||||
| default_branch: params[:default_branch], | |||||
| website: params[:website] | |||||
| } | } | ||||
| if [true, false].include? private | if [true, false].include? private | ||||
| new_project_params = project_params.except(:private).merge(is_public: !private) | new_project_params = project_params.except(:private).merge(is_public: !private) | ||||
| @@ -162,7 +163,7 @@ class ProjectsController < ApplicationController | |||||
| private | private | ||||
| def project_params | 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) | :project_category_id, :project_language_id, :license_id, :ignore_id, :private) | ||||
| end | end | ||||
| @@ -11,6 +11,20 @@ class RepositoriesController < ApplicationController | |||||
| before_action :get_latest_commit, only: %i[entries sub_entries top_counts] | before_action :get_latest_commit, only: %i[entries sub_entries top_counts] | ||||
| before_action :get_statistics, only: %i[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 | def show | ||||
| @user = current_user | @user = current_user | ||||
| @repo = @project.repository | @repo = @project.repository | ||||
| @@ -187,7 +201,7 @@ class RepositoriesController < ApplicationController | |||||
| end | end | ||||
| def get_ref | def get_ref | ||||
| @ref = params[:ref] || "master" | |||||
| @ref = params[:ref] || @project.default_branch | |||||
| end | end | ||||
| def get_latest_commit | 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 | 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 :no_anomory_projects, -> {where("projects.user_id is not null and projects.user_id != ?", 2)} | ||||
| scope :recommend, -> { visible.project_statics_select.where(recommend: true) } | 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) | def self.search_project(search) | ||||
| @@ -41,6 +41,8 @@ class Repository < ApplicationRecord | |||||
| validates :identifier, presence: true | validates :identifier, presence: true | ||||
| delegate :default_branch, to: :project, allow_nil: true | |||||
| def to_param | def to_param | ||||
| self.identifier.parameterize | self.identifier.parameterize | ||||
| end | 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 | end | ||||
| def call | def call | ||||
| post(url, request_params) | |||||
| response = post(url, request_params) | |||||
| render_status(response) | |||||
| end | end | ||||
| private | private | ||||
| @@ -36,6 +36,7 @@ class Projects::CreateService < ApplicationService | |||||
| is_public: repo_is_public, | is_public: repo_is_public, | ||||
| ignore_id: params[:ignore_id], | ignore_id: params[:ignore_id], | ||||
| license_id: params[:license_id], | license_id: params[:license_id], | ||||
| website: params[:website], | |||||
| identifier: params[:repository_name] #新增,hs | identifier: params[:repository_name] #新增,hs | ||||
| } | } | ||||
| end | end | ||||
| @@ -44,6 +45,7 @@ class Projects::CreateService < ApplicationService | |||||
| { | { | ||||
| hidden: !repo_is_public, | hidden: !repo_is_public, | ||||
| user_id: params[:user_id], | user_id: params[:user_id], | ||||
| website: params[:website], | |||||
| identifier: params[:repository_name] | identifier: params[:repository_name] | ||||
| } | } | ||||
| end | end | ||||
| @@ -62,6 +62,7 @@ class Repositories::CreateService < ApplicationService | |||||
| project.update_columns( | project.update_columns( | ||||
| gpid: gitea_repository["id"], | gpid: gitea_repository["id"], | ||||
| identifier: repository.identifier, | identifier: repository.identifier, | ||||
| default_branch: gitea_repository["default_branch"], | |||||
| forked_count: gitea_repository["forks_count"]) | forked_count: gitea_repository["forks_count"]) | ||||
| end | end | ||||
| 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 | end | ||||
| #json.tags_count @tags_count | #json.tags_count @tags_count | ||||
| #json.branches_count @branches_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.zip_url render_zip_url(@project, @ref) | ||||
| json.tar_url render_tar_url(@project, @ref) | json.tar_url render_tar_url(@project, @ref) | ||||
| json.entries do | json.entries do | ||||
| @@ -380,6 +380,7 @@ Rails.application.routes.draw do | |||||
| resource :repositories, path: '/', only: [:show, :create, :edit] do | resource :repositories, path: '/', only: [:show, :create, :edit] do | ||||
| member do | member do | ||||
| get :detail | |||||
| get :archive | get :archive | ||||
| get :top_counts | get :top_counts | ||||
| get :entries | 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 | |||||