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  }