* Feature 🚀 : Ability to delete messages in chat channels - Sending message ID to frontend - Deleting Message - Use pusher to delete message realtime * Minor Bug 🐞: Show message action only for current user - User can delete or edit their own messages * Test cases added * Bug 🐞: Update message id for receiver Message id was not sent to receiver by pusher * Refactoring🛠: Message controller refactoring * Test Cases📝 : Specs for Delete message added * Feature 🚀 : Ability to edit messages * Test Cases📝 : Specs for Edit message added * added new column discoverable for public channel and changes in elasticsearch * fix corrections * changes in serializer file, added channel_discoverable * added checkbox with discoverable policy * changes in code for discoverable channels * accept and reject member invitation by mod * add joining request to closed groups * fixed merge error * changes in joining member to closed groups * join to closed group * changes in message action of joining * changes in chat upopened json * 🚀Feature : Ability to search Global Channels * touch updated_at in after commit update * 🚀Feature : Ability to send request to discoverable channel * 🚀Feature : Ability to send request to discoverable channel * created new route for joining closed channel * 🚀 Success handle on joining request sent * removed redundant code * join_channel improvement, removed authorization for join channel * list of joining requests * added joining_request status channels on search list * changes in mailer and query builder optimized * 🛠 Adding filter for new Query * added rspec for add membership method in controller * rspec for sending join channel request * invite join request channel list rspec * test case for query builder discoverable * viewable and discoverable channel list * refactored logic for search channels * 🚀 Check if Request already sent * 🛠 Optimizing code and making channelButton Component * 🛠 Optimizing codefor SVG problem * 🛠 Optimized action.js * changes in search controller query * hot fix * removed unwanted code * 🛠 Fix the Channel Name problem * 🛠 Optimizing code further for CodeClimate * added new column discoverable for public channel and changes in elasticsearch * fix corrections * changes in serializer file, added channel_discoverable * added checkbox with discoverable policy * changes in code for discoverable channels * accept and reject member invitation by mod * add joining request to closed groups * fixed merge error * changes in joining member to closed groups * join to closed group * changes in message action of joining * changes in chat upopened json * touch updated_at in after commit update * 🚀Feature : Ability to search Global Channels * 🚀Feature : Ability to send request to discoverable channel * 🚀Feature : Ability to send request to discoverable channel * created new route for joining closed channel * 🚀 Success handle on joining request sent * removed redundant code * join_channel improvement, removed authorization for join channel * list of joining requests * added joining_request status channels on search list * changes in mailer and query builder optimized * added rspec for add membership method in controller * rspec for sending join channel request * invite join request channel list rspec * 🛠 Adding filter for new Query * test case for query builder discoverable * viewable and discoverable channel list * refactored logic for search channels * 🚀 Check if Request already sent * 🛠 Optimizing code and making channelButton Component * 🛠 Optimizing codefor SVG problem * 🛠 Optimized action.js * changes in search controller query * hot fix * 🛠 Fix the Channel Name problem * 🛠 Fixing merge problem * 🛠 Optimizing code further for CodeClimate * updated UI for membership edit * fixed test casses and fixed UI for chat_channel_edit * 🛠napshots added * test cases fixed * 🛠 Test cases added for new component * channel settings accesible only by mod * 🛠 More Test cases added * 🛠 Svg code optimized * 🛠 Svg code optimized in videocontent * optimized code for search query * fix test case for query builder * changes in joining closed channel logic * refactored join channel * redirect to edit channel after joining request * changes in test case for redirect * optimized code * 🛠 Eslint bugs fixed * test case fixed * optimization * olving channel repetition problem * optimization of code for query builder * changes in query builder * test cases fixed * 🛠 Handling reduntant data on frontend * 🛠 Don't show data if no filter query * 🛠 Optimized code for fixing bugs and code coverage * 🛠 Optimizing code further for CodeClimate Co-authored-by: Parasgr-code <paras.gaur@skynox.tech>
137 lines
6.8 KiB
Ruby
137 lines
6.8 KiB
Ruby
class ChatChannelMembershipsController < ApplicationController
|
|
after_action :verify_authorized, except: :join_channel
|
|
include MessagesHelper
|
|
|
|
def index
|
|
skip_authorization
|
|
@pending_invites = current_user.chat_channel_memberships.includes(:chat_channel).where(status: "pending")
|
|
end
|
|
|
|
def find_by_chat_channel_id
|
|
@membership = ChatChannelMembership.where(chat_channel_id: params[:chat_channel_id], user_id: current_user.id).first!
|
|
authorize @membership
|
|
render json: @membership.to_json(
|
|
only: %i[id status viewable_by chat_channel_id last_opened_at],
|
|
methods: %i[channel_text channel_last_message_at channel_status channel_username
|
|
channel_type channel_text channel_name channel_image channel_modified_slug channel_messages_count],
|
|
)
|
|
end
|
|
|
|
def edit
|
|
@membership = ChatChannelMembership.find(params[:id])
|
|
@channel = @membership.chat_channel
|
|
authorize @membership
|
|
end
|
|
|
|
def create
|
|
membership_params = params[:chat_channel_membership]
|
|
@chat_channel = ChatChannel.find(membership_params[:chat_channel_id])
|
|
authorize @chat_channel, :update?
|
|
usernames = membership_params[:invitation_usernames].split(",").map { |username| username.strip.delete("@") }
|
|
users = User.where(username: usernames)
|
|
invitations_sent = @chat_channel.invite_users(users: users, membership_role: "member", inviter: current_user)
|
|
flash[:settings_notice] = if invitations_sent.zero?
|
|
"No invitations sent. Check for username typos."
|
|
else
|
|
"#{invitations_sent} #{'invitation'.pluralize(invitations_sent)} sent."
|
|
end
|
|
membership = @chat_channel.chat_channel_memberships.find_by!(user: current_user)
|
|
redirect_to edit_chat_channel_membership_path(membership)
|
|
end
|
|
|
|
def join_channel
|
|
membership_params = params[:chat_channel_membership]
|
|
chat_channel = ChatChannel.find(membership_params[:chat_channel_id])
|
|
existing_membership = ChatChannelMembership.find_by(user_id: current_user.id, chat_channel_id: chat_channel.id)
|
|
if existing_membership.present? && %w[active joining_request].exclude?(existing_membership.status)
|
|
status = existing_membership.update(status: "joining_request", role: "member")
|
|
else
|
|
membership = ChatChannelMembership.new(user_id: current_user.id, chat_channel_id: chat_channel.id, role: "member", status: "joining_request")
|
|
status = membership.save
|
|
end
|
|
if status
|
|
render json: { status: "success", message: "Request Sent" }
|
|
else
|
|
render json: { status: 400, message: "Unable to join channel" }, status: :bad_request
|
|
end
|
|
end
|
|
|
|
def remove_membership
|
|
@chat_channel = ChatChannel.find(params[:chat_channel_id])
|
|
authorize @chat_channel, :update?
|
|
@chat_channel_membership = @chat_channel.chat_channel_memberships.find(params[:membership_id])
|
|
if params[:status] == "pending"
|
|
@chat_channel_membership.destroy
|
|
flash[:settings_notice] = "Invitation removed."
|
|
else
|
|
send_chat_action_message("@#{current_user.username} removed @#{@chat_channel_membership.user.username} from #{@chat_channel_membership.channel_name}", current_user, @chat_channel_membership.chat_channel_id, "removed_from_channel")
|
|
@chat_channel_membership.update(status: "removed_from_channel")
|
|
flash[:settings_notice] = "Removed #{@chat_channel_membership.user.name}"
|
|
end
|
|
membership = ChatChannelMembership.find_by!(chat_channel_id: params[:chat_channel_id], user: current_user)
|
|
redirect_to edit_chat_channel_membership_path(membership)
|
|
end
|
|
|
|
def add_membership
|
|
@chat_channel = ChatChannel.find(params[:chat_channel_id])
|
|
authorize @chat_channel, :update?
|
|
@chat_channel_membership = @chat_channel.chat_channel_memberships.find(params[:membership_id])
|
|
respond_to_invitation(@chat_channel_membership.status) if permitted_params[:user_action].present? && @chat_channel_membership.status == "joining_request"
|
|
end
|
|
|
|
def update
|
|
@chat_channel_membership = ChatChannelMembership.find(params[:id])
|
|
authorize @chat_channel_membership
|
|
if permitted_params[:user_action].present?
|
|
respond_to_invitation(@chat_channel_membership.status)
|
|
else
|
|
@chat_channel_membership.update(permitted_params)
|
|
flash[:settings_notice] = "Personal settings updated."
|
|
redirect_to edit_chat_channel_membership_path(@chat_channel_membership.id)
|
|
end
|
|
end
|
|
|
|
def destroy
|
|
@chat_channel_membership = ChatChannelMembership.find(params[:id])
|
|
authorize @chat_channel_membership
|
|
channel_name = @chat_channel_membership.chat_channel.channel_name
|
|
send_chat_action_message("@#{current_user.username} left #{@chat_channel_membership.channel_name}", current_user, @chat_channel_membership.chat_channel_id, "left_channel")
|
|
@chat_channel_membership.update(status: "left_channel")
|
|
@chat_channels_memberships = []
|
|
flash[:settings_notice] = "You have left the channel #{channel_name}. It may take a moment to be removed from your list."
|
|
redirect_to chat_channel_memberships_path
|
|
end
|
|
|
|
private
|
|
|
|
def permitted_params
|
|
params.require(:chat_channel_membership).permit(:user_action, :show_global_badge_notification)
|
|
end
|
|
|
|
def respond_to_invitation(previous_status)
|
|
if permitted_params[:user_action] == "accept"
|
|
@chat_channel_membership.update(status: "active")
|
|
channel_name = @chat_channel_membership.chat_channel.channel_name
|
|
if previous_status == "pending"
|
|
send_chat_action_message("@#{current_user.username} joined #{@chat_channel_membership.channel_name}", current_user, @chat_channel_membership.chat_channel_id, "joined")
|
|
flash[:settings_notice] = "Invitation to #{channel_name} accepted. It may take a moment to show up in your list."
|
|
else
|
|
send_chat_action_message("@#{current_user.username} added @#{@chat_channel_membership.user.username}", current_user, @chat_channel_membership.chat_channel_id, "joined")
|
|
NotifyMailer.channel_invite_email(@chat_channel_membership, @chat_channel_membership.user).deliver_later
|
|
flash[:settings_notice] = "Accepted request of #{@chat_channel_membership.user.username} to join #{channel_name}."
|
|
membership = ChatChannelMembership.find_by!(chat_channel_id: @chat_channel_membership.chat_channel.id, user: current_user)
|
|
redirect_to(edit_chat_channel_membership_path(membership)) && return
|
|
end
|
|
else
|
|
@chat_channel_membership.update(status: "rejected")
|
|
flash[:settings_notice] = "Invitation rejected."
|
|
end
|
|
redirect_to chat_channel_memberships_path
|
|
end
|
|
|
|
def send_chat_action_message(message, user, channel_id, action)
|
|
temp_message_id = (0...20).map { ("a".."z").to_a[rand(8)] }.join
|
|
message = Message.create("message_markdown" => message, "user_id" => user.id, "chat_channel_id" => channel_id, "chat_action" => action)
|
|
pusher_message_created(false, message, temp_message_id)
|
|
end
|
|
end
|