# Folders

## Reason

The goals for a common project's folder structure is to mantain the organization
and to promote a common language between the programmers, decreasing the new
members' learning curve.

## Definitions

### Structure

- `domain`:

  - `service`:
    contains the business logic and persistence, i.e. validating values based on business
    rules 

  - `contract`:
    contains the interfaces for the whole app; useful for mocking dependencies on
    the tests and also decoupling the packages from each other, making the code independent
    from external technologies, e.g. databases

  - `entity`:
    represents the values our domain understands

- `infra`:
  contains utilities that will be used across the whole app

- `data`:
  contains the connection with the database or any other way to do the persistence

  - `data*`:
    an "implementation"

- `application`:
  represents our application as a whole

  - `applicationservice`:
    contains the application logic, i.e. parses and validates the data received, calls
    many domain's services, parses the output data and sends it

  - `entitymapping`:
    contains the functions that parses the application's view model to the domain's
    entities, and vice-versa

  - `viewmodel`:
    the data that will be sent and received from the app; it differs from the entity
    because it does not represent the values of our app, but rather the values the
    front-end server will understand

- `server`:
  contains the definitions for the web server

  - `router`:
    defines the routes and its handlers; contains no logic, only calls the application
    package

  - `serverconfig`:
    defines the middlewares and the server's configurations

- `static`:
  not required; mostly used for static files, such as large texts, email templates,
  static values, etc, or temporary files (commonly in `static/temp`)
