Getting started

Rakam API is a RESTFul API written in Java 8. It's built on top of the HTTP framework called
netty-rest and mainly uses java libraries Guice,
Guava, Jackson, Airlift, HikariCP and OkHttp. Netty-rest heavily uses annotations does some Java 8
bytecode optimizations and Netty networking library under the hood. It maps the Java methods
to API endpoints. You can learn more about it here.

The starter class in Rakam is org.rakam.ServiceStarter. It uses [ServiceLoader](https://docs.oracle.com/
javase/7/docs/api/java/util/ServiceLoader.html) in order to find of the modules in runtime and
load them. In order to automate this process, we use [Google's AutoService](https://
github.com/google/auto/tree/master/service). All of the modules inside Rakam has this
@AutoService annotation, some of them has an additional annotation
@ConditionalModule(config="config_name_for_enabling_this_module", value="true").

Rakam uses a file config.properties, it's simply a Java properties file that has pair of
attribute / value pairs. The users enable the modules, pass the configuration values using
this file. @ConditionalModule is used for automatically enabling the modules with
config.properties file. You can see the current the config properties [here](http://
rakam.io/config).

In order for modules to interact with Rakam, we use Guice dependency injection library. You can learn more about the modules and the shared classeshere.

Currently we mostly have integration tests in Rakam, when you create a PR. our continuous integration solution Travis will run the tests and inform you if a test fails.