### Microservice - CQRS with GraphQL and SubscriberProxy

#### OVERVIEW

The role for microservice - CQRS is responsible to handle the request and response in between client and graphQL server. It's also manipulate the standard fisApp request/response.

FisApp API is the main way to request and response the data. The data can be consist of Account Profile, Invoice,  


#### REQUEST

NOTE: PAYLOAD will be graphQL QUERY
#### Method 1 - DataService Request (HTTP API)

Request without fisApp header(simplified request)

HTTP API POST Request
```bash
 POST   http://swopt.com:3011/api/request 
```
POST Request DATA - RAW JSON(application/json) 


```bash
Header

{
  "header": {
    "messageType": "Query",
    "messageID": "942ecfe2-8734-4cff-998e-6a2a5a39c464",
    "messageName": "Query",
    "dateCreated": "2022-03-11T02:19:50.923Z",
    "isAggregate": false,
    "messageProducerInformation": {
      "origin": {
        "userApplication": {
          "userAppId": "getQueryMessage",
          "userAppName": "Client"
        }
      },
      "components": "Presentation"
    },
    "security": {
      "ucpId": "ABC"
    },
    "messageDataLocation": {
      "isEmbaded": true
    },
    "messageDataFormat": {
      "dataFormat": "Json"
    },
    "requestExecutionMode": 0,
    "resquestTimeOut": 0,
    "query": "General"
  }
}
```
```bash
Payload

query demo{
        APAccountProfileQuery{
          SummaryResponse{
            __typename
            returnFormatType
          }
          StatusResponse{
            __typename
            status
          }
          APAccountProfileMessage{
            __typename
            data{
              acct_id
              acct_no
            }
          }
        }
      }
```

```bash
SAMPLE - Header with Payload

{
    header: '{  "header": {    "messageType": "Query",    "messageID": "942ecfe2-8734-4cff-998e-6a2a5a39c464",    "messageName": "Query",    "dateCreated": "2022-03-11T02:19:50.923Z",    "isAggregate": false,    "messageProducerInformation": {      "origin": {        "userApplication": {    
      "userAppId": "getQueryMessage",          "userAppName": "Client"        }      },      "components": "Presentation"    },    "security": {  
    "ucpId": "ABC"    },    "messageDataLocation": {      "isEmbaded": true    },    "messageDataFormat": {      "dataFormat": "Json"    },    "requestExecutionMode": 0,    "resquestTimeOut": 0,    "query": "General"  }}',
    payload: 'query APAccountProfile {            APAccountProfile {              className              filter              returnFormatType     
         returnSequenceTotal              returnSequenceNumber              data {                acct_id                acct_no                acct_name                acct_type              }            }          }'
  }


```


#### Method 2 - fisApp Dataservice request (HTTP API)
Request without login
```bash
 POST   http://swopt.com:3011/api/default
```

Request with login
```bash
 POST   http://swopt.com:3011/request
```

Request with fisApp header 
 

```bash
{
  "header": {
    "messageType": "Query",
    "messageID": "942ecfe2-8734-4cff-998e-6a2a5a39c464",
    "messageName": "Query",
    "dateCreated": "2022-03-11T02:19:50.923Z",
    "isAggregate": false,
    "messageProducerInformation": {
      "origin": {
        "userApplication": {
          "userAppId": "getQueryMessage",
          "userAppName": "Client"
        }
      },
      "components": "Presentation"
    },
    "security": {
      "ucpId": "ABC"
    },
    "messageDataLocation": {
      "isEmbaded": true
    },
    "messageDataFormat": {
      "dataFormat": "Json"
    },
    "requestExecutionMode": 0,
    "resquestTimeOut": 0,
    "query": "General"
  },
  "data":{
      "payload": "query demo { APAccountProfileQuery {    SummaryResponse{  __typename  returnFormatType }    StatusResponse {  __typename  status }     APAccountProfileMessage{  data { acct_id acct_no acct_name acct_type   } } } } "
  }
}

```

#### Method 3 - HTTP Playground with graphQL API request

Access to below url is to play around the request and response. left textarea is to paste in the fisApp with header(example as below), the response will be shown in the right textarea column.

```bash
 GET   http://swopt.com:3011/graphqlapi
```

Default dataservice REQUEST: 
```bash
{
  "header": {
    "messageType": "Query",
    "messageID": "942ecfe2-8734-4cff-998e-6a2a5a39c464",
    "messageName": "Query",
    "dateCreated": "2022-03-11T02:19:50.923Z",
    "isAggregate": false,
    "messageProducerInformation": {
      "origin": {
        "userApplication": {
          "userAppId": "getQueryMessage",
          "userAppName": "Client"
        }
      },
      "components": "Presentation"
    },
    "security": {
      "ucpId": "ABC"
    },
    "messageDataLocation": {
      "isEmbaded": true
    },
    "messageDataFormat": {
      "dataFormat": "Json"
    },
    "requestExecutionMode": 0,
    "resquestTimeOut": 0,
    "query": "General"
  },
  "data":{
      "payload": "query demo { APAccountProfileQuery {    SummaryResponse{  __typename  returnFormatType }    StatusResponse {  __typename  status }     APAccountProfileMessage{  data { acct_id acct_no acct_name acct_type   } } } } "
  } 
}

```

### DEFINITION - DATASERVICE

| Property |Type| Description |
|--------|---|-------------|
|className| String | REQUIRED: define which dataservice data want to retrieve|
|filter|String| OPTIONAL : The filter for the getData function will be in  key=value; key=value; pair format where key refers to column name. |
|returnFormatType| String |OPTIONAL: byRow , byBatchOf5, byBatchOf10 or full |


#### SAMPLE GRAPHQL SCHEMA
```bash
query 
    dataservice($className: String!, 
                $filter: String!,
                $returnFormatType: String!) 
    {
        dataservice(className: $className, 
                    filter: $filter,  
                    returnFormatType: $returnFormatType) 
                    {
                        filter,
                        className,
                        returnFormatType,
                        returnSequenceTotal,
                        returnSequenceNumber,
                        data
        
                    }
    }

```

#### SAMPLE REQUEST
```bash
    "data": {
        "type": "dataservice",
        "className": "APAccountProfileDataService",
        "returnFormatType": "byRow"
    }
```
========================================================
#### RESPONSE
```bash
type DataService {
    className: String!
    data: String!
    filter: String!
    returnFormatType: String!
    returnSequenceNumber: Float!
    returnSequenceTotal: Float!
}
```


|Property | Description|
|-------|  ----|
|classname| same as request className |
| data| responsed data |
|filter| same as request|
|returnFormatType| same as requested returnFormatType|
|returnSequenceTotal | refer to the total number of responses|
|returnSequenceNumber | refer to the response number start from 1 to total number of response.|


## SETUP GUIDE

### GraphQL Codegen
GraphQL codegen is to generate the code from Graphql schema to typescript code.

```bash
# to run the graphql codegen
npm run generate 

# typescript code will be generated/updated at:
.../src/generated/graphql.ts

```




========================================================
## Installation

```bash
$ npm install
```

## Running the app

```bash
# development
$ npm run start

# watch mode
$ npm run start:dev

# production mode
$ npm run start:prod


```



## Test

```bash
# unit tests
$ npm run test

# e2e tests
$ npm run test:e2e

# test coverage
$ npm run test:cov
```
