# MyFreight Assessment ## How to run Easiest way to run this project is using docker compose: `docker compose up` It is possible that this will give some database connection issues on the first try, but after a couple of seconds, it should automatically reconnect. Alternatively, it is possible to use your own mysql database, and run the code locally: 1. Import the `database/entrypoint/init.sql` into your own database 2. Update the `.env` file with the database credentials 3. Run `npm ci` to install all npm packages 4. Run `npm run build` to build the nestjs application 5. Run `npm run start:prod` to start the nestjs application ## Receiving Tracking information When receiving Tracking information, the following steps need to be completed to process the data ```mermaid flowchart TD receiveTracking(["Receive Tracking"]) findContainerAndShipment["SELECT container JOIN Shipment"] updateShipment[/Update shipment\] isArrivingSoon{{"Is arrival estimate between now and now + 24h?"}} hasArrived{{"Is arrival estimate <=now?"}} isDelayed{{Is arrival estimate > original arrival + 24h?}} sendNotification[/Send notification\] receiveTracking -- "` **Tracking data** carrierName:**string** destinationUnLoCode:**string** departureDate:**string[_datetime_]** arrivalDateEstimate:**string[_datetime_]** containerNumber:**string** `" --> findContainerAndShipment findContainerAndShipment --> |WHERE containers.containerNumber = :trackingData.containerNumber| updateShipment updateShipment --> isArrivingSoon & hasArrived & isDelayed isDelayed -->|set delayed flag| sendNotification hasArrived --> |set has arrived flag| sendNotification isArrivingSoon -->|set is arriving soon flag| sendNotification %% isArrivingSoon -->|yes| sendArriveSoon ``` ## Possible improvements - Sending the actual notification, there should be a more general way to setup notifiers - Moving some variables to config files - when is a shipment "arriving soon" - mock date - Use the uuid package - was not possible since the uuid's from the sample data were invalid uuid's - Add end-to-end tests as well - Get shipments should be paginated - Could use a package like typeorm-crud - Cleanup duplicate OpenApi decorators, perhaps consolidate them in a custom decorator