Expose time since starring on project/:id/starrers API endpoint; exclude private profiles here as well

This commit is contained in:
Camil Staps 2019-02-02 20:48:27 +01:00
parent 50f5f2e8ae
commit e8bdcdf0f8
No known key found for this signature in database
GPG Key ID: 4A9BFD4F6A415F83
5 changed files with 38 additions and 19 deletions

View File

@ -282,6 +282,15 @@ class User < ApplicationRecord
scope :for_todos, -> (todos) { where(id: todos.select(:user_id)) }
scope :with_emails, -> { preload(:emails) }
scope :with_dashboard, -> (dashboard) { where(dashboard: dashboard) }
scope :with_visible_profile, -> (user) {
if user.nil?
where(private_profile: [false, nil])
elsif user.admin?
all
else
where(private_profile: [false, nil]).or where(id: user.id)
end
}
# Limits the users to those that have TODOs, optionally in the given state.
#

View File

@ -15,7 +15,7 @@ class UsersStarProject < ApplicationRecord
scope :order_user_name_asc, -> { joins(:user).reorder('"users"."name" ASC') }
scope :order_user_name_desc, -> { joins(:user).reorder('"users"."name" DESC') }
scope :by_project, -> (project) { where(project_id: project.id) }
scope :with_visible_profile, -> (user) { joins(:user).where('"users"."private_profile" IS NULL OR "users"."private_profile" = ? OR "users"."id" = ?', false, user.id ) }
scope :with_visible_profile, -> (user) { joins(:user).merge(User.with_visible_profile(user)) }
class << self
def sort_by_attribute(method)

View File

@ -1358,21 +1358,27 @@ Example responses:
```json
[
{
"id": 1,
"username": "jane_smith",
"name": "Jane Smith",
"state": "active",
"avatar_url": "http://localhost:3000/uploads/user/avatar/1/cd8.jpeg",
"web_url": "http://localhost:3000/jane_smith"
"starred_since": "2019-01-28T14:47:30.642Z",
"user":
{
"id": 1,
"username": "jane_smith",
"name": "Jane Smith",
"state": "active",
"avatar_url": "http://localhost:3000/uploads/user/avatar/1/cd8.jpeg",
"web_url": "http://localhost:3000/jane_smith"
}
},
{
"id": 2,
"username": "janine_smith",
"name": "Janine Smith",
"state": "blocked",
"avatar_url": "http://gravatar.com/../e32131cd8.jpeg",
"web_url": "http://localhost:3000/janine_smith"
}
"starred_since": "2018-01-02T11:40:26.570Z",
"user":
{
"id": 2,
"username": "janine_smith",
"name": "Janine Smith",
"state": "blocked",
"avatar_url": "http://gravatar.com/../e32131cd8.jpeg",
"web_url": "http://localhost:3000/janine_smith"
}
]
```

View File

@ -77,6 +77,11 @@ module API
expose :last_activity_on, as: :last_activity_at # Back-compat
end
class UserStarsProject < Grape::Entity
expose :starred_since
expose :user, using: Entities::UserBasic
end
class Identity < Grape::Entity
expose :provider, :extern_uid
end

View File

@ -128,7 +128,7 @@ module API
user = find_user(params[:user_id])
not_found!('User') unless user
starred_projects = StarredProjectsFinder.new(user, current_user: current_user).execute
starred_projects = StarredProjectsFinder.new(user, params: project_finder_params, current_user: current_user).execute
present_projects starred_projects
end
end
@ -382,10 +382,9 @@ module API
use :pagination
end
get ':id/starrers' do
users = DeclarativePolicy.subject_scope { user_project.starrers }
users = users.search(params[:search]) if params[:search].present?
starrers = UsersStarProjectsFinder.new(params, user_project, current_user: current_user).execute
present paginate(users), with: Entities::UserBasic
present paginate(starrers), with: Entities::UserStarsProject
end
desc 'Get languages in project repository'