Skip to content

NodeJS scalable solution with Open Charge Map integration + MongoDB

Notifications You must be signed in to change notification settings

mrPronin/open-charge-map-backend-demo

Repository files navigation

NodeJS scalable solution with Open Charge Map integration + MongoDB

DESCRIPTION

USER STORIES

  • User story 01: As a project architect, I want Docker images to be built for each service to ensure they can be deployed to a Kubernetes cluster.
  • User story 02: As a project architect, I want services to be designed for scalability, taking into account potential timeouts and other issues that might impact uptime.
  • User story 03: As a project architect, I want a /graphql endpoint provided for each service, serving a sub-graph that can be accessed through a federated GraphQL gateway to serve data for several clients.
  • User story 04: As a project architect, I want data to be stored in a MongoDB database, using UUIDs (v4) instead of the default ObjectIds for internal identification.
  • User story 05: As a project architect, I want a service that fetches the latest charging station data from Open Charge Map and updates the database only when changes are detected.
  • User story 06: As a project architect, I want the /graphql endpoint to list all imported charging stations, with relay-style pagination to navigate through the results.
  • User story 07: As a project architect, I want separate Docker images to be created for the data pulling and the service itself.
  • User story 08: As a project architect, I want the following fields from Open Charge Map to be imported:
    • operatorInfo,
    • statusType,
    • addressInfo,
    • connections.
  • User story 09: As a project architect, I want a single command to run the entire service and import process locally, along with instructions and a docker-compose file for the additional local infrastructure.
  • User story 10: (Bonus) As a project architect, I want a minimum of 50% unit test coverage and at least one end-to-end test for the solution.

ASSUMPTIONS

  • use monorepo for all components
  • to demonstrate how the project works, it is enough to have docker images for all components and a docker-compose file, there is no need to create Kubernetes config
  • to synchronize with OCM, I use the undocumented modifiedsince parameter to fulfill the requirement to receive only the delta of updated data from OCM
  • use Apollo Server to support subgraphs
  • authentication and user management out of the scope of implementation

TODO

  • define user stories
  • create list of questions to the requirements
  • analyze the questions
  • create list of assumptions
  • create git repository and initial README.MD with user stories
  • investigate Open Charge Map API: https://openchargemap.org/site/develop/api#/
  • prepare a list of questions to the requirements
  • R&D federated GraphQL gateway
  • import-service
    • initial project setup for import-service
    • boilerplate import-service with Apollo Server
    • define import-service GraphQL schema and mock response
    • implement 'dev' script, add ts-node-dev
    • setup linter and formatter
    • refactor project
      • refactor: extract type definition to separate schema.graphql file
      • refactor: extract resolvers from index.ts
    • define port from PORT environment variable
    • create Dockerfile for import-service
      • define initial Dockerfile
      • refacor: Dockerfile for production and Dockerfile.dev for development
      • feat: create production Dockerfile
    • implement MongoDB integration
      • define mongoose schema for ImportSession
      • implement db connector as db.ts
      • define mongoose models for OCM data
        • define mongoose model for Country
        • define mongoose models POI, AddressInfo, ConnectionInfo, ConnectionType, LevelType, OperatorInfo, StatusType, SupplyType
      • create index for POI based on DateLastStatusUpdate
    • define DDD structure, refactor existing code, create placeholders
    • define domain models, refactor dao
    • define interfaces for ImportService
    • define interface for OpenChargeMapRepository
    • define interface for OCMPersistenceRepository, ImportSessionRepository
    • define CoreReferenceData
    • fix: issue with start script ERR_UNSUPPORTED_DIR_IMPORT
    • define path aliases @dal, @domain and @presentation
    • implement initial version for ImportService, ImportSessionRepository, OCMPersistenceRepository, OpenChargeMapRepository
    • implement ImportService
    • refactor: implement bootstrap module
    • setup dependency injection
    • redefine ImportService with mocked repositories
    • implement 'storeReferenceData' method for OCMPersistenceRepository
    • fine-tune dao and models according to OpenAPI docs
    • implement 'storePOIs' method for OCMPersistenceRepository
    • implement 'getLastPOIUpdate' for OCMDataPersistenceRepository
    • implement 'create' and 'getAll' methods for ImportSessionRepository
    • implement generic network API
    • dependency injection, implement composition point inside bootstrap function
    • implement 'getReferenceData' method for OpenChargeMapRepository with network api
    • implement 'getPOI' method for OpenChargeMapRepository with network api
    • improve ImportService - extract 10 minutes from modifiedSince to ensure that no data is lost when importing OPM, define global constanst for values such this
    • use transaction for OCMPersistenceRepository and ImportSessionRepository, refactor ImportService
    • handle initial POI import using streams
    • graceful shutdown import-service
    • unit-tests
    • adjust service to work as a subgraph
    • implement error handling
    • implement generic middleware
    • define cors configuration
    • add logger
    • documentation
    • etc
  • client-api
    • initial project setup
    • define domain models (interfaces)
    • implement DAO (data access objects)
    • define DB connector
    • define GraphQL schema
    • add prisma support
    • define query for one POI
    • define query for POI list with relay-style pagination
    • define resolvers
    • define interfaces for repository and services
    • implement services
    • implement repositories
    • implement dependency injection
    • create Dockerfile and Dockerfile.dev
    • graceful shutdown import-service
    • define input parameter validation, generate an error
    • unit-tests
    • adjust service to work as a subgraph
    • define cors configuration
    • add logger
    • implement errror handling
    • documentation
    • etc
  • graph-router
    • create Dockerfile for graph-router
    • etc
  • docker-compose
    • feat: define initial docker-compose
    • fix: MongoServerError: Authentication failed
    • add client-api instance
    • add graph-router instance
    • etc

About

NodeJS scalable solution with Open Charge Map integration + MongoDB

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published