From 40955f5a99e60760ff8e37fb91c94aaf6f9186c3 Mon Sep 17 00:00:00 2001 From: yystopf Date: Fri, 25 Jul 2025 14:46:21 +0800 Subject: [PATCH 1/8] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E7=BB=84?= =?UTF-8?q?=E7=BB=87=E4=B8=8B=E6=9F=A5=E8=AF=A2=E6=8E=A5=E5=8F=A3=E4=BB=A5?= =?UTF-8?q?=E5=8F=8A=E7=BB=84=E7=BB=87=E6=88=90=E5=91=98=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../v1/organizations/projects_controller.rb | 18 ++++++++++ .../projects/index.json.jbuilder | 34 +++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 app/controllers/api/v1/organizations/projects_controller.rb create mode 100644 app/views/api/v1/organizations/projects/index.json.jbuilder diff --git a/app/controllers/api/v1/organizations/projects_controller.rb b/app/controllers/api/v1/organizations/projects_controller.rb new file mode 100644 index 000000000..047e95ec8 --- /dev/null +++ b/app/controllers/api/v1/organizations/projects_controller.rb @@ -0,0 +1,18 @@ +class Api::V1::Organizations::ProjectsController < Api::V1::BaseController + def index + public_projects_sql = @organization.projects.where(is_public: true).to_sql + private_projects_sql = @organization.projects + .where(is_public: false) + .joins(team_projects: {team: :team_users}) + .where(team_users: {user_id: current_user.id}).to_sql + @projects = Project.from("( #{ public_projects_sql} UNION #{ private_projects_sql } ) AS projects") + keywords = params[:search].to_s.each_char.select { |c| c.bytes.first < 240 }.join('')\ + @projects = @projects.where(is_public: params[:is_public]) if params[:is_public].present? + @projects = @projects.where(id: params[:pm_project_repository_ids].split(',')) if params[:pm_project_repository_ids].present? + @projects = @projects.where.not(id: params[:exclude_ids].to_s.split(",")) if params[:exclude_ids].present? + @projects = @projects.where(project_type: ['mirror', 'common']).where("gpid is not null") if params[:actived].present? + @projects = @projects.ransack(name_or_identifier_cont: keywords).result if params[:search].present? + @projects = @projects.includes(:owner).order("projects.#{sort} #{sort_direction}") + @projects = paginate(@projects) + end +end \ No newline at end of file diff --git a/app/views/api/v1/organizations/projects/index.json.jbuilder b/app/views/api/v1/organizations/projects/index.json.jbuilder new file mode 100644 index 000000000..91d479c1c --- /dev/null +++ b/app/views/api/v1/organizations/projects/index.json.jbuilder @@ -0,0 +1,34 @@ +json.total_count @projects.total_count +json.projects @projects.each do |project| + json.(project, :id, :name, :identifier, :description, :forked_count, :praises_count, :forked_from_project_id, :is_public) + json.mirror_url project.repository&.mirror_url + json.type project.numerical_for_project_type + json.praised project.praised_by?(current_user) + json.last_update_time render_unix_time(project.updated_on) + json.full_last_update_time project.updated_on + json.time_ago time_from_now(project.updated_on) + json.language do + if project.project_language.blank? + json.nil! + else + json.id project.project_language.id + json.name project.project_language.name + end + end + json.category do + if project.project_category.blank? + json.nil! + else + json.id project.project_category.id + json.name project.project_category.name + end + end + json.topics project.project_topics.each do |topic| + json.(topic, :id, :name) + end + json.url project.full_url + json.owner do + json.partial! "api/v1/users/simple_user", locals: {user: @organization.team_users.joins(:team).where(teams: {authorize: "owner"}).take&.user} + end + json.team_users_count @organization.team_users.size +end \ No newline at end of file From f9e7b92386229f80df6b24b6f413d5dcb7ad45e5 Mon Sep 17 00:00:00 2001 From: yystopf Date: Fri, 25 Jul 2025 14:48:50 +0800 Subject: [PATCH 2/8] fixed --- .../api/v1/organizations/projects_controller.rb | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/app/controllers/api/v1/organizations/projects_controller.rb b/app/controllers/api/v1/organizations/projects_controller.rb index 047e95ec8..78381b3c2 100644 --- a/app/controllers/api/v1/organizations/projects_controller.rb +++ b/app/controllers/api/v1/organizations/projects_controller.rb @@ -1,13 +1,16 @@ class Api::V1::Organizations::ProjectsController < Api::V1::BaseController - def index + before_action :load_organization + + def index public_projects_sql = @organization.projects.where(is_public: true).to_sql private_projects_sql = @organization.projects .where(is_public: false) .joins(team_projects: {team: :team_users}) .where(team_users: {user_id: current_user.id}).to_sql @projects = Project.from("( #{ public_projects_sql} UNION #{ private_projects_sql } ) AS projects") - keywords = params[:search].to_s.each_char.select { |c| c.bytes.first < 240 }.join('')\ - @projects = @projects.where(is_public: params[:is_public]) if params[:is_public].present? + # 表情处理 + keywords = params[:search].to_s.each_char.select { |c| c.bytes.first < 240 }.join('') + @projects = @projects.where(is_public: params[:is_public] if params[:is_public].present? @projects = @projects.where(id: params[:pm_project_repository_ids].split(',')) if params[:pm_project_repository_ids].present? @projects = @projects.where.not(id: params[:exclude_ids].to_s.split(",")) if params[:exclude_ids].present? @projects = @projects.where(project_type: ['mirror', 'common']).where("gpid is not null") if params[:actived].present? From 40576e321feec0743e48604485a0a726c055085d Mon Sep 17 00:00:00 2001 From: yystopf Date: Fri, 25 Jul 2025 14:50:27 +0800 Subject: [PATCH 3/8] fixed --- .../api/v1/organizations/projects_controller.rb | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/app/controllers/api/v1/organizations/projects_controller.rb b/app/controllers/api/v1/organizations/projects_controller.rb index 78381b3c2..b1f905404 100644 --- a/app/controllers/api/v1/organizations/projects_controller.rb +++ b/app/controllers/api/v1/organizations/projects_controller.rb @@ -10,7 +10,7 @@ class Api::V1::Organizations::ProjectsController < Api::V1::BaseController @projects = Project.from("( #{ public_projects_sql} UNION #{ private_projects_sql } ) AS projects") # 表情处理 keywords = params[:search].to_s.each_char.select { |c| c.bytes.first < 240 }.join('') - @projects = @projects.where(is_public: params[:is_public] if params[:is_public].present? + @projects = @projects.where(is_public: params[:is_public]) if params[:is_public].present? @projects = @projects.where(id: params[:pm_project_repository_ids].split(',')) if params[:pm_project_repository_ids].present? @projects = @projects.where.not(id: params[:exclude_ids].to_s.split(",")) if params[:exclude_ids].present? @projects = @projects.where(project_type: ['mirror', 'common']).where("gpid is not null") if params[:actived].present? @@ -18,4 +18,12 @@ class Api::V1::Organizations::ProjectsController < Api::V1::BaseController @projects = @projects.includes(:owner).order("projects.#{sort} #{sort_direction}") @projects = paginate(@projects) end + + private + + def load_organization + @organization = Organization.find_by(login: params[:organization_id]) || Organization.find_by(id: params[:organization_id]) + return render_not_found("组织不存在") if @organization.nil? + return render_forbidden("没有查看组织的权限") if org_limited_condition || org_privacy_condition + end end \ No newline at end of file From c18d1d2ce41bfe02a80fe4b0a9d24d4dea79a24a Mon Sep 17 00:00:00 2001 From: yystopf Date: Fri, 25 Jul 2025 14:53:03 +0800 Subject: [PATCH 4/8] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E7=BB=84?= =?UTF-8?q?=E7=BB=87=E9=A1=B9=E7=9B=AE=E6=9F=A5=E8=AF=A2=E8=B7=AF=E7=94=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/routes/api.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/config/routes/api.rb b/config/routes/api.rb index d66bedc50..0e320d8d1 100644 --- a/config/routes/api.rb +++ b/config/routes/api.rb @@ -85,6 +85,7 @@ defaults format: :json do end scope module: :organizations do resources :sync_repositories, only: [:create] + resources :projects, only: [:index] end scope module: :users do resources :projects, only: [:index] From e37d76d97248c71385f103f52d34a9cce0ee7ef6 Mon Sep 17 00:00:00 2001 From: yystopf Date: Fri, 25 Jul 2025 14:58:08 +0800 Subject: [PATCH 5/8] =?UTF-8?q?=E6=9B=B4=E6=94=B9=EF=BC=9A=E8=AF=B7?= =?UTF-8?q?=E6=B1=82=E5=8F=82=E6=95=B0=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/organizations/projects_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/organizations/projects_controller.rb b/app/controllers/organizations/projects_controller.rb index 380f32e48..ba03b059a 100644 --- a/app/controllers/organizations/projects_controller.rb +++ b/app/controllers/organizations/projects_controller.rb @@ -36,7 +36,7 @@ class Organizations::ProjectsController < Organizations::BaseController private def load_organization - @organization = Organization.find_by(login: params[:organization_id]) || Organization.find_by(id: params[:organization_id]) + @organization = Organization.find_by(login: params[:owner]) || Organization.find_by(id: params[:owner]) return render_not_found("组织不存在") if @organization.nil? return render_forbidden("没有查看组织的权限") if org_limited_condition || org_privacy_condition end From 9cf4cc290c2bc967540a5576a1853102506609c1 Mon Sep 17 00:00:00 2001 From: yystopf Date: Fri, 25 Jul 2025 15:01:36 +0800 Subject: [PATCH 6/8] =?UTF-8?q?=E6=9B=B4=E6=94=B9=EF=BC=9A=E8=AF=B7?= =?UTF-8?q?=E6=B1=82=E5=8F=82=E6=95=B0=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/v1/organizations/projects_controller.rb | 11 ++++++++++- app/controllers/organizations/projects_controller.rb | 2 +- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/app/controllers/api/v1/organizations/projects_controller.rb b/app/controllers/api/v1/organizations/projects_controller.rb index b1f905404..0fd95bb50 100644 --- a/app/controllers/api/v1/organizations/projects_controller.rb +++ b/app/controllers/api/v1/organizations/projects_controller.rb @@ -22,8 +22,17 @@ class Api::V1::Organizations::ProjectsController < Api::V1::BaseController private def load_organization - @organization = Organization.find_by(login: params[:organization_id]) || Organization.find_by(id: params[:organization_id]) + @organization = Organization.find_by(login: params[:owner]) || Organization.find_by(id: params[:owner]) return render_not_found("组织不存在") if @organization.nil? return render_forbidden("没有查看组织的权限") if org_limited_condition || org_privacy_condition end + + def org_limited_condition + @organization.organization_extension.limited? && !current_user.logged? + end + + def org_privacy_condition + return false if current_user.admin? + @organization.organization_extension.privacy? && @organization.organization_users.where(user_id: current_user.id).blank? + end end \ No newline at end of file diff --git a/app/controllers/organizations/projects_controller.rb b/app/controllers/organizations/projects_controller.rb index ba03b059a..380f32e48 100644 --- a/app/controllers/organizations/projects_controller.rb +++ b/app/controllers/organizations/projects_controller.rb @@ -36,7 +36,7 @@ class Organizations::ProjectsController < Organizations::BaseController private def load_organization - @organization = Organization.find_by(login: params[:owner]) || Organization.find_by(id: params[:owner]) + @organization = Organization.find_by(login: params[:organization_id]) || Organization.find_by(id: params[:organization_id]) return render_not_found("组织不存在") if @organization.nil? return render_forbidden("没有查看组织的权限") if org_limited_condition || org_privacy_condition end From 9544a5b22d9a792a34ca1c3f963a07b7e333ceb1 Mon Sep 17 00:00:00 2001 From: yystopf Date: Fri, 25 Jul 2025 15:02:42 +0800 Subject: [PATCH 7/8] fixed --- .../api/v1/organizations/projects_controller.rb | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/app/controllers/api/v1/organizations/projects_controller.rb b/app/controllers/api/v1/organizations/projects_controller.rb index 0fd95bb50..84e5aa973 100644 --- a/app/controllers/api/v1/organizations/projects_controller.rb +++ b/app/controllers/api/v1/organizations/projects_controller.rb @@ -35,4 +35,12 @@ class Api::V1::Organizations::ProjectsController < Api::V1::BaseController return false if current_user.admin? @organization.organization_extension.privacy? && @organization.organization_users.where(user_id: current_user.id).blank? end + + def sort + Project.column_names.include?(params[:sort_by]) ? params[:sort_by] : 'updated_on' + end + + def sort_direction + %w(desc asc).include?(params[:sort_direction]) ? params[:sort_direction] : 'desc' + end end \ No newline at end of file From f4248ec14be8bda4f0c34fbf8e944af695c4e029 Mon Sep 17 00:00:00 2001 From: yystopf Date: Fri, 25 Jul 2025 15:06:50 +0800 Subject: [PATCH 8/8] fixed --- app/controllers/api/v1/organizations/projects_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/api/v1/organizations/projects_controller.rb b/app/controllers/api/v1/organizations/projects_controller.rb index 84e5aa973..cf0e7b1ec 100644 --- a/app/controllers/api/v1/organizations/projects_controller.rb +++ b/app/controllers/api/v1/organizations/projects_controller.rb @@ -16,7 +16,7 @@ class Api::V1::Organizations::ProjectsController < Api::V1::BaseController @projects = @projects.where(project_type: ['mirror', 'common']).where("gpid is not null") if params[:actived].present? @projects = @projects.ransack(name_or_identifier_cont: keywords).result if params[:search].present? @projects = @projects.includes(:owner).order("projects.#{sort} #{sort_direction}") - @projects = paginate(@projects) + @projects = kaminari_paginate(@projects) end private