# Mobicoop V3 - Ad Ad service for Mobicoop V3. ## Requirements You need [Docker](https://docs.docker.com/engine/) and its [compose](https://docs.docker.com/compose/) plugin. You also need NodeJS installed locally : we **strongly** advise to install [Node Version Manager](https://github.com/nvm-sh/nvm) and use the latest LTS version of Node (check that your local version matches with the one used in the Dockerfile). The API will run inside a docker container, **but** the install itself is made outside the container, because during development we need tools that need to be available locally (eg. ESLint or Prettier with fix-on-save). A RabbitMQ instance is also required to send / receive messages when data has been inserted/updated/deleted. ## Installation - copy `.env.dist` to `.env` : ```bash cp .env.dist .env ``` Modify it if needed. - install the dependencies : ```bash npm install ``` - start the containers : ```bash docker compose up -d ``` The app runs automatically on port **5006**. ## Database migration Before using the app, you need to launch the database migration (it will be launched inside the container) : ```bash npm run migrate ``` ## Usage The app exposes the following [gRPC](https://grpc.io/) services : - **FindByUuid** : find an ad by its uuid ```json { "uuid": "80126a61-d128-4f96-afdb-92e33c75a3e1" } ``` - **Create** : create an ad (note that uuid is optional, a uuid will be automatically attributed if it is not provided) Punctual driver ad : ```json { "userUuid": "80c9bb02-0931-4a1d-bea6-22d358992245", "driver": true, "seatsDriver": 3, "frequency": "PUNCTUAL", "departure": "2023-01-15 09:00", "addresses": [ { "position": 0, "lon": 48.68944505415954, "lat": 6.176510296462267, "houseNumber": "5", "street": "Avenue Foch", "locality": "Nancy", "postalCode": "54000", "country": "France" }, { "position": 1, "lon": 48.8566, "lat": 2.3522, "locality": "Paris", "postalCode": "75000", "country": "France" } ] } ``` Punctual driver and passenger ad : ```json { "userUuid": "80c9bb02-0931-4a1d-bea6-22d358992245", "driver": true, "pasenger": true, "seatsDriver": 3, "seatsPassenger": 1, "frequency": "PUNCTUAL", "departure": "2023-01-15 09:00", "addresses": [ { "position": 0, "lon": 48.68944505415954, "lat": 6.176510296462267, "houseNumber": "5", "street": "Avenue Foch", "locality": "Nancy", "postalCode": "54000", "country": "France" }, { "position": 1, "lon": 48.8566, "lat": 2.3522, "locality": "Paris", "postalCode": "75000", "country": "France" } ] } ``` Recurrent passenger ad : ```json { "userUuid": "80c9bb02-0931-4a1d-bea6-22d358992245", "passenger": true, "seatsPassenger": 1, "frequency": "RECURRRENT", "fromDate": "2023-01-15", "toDate": "2023-12-31", "schedule": { "mon": "07:00", "tue": "07:05", "fri": "07:10" }, "addresses": [ { "position": 0, "lon": 48.68944505415954, "lat": 6.176510296462267, "houseNumber": "5", "street": "Avenue Foch", "locality": "Nancy", "postalCode": "54000", "country": "France" }, { "position": 1, "lon": 48.8566, "lat": 2.3522, "locality": "Paris", "postalCode": "75000", "country": "France" } ] } ``` The list of possible options when creating an ad : - uuid (optional): the uuid of the ad - userUuid: the user uuid - driver (boolean, optional): if the ad is a driver ad - passenger (boolean, optional): if the ad is a passenger ad - frequency: `PUNCTUAL` or `RECURRENT` - departure (required if punctual): departure date and hour/minute for a punctual ad - fromDate (required if recurrent): start date for recurrent ad - toDate (required if recurrent): end date for recurrent ad - schedule (required if recurrent): an object with the departure time for each carpooled day in the week - marginDurations (optional): an object with the margin duration (in seconds) for each carpooled day in the week, eg: { "mon": 900, "tue": 850, "fri": 950 } - seatsDriver (optional): number of seats proposed as driver; - seatsPassenger (optional): number of seats requested as passenger; - strict (boolean, optional): if set to true, allow matching only with similar frequency ads - addresses: an array of adresses that represent the waypoints of the journey (only first and last waypoints are used for passenger ads) Default values must be set in `.env` file. ## Messages As mentionned earlier, RabbitMQ messages are sent after these events : - **Create** (message : the created ad informations) ## Tests / ESLint / Prettier Tests are run outside the container for ease of use (switching between different environments inside containers using prisma is complicated and error prone). The integration tests use a dedicated database (see _db-test_ section of _docker-compose.yml_). ```bash # run all tests (unit + integration) npm run test # unit tests only npm run test:unit # integration tests only npm run test:integration # coverage npm run test:cov # ESLint npm run lint # Prettier npm run pretty ``` ## License Mobicoop V3 - Ad Service is [AGPL licensed](LICENSE).