-- Copyright (c) 2016 IBM. All rights reserved.
--
--   Permission is hereby granted, free of charge, to any person obtaining a
--   copy of this software and associated documentation files (the "Software"),
--   to deal in the Software without restriction, including without limitation
--   the rights to use, copy, modify, merge, publish, distribute, sublicense,
--   and/or sell copies of the Software, and to permit persons to whom the
--   Software is furnished to do so, subject to the following conditions:
--
--   The above copyright notice and this permission notice shall be included in
--   all copies or substantial portions of the Software.
--
--   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
--   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
--   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
--   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
--   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
--   FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
--   DEALINGS IN THE SOFTWARE.

--- @module
--
-- @author Alex Song (songs)

local utils = require "lib/utils"
local cjson = require "cjson"

local _Request = {}

--- Error function to call when request is malformed
-- @param code error code
-- @param msg error message
function err(code, msg)
  ngx.header.content_type = "application/json; charset=utf-8"
  ngx.status = code
  local errObj = cjson.encode({
    status = code,
    message = utils.concatStrings({"Error: ", msg})
  })
  ngx.say(errObj)
  ngx.exit(ngx.status)
end

--- Function to call when request is successful
-- @param code status code
-- @param obj JSON encoded object to return
function success(code, obj)
  ngx.status = code
  if obj ~= nil then
    ngx.say(obj)
  end
  ngx.exit(ngx.status)
end

_Request.err = err
_Request.success = success

return _Request
