gab-social/app/controllers/api/v1/chat_conversation_controller.rb
mgabdev 7ec426e3d8 Progress on DMs
Progress on DMs
2020-12-19 01:33:33 -05:00

119 lines
4.3 KiB
Ruby

# frozen_string_literal: true
class Api::V1::ChatConversationController < Api::BaseController
before_action -> { authorize_if_got_token! :read, :'read:chats' }
before_action -> { doorkeeper_authorize! :write, :'write:chats' }
before_action :require_user!
before_action :set_account, only: :create
before_action :set_chat_conversation, only: [
:show,
:mark_chat_conversation_approved,
:mark_chat_conversation_hidden,
:mark_chat_conversation_read,
:set_expiration_policy
]
def show
render json: {}, each_serializer: REST::ChatConversationAccountSerializer
end
def create
# : todo :
# check if already created
# check if blocked
# check if chat blocked
# check if allow anyone to message then create with approved:true
# unique account id, participants
chat_conversation_account = find_or_create_conversation
render json: chat_conversation_account, each_serializer: REST::ChatConversationAccountSerializer
end
def mark_chat_conversation_read
@chat_conversation_account.update!(unread_count: 0)
render json: @chat_conversation_account, serializer: REST::ChatConversationAccountSerializer
end
def mark_chat_conversation_hidden
@chat_conversation_account.update!(is_hidden: true)
render json: @chat_conversation_account, serializer: REST::ChatConversationAccountSerializer
end
def mark_chat_conversation_approved
approved_conversation_count = ChatConversationAccount.where(account: @account, is_hidden: false, is_approved: true).count
if approved_conversation_count >= ChatConversationAccount::PER_ACCOUNT_APPROVED_LIMIT
render json: { error: true, message: "You have #{approved_conversation_count} active chat conversations. The limit is #{ChatConversationAccount::PER_ACCOUNT_APPROVED_LIMIT}. Delete some conversations first before approving any more requests." }
else
@chat_conversation_account.update!(is_approved: true)
render json: @chat_conversation_account, serializer: REST::ChatConversationAccountSerializer
end
end
def set_expiration_policy
if current_user.account.is_pro
case params[:expiration]
when 'five_minutes'
@expires_at = ChatConversationAccount::EXPIRATION_POLICY_MAP[:five_minutes]
when 'one_hour'
@expires_at = ChatConversationAccount::EXPIRATION_POLICY_MAP[:one_hour]
when 'six_hours'
@expires_at = ChatConversationAccount::EXPIRATION_POLICY_MAP[:six_hours]
when 'one_day'
@expires_at = ChatConversationAccount::EXPIRATION_POLICY_MAP[:one_day]
when 'three_days'
@expires_at = ChatConversationAccount::EXPIRATION_POLICY_MAP[:three_days]
when 'one_week'
@expires_at = ChatConversationAccount::EXPIRATION_POLICY_MAP[:one_week]
else
@expires_at = nil
end
puts "tilly @expires_at: " + @expires_at.inspect
@chat_conversation_account.chat_message_expiration_policy = @expires_at
@chat_conversation_account.save!
render json: @chat_conversation_account, serializer: REST::ChatConversationAccountSerializer
else
render json: { error: 'You need to be a GabPRO member to access this' }, status: 422
end
end
private
def find_or_create_conversation
chat = ChatConversationAccount.find_by(account: current_account, participant_account_ids: [@account.id.to_s])
return chat unless chat.nil?
chat_conversation = ChatConversation.create
my_chat = ChatConversationAccount.create!(
account: current_account,
participant_account_ids: [@account.id.to_s],
chat_conversation: chat_conversation,
is_approved: true
)
# : todo : if multiple ids
their_chat = ChatConversationAccount.create!(
account: @account,
participant_account_ids: [current_account.id.to_s],
chat_conversation: chat_conversation,
is_approved: false # default as request
)
return my_chat
end
def set_account
@account = Account.find(params[:account_id])
end
def set_chat_conversation
@chat_conversation = ChatConversation.find(params[:id])
@chat_conversation_account = ChatConversationAccount.where(
account: current_account,
chat_conversation: @chat_conversation
).first
end
end