#/*
# * 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.
# *
# */

server {
    listen 9000;
    server_name management_gw;

     # Log locations with service name
     access_log /var/log/api-gateway/access.log platform;
     error_log /var/log/api-gateway/mgmt_error.log debug;

    location /resources {
        access_by_lua_block {
            mgmt = require("management")
            requestMethod = ngx.req.get_method()
            if requestMethod == "GET" then
                mgmt.getResource()
            elseif requestMethod == "PUT" then
                mgmt.addResource()
            elseif requestMethod == "POST" then
                ngx.status = 400
                ngx.say("Use PUT")
            elseif requestMethod == "DELETE" then
                mgmt.deleteResource()
            else
                ngx.status = 400
                ngx.say("Invalid verb")
            end
        }
    }

    location /subscriptions {
         access_by_lua_block {
             mgmt = require("management")
             requestMethod = ngx.req.get_method()
             if requestMethod == "PUT" then
                 mgmt.addSubscription()
             elseif requestMethod == "DELETE" then
                 mgmt.deleteSubscription()
             else
                 ngx.status = 400
                 ngx.say("Invalid verb")
             end

         }
     }

    location /subscribe {
        access_by_lua_block {
            mgmt = require("management")
            mgmt.subscribe()
        }
    }

    location /unsubscribe {
        access_by_lua_block {
            mgmt = require("management")
            mgmt.unsubscribe()
        }
    }
}
