mirror of
https://github.com/Blockstream/satellite-api.git
synced 2025-02-23 22:06:32 +01:00
131 lines
4.1 KiB
Ruby
131 lines
4.1 KiB
Ruby
|
require 'sinatra'
|
||
|
require 'sinatra/param'
|
||
|
|
||
|
require_relative 'constants'
|
||
|
|
||
|
set :raise_sinatra_param_exceptions, true
|
||
|
|
||
|
def error_object(title, detail, code)
|
||
|
{:message => title,
|
||
|
:errors => [{
|
||
|
title: title,
|
||
|
detail: detail,
|
||
|
code: code
|
||
|
}]
|
||
|
}.to_json
|
||
|
end
|
||
|
|
||
|
class ERROR
|
||
|
CODES = {
|
||
|
OTHER_ERROR: 1,
|
||
|
PARAM_COERCION: 2,
|
||
|
PARAM_MISSING: 3,
|
||
|
PARAM_BLANK: 4,
|
||
|
PARAM_NOT_STRING: 5,
|
||
|
PARAM_FORMAT: 6,
|
||
|
PARAM_EQUALITY: 7,
|
||
|
PARAM_OUT_OF_RANGE: 8,
|
||
|
PARAM_TOO_SMALL: 9,
|
||
|
PARAM_TOO_LARGE: 10,
|
||
|
PARAM_TOO_SHORT: 11,
|
||
|
PARAM_TOO_LONG: 12,
|
||
|
PARAM_ONE_OF: 13,
|
||
|
PARAM_ANY_OF: 14,
|
||
|
|
||
|
LIMIT_TOO_LARGE: 101,
|
||
|
BID_TOO_SMALL: 102,
|
||
|
FILE_MISSING: 103,
|
||
|
UUID_MISSING: 104,
|
||
|
BID_INCREASE_MISSING: 105,
|
||
|
BID_INCREASE_TOO_SMALL: 106,
|
||
|
LID_MISSING: 107,
|
||
|
CHARGED_AUTH_TOKEN_MISSING: 108
|
||
|
}
|
||
|
|
||
|
def self.code(p, e)
|
||
|
param = p.to_s.upcase
|
||
|
error = e.to_s.upcase
|
||
|
param_specific_error_code = "#{param}_#{error}".to_sym
|
||
|
generic_error_code = "PARAM_#{error}".to_sym
|
||
|
CODES[param_specific_error_code] || CODES[generic_error_code] || CODES[:OTHER_ERROR]
|
||
|
end
|
||
|
end
|
||
|
|
||
|
error Sinatra::Param::ParameterCoercionError do
|
||
|
param_name = env['sinatra.error'].param
|
||
|
error_object("#{param_name} type coercion error",
|
||
|
"#{param_name} not the expected type",
|
||
|
ERROR.code(param_name, :COERCION))
|
||
|
end
|
||
|
|
||
|
error Sinatra::Param::ParameterMissingError do
|
||
|
param_name = env['sinatra.error'].param
|
||
|
error_object("#{param_name} missing",
|
||
|
"#{param_name} is required and is missing",
|
||
|
ERROR.code(param_name, :MISSING))
|
||
|
end
|
||
|
|
||
|
error Sinatra::Param::ParameterBlankError do
|
||
|
param_name = env['sinatra.error'].param
|
||
|
error_object("#{param_name} blank",
|
||
|
"#{param_name} cannot be blank",
|
||
|
ERROR.code(param_name, :BLANK))
|
||
|
end
|
||
|
|
||
|
error Sinatra::Param::ParameterNotStringError do
|
||
|
param_name = env['sinatra.error'].param
|
||
|
error_object("#{param_name} must be a string",
|
||
|
"#{param_name} must be a string if using format validation #{env['sinatra.error'].options[:format]}",
|
||
|
ERROR.code(param_name, :STRING))
|
||
|
end
|
||
|
|
||
|
error Sinatra::Param::ParameterFormatError do
|
||
|
param_name = env['sinatra.error'].param
|
||
|
error_object("#{param_name} must match format",
|
||
|
"#{param_name} must match format #{env['sinatra.error'].options[:format]}",
|
||
|
ERROR.code(param_name, :FORMAT))
|
||
|
end
|
||
|
|
||
|
error Sinatra::Param::ParameterEqualityError do
|
||
|
param_name = env['sinatra.error'].param
|
||
|
error_object("#{param_name} must be value",
|
||
|
"#{param_name} must be #{env['sinatra.error'].options[:is]}",
|
||
|
ERROR.code(param_name, :EQUALITY))
|
||
|
end
|
||
|
|
||
|
error Sinatra::Param::ParameterOutOfRangeError do
|
||
|
param_name = env['sinatra.error'].param
|
||
|
range = env['sinatra.error'].options[:in] || env['sinatra.error'].options[:within] || env['sinatra.error'].options[:range]
|
||
|
error_object("#{param_name} out of range",
|
||
|
"#{param_name} out of range #{range}",
|
||
|
ERROR.code(param_name, :EQUALITY))
|
||
|
end
|
||
|
|
||
|
error Sinatra::Param::ParameterTooSmallError do
|
||
|
param_name = env['sinatra.error'].param
|
||
|
error_object("#{param_name} too small",
|
||
|
"#{param_name} cannot be smaller than #{env['sinatra.error'].options[:min]}",
|
||
|
ERROR.code(param_name, :TOO_SMALL))
|
||
|
end
|
||
|
|
||
|
error Sinatra::Param::ParameterTooLargeError do
|
||
|
param_name = env['sinatra.error'].param
|
||
|
error_object("#{param_name} too large",
|
||
|
"#{param_name} cannot be larger than #{env['sinatra.error'].options[:max]}",
|
||
|
ERROR.code(param_name, :TOO_LARGE))
|
||
|
end
|
||
|
|
||
|
error Sinatra::Param::ParameterTooShortError do
|
||
|
param_name = env['sinatra.error'].param
|
||
|
error_object("#{param_name} too short",
|
||
|
"#{param_name} cannot have length less than #{env['sinatra.error'].options[:min_length]}",
|
||
|
ERROR.code(param_name, :TOO_SHORT))
|
||
|
end
|
||
|
|
||
|
error Sinatra::Param::ParameterTooLongError do
|
||
|
param_name = env['sinatra.error'].param
|
||
|
error_object("#{param_name} too long",
|
||
|
"#{param_name} cannot have length greater than #{env['sinatra.error'].options[:max_length]}",
|
||
|
ERROR.code(param_name, :TOO_LONG))
|
||
|
end
|