main.lua

-- Default main file for the lua appplication.  The Lua application's methods and corresponding
-- scripts are provided here.  This is nothing more than a mapping of scripts which will be
-- included in the application.

-- Date: 8/8/17
-- Time: 11:21 PM

-- This table determines the HTTP mapping of methods to Lua modules.  Modules not specified here
-- will not be mapped to HTTP method calls.


-- A model definition object includes a definition of what an object looks like.  The types
-- correspond to the pre-defined lua types.  They key in the table is the name of the field
-- and the value is the type of value (eg, string, number).  In the cases of complex types,
-- the type a table indicating the type and referenced module object must be used.

local namazu_log = require "namazu.log"
local pagination = require "namazu.pagination"

-- A simple example model which contains primitives

local example_model = require "example.model"

local manifest = {}
manifest.model = {}

manifest.model.foo = example_model.foo
manifest.model.foo_pagination = pagination.manifest_for("foo")

manifest.model.bar = example_model.bar

-- Some tables that are used as resuseable examples

local example_headers = {

    ["X-MyExampleStringHeader"] = {
        description = "An example string header",
        type = "string",
    },

    ["X-MyExampleNumberHeader"] = {
        description = "An example number header",
        type = "number",
    },

    ["X-MyExampleBooleanHeader"] = {
        description = "An example boolean header",
        type = "boolean",
    }

}

local example_static_headers = {
    ["Access-Control-Allow-Origin"] = "http://example.com"
}

local example_parameters = {
    foo_number = {index=1, type="number"},
    bar_number = {index=2, type="number"},
    foo_string = {index=3, type="string"},
    bar_string = {index=4, type="string"}
}

-- The security manifest

manifest.security = {

    -- Specifies header-based auth schemes

    header = {

        -- Specifies an auth scheme named "api-key"

        ["api-key"] = {

            -- Describes the auth scheme.

            description = "Example Auth Scheme",

            -- Includes the specifier for the header itself

            spec = {
                name = "X-ExampleHeader",
                description = "The Example Header Specification",
                type = "string"
            }

        }
    }
}

-- The table containing the HTTP method manifest.

