{"id":16239160,"url":"https://github.com/xtrinch/sensor-dashboard-nestjs-backend","last_synced_at":"2025-03-19T16:31:17.078Z","repository":{"id":39889281,"uuid":"282815833","full_name":"xtrinch/sensor-dashboard-nestjs-backend","owner":"xtrinch","description":"Nest.JS Backend repo for a grafana-like environmental sensor dashboard.","archived":false,"fork":false,"pushed_at":"2023-03-08T02:39:32.000Z","size":2765,"stargazers_count":9,"open_issues_count":6,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2024-10-11T13:42:11.087Z","etag":null,"topics":["measurements","nestjs","sensor-data"],"latest_commit_sha":null,"homepage":"https://iotfreezer.com","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/xtrinch.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-07-27T06:44:56.000Z","updated_at":"2022-11-26T07:42:21.000Z","dependencies_parsed_at":"2023-02-13T20:16:13.432Z","dependency_job_id":null,"html_url":"https://github.com/xtrinch/sensor-dashboard-nestjs-backend","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xtrinch%2Fsensor-dashboard-nestjs-backend","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xtrinch%2Fsensor-dashboard-nestjs-backend/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xtrinch%2Fsensor-dashboard-nestjs-backend/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xtrinch%2Fsensor-dashboard-nestjs-backend/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/xtrinch","download_url":"https://codeload.github.com/xtrinch/sensor-dashboard-nestjs-backend/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":221729257,"owners_count":16870978,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["measurements","nestjs","sensor-data"],"created_at":"2024-10-10T13:42:31.195Z","updated_at":"2024-10-27T20:24:37.587Z","avatar_url":"https://github.com/xtrinch.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Sensor dashboard backend\n\n## Description\n\nSimple NestJS backend for a dashboard displaying graphs of environmental sensor data.\n\nHow this works? First you need to create yourself a user. Then you create a sensor entry in the database via the API with your user token, which creates the sensor authentication token (`accessToken` field of the sensor entry). With the sensor authentication token you program your sensor board to make api calls to import measurements. One board can have multiple sensors, so you can import multiple measurements at a time.\n\nSee also [frontend](https://github.com/xtrinch/sensor-dashboard-react-frontend) and [sensor board code](https://github.com/xtrinch/sensor-dashboard-ESP32-BME680-reader), or [see it live](http://iotfreezer.com) with some sensor data from my living room.\n\n## Installation\n\n```bash\n$ yarn install\n$ cp .env.example .env\n```\nFill out database credentials in newly created .env files.\n\nFor detailed API documentation (swagger docs) see `http://localhost:3000/swagger`.\n\n## Endpoints\n\n Endpoint               | Method | Auth?               | Query params                                 | Description\n ---------------------- | ------ | ------------------- | -------------------------------------------- | ------------------------------------------------\n `/sensors`             | GET    | No                  |                                              | List all sensor boards\n `/sensors/my`          | GET    | Yes - User cookies  |                                              | List all sensors for user\n `/sensors`             | POST   | Yes - User cookies  |                                              | Create a sensor for user\n `/measurements`        | GET    | No                  | createdAtRange, measurementTypes, sensorIds  | List all measurements\n `/measurements`        | POST   | Yes - Sensor token  |                                              | Post one measurement for a sensor board\n `/measurements/multi`  | POST   | Yes - Sensor token  |                                              | Post multiple measurements for a sensor board\n `/measurements/display`| POST   | Yes - Display token |                                              | Get latest measurements configured for a display\n `/displays/my`         | GET    | Yes - User cookies  |                                              | List all displays for user\n `/displays`            | POST   | Yes - User cookies  |                                              | Create a display entry\n\n## MQTT\n\nYou can also post measurement data (multiple only) via MQTT by publishing to the following topic:\n`/measurements/multi/${your_jwt}`\t\n\nExample command:\n`mosquitto_pub -L  'mqtts://iotfreezer.com:8883/measurements/multi/05ba4e87-e61e-4041-bbe5-35333ca4c2bc' -m '{\\\"measurements\\\":[{\\\"measurement\\\":14,\\\"measurementType\\\": \\\"temperature\\\"}]}' --cafile .\\test.cer`\n## Running the app\n\n```bash\n# development\n$ yarn run start\n\n# watch mode\n$ yarn run start:dev\n\n# production mode\n$ yarn run start:prod\n```\n\n## Migrations\n\nGenerate migrations:\n```bash\n$ yarn run typeorm migration:generate -n SampleMigrationName\n```\n\nRevert last migration:\n```bash\n$ yarn run typeorm migration:revert\n```\n\nMigrations are run automagically upon server start.\n\n## Test\n\nIf running tests locally, make sure to add `127.0.0.1 postgrestest` to /etc/hosts.\n\n```bash\n# unit tests\n$ yarn run test\n\n# e2e tests\n$ yarn run test:e2e\n\n# test coverage\n$ yarn run test:cov\n\n# run via docker-compose\n$  docker-compose --env-file .env.test --profile testing up --exit-code-from backendtest \n```\n\n## Production setup\n \n```bash\n\n# copy the prod env example\n$ cp .prod.env.example .env\n# change:\n# - KOOFR_EMAIL \n# - KOOFR_PASSWORD (generate a new koofr password on their dashboard)\n# - JWT_SECRET (generate random)\n# - ADMIN_TOKEN (generate random)\n# - GOOGLE_CLIENT_ID\n# - GOOGLE_SECRET\n# - TYPEORM_PASSWORD\n# - PGPASSWORD\n\n# spin up postgres, node and test container\n$ docker-compose --profile run up -d\n\n# restore database, winscp the backup into your server first\n$ sudo docker inspect iotfreezer-postgres | grep \"IPAddress\"\n# if you need to do some maintenance in the db first\n$ psql -h 172.25.0.2 -p 5433 -U postgres --dbname=sensor-dashboard\n# data only restore, migration inserts will fail but the rest should succeed\n$ pg_restore --host \"172.24.0.3\" --port \"5433\" --username \"postgres\" --dbname \"sensor-dashboard\" --verbose --schema \"public\" backup-production-28-02-2022.dump --disable-triggers --exit-on-error\n\n# use the nginx.default.conf and voila\n\n# backup database in production\n$ docker exec -t postgres pg_dump --no-owner -U postgres sensor-dashboard \u003e ../sensor-dashboard-database-backups/backup\n```\n\n# TODOs\n- change password\n- reset password","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxtrinch%2Fsensor-dashboard-nestjs-backend","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fxtrinch%2Fsensor-dashboard-nestjs-backend","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxtrinch%2Fsensor-dashboard-nestjs-backend/lists"}