trabajo-afectivo/lib/sessions/event/base.rb
2022-01-01 14:38:12 +01:00

161 lines
3.4 KiB
Ruby

# Copyright (C) 2012-2022 Zammad Foundation, https://zammad-foundation.org/
class Sessions::Event::Base
def initialize(params)
params.each do |key, value|
instance_variable_set "@#{key}", value
end
@is_web_socket = false
return if !@clients[@client_id]
@is_web_socket = true
return if !self.class.instance_variable_get(:@database_connection)
if ActiveRecord::Base.connected?
@reused_connection = true
else
@reused_connection = false
ActiveRecord::Base.establish_connection
end
end
def self.inherited(subclass)
super
subclass.instance_variable_set(:@database_connection, @database_connection)
end
def websocket_send(recipient_client_id, data)
msg = if data.instance_of?(Array)
data.to_json
else
"[#{data.to_json}]"
end
if @clients[recipient_client_id]
log 'debug', "ws send #{msg}", recipient_client_id
@clients[recipient_client_id][:websocket].send(msg)
else
log 'debug', "fs send #{msg}", recipient_client_id
Sessions.send(recipient_client_id, data)
end
end
def valid_session?
if !@session
error = {
event: 'error',
data: {
state: 'no_session',
},
}
Sessions.send(@client_id, error)
return
end
if !@session['id']
error = {
event: 'error',
data: {
state: 'no_session_user_id',
},
}
Sessions.send(@client_id, error)
return
end
true
end
def current_user_id
if !@session
error = {
event: "#{@event}_error",
data: {
state: 'no_session',
},
}
Sessions.send(@client_id, error)
return
end
if @session['id'].blank?
error = {
event: "#{@event}_error",
data: {
state: 'no_session_user_id',
},
}
Sessions.send(@client_id, error)
return
end
@session['id']
end
def current_user
user_id = current_user_id
return if !user_id
user = User.find_by(id: user_id)
if !user
error = {
event: "#{event}_error",
data: {
state: 'no_such_user',
},
}
Sessions.send(@client_id, error)
return
end
user
end
def remote_ip
@headers&.fetch('X-Forwarded-For', nil).presence
end
def origin
@headers&.fetch('Origin', nil).presence
end
def permission_check(key, event)
user = current_user
return if !user
if !user.permissions?(key)
error = {
event: "#{event}_error",
data: {
state: 'no_permission',
},
}
Sessions.send(@client_id, error)
return
end
true
end
def log(level, data, client_id = nil)
return if !@options[:v] && level == 'debug'
if !client_id
client_id = @client_id
end
# rubocop:disable Rails/Output
puts "#{Time.now.utc.iso8601}:client(#{client_id}) #{data}"
# puts "#{Time.now.utc.iso8601}:#{ level }:client(#{ client_id }) #{ data }"
# rubocop:enable Rails/Output
# Rails.logger.info "#{Time.now.utc.iso8601}:client(#{client_id}) #{data}"
end
def self.database_connection_required
@database_connection = true
end
def destroy
return if !@is_web_socket
return if !self.class.instance_variable_get(:@database_connection)
return if @reused_connection
ActiveRecord::Base.remove_connection
end
end