diff --git a/app/controllers/compare_controller.rb b/app/controllers/compare_controller.rb index 382e7506e..1aab7adbe 100644 --- a/app/controllers/compare_controller.rb +++ b/app/controllers/compare_controller.rb @@ -9,6 +9,10 @@ class CompareController < ApplicationController load_compare_params compare @merge_status, @merge_message = get_merge_message + @page_size = page_size <= 0 ? 1 : page_size + @page_limit = page_limit <=0 ? 15 : page_limit + @page_offset = (@page_size -1) * @page_limit + Rails.logger.info("+========#{@page_size}-#{@page_limit}-#{@page_offset}") end private @@ -53,4 +57,12 @@ class CompareController < ApplicationController def gitea_compare(base, head) Gitea::Repository::Commits::CompareService.call(@owner.login, @project.identifier, Addressable::URI.escape(base), Addressable::URI.escape(head), current_user.gitea_token) end + + def page_size + params.fetch(:page, 1).to_i + end + + def page_limit + params.fetch(:limit, 15).to_i + end end diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index be9a93d9f..c4e440aff 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -13,6 +13,8 @@ class ProjectsController < ApplicationController def menu_list menu = [] + user_is_admin = current_user.admin? || @project.manager?(current_user) + menu.append(menu_hash_by_name("home")) menu.append(menu_hash_by_name("code")) if @project.has_menu_permission("code") menu.append(menu_hash_by_name("issues")) if @project.has_menu_permission("issues") @@ -22,7 +24,8 @@ class ProjectsController < ApplicationController menu.append(menu_hash_by_name("wiki")) if @project.has_menu_permission("wiki") && @project.forge? menu.append(menu_hash_by_name("resources")) if @project.has_menu_permission("resources") && @project.forge? menu.append(menu_hash_by_name("activity")) - menu.append(menu_hash_by_name("settings")) if (current_user.admin? || @project.manager?(current_user)) && @project.forge? + menu.append(menu_hash_by_name("settings")) if user_is_admin && @project.forge? + menu.append(menu_hash_by_name("quit")) if !user_is_admin && @project.member(current_user.id) && @project.forge? render json: menu end @@ -88,7 +91,7 @@ class ProjectsController < ApplicationController return @branches = [] unless @project.forge? # result = Gitea::Repository::Branches::ListService.call(@owner, @project.identifier) - result = Gitea::Repository::Branches::ListNameService.call(@owner, @project.identifier) + result = Gitea::Repository::Branches::ListNameService.call(@owner, @project.identifier, params[:name]) @branches = result.is_a?(Hash) ? (result.key?(:status) ? [] : result["branch_name"]) : result end @@ -177,6 +180,22 @@ class ProjectsController < ApplicationController tip_exception(e.message) end + def quit + user_is_admin = current_user.admin? || @project.manager?(current_user) + if !user_is_admin && @project.member(current_user.id) && @project.forge? + ActiveRecord::Base.transaction do + Projects::DeleteMemberInteractor.call(@project.owner, @project, current_user) + SendTemplateMessageJob.perform_later('ProjectMemberLeft', current_user.id, current_user.id, @project.id) if Site.has_notice_menu? + render_ok + end + else + render_forbidden('你不能退出该仓库') + end + rescue Exception => e + uid_logger_error(e.message) + tip_exception(e.message) + end + def watch_users watchers = @project.watchers.includes(:user).order("watchers.created_at desc").distinct @watchers_count = watchers.size diff --git a/app/controllers/pull_requests_controller.rb b/app/controllers/pull_requests_controller.rb index 189c5c6bf..0ac7a7144 100644 --- a/app/controllers/pull_requests_controller.rb +++ b/app/controllers/pull_requests_controller.rb @@ -29,7 +29,7 @@ class PullRequestsController < ApplicationController end def new - @all_branches = Branches::ListService.call(@owner, @project) + @all_branches = Branches::ListService.call(@owner, @project, params[:branch_name]) @is_fork = @project.forked_from_project_id.present? @projects_names = [{ project_user_login: @owner.try(:login), @@ -50,7 +50,7 @@ class PullRequestsController < ApplicationController end def get_branches - branch_result = Branches::ListService.call(@owner, @project) + branch_result = Branches::ListService.call(@owner, @project, params[:name]) render json: branch_result # return json: branch_result end diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 9a3fab62d..f61ba2478 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -1,324 +1,332 @@ -class UsersController < ApplicationController - include ApplicationHelper - include Ci::DbConnectable - - before_action :load_user, only: [:show, :homepage_info, :sync_token, :sync_gitea_pwd, :projects, :watch_users, :fan_users, :hovercard] - before_action :check_user_exist, only: [:show, :homepage_info,:projects, :watch_users, :fan_users, :hovercard] - before_action :require_login, only: %i[me sync_user_info] - before_action :connect_to_ci_db, only: [:get_user_info] - before_action :convert_image!, only: [:update, :update_image] - skip_before_action :check_sign, only: [:attachment_show] - - def connect_to_ci_db(options={}) - if !(current_user && !current_user.is_a?(AnonymousUser) && current_user.devops_certification?) - return - end - if current_user.ci_cloud_account.server_type == Ci::CloudAccount::SERVER_TYPE_TRUSTIE - connect_to_trustie_ci_database(options) - else - connect_to_ci_database(options) - end - end - - def list - scope = User.active.recent.like(params[:search]).includes(:user_extension) - @total_count = scope.size - @users = paginate(scope) - end - - def show - #待办事项,现在未做 - if User.current.admin? || User.current.login == @user.login - @waiting_applied_messages = @user.applied_messages.waiting - @common_applied_transfer_projects = AppliedTransferProject.where(owner_id: @user.id).common + AppliedTransferProject.where(owner_id: Organization.joins(team_users: :team).where(team_users: {user_id: @user.id}, teams: {authorize: %w(admin owner)} )).common - @common_applied_projects = AppliedProject.where(project_id: @user.full_admin_projects).common - #@undo_events = @waiting_applied_messages.size + @common_applied_transfer_projects.size + @common_applied_projects.size - @undo_events = @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? ? @user.organizations.with_visibility(%w(common limited)) + @user.organizations.with_visibility("privacy").joins(:team_users).where(team_users: {user_id: current_user.id}) : @user.organizations.with_visibility("common") - @user_org_count = user_organizations.size - normal_projects = Project.members_projects(@user.id).to_sql - org_projects = Project.joins(team_projects: [team: :team_users]).where(team_users: {user_id: @user.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 == @user.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 - # 为了缓存活跃用户的基本信息,后续删除 - Cache::V2::OwnerCommonService.new(@user.id).read - end - - def watch_users - watchers = Watcher.watching_users(@user.id).includes(:user).order("watchers.created_at desc") - if params[:search].present? - search_user_ids = User.where(id: watchers.pluck(:watchable_id)).like(params[:search]).pluck(:id) - watchers = watchers.where(watchable_id: search_user_ids) - end - @watchers_count = watchers.size - @watchers = paginate(watchers) - end - - def fan_users - watchers = @user.watchers.includes(:user).order("watchers.created_at desc") - watchers = watchers.joins(:user).merge(User.like(params[:search])) - @watchers_count = watchers.size - @watchers = paginate(watchers) - end - - def hovercard - end - - def update - 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) - unless @user.save - render_error(-1, @user.errors.full_messages.join(", ")) - end - end - - def update_image - 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)) - return render_ok({message: '头像修改成功'}) - rescue Exception => e - uid_logger_error(e.message) - render_error(-1, '头像修改失败!') - end - - def me - @user = current_user - end - - # 贴吧获取用户信接口 - def get_user_info - begin - @user = current_user - begin - result = Notice::Read::CountService.call(current_user.id) - @message_unread_total = result.nil? ? 0 : result[2]["unread_notification"] - rescue - @message_unread_total = 0 - end - # TODO 等消息上线再打开注释 - #@tidding_count = unviewed_tiddings(current_user) if current_user.present? - rescue Exception => e - uid_logger_error(e.message) - missing_template - end - - end - - def attachment_show - file_name = params[:file_name] - path = params[:path] || file_storage_directory - send_file "#{path}/#{file_name}", :filename => "#{file_name}", - :type => 'game', - :disposition => 'attachment' #inline can open in browser - end - - def html_show - @contents = File.read("#{params[:path]}") - respond_to do |format| - format.html {render :layout => false} - end - end - - # Redo: 消息总数缓存 - def get_navigation_info - # @old_domain = edu_setting('old_edu_host') - # @user = current_user - # # 新消息数 - # @new_message = @user.tidings.where("created_at > '#{@user.click_time}'").count > 0 || @user.private_messages.where("created_at > '#{@user.click_time}'").count > 0 - # - # @user_url = "/users/#{@user.login}" - # @career = Career.where(status: true).order("created_at asc").pluck(:id, :name) - # @auth = User.current.ec_school.present? ? "#{@old_domain}/ecs/department?school_id=#{User.current.ec_school}" : nil - end - - # 用户回复功能 - def reply_message - message = JournalsForMessage.new(reply_message_params) - message.user_id = current_user.id - message.save! - - render_ok(id: message.id) - end - - # 搜索用户具有管理员角色的项目 - def search_user_projects - projects = Project.where.not(status: 9) - - projects = projects.joins(members: :member_roles).where(member_roles: { role_id: 3 }) - projects = projects.where(members: { user_id: current_user.id }) - - search = params[:search].to_s.strip - projects = projects.where('projects.name LIKE ?', "%#{search}%") if search.present? - - @projects = projects.select(:id, :name) - end - - #TODO 个人主页信息,forge上弃用-hs, 0602 - def homepage_info - #待办事项,现在未做 - @undo_events = 10 - #用户的组织数量 - # @user_composes_count = @user.composes.size - @user_composes_count = 10 - end - - def brief_introduction - content = params[:content].to_s.strip - - current_user.user_extension.update!(brief_introduction: content) - - render_ok - end - - def attendance - attendance = Users::AttendanceService.call(current_user) - render_ok(grade: current_user.grade, next_gold: attendance.next_gold) - rescue Users::AttendanceService::Error => ex - render_error(ex.message) - end - - # 其他平台登录后,必须将token同步到forge平台,实现sso登录功能 - def sync_token - return render_error('未找相关用户!') unless @user - - token = Token.get_or_create_permanent_login_token(@user, 'autologin') - token.update_column(:value, params[:token]) - render_ok - end - - def trustie_related_projects - projects = Project.includes(:owner, :members, :project_score).where(id: params[:ids]).order("updated_on desc") - projects_json = [] - domain_url = EduSetting.get('host_name') - if projects.present? - projects.each do |p| - project_url = "/#{p.owner.login}/#{p.identifier}" - pj = { - id: p.id, - name: p.name, - is_public: p.is_public, - updated_on: p.updated_on.strftime("%Y-%m-%d"), - status: p.status, - is_member: p.member?(current_user.try(:id)), - owner: { - name: p.owner.try(:show_real_name), - login: p.owner.login - }, - members_count: p&.members.size, - issues_count: p.issues_count - p.pull_requests_count, - commits_count: p&.project_score&.changeset_num.to_i, - http_url: domain_url + project_url, - http_collaborator_url: domain_url + project_url + "/setting/collaborator", - http_issues_url: domain_url + project_url + "/issues", - http_commits_url: domain_url + project_url + "/commits", - project_score: p&.project_score.present? ? p&.project_score&.as_json(:except=>[:created_at, :updated_at]).merge!(commit_time: format_time(p&.project_score&.commit_time)) : {} - } - projects_json.push(pj) - end - end - Rails.logger.info("==========projects_json========+########{projects_json}") - render json: { projects: projects_json.present? ? projects_json : {} } - end - - def trustie_projects - user_id = User.select(:id, :login).where(login: params[:login])&.first&.id - projects = Project.visible - - projects = projects.joins(:members).where(members: { user_id: user_id }) - - search = params[:search].to_s.strip - projects = projects.where('projects.name LIKE ?', "%#{search}%") if search.present? - - projects = projects.select(:id, :name).limit(10).as_json - render json: { projects: projects } - end - - def projects - is_current_admin_user = User.current.logged? && (current_user&.admin? || current_user.id == @user.id) - scope = Projects::ListMyQuery.call(params, @user,is_current_admin_user) - @total_count = scope.size - @projects = paginate(scope) - end - - # TODO 其他平台登录时同步修改gitea平台对应用户的密码 - # 该方法主要用于:别的平台初次部署对接forge平台,同步用户后,gitea平台对应的用户密码与forge平台用户密码不一致是问题 - def sync_gitea_pwd - return render_error("未找到相关的用户") if @user.blank? - - flag = sync_pwd_to_gitea!(@user, {password: params[:password].to_s}) - flag ? render_ok : render_error('同步失败!') - end - - # TODO - # 同步trusite平台用户的salt信息,只需同步一次,同步完成后,该方法可以删除 - def sync_salt - user = User.find_by_login params[:login] - return if user.blank? - user.update_column(:salt, params[:salt]) - render_ok - end - - def sync_user_info - user = User.find_by_login params[:login] - return render_forbidden unless user === current_user - - sync_params = { - email: params[:email], - password: params[:password] - } - - Users::UpdateInfoForm.new(sync_params.merge(login: params[:login])).validate! - - interactor = Gitea::User::UpdateInteractor.call(user.login, sync_params) - if interactor.success? - user.update!(password: params[:password], mail: params[:email], status: User::STATUS_ACTIVE) - render_ok - else - render_error(interactor.error) - end - end - - private - def load_user - @user = User.find_by_login(params[:id]) || User.find_by(id: params[:id]) - end - - def user_params - params.require(:user).permit(:nickname, :image, - user_extension_attributes: [ - :gender, :location, :location_city, - :occupation, :technical_title, - :school_id, :department_id, :province, :city, - :custom_department, :identity, :student_id, :description, - :show_email, :show_location, :show_department] - ) - end - - def reply_message_params - normal_status(-1, "参数不对") if params[:journals_for_message][:jour_type].nil? || params[:journals_for_message][:jour_id].nil? || - params[:journals_for_message][:notes].nil? || params[:journals_for_message][:reply_id].nil? - params.require(:journals_for_message).permit(:jour_type, :jour_id, :notes, :m_parent_id, :reply_id) - end - - def check_user_exist - return if @user.present? - render_not_found - end - -end +class UsersController < ApplicationController + include ApplicationHelper + include Ci::DbConnectable + + before_action :load_user, only: [:show, :homepage_info, :sync_token, :sync_gitea_pwd, :projects, :watch_users, :fan_users, :hovercard] + before_action :check_user_exist, only: [:show, :homepage_info,:projects, :watch_users, :fan_users, :hovercard] + before_action :require_login, only: %i[me sync_user_info] + before_action :connect_to_ci_db, only: [:get_user_info] + before_action :convert_image!, only: [:update, :update_image] + skip_before_action :check_sign, only: [:attachment_show] + + def connect_to_ci_db(options={}) + if !(current_user && !current_user.is_a?(AnonymousUser) && current_user.devops_certification?) + return + end + if current_user.ci_cloud_account.server_type == Ci::CloudAccount::SERVER_TYPE_TRUSTIE + connect_to_trustie_ci_database(options) + else + connect_to_ci_database(options) + end + end + + def list + scope = User.active.recent.like(params[:search]).includes(:user_extension) + @total_count = scope.size + @users = paginate(scope) + end + + def show + #待办事项,现在未做 + if User.current.admin? || User.current.login == @user.login + @waiting_applied_messages = @user.applied_messages.waiting + @common_applied_transfer_projects = AppliedTransferProject.where(owner_id: @user.id).common + AppliedTransferProject.where(owner_id: Organization.joins(team_users: :team).where(team_users: {user_id: @user.id}, teams: {authorize: %w(admin owner)} )).common + @common_applied_projects = AppliedProject.where(project_id: @user.full_admin_projects).common + #@undo_events = @waiting_applied_messages.size + @common_applied_transfer_projects.size + @common_applied_projects.size + @undo_events = @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? ? @user.organizations.with_visibility(%w(common limited)) + @user.organizations.with_visibility("privacy").joins(:team_users).where(team_users: {user_id: current_user.id}) : @user.organizations.with_visibility("common") + @user_org_count = user_organizations.size + normal_projects = Project.members_projects(@user.id).to_sql + org_projects = Project.joins(team_projects: [team: :team_users]).where(team_users: {user_id: @user.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 == @user.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 + # 为了缓存活跃用户的基本信息,后续删除 + Cache::V2::OwnerCommonService.new(@user.id).read + end + + def watch_users + watchers = Watcher.watching_users(@user.id).includes(:user).order("watchers.created_at desc") + if params[:search].present? + search_user_ids = User.where(id: watchers.pluck(:watchable_id)).like(params[:search]).pluck(:id) + watchers = watchers.where(watchable_id: search_user_ids) + end + @watchers_count = watchers.size + @watchers = paginate(watchers) + end + + def fan_users + watchers = @user.watchers.includes(:user).order("watchers.created_at desc") + watchers = watchers.joins(:user).merge(User.like(params[:search])) + @watchers_count = watchers.size + @watchers = paginate(watchers) + end + + def hovercard + end + + def update + 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) + unless @user.save + render_error(-1, @user.errors.full_messages.join(", ")) + end + end + + def update_image + 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)) + return render_ok({message: '头像修改成功'}) + rescue Exception => e + uid_logger_error(e.message) + render_error(-1, '头像修改失败!') + end + + def get_image + 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) + + redirect_to Rails.application.config_for(:configuration)['platform_url'] + "/" + url_to_avatar(@user).to_s + end + + def me + @user = current_user + end + + # 贴吧获取用户信接口 + def get_user_info + begin + @user = current_user + begin + result = Notice::Read::CountService.call(current_user.id) + @message_unread_total = result.nil? ? 0 : result[2]["unread_notification"] + rescue + @message_unread_total = 0 + end + # TODO 等消息上线再打开注释 + #@tidding_count = unviewed_tiddings(current_user) if current_user.present? + rescue Exception => e + uid_logger_error(e.message) + missing_template + end + + end + + def attachment_show + file_name = params[:file_name] + path = params[:path] || file_storage_directory + send_file "#{path}/#{file_name}", :filename => "#{file_name}", + :type => 'game', + :disposition => 'attachment' #inline can open in browser + end + + def html_show + @contents = File.read("#{params[:path]}") + respond_to do |format| + format.html {render :layout => false} + end + end + + # Redo: 消息总数缓存 + def get_navigation_info + # @old_domain = edu_setting('old_edu_host') + # @user = current_user + # # 新消息数 + # @new_message = @user.tidings.where("created_at > '#{@user.click_time}'").count > 0 || @user.private_messages.where("created_at > '#{@user.click_time}'").count > 0 + # + # @user_url = "/users/#{@user.login}" + # @career = Career.where(status: true).order("created_at asc").pluck(:id, :name) + # @auth = User.current.ec_school.present? ? "#{@old_domain}/ecs/department?school_id=#{User.current.ec_school}" : nil + end + + # 用户回复功能 + def reply_message + message = JournalsForMessage.new(reply_message_params) + message.user_id = current_user.id + message.save! + + render_ok(id: message.id) + end + + # 搜索用户具有管理员角色的项目 + def search_user_projects + projects = Project.where.not(status: 9) + + projects = projects.joins(members: :member_roles).where(member_roles: { role_id: 3 }) + projects = projects.where(members: { user_id: current_user.id }) + + search = params[:search].to_s.strip + projects = projects.where('projects.name LIKE ?', "%#{search}%") if search.present? + + @projects = projects.select(:id, :name) + end + + #TODO 个人主页信息,forge上弃用-hs, 0602 + def homepage_info + #待办事项,现在未做 + @undo_events = 10 + #用户的组织数量 + # @user_composes_count = @user.composes.size + @user_composes_count = 10 + end + + def brief_introduction + content = params[:content].to_s.strip + + current_user.user_extension.update!(brief_introduction: content) + + render_ok + end + + def attendance + attendance = Users::AttendanceService.call(current_user) + render_ok(grade: current_user.grade, next_gold: attendance.next_gold) + rescue Users::AttendanceService::Error => ex + render_error(ex.message) + end + + # 其他平台登录后,必须将token同步到forge平台,实现sso登录功能 + def sync_token + return render_error('未找相关用户!') unless @user + + token = Token.get_or_create_permanent_login_token(@user, 'autologin') + token.update_column(:value, params[:token]) + render_ok + end + + def trustie_related_projects + projects = Project.includes(:owner, :members, :project_score).where(id: params[:ids]).order("updated_on desc") + projects_json = [] + domain_url = EduSetting.get('host_name') + if projects.present? + projects.each do |p| + project_url = "/#{p.owner.login}/#{p.identifier}" + pj = { + id: p.id, + name: p.name, + is_public: p.is_public, + updated_on: p.updated_on.strftime("%Y-%m-%d"), + status: p.status, + is_member: p.member?(current_user.try(:id)), + owner: { + name: p.owner.try(:show_real_name), + login: p.owner.login + }, + members_count: p&.members.size, + issues_count: p.issues_count - p.pull_requests_count, + commits_count: p&.project_score&.changeset_num.to_i, + http_url: domain_url + project_url, + http_collaborator_url: domain_url + project_url + "/setting/collaborator", + http_issues_url: domain_url + project_url + "/issues", + http_commits_url: domain_url + project_url + "/commits", + project_score: p&.project_score.present? ? p&.project_score&.as_json(:except=>[:created_at, :updated_at]).merge!(commit_time: format_time(p&.project_score&.commit_time)) : {} + } + projects_json.push(pj) + end + end + Rails.logger.info("==========projects_json========+########{projects_json}") + render json: { projects: projects_json.present? ? projects_json : {} } + end + + def trustie_projects + user_id = User.select(:id, :login).where(login: params[:login])&.first&.id + projects = Project.visible + + projects = projects.joins(:members).where(members: { user_id: user_id }) + + search = params[:search].to_s.strip + projects = projects.where('projects.name LIKE ?', "%#{search}%") if search.present? + + projects = projects.select(:id, :name).limit(10).as_json + render json: { projects: projects } + end + + def projects + is_current_admin_user = User.current.logged? && (current_user&.admin? || current_user.id == @user.id) + scope = Projects::ListMyQuery.call(params, @user,is_current_admin_user) + @total_count = scope.size + @projects = paginate(scope) + end + + # TODO 其他平台登录时同步修改gitea平台对应用户的密码 + # 该方法主要用于:别的平台初次部署对接forge平台,同步用户后,gitea平台对应的用户密码与forge平台用户密码不一致是问题 + def sync_gitea_pwd + return render_error("未找到相关的用户") if @user.blank? + + flag = sync_pwd_to_gitea!(@user, {password: params[:password].to_s}) + flag ? render_ok : render_error('同步失败!') + end + + # TODO + # 同步trusite平台用户的salt信息,只需同步一次,同步完成后,该方法可以删除 + def sync_salt + user = User.find_by_login params[:login] + return if user.blank? + user.update_column(:salt, params[:salt]) + render_ok + end + + def sync_user_info + user = User.find_by_login params[:login] + return render_forbidden unless user === current_user + + sync_params = { + email: params[:email], + password: params[:password] + } + + Users::UpdateInfoForm.new(sync_params.merge(login: params[:login])).validate! + + interactor = Gitea::User::UpdateInteractor.call(user.login, sync_params) + if interactor.success? + user.update!(password: params[:password], mail: params[:email], status: User::STATUS_ACTIVE) + render_ok + else + render_error(interactor.error) + end + end + + private + def load_user + @user = User.find_by_login(params[:id]) || User.find_by(id: params[:id]) + end + + def user_params + params.require(:user).permit(:nickname, :image, + user_extension_attributes: [ + :gender, :location, :location_city, + :occupation, :technical_title, + :school_id, :department_id, :province, :city, + :custom_department, :identity, :student_id, :description, + :show_super_description, :super_description, + :show_email, :show_location, :show_department] + ) + end + + def reply_message_params + normal_status(-1, "参数不对") if params[:journals_for_message][:jour_type].nil? || params[:journals_for_message][:jour_id].nil? || + params[:journals_for_message][:notes].nil? || params[:journals_for_message][:reply_id].nil? + params.require(:journals_for_message).permit(:jour_type, :jour_id, :notes, :m_parent_id, :reply_id) + end + + def check_user_exist + return if @user.present? + render_not_found + end + +end \ No newline at end of file diff --git a/app/controllers/version_releases_controller.rb b/app/controllers/version_releases_controller.rb index 2d7546a1c..dd59098f7 100644 --- a/app/controllers/version_releases_controller.rb +++ b/app/controllers/version_releases_controller.rb @@ -14,7 +14,7 @@ class VersionReleasesController < ApplicationController def new #获取所有的分支 @all_branches = [] - get_all_branches = Gitea::Repository::Branches::ListService.new(@user, @repository.try(:identifier)).call + get_all_branches = Gitea::Repository::Branches::ListService.new(@user, @repository.try(:identifier), params[:branch_name]).call if get_all_branches && get_all_branches.size > 0 get_all_branches.each do |b| @all_branches.push(b["name"]) diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 73b365039..c9096fe22 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -147,6 +147,15 @@ module ApplicationHelper end end + def url_to_avatar_with_platform_url(source) + platform_url = Rails.application.config_for(:configuration)['platform_url'] + if platform_url + return Rails.application.config_for(:configuration)['platform_url'] + "/" + url_to_avatar(source).to_s + else + return url_to_avatar(source).to_s + end + end + # 主页banner图 def banner_img(source_type) if File.exist?(disk_filename(source_type, "banner")) diff --git a/app/helpers/repositories_helper.rb b/app/helpers/repositories_helper.rb index f1556376c..3af3ef140 100644 --- a/app/helpers/repositories_helper.rb +++ b/app/helpers/repositories_helper.rb @@ -36,7 +36,6 @@ module RepositoriesHelper end def render_cache_commit_author(author_json) - Rails.logger.info author_json['Email'] if author_json["name"].present? && author_json["email"].present? return find_user_in_redis_cache(author_json['name'], author_json['email']) end diff --git a/app/models/organization.rb b/app/models/organization.rb index 40c676e05..56351a415 100644 --- a/app/models/organization.rb +++ b/app/models/organization.rb @@ -83,6 +83,10 @@ class Organization < Owner after_save :reset_cache_data + def gitea_token + team_users.joins(:team).where(teams: {authorize: "owner"}).take&.user&.gitea_token + end + def reset_cache_data Cache::V2::OwnerCommonService.new(self.id).reset end diff --git a/app/models/user.rb b/app/models/user.rb index 909c75ad8..66aeb6164 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -188,7 +188,7 @@ class User < Owner attr_accessor :password, :password_confirmation delegate :description, :gender, :department_id, :school_id, :location, :location_city, - :show_email, :show_location, :show_department, + :show_email, :show_location, :show_department, :super_description, :show_super_description, :technical_title, :province, :city, :custom_department, to: :user_extension, allow_nil: true before_save :update_hashed_password, :set_lastname diff --git a/app/models/user_extension.rb b/app/models/user_extension.rb index ee208af7e..c1046ac2f 100644 --- a/app/models/user_extension.rb +++ b/app/models/user_extension.rb @@ -2,35 +2,34 @@ # # Table name: user_extensions # -# id :integer not null, primary key -# user_id :integer not null -# birthday :date -# brief_introduction :string(255) -# gender :integer -# location :string(255) -# occupation :string(255) -# work_experience :integer -# zip_code :integer -# created_at :datetime not null -# updated_at :datetime not null -# technical_title :string(255) -# identity :integer -# student_id :string(255) -# teacher_realname :string(255) -# student_realname :string(255) -# location_city :string(255) -# school_id :integer -# description :string(255) default("") -# department_id :integer -# honor :text(65535) -# edu_background :integer -# edu_entry_year :integer -# province :string(255) -# city :string(255) -# custom_department :string(255) -# show_email :boolean default("0") -# show_location :boolean default("0") -# show_department :boolean default("0") +# id :integer not null, primary key +# user_id :integer not null +# birthday :date +# brief_introduction :string(255) +# gender :integer +# location :string(255) +# occupation :string(255) +# work_experience :integer +# zip_code :integer +# created_at :datetime not null +# updated_at :datetime not null +# technical_title :string(255) +# identity :integer +# student_id :string(255) +# teacher_realname :string(255) +# student_realname :string(255) +# location_city :string(255) +# school_id :integer +# description :string(255) default("") +# department_id :integer +# province :string(255) +# city :string(255) +# custom_department :string(255) +# show_email :boolean default("0") +# show_location :boolean default("0") +# show_department :boolean default("0") +# super_description :text(4294967295) +# show_super_description :boolean default("0") # # Indexes # diff --git a/app/services/branches/list_service.rb b/app/services/branches/list_service.rb index a3b77a7b0..7b47658e3 100644 --- a/app/services/branches/list_service.rb +++ b/app/services/branches/list_service.rb @@ -1,17 +1,18 @@ class Branches::ListService < ApplicationService - attr_reader :user, :project + attr_reader :user, :project, :name - def initialize(user, project) + def initialize(user, project, name=nil) @user = user @project = project + @name = name end def call all_branches = [] user_name = user.try(:show_real_name) identifier = project.repository.try(:identifier) - get_all_branches = Gitea::Repository::Branches::ListService.new(user, identifier).call + get_all_branches = Gitea::Repository::Branches::ListService.new(user, identifier, name).call all_branches = branch_lists(user_name,user.try(:login), identifier, get_all_branches) if get_all_branches && get_all_branches.size > 0 return all_branches end diff --git a/app/services/gitea/repository/branches/list_name_service.rb b/app/services/gitea/repository/branches/list_name_service.rb index 716ee464c..c005c8359 100644 --- a/app/services/gitea/repository/branches/list_name_service.rb +++ b/app/services/gitea/repository/branches/list_name_service.rb @@ -1,9 +1,10 @@ class Gitea::Repository::Branches::ListNameService < Gitea::ClientService - attr_reader :user, :repo + attr_reader :user, :repo, :name - def initialize(user, repo) + def initialize(user, repo, name=nil) @user = user @repo = repo + @name = name end def call @@ -13,7 +14,7 @@ class Gitea::Repository::Branches::ListNameService < Gitea::ClientService private def params - Hash.new.merge(token: user.gitea_token) + Hash.new.merge(token: user.gitea_token, name: name) end def url diff --git a/app/services/gitea/repository/branches/list_service.rb b/app/services/gitea/repository/branches/list_service.rb index f42965098..7722ecd0b 100644 --- a/app/services/gitea/repository/branches/list_service.rb +++ b/app/services/gitea/repository/branches/list_service.rb @@ -1,9 +1,10 @@ class Gitea::Repository::Branches::ListService < Gitea::ClientService - attr_reader :user, :repo + attr_reader :user, :repo, :name - def initialize(user, repo) + def initialize(user, repo, name=nil) @user = user @repo = repo + @name = name end def call @@ -13,7 +14,7 @@ class Gitea::Repository::Branches::ListService < Gitea::ClientService private def params - Hash.new.merge(token: user.gitea_token) + Hash.new.merge(token: user.gitea_token, name: name) end def url diff --git a/app/services/organizations/create_service.rb b/app/services/organizations/create_service.rb index a430ed6f4..263779191 100644 --- a/app/services/organizations/create_service.rb +++ b/app/services/organizations/create_service.rb @@ -47,7 +47,7 @@ class Organizations::CreateService < ApplicationService end def create_org_and_extension - @organization = Organization.build(params[:name], params[:nickname], user.gitea_token) + @organization = Organization.build(params[:name], params[:nickname]) org_extension = OrganizationExtension.build(organization.id, description, website, location, repo_admin_change_team_access, visibility, max_repo_creation) diff --git a/app/views/admins/shared/_sidebar.html.erb b/app/views/admins/shared/_sidebar.html.erb index 055988731..4c6e6de70 100644 --- a/app/views/admins/shared/_sidebar.html.erb +++ b/app/views/admins/shared/_sidebar.html.erb @@ -45,6 +45,11 @@