app/controllers/api/v1/api_controller.rb
module Api
module V1
class ApiController < ApplicationController
before_action :initialize_updates_used_tracker
before_action :authenticate_application!
before_action :authenticate_api_user!
after_action :log_api_request
def authenticate_application!
# @application_integration = ApplicationIntegration.find_by(application_token: params[:application_token])
# Stopgap for live implementation
@application_integration = ApplicationIntegration.first
unless @application_integration
@request_success = :error
log_api_request
render json: {
"Error" => "Invalid application_token",
"Param" => "application_token",
"Token" => params[:application_token]
}
return
end
end
def authenticate_api_user!
# @authorization = @application_integration.integration_authorizations.find_by(user_token: params[:authorization_token])
# todo error on this if not set
# Stopgap for live implementation
@authorization = @application_integration.integration_authorizations.first
# @current_api_user = @authorization.try(:user)
@current_api_user = current_user
unless @current_api_user
@request_success = :error
log_api_request
render json: {
"Error" => "Invalid authorization_token",
"Param" => "authorization_token",
"Token" => params[:authorization_token]
}
return
end
end
def initialize_updates_used_tracker
@updates_used_this_request = 0
end
def log_api_request
ApiRequest.create!(
application_integration: @application_integration,
integration_authorization: @authorization,
result: @request_success || :success,
updates_used: @updates_used_this_request,
ip_address: request.remote_ip
)
end
# Content page list endpoints
Rails.application.config.content_types[:all].each do |content_type|
define_method(content_type.name.downcase.pluralize) do
pages = @current_api_user.send(content_type.name.downcase.pluralize)
render json: pages.map { |page|
{
id: page.id,
name: page.name,
description: page.description,
universe: page.try(:universe).nil? ? nil : {
id: page.universe_id,
name: page.universe.name
},
meta: {
created_at: page.created_at,
updated_at: page.updated_at
}
}
}
end
end
# Content page show endpoints
Rails.application.config.content_types[:all].each do |content_type|
define_method(content_type.name.downcase) do
page = content_type.find_by(id: params[:id].to_i)
if page && page.readable_by?(@current_api_user || User.new)
render json: ApiContentSerializer.new(page, include_blank_fields: params.fetch(:include_blank_fields, false)).data
else
render json: { error: "Page not found" }
end
end
end
def timeline
timeline = Timeline.find_by(id: params[:id].to_i)
events = timeline.timeline_events
render json: {
name: timeline.name,
description: timeline.description,
universe: timeline.universe.nil? ? nil : {
id: timeline.universe.id,
name: timeline.universe.try(:name)
},
meta: {
created_at: timeline.created_at,
updated_at: timeline.updated_at
},
categories: [
id: 1,
label: 'Events',
icon: Timeline.icon,
fields: events.map { |event|
{
id: event.id,
label: event.title,
icon: Timeline.icon,
type: TimelineEvent.name,
description: event.description,
time_label: event.time_label
}
}
]
}
end
end
end
end