diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index d3f9c193a..6848fffaa 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -246,6 +246,14 @@ class ApplicationController < ActionController::Base tip_exception(401, "请登录后再操作") unless User.current.logged? end + def require_profile_completed + tip_exception(411, "请完善资料后再操作") unless User.current.profile_completed + end + + def require_user_profile_completed(user) + tip_exception(412, "请用户完善资料后再操作") unless user.profile_completed + end + # 异常提醒 def tip_exception(status = -1, message) raise Educoder::TipException.new(status, message) diff --git a/app/controllers/forks_controller.rb b/app/controllers/forks_controller.rb index cb18091c1..409133f06 100644 --- a/app/controllers/forks_controller.rb +++ b/app/controllers/forks_controller.rb @@ -1,5 +1,6 @@ class ForksController < ApplicationController before_action :require_login + before_action :require_profile_completed, only: [:create] before_action :load_project before_action :authenticate_project!, :authenticate_user! diff --git a/app/controllers/issues_controller.rb b/app/controllers/issues_controller.rb index ca74247d5..cfbd8a624 100644 --- a/app/controllers/issues_controller.rb +++ b/app/controllers/issues_controller.rb @@ -1,5 +1,6 @@ class IssuesController < ApplicationController before_action :require_login, except: [:index, :show, :index_chosen] + before_action :require_profile_completed, only: [:create] before_action :load_project before_action :set_user before_action :check_issue_permission diff --git a/app/controllers/journals_controller.rb b/app/controllers/journals_controller.rb index 6917974b8..ab00628d9 100644 --- a/app/controllers/journals_controller.rb +++ b/app/controllers/journals_controller.rb @@ -1,5 +1,6 @@ class JournalsController < ApplicationController before_action :require_login, except: [:index, :get_children_journals] + before_action :require_profile_completed, only: [:create] before_action :set_issue before_action :check_issue_permission before_action :set_journal, only: [:destroy, :edit, :update] diff --git a/app/controllers/members_controller.rb b/app/controllers/members_controller.rb index 097da69db..7fb211e38 100644 --- a/app/controllers/members_controller.rb +++ b/app/controllers/members_controller.rb @@ -2,6 +2,7 @@ class MembersController < ApplicationController before_action :require_login before_action :load_project before_action :find_user_with_id, only: %i[create remove change_role] + before_action :check_user_profile_completed, only: [:create] before_action :operate!, except: %i[index] before_action :check_member_exists!, only: %i[create] before_action :check_member_not_exists!, only: %i[remove change_role] @@ -61,4 +62,8 @@ class MembersController < ApplicationController def check_member_not_exists! return render_error("user_id为#{params[:user_id]}的用户还不是项目成员") unless member_exists? end + + def check_user_profile_completed + require_user_profile_completed(@user) + end end diff --git a/app/controllers/organizations/organizations_controller.rb b/app/controllers/organizations/organizations_controller.rb index 104db90ed..76aaca0fc 100644 --- a/app/controllers/organizations/organizations_controller.rb +++ b/app/controllers/organizations/organizations_controller.rb @@ -1,5 +1,6 @@ class Organizations::OrganizationsController < Organizations::BaseController before_action :require_login, except: [:index, :show, :recommend] + before_action :require_profile_completed, only: [:create] before_action :convert_image!, only: [:create, :update] before_action :load_organization, only: [:show, :update, :destroy] before_action :check_user_can_edit_org, only: [:update, :destroy] diff --git a/app/controllers/organizations/team_users_controller.rb b/app/controllers/organizations/team_users_controller.rb index 0c27e0701..43ed10708 100644 --- a/app/controllers/organizations/team_users_controller.rb +++ b/app/controllers/organizations/team_users_controller.rb @@ -1,6 +1,7 @@ class Organizations::TeamUsersController < Organizations::BaseController before_action :load_organization, :load_team before_action :load_operate_user, only: [:create, :destroy] + before_action :check_user_profile_completed, only: [:create] before_action :load_team_user, only: [:destroy] before_action :check_user_can_edit_org, only: [:create, :destroy] @@ -83,4 +84,8 @@ class Organizations::TeamUsersController < Organizations::BaseController tip_exception("组织团队成员不存在") if @team_user.nil? end + def check_user_profile_completed + require_user_profile_completed(@operate_user) + end + end \ No newline at end of file diff --git a/app/controllers/owners_controller.rb b/app/controllers/owners_controller.rb index 97444f7a4..73085e4a9 100644 --- a/app/controllers/owners_controller.rb +++ b/app/controllers/owners_controller.rb @@ -1,5 +1,5 @@ class OwnersController < ApplicationController - before_action :require_login + before_action :require_login, only: [:index] def index @owners = [] @@ -9,4 +9,53 @@ class OwnersController < ApplicationController teams: {can_create_org_project: true}) .distinct end -end \ No newline at end of file + + def show + @owner = Owner.find_by(login: params[:id]) || Owner.find_by(id: params[:id]) + return render_not_found unless @owner.present? + # 组织 + if @owner.is_a?(Organization) + return render_forbidden("没有查看组织的权限") if org_limited_condition || org_privacy_condition + @can_create_project = @owner.can_create_project?(current_user.id) + @is_admin = current_user.admin? || @owner.is_owner?(current_user.id) + @is_member = @owner.is_member?(current_user.id) + # 用户 + else + #待办事项,现在未做 + if User.current.admin? || User.current.login == @owner.login + @waiting_applied_messages = @owner.applied_messages.waiting + @common_applied_transfer_projects = AppliedTransferProject.where(owner_id: @owner.id).common + AppliedTransferProject.where(owner_id: Organization.joins(team_users: :team).where(team_users: {user_id: @owner.id}, teams: {authorize: %w(admin owner)} )).common + @common_applied_projects = AppliedProject.where(project_id: @owner.full_admin_projects).common + @undo_events = @waiting_applied_messages.size + @common_applied_transfer_projects.size + @common_applied_projects.size + else + @waiting_applied_messages = AppliedMessage.none + @common_applied_transfer_projects = AppliedTransferProject.none + @common_applied_projects = AppliedProject.none + @undo_events = 0 + end + #用户的组织数量 + # @user_composes_count = @user.composes.size + @user_composes_count = 0 + user_organizations = User.current.logged? ? @owner.organizations.with_visibility(%w(common limited)) + @owner.organizations.with_visibility("privacy").joins(:team_users).where(team_users: {user_id: current_user.id}) : @owner.organizations.with_visibility("common") + @user_org_count = user_organizations.size + normal_projects = Project.members_projects(@owner.id).to_sql + org_projects = Project.joins(team_projects: [team: :team_users]).where(team_users: {user_id: @owner.id}).to_sql + projects = Project.from("( #{ normal_projects} UNION #{ org_projects } ) AS projects").distinct + user_projects = User.current.logged? && (User.current.admin? || User.current.login == @owner.login) ? projects : projects.visible + @projects_common_count = user_projects.common.size + @projects_mirrior_count = user_projects.mirror.size + @projects_sync_mirrior_count = user_projects.sync_mirror.size + puts @owner.as_json + end + end + + private + def org_limited_condition + @owner.organization_extension.limited? && !current_user.logged? + end + + def org_privacy_condition + return false if current_user.admin? + @owner.organization_extension.privacy? && @owner.organization_users.where(user_id: current_user.id).blank? + end +end diff --git a/app/controllers/praise_tread_controller.rb b/app/controllers/praise_tread_controller.rb index 983697e08..c355e8fd2 100644 --- a/app/controllers/praise_tread_controller.rb +++ b/app/controllers/praise_tread_controller.rb @@ -1,5 +1,6 @@ class PraiseTreadController < ApplicationController before_action :require_login, except: %i[index] + before_action :require_profile_completed, only: [:like] before_action :find_project_with_id def index diff --git a/app/controllers/projects/applied_transfer_projects_controller.rb b/app/controllers/projects/applied_transfer_projects_controller.rb index e62033f21..d46274d88 100644 --- a/app/controllers/projects/applied_transfer_projects_controller.rb +++ b/app/controllers/projects/applied_transfer_projects_controller.rb @@ -1,5 +1,6 @@ class Projects::AppliedTransferProjectsController < Projects::BaseController before_action :check_auth + before_action :check_user_profile_completed, only: [:create] def organizations @organizations = Organization.includes(:organization_extension).joins(team_users: :team).where(team_users: {user_id: current_user.id}, teams: {authorize: %w(admin owner)}) @@ -23,4 +24,10 @@ class Projects::AppliedTransferProjectsController < Projects::BaseController def check_auth return render_forbidden unless current_user.admin? ||@project.owner?(current_user) end + + def check_user_profile_completed + @owner = Owner.find_by(login: params[:owner_name]) + return if @owner.is_a?(Organization) + require_user_profile_completed(@owner) + end end \ No newline at end of file diff --git a/app/controllers/projects/project_applies_controller.rb b/app/controllers/projects/project_applies_controller.rb index 37d9d615e..63922a461 100644 --- a/app/controllers/projects/project_applies_controller.rb +++ b/app/controllers/projects/project_applies_controller.rb @@ -1,4 +1,5 @@ class Projects::ProjectAppliesController < Projects::BaseController + before_action :require_profile_completed, only: [:create] def create project = Projects::ApplyJoinService.call(current_user, create_params) render_ok(project_id: project.id) diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 818abf548..02403bbd9 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -5,6 +5,7 @@ class ProjectsController < ApplicationController include Acceleratorable before_action :require_login, except: %i[index branches group_type_list simple show fork_users praise_users watch_users recommend about menu_list] + before_action :require_profile_completed, only: [:create, :migrate] before_action :load_repository, except: %i[index group_type_list migrate create recommend] before_action :authorizate_user_can_edit_project!, only: %i[update] before_action :project_public?, only: %i[fork_users praise_users watch_users] diff --git a/app/controllers/pull_requests_controller.rb b/app/controllers/pull_requests_controller.rb index 1a74e91a3..e1639969a 100644 --- a/app/controllers/pull_requests_controller.rb +++ b/app/controllers/pull_requests_controller.rb @@ -1,5 +1,6 @@ class PullRequestsController < ApplicationController before_action :require_login, except: [:index, :show, :files, :commits] + before_action :require_profile_completed, only: [:create] before_action :load_repository before_action :find_pull_request, except: [:index, :new, :create, :check_can_merge,:get_branches,:create_merge_infos, :files, :commits] before_action :load_pull_request, only: [:files, :commits] diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index a0184a348..470c61437 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -74,7 +74,7 @@ class UsersController < ApplicationController end def update - return render_not_found unless @user = User.find_by_id(params[:id]) || User.find_by(login: params[:id]) + return render_not_found unless @user = User.find_by(login: params[:id]) || User.find_by_id(params[:id]) return render_forbidden unless User.current.logged? && (current_user&.admin? || current_user.id == @user.id) Util.write_file(@image, avatar_path(@user)) if user_params[:image].present? @user.attributes = user_params.except(:image) diff --git a/app/controllers/version_releases_controller.rb b/app/controllers/version_releases_controller.rb index ac17c7d4b..618eb0735 100644 --- a/app/controllers/version_releases_controller.rb +++ b/app/controllers/version_releases_controller.rb @@ -7,7 +7,7 @@ class VersionReleasesController < ApplicationController def index version_releases = Gitea::Versions::ListService.new(@user.gitea_token, @user.try(:login), @repository.try(:identifier)).call @version_releases = version_releases - @user_permission = current_user.present? && (current_user == @user || current_user.admin?) + @user_permission = current_user.present? && (@repository.project.all_developers.include?(current_user) || current_user.admin?) @forge_releases = @repository.version_releases.select(:id,:version_gid, :created_at).includes(:attachments) end diff --git a/app/controllers/versions_controller.rb b/app/controllers/versions_controller.rb index 58cd9e87f..cf5b3b9f1 100644 --- a/app/controllers/versions_controller.rb +++ b/app/controllers/versions_controller.rb @@ -1,5 +1,6 @@ class VersionsController < ApplicationController before_action :require_login, except: [:index, :show] + before_action :require_profile_completed, only: [:create] before_action :load_repository before_action :check_issue_permission, except: [:show, :index] before_action :set_version, only: [:edit, :update, :destroy, :show,:update_status] diff --git a/app/controllers/watchers_controller.rb b/app/controllers/watchers_controller.rb index 38f60ebae..aa3642616 100644 --- a/app/controllers/watchers_controller.rb +++ b/app/controllers/watchers_controller.rb @@ -1,5 +1,6 @@ class WatchersController < ApplicationController before_action :require_login, except: %i[index] + before_action :require_profile_completed, only: [:follow] # before_action :find_project_with_id before_action :get_target diff --git a/app/models/user.rb b/app/models/user.rb index cbf0c66f7..1a7cdeecc 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -186,7 +186,7 @@ class User < Owner :show_email, :show_location, :show_department, :technical_title, :province, :city, :custom_department, to: :user_extension, allow_nil: true - before_save :update_hashed_password, :set_lastname + before_save :update_hashed_password, :set_lastname, :set_profile_completed after_create do SyncTrustieJob.perform_later("user", 1) if allow_sync_to_trustie? end @@ -783,6 +783,10 @@ class User < Owner def set_lastname self.lastname = self.nickname if changes[:nickname].present? end + + def set_profile_completed + self.profile_completed = self.nickname.present? && self.gender.present? && self.mail.present? && self.custom_department.present? + end end diff --git a/app/services/projects/apply_transfer_service.rb b/app/services/projects/apply_transfer_service.rb index ca26f86c4..0d9d41e7d 100644 --- a/app/services/projects/apply_transfer_service.rb +++ b/app/services/projects/apply_transfer_service.rb @@ -24,6 +24,7 @@ class Projects::ApplyTransferService < ApplicationService raise Error, '仓库标识不正确' if @project.identifier != params[:identifier] raise Error, '该仓库正在迁移' if @project.is_transfering raise Error, '新拥有者不存在' unless @owner.present? + raise Error, '新拥有者资料不完善' unless @owner.profile_completed raise Error, '新拥有者已经存在同名仓库!' if Project.where(user_id: @owner.id, identifier: params[:identifier]).present? raise Error, '未拥有转移权限' unless is_permit_owner end diff --git a/app/views/owners/show.json.jbuilder b/app/views/owners/show.json.jbuilder new file mode 100644 index 000000000..acd1314fd --- /dev/null +++ b/app/views/owners/show.json.jbuilder @@ -0,0 +1,24 @@ +json.type @owner.type +if @owner.is_a?(Organization) + json.partial! "organizations/organizations/detail", organization: @owner + json.can_create_project @can_create_project + json.is_admin @is_admin + json.is_member @is_member +else + json.partial! 'users/user', locals: { user: @owner } + json.undo_messages @waiting_applied_messages.size + json.undo_transfer_projects @common_applied_transfer_projects.size + json.undo_join_projects @common_applied_projects.size + json.undo_events @undo_events + json.user_composes_count @user_composes_count + json.user_org_count @user_org_count + json.common_projects_count @projects_common_count + json.mirror_projects_count @projects_mirrior_count + json.sync_mirror_projects_count @projects_sync_mirrior_count + json.created_time format_time(@owner.created_on) + json.email @owner.show_email ? @owner.mail : nil + json.province @owner.show_location ? @owner.province : nil + json.city @owner.show_location ? @owner.city : nil + json.custom_department @owner.show_department ? @owner.custom_department : nil + json.description @owner.description +end \ No newline at end of file diff --git a/app/views/users/_user.json.jbuilder b/app/views/users/_user.json.jbuilder index dc43d6bc8..a3744ab66 100644 --- a/app/views/users/_user.json.jbuilder +++ b/app/views/users/_user.json.jbuilder @@ -1,20 +1,20 @@ json.user_id user.id json.name user.full_name -json.username @user.full_name -json.real_name @user.real_name +json.username user.full_name +json.real_name user.real_name json.grade user.grade -json.gender @user.gender -json.login @user.login -json.user_id @user.id -json.image_url url_to_avatar(@user) -json.admin @user.admin? -json.user_identity @user.identity -json.is_watch current_user&.watched?(@user) -json.watched_count @user.fan_count #粉丝 -json.watching_count @user.follow_count #关注数 -json.created_time format_time(@user.created_on) -json.email @user.show_email ? @user.mail : nil -json.province @user.show_location ? @user.province : nil -json.city @user.show_location ? @user.city : nil -json.custom_department @user.show_department ? @user.custom_department : nil -json.description @user.description \ No newline at end of file +json.gender user.gender +json.login user.login +json.user_id user.id +json.image_url url_to_avatar(user) +json.admin user.admin? +json.user_identity user.identity +json.is_watch current_user&.watched?(user) +json.watched_count user.fan_count #粉丝 +json.watching_count user.follow_count #关注数 +json.created_time format_time(user.created_on) +json.email user.show_email ? user.mail : nil +json.province user.show_location ? user.province : nil +json.city user.show_location ? user.city : nil +json.custom_department user.show_department ? user.custom_department : nil +json.description user.description \ No newline at end of file diff --git a/app/views/users/_user_small.json.jbuilder b/app/views/users/_user_small.json.jbuilder index 54107b0e3..b8033ba77 100644 --- a/app/views/users/_user_small.json.jbuilder +++ b/app/views/users/_user_small.json.jbuilder @@ -4,5 +4,6 @@ json.array! users do |user| json.login user.login json.user_id user.id json.image_url url_to_avatar(user) + json.profile_completed user.profile_completed end diff --git a/app/views/users/get_user_info.json.jbuilder b/app/views/users/get_user_info.json.jbuilder index 50296f524..067019ef9 100644 --- a/app/views/users/get_user_info.json.jbuilder +++ b/app/views/users/get_user_info.json.jbuilder @@ -1,5 +1,6 @@ json.username @user.full_name json.real_name @user.real_name +json.nickname @user.nickname json.gender @user.gender json.login @user.login json.user_id @user.id diff --git a/config/routes.rb b/config/routes.rb index a3cc196ec..b9471b5a5 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -107,7 +107,7 @@ Rails.application.routes.draw do put 'commons/unhidden', to: 'commons#unhidden' delete 'commons/delete', to: 'commons#delete' - resources :owners, only: [:index] + resources :owners, only: [:index, :show] scope module: :organizations do resources :organizations, except: [:edit, :new] do