**Service** - This term is used internally in order to refer to commands that get deployed as APIs.
**Runner** - This term is used internally in order to refer to commands that get deployed as consumers of a queue.
### Creating a new Service
1. Add a file named `<service_name>.yml`. The service name is important, as it will be used as a reference throughout the codebase. The service name must be in the format `<functionality>Service`. E.g. queryService, ClientService
2. Run `task openapi:generate`. This will generate the following:
- A location to implement the server-side functions in `./api/<service_name>/`, as well as generated functions, models and swagger docs.
- A location with the client-side code in `./pkg/<service_name>/`
3. Implement the controllers in `./api/<service_name>/`
4. Create a command in `./cmd/<service_name>/main.go` which creates a new instance from `./internal/api`
### Creating a new Runner
1. Implement the controller in `./api/<runner_name>/` which implements the `Controller` interface in `./internal/queue`. The runner name must be in the format `<functionality>Runner`. E.g. queryRunner, csvExportRunner
2. Create a command in `./cmd/<runner_name>/main.go` which creates a new instance from `./internal/queue`