Categories model now returns category code in payload
Additive payload now contains category id
Updated composer keywords and version info
Updated GET requests
Added robots.txt to disallow searches
Added ETag HTTP caching call in MyResponse

Change due to issue #12. Config file now contains 'HTTP_CACHE'
boolean constant. When set to true all HTTP responses that are
applicable for caching will contain the ETag header.
The ETag header is generated from the same key that is used to
cache results in the Redis cache server.
Refactored Cache classes inheritance model

Added abstract CacheBase class that implements CacheInterface.
This class contains common cache functionalities like the genKey() method.
Bumped version in composer.json to 0.9.1
NullCache getters return false
Added test HTTP cache settings to category fetch
Adapted caching to work using Last-Modified header
Categories HTTP caching now uses ETag
Added cache headers to HTTP respons (issue #12 )

Entity tag (ETag) headers are now added for the following resources:
/additives, /additives/{code}, /categories/{code}. The ETag unique-id
value is calculated using the 'last_update' SQL schema property for each
item selected. Results will be cached in Redis and the ETag unique-id will
be recalculated on every request. The server will return (304) Not
Modified for matching ETag ids.

This is not a full fix for the issue because results are still fetched and
sent to the user agent. A proper fix would be to directly compare the ETag
ids without actually making a Redis data fetch request!
Added 'SKIP_AUTH' config parameter

If this parameter is set to 'true', the server will not validate the
X-Authorization header sent by user agents.
Fixed Slim Stop Exception issue (issue #12)

As soon as the Slim framework detects that user agent sent ETag matches
the server produced ETag set in the Model classes it halts the execution
with (304) Not Modified and throws a \Slim\Exception\Stop exception which
was being handled by the try-catch (Exception) in Model class methods.
This in turn was then rethrown as ModelException and that cause incorrect
HTTP (500) Internal Server Error to be thrown.

This whole scenario actually happens when there was NO cache at all on
server side (in Redis) but the user agent (browser) still sends the ETag
with the request.

Now fixed by catching the Stop exception in Model class methods and
rethrowing it to the caller.
Fixed auth problem if SKIP_AUTH was not defined
ResourceURI now written in logs when in DEBUG mode
Fixed an issue with Expires header (issue #12)

It seems it is required to call Slim expires() before etag()
because after calling etag() the app halts and the new expires()
value will not be written into the HTTP response headers.
Refactored HTTP cache headers calls

Model class now implements a setCacheHeaders() method that sets
both etag() and expires().
Extended setCacheHeaders() functionality (issue #12)

Extended the etag() unique-id generation by using two more salt
factors: VERSION constant defined in config file and GLOBAL_CACHE
_KEY defined in Model class. With the help of these two data
cached on client side can be more easily invalidated.