ADD watchers

dev_forge
Jasder 5 years ago
parent 48ea06ec8a
commit 9fbc04aa6e

@ -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 DELETE /api/:login/:repo_identifier/contents

@ -637,6 +637,11 @@ class ApplicationController < ActionController::Base
render_not_found("未找到’#{params[:repo_identifier]}’相关的项目") unless @repo render_not_found("未找到’#{params[:repo_identifier]}’相关的项目") unless @repo
end end
def find_project
@project = Project.find_by_identifier! params[:id]
render_not_found("未找到’#{params[:id]}’相关的项目") unless @project
end
private private
def object_not_found def object_not_found
uid_logger("Missing template or cant't find record, responding with 404") uid_logger("Missing template or cant't find record, responding with 404")

@ -38,10 +38,6 @@ class ProjectsController < ApplicationController
end end
private private
def find_project
@project = Project.find_by_identifier! params[:id]
end
def project_params def project_params
params.permit(:user_id, :name, :description, :repository_name, params.permit(:user_id, :name, :description, :repository_name,
:project_category_id, :project_language_id, :license_id, :ignore_id) :project_category_id, :project_language_id, :license_id, :ignore_id)

@ -25,4 +25,4 @@ class Users::WatchesController < Users::BaseController
current_user.unwatch!(observed_user) current_user.unwatch!(observed_user)
render_ok render_ok
end end
end end

@ -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

@ -0,0 +1,2 @@
module WatchersHelper
end

@ -2,8 +2,8 @@ module Watchable
extend ActiveSupport::Concern extend ActiveSupport::Concern
included do included do
has_many :watchers, as: :watchable, dependent: :destroy # 关注我的 has_many :watchers, as: :watchable, dependent: :destroy
has_many :watcher_users, through: :watchers, source: :user, validate: false # 我的粉丝 has_many :watcher_users, through: :watchers, source: :user, validate: false
scope :watched_by, -> (user_id) { includes(:watchers).where(watchers: { user_id: user_id }) } scope :watched_by, -> (user_id) { includes(:watchers).where(watchers: { user_id: user_id }) }
end end
@ -12,15 +12,15 @@ module Watchable
watchable.watchers.exists?(user: self) watchable.watchers.exists?(user: self)
end end
def watch!(user) def watch!(watchable)
user.watchers.create!(user: self) watchable.watchers.create!(user: self)
end end
def unwatch!(user) def unwatch!(watchable)
obj = user.watchers.find_by(user: self) obj = watchable.watchers.find_by(user: self)
obj.destroy! if obj.present? obj.destroy! if obj.present?
end end
module ClassMethods module ClassMethods
end end
end end

@ -0,0 +1,3 @@
json.name watcher.user.real_name
json.login watcher.user.login
json.image_url url_to_avatar(watcher.user)

@ -0,0 +1,4 @@
json.total_count @watchers.size
json.watchers do
json.partial! 'watcher', collection: @watchers, as: :watcher
end

@ -1,5 +1,5 @@
Rails.application.routes.draw do Rails.application.routes.draw do
require 'sidekiq/web' require 'sidekiq/web'
require 'admin_constraint' require 'admin_constraint'
mount Sidekiq::Web => '/sidekiq', :constraints => AdminConstraint.new mount Sidekiq::Web => '/sidekiq', :constraints => AdminConstraint.new
@ -63,12 +63,21 @@ Rails.application.routes.draw do
post :update_status post :update_status
end end
end end
resources :watchers, only: [:index] do
collection do
post :follow
delete :unfollow
end
end
resources :praise_tread, only: [:index]
collection do collection do
post :migrate post :migrate
get :group_type_list get :group_type_list
post :watch
end end
member do member do
get :branches get :branches
post :watch
end end
end end

Loading…
Cancel
Save