f41591d98641016d68621fd75b4443ed239fee6d
[ric-plt/resource-status-manager.git] / RSM / controllers / controller.go
1 //
2 // Copyright 2019 AT&T Intellectual Property
3 // Copyright 2019 Nokia
4 //
5 // Licensed under the Apache License, Version 2.0 (the "License");
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
8 //
9 //      http://www.apache.org/licenses/LICENSE-2.0
10 //
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
16 //
17
18 package controllers
19
20 type IController interface {
21 }
22 /*
23 import (
24         "encoding/json"
25         "io"
26         "io/ioutil"
27         "net/http"
28         "net/http/httputil"
29         "rsm/logger"
30         "rsm/models"
31         "rsm/providers/httpmsghandlerprovider"
32         "rsm/rsmerrors"
33         "strings"
34 )
35
36 const (
37         LimitRequest = 2000
38 )
39
40 type IController interface {
41 }
42
43 type Controller struct {
44         logger          *logger.Logger
45         handlerProvider *httpmsghandlerprovider.RequestHandlerProvider
46 }
47
48 func NewController(logger *logger.Logger, handlerProvider *httpmsghandlerprovider.RequestHandlerProvider) *Controller {
49         return &Controller{
50                 logger:          logger,
51                 handlerProvider: handlerProvider,
52         }
53 }
54
55 func (c *Controller) extractJsonBody(r *http.Request, request models.Request, writer http.ResponseWriter) bool {
56         defer r.Body.Close()
57         body, err := ioutil.ReadAll(io.LimitReader(r.Body, LimitRequest))
58
59         if err != nil {
60                 c.logger.Errorf("[Client -> RSM] #Controller.extractJsonBody - unable to extract json body - error: %s", err)
61                 c.handleErrorResponse(rsmerrors.NewInvalidJsonError(), writer)
62                 return false
63         }
64
65         err = json.Unmarshal(body, &request)
66         if err != nil {
67                 c.logger.Errorf("[Client -> RSM] #Controller.extractJsonBody - unable to extract json body - error: %s", err)
68                 c.handleErrorResponse(rsmerrors.NewInvalidJsonError(), writer)
69                 return false
70         }
71
72         return true
73 }
74
75 func (c *Controller) handleRequest(writer http.ResponseWriter, header *http.Header, requestName httpmsghandlerprovider.IncomingRequest, request models.Request, validateHeader bool) {
76
77         if validateHeader {
78
79                 err := c.validateRequestHeader(header)
80                 if err != nil {
81                         c.handleErrorResponse(err, writer)
82                         return
83                 }
84         }
85
86         handler, err := c.handlerProvider.GetHandler(requestName)
87
88         if err != nil {
89                 c.handleErrorResponse(err, writer)
90                 return
91         }
92
93         response, err := (*handler).Handle(request)
94
95         if err != nil {
96                 c.handleErrorResponse(err, writer)
97                 return
98         }
99
100         if response == nil {
101                 writer.WriteHeader(http.StatusNoContent)
102                 c.logger.Infof("[RSM -> Client] #Controller.handleRequest - status response: %v", http.StatusNoContent)
103                 return
104         }
105
106         result, err := response.Marshal()
107
108         if err != nil {
109                 c.handleErrorResponse(err, writer)
110                 return
111         }
112
113         c.logger.Infof("[RSM -> Client] #Controller.handleRequest - response: %s", result)
114         writer.Header().Set("Content-Type", "application/json")
115         writer.Write([]byte(result))
116 }
117
118 func (c *Controller) validateRequestHeader(header *http.Header) error {
119
120         if header.Get("Content-Type") != "application/json" {
121                 c.logger.Errorf("#Controller.validateRequestHeader - validation failure, incorrect content type")
122
123                 return rsmerrors.NewHeaderValidationError()
124         }
125         return nil
126 }
127
128 func (c *Controller) handleErrorResponse(err error, writer http.ResponseWriter) {
129
130         var errorResponseDetails models.ErrorResponse
131         var httpError int
132
133         if err != nil {
134                 switch err.(type) {
135                 case *rsmerrors.RnibDbError:
136                         e2Error, _ := err.(*rsmerrors.RnibDbError)
137                         errorResponseDetails = models.ErrorResponse{Code: e2Error.Code, Message: e2Error.Message}
138                         httpError = http.StatusInternalServerError
139                 case *rsmerrors.HeaderValidationError:
140                         e2Error, _ := err.(*rsmerrors.HeaderValidationError)
141                         errorResponseDetails = models.ErrorResponse{Code: e2Error.Code, Message: e2Error.Message}
142                         httpError = http.StatusUnsupportedMediaType
143                 case *rsmerrors.WrongStateError:
144                         e2Error, _ := err.(*rsmerrors.WrongStateError)
145                         errorResponseDetails = models.ErrorResponse{Code: e2Error.Code, Message: e2Error.Message}
146                         httpError = http.StatusBadRequest
147                 case *rsmerrors.RequestValidationError:
148                         e2Error, _ := err.(*rsmerrors.RequestValidationError)
149                         errorResponseDetails = models.ErrorResponse{Code: e2Error.Code, Message: e2Error.Message}
150                         httpError = http.StatusBadRequest
151                 case *rsmerrors.InvalidJsonError:
152                         e2Error, _ := err.(*rsmerrors.InvalidJsonError)
153                         errorResponseDetails = models.ErrorResponse{Code: e2Error.Code, Message: e2Error.Message}
154                         httpError = http.StatusBadRequest
155                 case *rsmerrors.RmrError:
156                         e2Error, _ := err.(*rsmerrors.RmrError)
157                         errorResponseDetails = models.ErrorResponse{Code: e2Error.Code, Message: e2Error.Message}
158                         httpError = http.StatusInternalServerError
159                 case *rsmerrors.ResourceNotFoundError:
160                         e2Error, _ := err.(*rsmerrors.ResourceNotFoundError)
161                         errorResponseDetails = models.ErrorResponse{Code: e2Error.Code, Message: e2Error.Message}
162                         httpError = http.StatusNotFound
163
164                 default:
165                         e2Error := rsmerrors.NewInternalError()
166                         errorResponseDetails = models.ErrorResponse{Code: e2Error.Code, Message: e2Error.Message}
167                         httpError = http.StatusInternalServerError
168                 }
169         }
170         errorResponse, _ := json.Marshal(errorResponseDetails)
171
172         c.logger.Errorf("[RSM -> Client] #Controller.handleErrorResponse - http status: %d, error response: %+v", httpError, errorResponseDetails)
173
174         writer.Header().Set("Content-Type", "application/json")
175         writer.WriteHeader(httpError)
176         _, err = writer.Write(errorResponse)
177
178         if err != nil {
179                 c.logger.Errorf("#Controller.handleErrorResponse - Cannot send response. writer:%v", writer)
180         }
181 }*/
182 /*
183 func (c *Controller) prettifyRequest(request *http.Request) string {
184         dump, _ := httputil.DumpRequest(request, true)
185         requestPrettyPrint := strings.Replace(string(dump), "\r\n", " ", -1)
186         return strings.Replace(requestPrettyPrint, "\n", "", -1)
187 }
188 */