discourse/app/controllers/groups_controller.rb

149 lines
3.9 KiB
Ruby

class GroupsController < ApplicationController
before_filter :ensure_logged_in, only: [:set_notifications]
def show
render_serialized(find_group(:id), BasicGroupSerializer)
end
def counts
group = find_group(:group_id)
counts = {
posts: group.posts_for(guardian).count,
topics: group.posts_for(guardian).where(post_number: 1).count,
mentions: group.mentioned_posts_for(guardian).count,
members: group.users.count,
}
if guardian.can_see_group_messages?(group)
counts[:messages] = group.messages_for(guardian).where(post_number: 1).count
end
render json: { counts: counts }
end
def posts
group = find_group(:group_id)
posts = group.posts_for(guardian, params[:before_post_id]).limit(20)
render_serialized posts.to_a, GroupPostSerializer
end
def topics
group = find_group(:group_id)
posts = group.posts_for(guardian, params[:before_post_id]).where(post_number: 1).limit(20)
render_serialized posts.to_a, GroupPostSerializer
end
def mentions
group = find_group(:group_id)
posts = group.mentioned_posts_for(guardian, params[:before_post_id]).limit(20)
render_serialized posts.to_a, GroupPostSerializer
end
def messages
group = find_group(:group_id)
posts = if guardian.can_see_group_messages?(group)
group.messages_for(guardian, params[:before_post_id]).where(post_number: 1).limit(20).to_a
else
[]
end
render_serialized posts, GroupPostSerializer
end
def members
group = find_group(:group_id)
limit = (params[:limit] || 50).to_i
offset = params[:offset].to_i
total = group.users.count
members = group.users.order('NOT group_users.owner').order(:username_lower).limit(limit).offset(offset)
owners = group.users.order(:username_lower).where('group_users.owner')
render json: {
members: serialize_data(members, GroupUserSerializer),
owners: serialize_data(owners, GroupUserSerializer),
meta: {
total: total,
limit: limit,
offset: offset
}
}
end
def add_members
group = Group.find(params[:id])
guardian.ensure_can_edit!(group)
if params[:usernames].present?
users = User.where(username: params[:usernames].split(","))
elsif params[:user_ids].present?
users = User.find(params[:user_ids].split(","))
elsif params[:user_emails].present?
users = User.where(email: params[:user_emails].split(","))
else
raise Discourse::InvalidParameters.new('user_ids or usernames or user_emails must be present')
end
users.each do |user|
if !group.users.include?(user)
group.add(user)
else
return render_json_error I18n.t('groups.errors.member_already_exist', username: user.username)
end
end
if group.save
render json: success_json
else
render_json_error(group)
end
end
def remove_member
group = Group.find(params[:id])
guardian.ensure_can_edit!(group)
if params[:user_id].present?
user = User.find(params[:user_id])
elsif params[:username].present?
user = User.find_by_username(params[:username])
else
raise Discourse::InvalidParameters.new('user_id or username must be present')
end
user.primary_group_id = nil if user.primary_group_id == group.id
group.users.delete(user.id)
if group.save && user.save
render json: success_json
else
render_json_error(group)
end
end
def set_notifications
group = find_group(:id)
notification_level = params.require(:notification_level)
GroupUser.where(group_id: group.id)
.where(user_id: current_user.id)
.update_all(notification_level: notification_level)
render json: success_json
end
private
def find_group(param_name)
name = params.require(param_name)
group = Group.find_by("lower(name) = ?", name.downcase)
guardian.ensure_can_see!(group)
group
end
end