From 9fbc04aa6e1c89ad5c1cfa15a85b25c970e9cdf9 Mon Sep 17 00:00:00 2001 From: Jasder <2053003901@@qq.com> Date: Wed, 8 Jan 2020 20:30:48 +0800 Subject: [PATCH] ADD watchers --- README.md | 151 ++++++++++++++++++++ app/controllers/application_controller.rb | 5 + app/controllers/projects_controller.rb | 4 - app/controllers/users/watches_controller.rb | 2 +- app/controllers/watchers_controller.rb | 40 ++++++ app/helpers/watchers_helper.rb | 2 + app/models/concerns/watchable.rb | 14 +- app/views/watchers/_watcher.json.jbuilder | 3 + app/views/watchers/index.json.jbuilder | 4 + config/routes.rb | 11 +- 10 files changed, 223 insertions(+), 13 deletions(-) create mode 100644 app/controllers/watchers_controller.rb create mode 100644 app/helpers/watchers_helper.rb create mode 100644 app/views/watchers/_watcher.json.jbuilder create mode 100644 app/views/watchers/index.json.jbuilder diff --git a/README.md b/README.md index 5b5ec27ac..9aeb633d2 100644 --- a/README.md +++ b/README.md @@ -1107,6 +1107,157 @@ http://localhost:3000/api/praise_tread/unlike | jq ``` --- +### 项目的点赞者列表 +``` +GET /api/projects/:id/praise_tread +``` +*示例* +``` +curl -X GET \ +-d 'object_id=1' \ +-d 'object_type=project' \ +http://localhost:3000/api/projects/mirror_demo/praise_tread | jq +``` +*请求参数说明:* + +|参数名|必选|类型|说明| +-|-|-|- +|object_id |是 |int |项目id | +|object_type |否 |string | 点赞类型,默认为project| + + +*返回参数说明:* + +|参数名|类型|说明| +-|-|- +|status |int|0:点赞成功,-1:操作失败,2:表示已经点过赞了| + + +返回值 +``` +{ + "status": 0, + "message": "响应成功" +} +``` +--- + +### 关注(项目) +``` +POST /api/projects/:id/watchers/follow +``` +*示例* +``` +curl -X POST \ +-d "login=18816895620" \ +http://localhost:3000/api/projects/mirror_demo/watchers/follow | jq +``` +*请求参数说明:* + +|参数名|必选|类型|说明| +-|-|-|- +|id |是|string |项目标识(identifier) | +|login |是|string |用户标识/登录名(login) | + + +*返回参数说明:* + +|参数名|类型|说明| +-|-|- +|status |int|0:点赞成功,-1:操作失败,2:表示已经点过赞了| + + +返回值 +``` +{ + "status": 0, + "message": "响应成功" +} +``` +--- + +### 取消关注 +``` +DELETE /api/projects/:id/watchers/unfollow +``` +*示例* +``` +curl -X DELETE \ +-d "login=18816895620" \ +http://localhost:3000//api/projects/mirror_demo/watchers/unfollow | jq +``` +*请求参数说明:* + +|参数名|必选|类型|说明| +-|-|-|- +|id |是|string |项目标识(identifier) | +|login |是|string |用户标识/登录名(login) | + + +*返回参数说明:* + +|参数名|类型|说明| +-|-|- +|status |int|0:点赞成功,-1:操作失败,2:表示还未点赞| + + +返回值 +``` +{ + "status": 0, + "message": "响应成功" +} +``` +--- + +### 项目的关注者列表 +``` +GET /api/projects/:id/watchers +``` +*示例* +``` +curl -X GET \ +-d "login=18816895620" \ +-d "page=1" \ +-d "limit=5" \ +http://localhost:3000//api/projects/mirror_demo/watchers | jq +``` +*请求参数说明:* + +|参数名|必选|类型|说明| +-|-|-|- +|id |是|string |项目标识(identifier) | +|login |是|string |用户标识/登录名(login) | +|page |否|string |页数,第几页 | +|limit |否|string |每页多少条数据,默认15条 | + + +*返回参数说明:* + +|参数名|类型|说明| +-|-|- +|total_count |int|总条数| +|watchers |array|关注数据| +|-- name |string|用户名称| +|-- login |string|用户标识/登录名(login)| +|-- image_url |string|用户头像| + + +返回值 +``` +{ + "total_count": 1, + "watchers": [ + { + "name": "18816895620", + "login": "18816895620", + "image_url": "avatars/User/b" + } + ] +} +``` +--- + ### 仓库新建文件 ``` DELETE /api/:login/:repo_identifier/contents diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 57b9e45ef..9461e180f 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -637,6 +637,11 @@ class ApplicationController < ActionController::Base render_not_found("未找到’#{params[:repo_identifier]}’相关的项目") unless @repo end + def find_project + @project = Project.find_by_identifier! params[:id] + render_not_found("未找到’#{params[:id]}’相关的项目") unless @project + end + private def object_not_found uid_logger("Missing template or cant't find record, responding with 404") diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 293c9a5ff..e0f16729b 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -38,10 +38,6 @@ class ProjectsController < ApplicationController end private - def find_project - @project = Project.find_by_identifier! params[:id] - end - def project_params params.permit(:user_id, :name, :description, :repository_name, :project_category_id, :project_language_id, :license_id, :ignore_id) diff --git a/app/controllers/users/watches_controller.rb b/app/controllers/users/watches_controller.rb index 867106c52..9a9e78a3e 100644 --- a/app/controllers/users/watches_controller.rb +++ b/app/controllers/users/watches_controller.rb @@ -25,4 +25,4 @@ class Users::WatchesController < Users::BaseController current_user.unwatch!(observed_user) render_ok end -end \ No newline at end of file +end diff --git a/app/controllers/watchers_controller.rb b/app/controllers/watchers_controller.rb new file mode 100644 index 000000000..f018959ee --- /dev/null +++ b/app/controllers/watchers_controller.rb @@ -0,0 +1,40 @@ +class WatchersController < ApplicationController + before_action :require_login, except: %i[index] + before_action :find_user, :set_project + + def index + scope = @project.watchers.includes(:user) + @watchers = paginate(scope) + end + + def unfollow + begin + return normal_status(2, "你还没有关注哦") unless current_user.watched?(@project) + current_user.unwatch!(@project) + render_ok + rescue Exception => e + uid_logger_error(e.message) + tip_exception(e.message) + raise ActiveRecord::Rollback + end + end + + def follow + begin + return normal_status(2, "你已关注了") if current_user.watched?(@project) + current_user.watch!(@project) + render_ok + rescue Exception => e + uid_logger_error(e.message) + tip_exception(e.message) + raise ActiveRecord::Rollback + end + end + + private + def set_project + @project = @user.projects.find_by_identifier params[:project_id] + render_not_found("未找到’#{params[:id]}’相关的项目") unless @project + end + +end diff --git a/app/helpers/watchers_helper.rb b/app/helpers/watchers_helper.rb new file mode 100644 index 000000000..dcb0c0ece --- /dev/null +++ b/app/helpers/watchers_helper.rb @@ -0,0 +1,2 @@ +module WatchersHelper +end diff --git a/app/models/concerns/watchable.rb b/app/models/concerns/watchable.rb index 7be7d1b4c..ad707a0cf 100644 --- a/app/models/concerns/watchable.rb +++ b/app/models/concerns/watchable.rb @@ -2,8 +2,8 @@ module Watchable extend ActiveSupport::Concern included do - has_many :watchers, as: :watchable, dependent: :destroy # 关注我的 - has_many :watcher_users, through: :watchers, source: :user, validate: false # 我的粉丝 + has_many :watchers, as: :watchable, dependent: :destroy + has_many :watcher_users, through: :watchers, source: :user, validate: false scope :watched_by, -> (user_id) { includes(:watchers).where(watchers: { user_id: user_id }) } end @@ -12,15 +12,15 @@ module Watchable watchable.watchers.exists?(user: self) end - def watch!(user) - user.watchers.create!(user: self) + def watch!(watchable) + watchable.watchers.create!(user: self) end - def unwatch!(user) - obj = user.watchers.find_by(user: self) + def unwatch!(watchable) + obj = watchable.watchers.find_by(user: self) obj.destroy! if obj.present? end module ClassMethods end -end \ No newline at end of file +end diff --git a/app/views/watchers/_watcher.json.jbuilder b/app/views/watchers/_watcher.json.jbuilder new file mode 100644 index 000000000..52becc9e4 --- /dev/null +++ b/app/views/watchers/_watcher.json.jbuilder @@ -0,0 +1,3 @@ +json.name watcher.user.real_name +json.login watcher.user.login +json.image_url url_to_avatar(watcher.user) diff --git a/app/views/watchers/index.json.jbuilder b/app/views/watchers/index.json.jbuilder new file mode 100644 index 000000000..72f0083c4 --- /dev/null +++ b/app/views/watchers/index.json.jbuilder @@ -0,0 +1,4 @@ +json.total_count @watchers.size +json.watchers do + json.partial! 'watcher', collection: @watchers, as: :watcher +end diff --git a/config/routes.rb b/config/routes.rb index 68aa00d8a..098ebaf2c 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,5 +1,5 @@ Rails.application.routes.draw do - + require 'sidekiq/web' require 'admin_constraint' mount Sidekiq::Web => '/sidekiq', :constraints => AdminConstraint.new @@ -63,12 +63,21 @@ Rails.application.routes.draw do post :update_status end end + resources :watchers, only: [:index] do + collection do + post :follow + delete :unfollow + end + end + resources :praise_tread, only: [:index] collection do post :migrate get :group_type_list + post :watch end member do get :branches + post :watch end end