### 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 ```