diff --git a/api_document.md b/api_document.md index 2cbb2431..e667cb17 100644 --- a/api_document.md +++ b/api_document.md @@ -4058,6 +4058,77 @@ http://localhost:3000/api/users/Jason/projects.json | jq } ``` --- + +#### 特殊许可证项目申请列表 +``` +GET /api/apply_signatures +``` +*示例* +```bash +curl -X GET \ +-d "project_id=36" \ +-d "page=1" \ +-d "limit=5" \ +-d "search=16895620" \ +-d "status=waiting" \ +http://localhost:3000/api/apply_signatures | jq +``` +*请求参数说明:* + +|参数名|必选|类型|说明| +|-|-|-|-| +|project_id |是|int |项目id | +|page |否|string |页数,第几页 | +|limit |否|string |每页多少条数据,默认15条 | +|search |否|string |用户名、登录名匹配搜索 | +|status |否|string |状态匹配搜索,'unpassed': 审核未通过,'waiting': 等待审核 'passed':审核通过 | + + +*返回参数说明:* + +|参数名|类型|说明| +|-|-|-| +|total_count |int |返回记录总条数 | +|apply_signatures |array|特殊许可证项目申请信息| +|-- id |int|特殊许可证项目申请id| +|-- status |int|特殊许可证项目申请状态,'unpassed': 审核未通过,'waiting': 等待审核 'passed':审核通过| +|user |object|用户| +|-- id |int|用户id| +|-- name |string|用户名称| +|-- login |string|用户登录名/标识| +|-- image_url |string|用户头像| +|-- email |string|用户邮箱| +|-- is_owner |boolean|是否是项目的拥有者,true:是, false:不是| +|attachment |object|上传附件| +|--filename |string|附件名称| +|--path |string|附件地址| + + +返回值 +```json +{ + "total_count": 1, + "apply_signatures": [ + { + "id": 18, + "status": "passed", + "user": { + "id": 3, + "name": "16895620", + "login": "16895620", + "image_url": "avatars/User/boy.jpg", + "email": "2456233122@qq.com", + "is_owner": false + }, + "attachment": { + "filename": "PHengLEI软件开源协议.docx", + "path": "/api/attachments/23" + } + } + ] +} +``` +--- #### 特殊许可证项目用户创建申请 ``` POST /api/apply_signatures @@ -4095,4 +4166,43 @@ http://localhost:3000/api/apply_signatures.json | jq } } ``` +--- +#### 特殊许可证项目申请修改 +``` +PATCH /api/apply_signatures/:id +``` + +*示例* +```bash +curl -X POST \ +-d "id=18" \ +-d "status=passed" \ +-d "project_id=36" \ +http://localhost:3000/api/apply_signatures/18 | jq +``` + +*请求参数说明:* + +|参数名|必选|类型|说明| +|-|-|-|-| +|id |是|int |特殊许可证项目申请id | +|status |是|string |特殊许可证项目申请状态 ,'unpassed': 审核未通过,'waiting': 等待审核 'passed':审核通过| +|project_id |是|int |项目id| + + +*返回参数说明:* + +|参数名|类型|说明| +|-|-|-| +|status |int |0:添加成功, -1: 更改失败, 1: 表示已经是该状态了 | +|message |string|返回信息说明| + + +返回值 +```json +{ + "status": 0, + "message": "success" +} +``` --- \ No newline at end of file diff --git a/app/controllers/apply_signatures_controller.rb b/app/controllers/apply_signatures_controller.rb index 54f64aa6..885249cf 100644 --- a/app/controllers/apply_signatures_controller.rb +++ b/app/controllers/apply_signatures_controller.rb @@ -1,5 +1,14 @@ class ApplySignaturesController < ApplicationController include ApplicationHelper + before_action :find_project, only: [:index, :create, :update] + before_action :require_owner, only: [:update] + before_action :find_apply_signature, only: [:update] + + def index + @apply_signatures = @project.apply_signatures.with_status(status).includes(user: :user_extension) + @apply_signatures = @apply_signatures.joins(:user).where("LOWER(concat(users.lastname, users.firstname, users.login, users.mail, users.nickname)) LIKE ?", "%#{search.split(" ").join('|')}%") + @apply_signatures = kaminari_paginate(@apply_signatures) + end def template_file license = License.find_by_name("PHengLEI") @@ -11,9 +20,12 @@ class ApplySignaturesController < ApplicationController def create ActiveRecord::Base.transaction do begin - @signature = current_user.apply_signatures.create!(project_id: params[:project_id]) + @signature = current_user.apply_signatures.find_or_create_by!(project_id: params[:project_id]) + @signature.status = 0 + @signature.attachments = Attachment.none @attachment = Attachment.find_by_id(params[:attachment_id]) @attachment.container = @signature + @signature.save! @attachment.save! rescue Exception => e tip_exception("#{e}") @@ -22,4 +34,45 @@ class ApplySignaturesController < ApplicationController render_json end end + + def update + @apply_signature.update_attributes!(apply_signature_params) + if @apply_signature.status == "passed" + Projects::AddMemberInteractor.call(@apply_signature.project.owner, @apply_signature.project, @apply_signature.user, "read", true) + else + Projects::DeleteMemberInteractor.call(@apply_signature.project.owner, @apply_signature.project, @apply_signature.user) + end + render_ok + rescue Exception => e + uid_logger_error(e.message) + tip_exception(e.message) + end + + private + def find_project + @project = Project.find_by_id(params[:project_id]) + normal_status(-1, "项目不存在") unless @project.present? + end + + def find_apply_signature + @apply_signature = ApplySignature.find_by_id(params[:id]) + normal_status(-1, "特殊许可申请不存在") unless @apply_signature.present? + normal_status(1, "已经是该状态了") if @apply_signature.status == params[:status] + end + + def apply_signature_params + params.permit(:status) + end + + def search + params.fetch(:search, "").to_s.downcase + end + + def status + params.fetch(:status, "all") + end + + def require_owner + normal_status(403, "") unless @project.owner?(current_user) + end end \ No newline at end of file diff --git a/app/controllers/members_controller.rb b/app/controllers/members_controller.rb index 2964eb1a..b8c0ea54 100644 --- a/app/controllers/members_controller.rb +++ b/app/controllers/members_controller.rb @@ -18,7 +18,7 @@ class MembersController < ApplicationController scope = @project.members.includes(:roles, user: :user_extension) search = params[:search].to_s.downcase role = params[:role].to_s - scope = scope.joins(:user).where("LOWER(concat(users.lastname, users.firstname, users.login, users.mail)) LIKE ?", "%#{search.split(" ").join('|')}%") if search.present? + scope = scope.joins(:user).where("LOWER(concat(users.lastname, users.firstname, users.login, users.mail, users.nickname)) LIKE ?", "%#{search.split(" ").join('|')}%") if search.present? scope = scope.joins(:roles).where("roles.name LIKE ?", "%#{role}%") if role.present? @total_count = scope.size diff --git a/app/models/apply_signature.rb b/app/models/apply_signature.rb index f6f7bfc3..937b601e 100644 --- a/app/models/apply_signature.rb +++ b/app/models/apply_signature.rb @@ -22,6 +22,9 @@ class ApplySignature < ApplicationRecord has_many :attachments, as: :container, dependent: :destroy scope :with_user_id, -> (user_id) {where(user_id: user_id)} + scope :with_status, -> (status) {where(status: status) if status.present? && status != "all"} + + validates :project_id, uniqueness: {scope: :user_id} enum status: {unpassed: -1, waiting: 0, passed: 1} end diff --git a/app/views/admins/apply_signatures/shared/_list.html.erb b/app/views/admins/apply_signatures/shared/_list.html.erb index ec028b30..36984aa9 100644 --- a/app/views/admins/apply_signatures/shared/_list.html.erb +++ b/app/views/admins/apply_signatures/shared/_list.html.erb @@ -22,7 +22,7 @@