manifest.http = {

    -- The simple hello world operation

    -- Source code of the module, relative to the project root.  The key of the module map is the name of the module
    -- as it would be passed to require.  In this case it will load example/hello_world.lua for this particular module
    -- when in the process of servicing the request

    ["example.hello_world"] = {


        -- The operations contained in the module.  This maps the request/respons metadata to various
        -- Lua script methods based on the nature of the request/response.

        operations = {

            get_hello_world_pagination = {

                -- Describes the operation which will be relayed to documentation definitions
                description = "Example Pagination Operation",

                -- The corresponding HTTP verb.  Must be one of GET, POST, PUT, DELETE, HEAD, OPTIONS.
                -- Note:  If left unspecified, HEAD or OPTIONS will revert to a default behavior.  Thereby
                -- obviating the need to implement those under normal circumstances.
                --
                -- In the case of HEAD, a GET request will execute (if available) and then provide the
                -- response without the headers.
                --
                -- The OPTIONS request will use the operations specified in this manifest file to determine
                -- what requests are availble wihtout having to provide a specific implementation.

                verb = "GET",

                -- The path the server will resolve the module.  The path parameters encapsulated in the
                -- {} notation and will be used as wildcard-style matching.  This example will match
                -- any path under /hello_world/ and capture the remaining path componenet in the
                -- foo path parameter.

                path = "/hello_world",

                -- The lua method to call in the module when servicing the request.  This will include
                -- the get module.

                method = "get_all",

                -- Specifies which auth schemes are supported by this endpoint.

                auth = { "api-key" },

                -- Parameters which the request will accept.  Parameters may ony specify simple types.

                parameters = example_parameters,

                -- Specifies the content which will be produced and consumed by the operation.  The consumer
                -- will consume a model of the supplied type when the content type is provided.

                consumes = {

                    -- Specifies the content-type to match the incoming requests
                    ["application/json"] = {

                        -- Specifies the model which will be used to service the request
                        model = "foo",

                        -- Specifies any additional headers this request may consume
                        headers = example_headers

                    }
                },

                produces = {

                    -- Specifies the content-type to match to the
                    ["application/json"] = {

                        -- Specifies the model which will be used to service the request
                        model = "foo_pagination",

                        -- Specifies any additional headers this request may consume
                        headers = example_headers,

                        -- Specifies any options headers, if availble.  These will be sent with the
                        -- response as-is.  This is useful for performing operations such as CORS or
                        -- similar responses.

                        static_headers = example_static_headers

                    }

                }

            },

            get_hello_world = {

                -- Describes the operation which will be relayed to documentation definitions
                description = "Example Operation",

                -- The corresponding HTTP verb.  Must be one of GET, POST, PUT, DELETE, HEAD, OPTIONS.
                -- Note:  If left unspecified, HEAD or OPTIONS will revert to a default behavior.  Thereby
                -- obviating the need to implement those under normal circumstances.
                --
                -- In the case of HEAD, a GET request will execute (if available) and then provide the
                -- response without the headers.
                --
                -- The OPTIONS request will use the operations specified in this manifest file to determine
                -- what requests are availble wihtout having to provide a specific implementation.

                verb = "GET",

                -- The path the server will resolve the module.  The path parameters encapsulated in the
                -- {} notation and will be used as wildcard-style matching.  This example will match
                -- any path under /hello_world/ and capture the remaining path componenet in the
                -- foo path parameter.

                path = "/hello_world/{foo}",

                -- The lua method to call in the module when servicing the request.  This will include
                -- the get module.

                method = "get",

                -- Parameters which the request will accept.  Parameters may ony specify simple types.

                parameters = example_parameters,

                -- Specifies the content which will be produced and consumed by the operation.  The consumer
                -- will consume a model of the supplied type when the content type is provided.

                consumes = {

                    -- Specifies the content-type to match the incoming requests
                    ["application/json"] = {

                        -- Specifies the model which will be used to service the request
                        model = "foo",

                        -- Specifies any additional headers this request may consume
                        headers = example_headers

                    }
                },

                produces = {
                    -- Specifies the content-type to match to the
                    ["application/json"] = {

                        -- Specifies the model which will be used to service the request
                        model = "foo",

                        -- Specifies any additional headers this request may consume
                        headers = example_headers,

                        -- Specifies any options headers, if availble.  These will be sent with the
                        -- response as-is.  This is useful for performing operations such as CORS or
                        -- similar responses.

                        static_headers = example_static_headers

                    }

                }

            },

            get_async_hello_world = {

                -- Describes the operation which will be relayed to documentation definitions
                description = "Example Async Operation",

                -- The corresponding HTTP verb.  Must be one of GET, POST, PUT, DELETE, HEAD, OPTIONS.
                -- Note:  If left unspecified, HEAD or OPTIONS will revert to a default behavior.  Thereby
                -- obviating the need to implement those under normal circumstances.
                --
                -- In the case of HEAD, a GET request will execute (if available) and then provide the
                -- response without the headers.
                --
                -- The OPTIONS request will use the operations specified in this manifest file to determine
                -- what requests are availble wihtout having to provide a specific implementation.

                verb = "GET",

                -- The path the server will resolve the module.  The path parameters encapsulated in the
                -- {} notation and will be used as wildcard-style matching.  This example will match
                -- any path under /hello_world/ and capture the remaining path componenet in the
                -- foo path parameter.

                path = "/hello_world_async/{foo}",

                -- The lua method to call in the module when servicing the request.  This will include
                -- the get module.

                method = "get_async",

                -- Parameters which the request will accept.  Parameters may ony specify simple types.

                parameters = example_parameters,

                -- Specifies the content which will be produced and consumed by the operation.  The consumer
                -- will consume a model of the supplied type when the content type is provided.

                consumes = {

                    -- Specifies the content-type to match the incoming requests
                    ["application/json"] = {

                        -- Specifies the model which will be used to service the request
                        model = "foo",

                        -- Specifies any additional headers this request may consume
                        headers = example_headers

                    }
                },

                produces = {
                    -- Specifies the content-type to match to the
                    ["application/json"] = {

                        -- Specifies the model which will be used to service the request
                        model = "foo",

                        -- Specifies any additional headers this request may consume
                        headers = example_headers,

                        -- Specifies any options headers, if availble.  These will be sent with the
                        -- response as-is.  This is useful for performing operations such as CORS or
                        -- similar responses.

                        static_headers = example_static_headers

                    }

                }

            }

        }

    }

}

manifest.startup = { 
    ["example.startup"] = {
        operations = {
            run_once = {
                method = "run_once"
            },
            run_forever = {
                method = "run_forever"
            }
        }
    }
}

manifest.event = {
    ["example.event"] = {
        {module = "example.event", method = "hello_event"},
        {module = "example.event", method = "hello_event_again"}
    }
}

return manifest