docbrown/app/controllers/concerns/api/follows_controller.rb
Joshua Wehner e0d7658138
Follow-ups for suggested organizations follows during onboarding (#19619)
* Documentation for /api/follows end-point

* Rename and refactor User suggester

* Clean up feature flag

* User average count should be unscoped
2023-06-29 11:49:01 +02:00

56 lines
1.8 KiB
Ruby

module Api
module FollowsController
extend ActiveSupport::Concern
def create
# API authentication might set current_user or might just set @user
active_user = current_user || @user
user_ids.each do |user_id|
Users::FollowWorker.perform_async(active_user.id, user_id, "User")
end
org_ids.each do |org_id|
Users::FollowWorker.perform_async(active_user.id, org_id, "Organization")
end
render json: {
outcome: I18n.t("api.v0.follows_controller.followed",
count: user_ids.size + org_ids.size)
}
end
def tags
@follows = @user.follows_by_type("ActsAsTaggableOn::Tag")
.select(%i[id followable_id followable_type points])
.includes(:followable)
.order(points: :desc)
end
private
# The strange params situation here is mostly due to a bug in the way
# rswag processes array-type params that appear in a query-string.
# Also, Rails' strong parameters does not work well with arrays-of-objects.
# So, in order to include this end-point in the swagger/open-api
# documentation, while maintaining compatibility with the existing
# infrastructure, we need to accept two kinds of inputs here -
# in one case, we receive a list of integer IDs,
# in the other case, we receive an array of objects, like {id: 123}
def user_ids
@user_ids ||= permitted_params[:user_ids].presence
@user_ids ||= params[:users].pluck("id") if params[:users].present?
@user_ids ||= []
end
def org_ids
@org_ids ||= permitted_params[:organization_ids].presence
@org_ids ||= params[:organizations].pluck("id") if params[:organizations].present?
@org_ids ||= []
end
def permitted_params
params.permit(user_ids: [], organization_ids: [])
end
end
end