97 lines
3.2 KiB
Ruby
97 lines
3.2 KiB
Ruby
class ChatChannelsController < ApplicationController
|
|
before_action :authenticate_user!, only: [:moderate]
|
|
|
|
def index
|
|
if params[:state] == "unopened"
|
|
render_unopened_json_response
|
|
return
|
|
else
|
|
render_channels_html
|
|
end
|
|
end
|
|
|
|
def show
|
|
@chat_channel = ChatChannel.includes(:messages).find_by(id: params[:id])
|
|
if @chat_channel
|
|
@chat_channel
|
|
else
|
|
message = "The chat channel you are looking for is either invalid or does not exist"
|
|
render json: { error: message },
|
|
status: 401
|
|
end
|
|
end
|
|
|
|
def open
|
|
@chat_channel = ChatChannel.find(params[:id])
|
|
unless @chat_channel.has_member?(current_user)
|
|
render json: { status: "success", channel: params[:id] }, status: 200
|
|
return
|
|
end
|
|
membership = @chat_channel.chat_channel_memberships.where(user_id: current_user.id).first
|
|
membership.update(last_opened_at: 1.seconds.from_now, has_unopened_messages: false)
|
|
render json: { status: "success", channel: params[:id] }, status: 200
|
|
end
|
|
|
|
def moderate
|
|
@chat_channel = ChatChannel.find(params[:id])
|
|
authorize @chat_channel
|
|
command = chat_channel_params[:command].split
|
|
case command[0]
|
|
when "/ban"
|
|
banned_user = User.find_by_username(command[1])
|
|
if banned_user
|
|
banned_user.add_role :banned
|
|
banned_user.messages.each(&:destroy!)
|
|
Pusher.trigger(@chat_channel.id, "user-banned", { userId: banned_user.id }.to_json)
|
|
render json: { status: "success", message: "banned!" }, status: 200
|
|
else
|
|
render json: { status: "error", message: "username not found" }, status: 400
|
|
end
|
|
when "/unban"
|
|
banned_user = User.find_by_username(command[1])
|
|
if banned_user
|
|
banned_user.remove_role :banned
|
|
render json: { status: "success", message: "unbanned!" }, status: 200
|
|
else
|
|
render json: { status: "error", message: "username not found" }, status: 400
|
|
end
|
|
when "/clearchannel"
|
|
@chat_channel.clear_channel
|
|
render json: { status: "success", message: "cleared!" }, status: 200
|
|
else
|
|
render json: { status: "error", message: "invalid command" }, status: 400
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
def chat_channel_params
|
|
params.require(:chat_channel).permit(:command)
|
|
end
|
|
|
|
def render_unopened_json_response
|
|
if current_user.has_role?(:super_admin) || Rails.env.development?
|
|
@chat_channels_memberships = current_user.
|
|
chat_channel_memberships.
|
|
where(has_unopened_messages: true).order("updated_at DESC")
|
|
else
|
|
@chat_channels_memberships = []
|
|
end
|
|
render "index.json"
|
|
end
|
|
|
|
def render_channels_html
|
|
@chat_channels = current_user.chat_channels.
|
|
order("last_message_at DESC").
|
|
includes(:chat_channel_memberships)
|
|
@chat_channels.each do |channel|
|
|
channel.current_user = current_user
|
|
end
|
|
slug = if params[:slug] && params[:slug].start_with?("@")
|
|
[current_user.username, params[:slug].gsub("@", "")].sort.join("/")
|
|
else
|
|
params[:slug]
|
|
end
|
|
@active_channel = ChatChannel.find_by_slug(slug) || @chat_channels.first
|
|
end
|
|
end
|