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..cf0e7b1ec --- /dev/null +++ b/app/controllers/api/v1/organizations/projects_controller.rb @@ -0,0 +1,46 @@ +class Api::V1::Organizations::ProjectsController < Api::V1::BaseController + 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? + @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 = kaminari_paginate(@projects) + end + + private + + def load_organization + @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 + + 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 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 diff --git a/config/routes/api.rb b/config/routes/api.rb index 2862abb03..4fcd20ba8 100644 --- a/config/routes/api.rb +++ b/config/routes/api.rb @@ -100,6 +100,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]