2020-12-03 04:22:51 +00:00
# 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
2020-12-19 06:33:33 +00:00
before_action :set_chat_conversation , only : [
:show ,
:mark_chat_conversation_approved ,
:mark_chat_conversation_hidden ,
:mark_chat_conversation_read ,
:set_expiration_policy
]
2020-12-03 04:22:51 +00:00
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
2020-12-20 17:27:24 +00:00
2020-12-03 04:22:51 +00:00
chat_conversation_account = find_or_create_conversation
render json : chat_conversation_account , each_serializer : REST :: ChatConversationAccountSerializer
end
2020-12-16 00:31:30 +00:00
def mark_chat_conversation_read
@chat_conversation_account . update! ( unread_count : 0 )
2020-12-03 04:22:51 +00:00
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
2020-12-16 00:31:30 +00:00
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
2020-12-03 04:22:51 +00:00
end
2020-12-19 06:33:33 +00:00
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
@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
2020-12-03 04:22:51 +00:00
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