From 90b302b99023f69dace3becf9986f709a871277b Mon Sep 17 00:00:00 2001 From: thijsheijden <hi@thijsheijden.nl> Date: Tue, 18 May 2021 11:13:07 +0200 Subject: [PATCH] Added MessageStruct to describe outgoing messages Replaced all maps in the handleMessage method with the MessageStruct, except for the final result, as this one uses the key 'values', where the rest use the key 'value'. Once this has been changed in the frontend it will be updated in the backend as well. --- internal/entity/messageStruct.go | 7 +++ internal/usecases/consume/handlemessage.go | 55 +++++++++++++++------- 2 files changed, 45 insertions(+), 17 deletions(-) create mode 100644 internal/entity/messageStruct.go diff --git a/internal/entity/messageStruct.go b/internal/entity/messageStruct.go new file mode 100644 index 0000000..4d153d7 --- /dev/null +++ b/internal/entity/messageStruct.go @@ -0,0 +1,7 @@ +package entity + +// MessageStruct describes outgoing messages from the query service +type MessageStruct struct { + Type string `json:"type"` + Value interface{} `json:"value"` +} diff --git a/internal/usecases/consume/handlemessage.go b/internal/usecases/consume/handlemessage.go index 6351409..3c991c0 100644 --- a/internal/usecases/consume/handlemessage.go +++ b/internal/usecases/consume/handlemessage.go @@ -2,6 +2,7 @@ package consume import ( "encoding/json" + "query-service/internal/entity" "query-service/pkg/errorhandler" "strings" @@ -21,12 +22,26 @@ func (s *Service) HandleMessage(msg *broker.Message) { return } + // Marshall the incoming message into an IncomingJSONQuery object + var JSONQuery entity.IncomingQueryJSON + err := json.Unmarshal(msg.Body, &JSONQuery) + if err != nil { + errorMsg := entity.MessageStruct{ + Type: "query_translation_error", + Value: "failed to unmarshall the incoming JSON query", + } + errorMsgBytes, _ := json.Marshal(errorMsg) + s.producer.PublishMessage(&errorMsgBytes, &sessionID) + return + } + // Convert the json byte msg to a query string query, databaseName, err := s.queryConverter.ConvertQuery(&msg.Body) if err != nil { - errorMsg := make(map[string]string) - errorMsg["type"] = "query_translation_error" - errorMsg["value"] = err.Error() + errorMsg := entity.MessageStruct{ + Type: "query_translation_error", + Value: err.Error(), + } errorMsgBytes, _ := json.Marshal(errorMsg) s.producer.PublishMessage(&errorMsgBytes, &sessionID) return @@ -34,35 +49,39 @@ func (s *Service) HandleMessage(msg *broker.Message) { // Check if there was a database name if *databaseName == "" { - errorMsg := make(map[string]string) - errorMsg["type"] = "query_malformed_request_error" - errorMsg["value"] = "no database name supplied" + errorMsg := entity.MessageStruct{ + Type: "query_malformed_request_error", + Value: "no database name supplied", + } errorMsgBytes, _ := json.Marshal(errorMsg) s.producer.PublishMessage(&errorMsgBytes, &sessionID) return } + // TODO: Figure out a way to do this in the integration tests instead // Remove newlines and tabs from string queryNoNewlines := strings.ReplaceAll(*query, "\n", "") queryNoTabs := strings.ReplaceAll(queryNoNewlines, "\t", "") // Send the resulting query back to the client - msgmap := make(map[string]interface{}) - msgmap["type"] = "query_translation_result" - msgmap["values"] = queryNoTabs - msgbyte, err := json.Marshal(msgmap) + translationMsg := entity.MessageStruct{ + Type: "query_translation_result", + Value: queryNoTabs, + } + translationMsgBytes, err := json.Marshal(translationMsg) if err != nil { errorhandler.LogError(err, "Marshalling query_translation_result went wrong!") // TODO: send error message to client instead return } - s.producer.PublishMessage(&msgbyte, &sessionID) // TODO: should this be a go routine? + s.producer.PublishMessage(&translationMsgBytes, &sessionID) // TODO: should this be a go routine? // Fetch database credentials from the user service databaseInfo, err := s.databaseInfoService.GetDatabaseInfo(&clientID, databaseName) if err != nil { - errorMsg := make(map[string]string) - errorMsg["type"] = "query_database_not_found" - errorMsg["value"] = err.Error() + errorMsg := entity.MessageStruct{ + Type: "query_database_not_found", + Value: err.Error(), + } errorMsgBytes, _ := json.Marshal(errorMsg) s.producer.PublishMessage(&errorMsgBytes, &sessionID) return @@ -72,15 +91,17 @@ func (s *Service) HandleMessage(msg *broker.Message) { // convert result to general (node-link) format result, err := s.requestSender.SendAQLQuery(*query, databaseInfo.Username, databaseInfo.Password, databaseInfo.URL, databaseInfo.Port, databaseInfo.InternalDatabaseName) if err != nil { - errorMsg := make(map[string]string) - errorMsg["type"] = "query_database_error" - errorMsg["value"] = err.Error() + errorMsg := entity.MessageStruct{ + Type: "query_database_error", + Value: err.Error(), + } errorMsgBytes, _ := json.Marshal(errorMsg) s.producer.PublishMessage(&errorMsgBytes, &sessionID) return } // Add type indicator to result from database + // TODO: Change key 'values' to key 'value' var res interface{} json.Unmarshal(*result, &res) resultMsgMap := make(map[string]interface{}) -- GitLab