github.com/mundipagg/boleto-api@v0.0.0-20230620145841-3f9ec742599f/api/boleto.go (about) 1 package api 2 3 import ( 4 "io/ioutil" 5 "net/http" 6 "net/http/httputil" 7 "strings" 8 9 "github.com/gin-gonic/gin" 10 "github.com/mundipagg/boleto-api/boleto" 11 "github.com/mundipagg/boleto-api/config" 12 "github.com/mundipagg/boleto-api/db" 13 "github.com/mundipagg/boleto-api/log" 14 "github.com/mundipagg/boleto-api/models" 15 "github.com/mundipagg/boleto-api/queue" 16 ) 17 18 var fallback = new(Fallback) 19 20 //registerBoleto Realiza o registro online do Boleto 21 func registerBoleto(c *gin.Context) { 22 23 if _, hasErr := c.Get("error"); hasErr { 24 return 25 } 26 27 lg := loadBankLog(c) 28 bol := getBoletoFromContext(c) 29 bank := getBankFromContext(c) 30 31 resp, err := bank.ProcessBoleto(&bol) 32 33 if qualifiedForNewErrorHandling(c, resp) { 34 c.Set(responseKey, resp) 35 return 36 } 37 38 if checkError(c, err, lg) { 39 return 40 } 41 42 st := getResponseStatusCode(resp) 43 44 if st == http.StatusOK { 45 46 boView := models.NewBoletoView(bol, resp, bank.GetBankNameIntegration()) 47 resp.ID = boView.ID.Hex() 48 resp.Links = boView.Links 49 50 errMongo := db.SaveBoleto(boView) 51 52 if errMongo != nil { 53 lg.Warn(errMongo.Error(), "Error saving to mongo") 54 55 b := boView.ToMinifyJSON() 56 p := queue.NewPublisher(b) 57 58 if !queue.WriteMessage(p) { 59 fallback.Save(c, boView.ID.Hex(), b) 60 } 61 } 62 } 63 64 c.JSON(st, resp) 65 c.Set("boletoResponse", resp) 66 } 67 68 //getBoleto Recupera um boleto devidamente registrado 69 func getBoleto(c *gin.Context) { 70 var boletoHtml string 71 72 var result = models.NewGetBoletoResult(c) 73 74 if !result.HasValidParameters() { 75 setupGetBoletoResultFailResponse(c, result, "Warning", "Not Found") 76 return 77 } 78 79 var err error 80 var boView models.BoletoView 81 82 boView, result.DatabaseElapsedTimeInMilliseconds, err = db.GetBoletoByID(result.Id, result.PublicKey) 83 84 if err != nil && (err.Error() == db.NotFoundDoc || err.Error() == db.InvalidPK) { 85 setupGetBoletoResultFailResponse(c, result, "Warning", "Not Found") 86 return 87 } else if err != nil { 88 setupGetBoletoResultFailResponse(c, result, "Error", err.Error()) 89 return 90 } 91 92 result.BoletoSource = "mongo" 93 boletoHtml = boleto.MinifyHTML(boView) 94 95 if result.Format == "html" { 96 c.Header("Content-Type", "text/html; charset=utf-8") 97 c.Writer.WriteString(boletoHtml) 98 } else { 99 c.Header("Content-Type", "application/pdf") 100 if boletoPdf, err := toPdf(boletoHtml); err == nil { 101 c.Writer.Write(boletoPdf) 102 } else { 103 c.Header("Content-Type", "application/json") 104 setupGetBoletoResultFailResponse(c, result, "Error", err.Error()) 105 return 106 } 107 } 108 109 setupGetBoletoSuccessResponse(c, result) 110 } 111 112 func setupGetBoletoResultFailResponse(c *gin.Context, result *models.GetBoletoResult, severity, errorMessage string) { 113 result.LogSeverity = severity 114 115 switch severity { 116 case "Warning": 117 result.SetErrorResponse(c, models.NewErrorResponse("MP404", errorMessage), http.StatusNotFound) 118 default: 119 result.SetErrorResponse(c, models.NewErrorResponse("MP500", errorMessage), http.StatusInternalServerError) 120 } 121 c.Set(resultGetBoletoKey, result) 122 } 123 124 func setupGetBoletoSuccessResponse(c *gin.Context, result *models.GetBoletoResult) { 125 c.Status(http.StatusOK) 126 result.LogSeverity = "Information" 127 c.Set(resultGetBoletoKey, result) 128 } 129 130 func getResponseStatusCode(response models.BoletoResponse) int { 131 if len(response.Errors) == 0 { 132 return http.StatusOK 133 } 134 135 if response.StatusCode == 0 { 136 return http.StatusBadRequest 137 } 138 139 return response.StatusCode 140 } 141 142 func toPdf(page string) ([]byte, error) { 143 url := config.Get().PdfAPIURL 144 payload := strings.NewReader(page) 145 if req, err := http.NewRequest("POST", url, payload); err != nil { 146 return nil, err 147 } else if res, err := http.DefaultClient.Do(req); err != nil { 148 return nil, err 149 } else { 150 defer res.Body.Close() 151 return ioutil.ReadAll(res.Body) 152 } 153 } 154 155 func getBoletoByID(c *gin.Context) { 156 id := c.Param("id") 157 pk := c.Param("pk") 158 log := log.CreateLog() 159 log.Operation = "GetBoletoV1" 160 161 boleto, _, err := db.GetBoletoByID(id, pk) 162 if err != nil { 163 checkError(c, models.NewHTTPNotFound("MP404", "Boleto não encontrado"), nil) 164 return 165 } 166 c.JSON(http.StatusOK, boleto) 167 } 168 169 func confirmation(c *gin.Context) { 170 if dump, err := httputil.DumpRequest(c.Request, true); err == nil { 171 l := log.CreateLog() 172 l.BankName = "BradescoShopFacil" 173 l.Operation = "BoletoConfirmation" 174 l.Request(string(dump), c.Request.URL.String(), nil) 175 } 176 c.String(200, "OK") 177 }