Rajrahane / Swasthya-AI-Placement-GraphQL-Server

GraphQL server for Swasthya AI Placement Assignment

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Swasthya-AI-Placement-GraphQL-Server

GraphQL server for Swasthya AI Placement Assignment

Running Servers on EC2:

http://18.206.209.243:3000/
http://18.206.209.243:4000/graphql

Visit the React Client Repository

Run the MYSQL script dump_2329_22052021.sql on MySQL Workbench
Steps to install and run GraphQL and React Servers:

  1. clone the repository (git clone https://github.com/Rajrahane/Swasthya-AI-Placement-GraphQL-Server.git)
  2. run npm install
  3. change the username,password for GraphQL dbConnection/dbConnection.js
  4. run npm start
  5. view the GraphQL server on http://localhost:4000/graphql
  6. view the React Server on http://localhost:3000/

Approach:

DB Schema:

Create 4 tables: User, Blog, Comment, Friend
  • User Table: id,first_name,last_name,mobile_number,email_address
  • Blog Table: id,name
  • Comment Table: id,message,user_id,blog_id
  • Friend Table: id,user_id,friend_id
    Friend table adds a given friend to the user's friendList.
Assumption: Friends is undirected connection,two entries would be made- for a pair of friends A,B as (A,B) and (B,A).

React UI:
/users Endpoint: User can Register, Search, View Profile
/blogs Endpoint: A new Blog can be created.Search Blog based on ID.
Blog Profile shows blog name and lists the comments.

Summary
  • Create a DB schema in MYSQL for the tables.
  • Create a GraphQL Schema to fetch data, create new User and Blog, post a new Comment.
  • Create getFriends RootQuery in GraphQL to fetch Nth Level Friend of a User
  • Create a React Frontend for Forms, Search, Profile.

Solution for Nth Level Friend List:
Create a Friends graph and make a BFS recursive call until Nth level.
Consider input as (user_id:int,givenLevel:int) returns list(users)
   Initialize an empty Set of VisitedUsers
   Initialize an empty queue.Push (user_id) into it
   Initialize currentLevel=0
   while(q is not empty and currentLevel lessthan givenLevel){
      init new empty queue q2
      while(q not empty){
        pop each user.
        if(user not visited){
            mark as visited in VisitedUsers
            fetch all friends ids from Friends table in Database
            foreach(friend){
              if(friend not visited){
                push friend to queue q2
              }
            }
         }
      }
      currentLevel++
      push all elements in q2 to q, i.e. q=q2
   }
   if(currentLevel less than givenLevel){ //no nth level depth possible, too few levels
      return empty list
   }
   return to_list(q)

Sample Database Data:
1. 7 users are created
2. 2 blogs are created
3. 1st blog has 2 comments added
4. To mock friend relations, 6 relations are created {1,2,3}, {1,4}, {4,6}, {4,5}


Sample GraphQL Query for getFriends at any level:
{
  getFriends(input:{
    user_id:5
    level:3
  }){
    id
    last_name
  }
}
Expected Output: Users 2 and 3
Explanation: User 5 has 1st level friend- User 4
User 5 has 2nd level friends- User 1,6 via User 4
User 5 has 3rd level friends- User 2,3 via User 1


Sample Query for edge case (level too high or level<=0)
{
  getFriends(input:{
    user_id:5
    level:4
  }){
    id
    last_name
  }
}
Expected Ouput: null list
Explanation: User 5 has friends upto level 3 only


Features of GraphQL Repository
  • Uses Express NPM Package for Server Setup
  • Uses GraphQL to create Schema and Query, Mutation operations
  • Uses Sequelize a Promise based Node.js ORM
Features of ReactJS Repository

Improvements:

  • DFS can be used instead of BFS if some(say 10) and not all users are to be fetched.
  • Graph DB - Neo4j can be used instead of MySQL, since a friends graph is formed
  • Pagination can be used to fetch Comments from GraphQL.
  • GraphQL caching can be used for query caching
Deployment:
  • GraphQL can be hosted over AWS Lambda + API Gateway
  • AWS CDK or AWS SAM can be setup for Deployment of Lambda Code from Repository

  • React JS UI Snaps

    EC2 Deployment

    • Launch EC2 using Amazon AWS console.Open ports 4000(GraphQL),3000(React),22(SSH)
    • SSH into it. install git `sudo yum install git -y`
    • install node using nvm
    • install pm2 Daemon Process Manager. `npm install pm2 -g`
    • git pull both repositories(React and GraphQL)
    • Install Docker on EC2
    • Install docker-compose(linux)
      `sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose`
      `sudo chmod +x /usr/local/bin/docker-compose`
      `docker-compose --version`
    • Deploy DB using Docker:In /deployment folder: `cd deployment`, `docker-compose up -d` This launches a mysql db and connects a persistent docker volume to it
    • Deploy GraphQL using pm2:in graphql repository: `pm2 start --name swasthya-ai-graphql-server npm -- start`
    • Deploy React using pm2:in react repository:change graphql endpoint in src/index.js to http://18.206.209.243:4000/graphql then `pm2 start --name swasthya-ai-react-server npm -- start`

    About

    GraphQL server for Swasthya AI Placement Assignment


    Languages

    Language:JavaScript 100.0%