You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
322 lines
10 KiB
322 lines
10 KiB
3 years ago
|
package creditManager
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"fmt"
|
||
|
"net/http"
|
||
|
"time"
|
||
|
|
||
|
"github.com/go-openapi/runtime/middleware"
|
||
|
"github.com/prometheus/client_golang/prometheus"
|
||
|
"github.com/Cyclops-Labs/cyclops-4-hpc.git/services/credit-system/models"
|
||
|
"github.com/Cyclops-Labs/cyclops-4-hpc.git/services/credit-system/restapi/operations/credit_management"
|
||
|
"github.com/Cyclops-Labs/cyclops-4-hpc.git/services/credit-system/server/dbManager"
|
||
|
"github.com/Cyclops-Labs/cyclops-4-hpc.git/services/credit-system/server/statusManager"
|
||
|
l "gitlab.com/cyclops-utilities/logging"
|
||
|
)
|
||
|
|
||
|
// CreditManager is the struct defined to group and contain all the methods
|
||
|
// that interact with the credit endpoint.
|
||
|
// Parameters:
|
||
|
// - db: a DbParameter reference to be able to use the DBManager methods.
|
||
|
// - monit: a StatusManager reference to be able to use the status subsystem methods.
|
||
|
type CreditManager struct {
|
||
|
db *dbManager.DbParameter
|
||
|
monit *statusManager.StatusManager
|
||
|
}
|
||
|
|
||
|
// New is the function to create the struct CreditManager.
|
||
|
// Parameters:
|
||
|
// - DbParameter: reference pointing to the DbParameter that allows the interaction
|
||
|
// with the DBManager methods.
|
||
|
// - monit: a reference to the StatusManager to be able to interact with the
|
||
|
// status subsystem.
|
||
|
// Returns:
|
||
|
// - CreditManager: struct to interact with CreditManager subsystem functionalities.
|
||
|
func New(db *dbManager.DbParameter, monit *statusManager.StatusManager) *CreditManager {
|
||
|
|
||
|
l.Trace.Printf("[CreditManager] Generating new CreditManager.\n")
|
||
|
|
||
|
monit.InitEndpoint("credit")
|
||
|
|
||
|
return &CreditManager{
|
||
|
db: db,
|
||
|
monit: monit,
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
// AddConsumption (Swagger func) is the function behind the (POST) API Endpoint
|
||
|
// /credit/consumed/{id}
|
||
|
// Its job is to add a system consumption in the credit account provided the
|
||
|
// account ID.
|
||
|
func (m *CreditManager) AddConsumption(ctx context.Context, params credit_management.AddConsumptionParams) middleware.Responder {
|
||
|
|
||
|
l.Trace.Printf("[CreditManager] AddConsumption endpoint invoked.\n")
|
||
|
|
||
|
callTime := time.Now()
|
||
|
m.monit.APIHit("credit", time.Now())
|
||
|
|
||
|
creditStatus, e := m.db.AddConsumption(params.ID, params.Amount, params.Medium)
|
||
|
|
||
|
if e != nil {
|
||
|
|
||
|
s := "Problem adding the Comsumption: " + e.Error()
|
||
|
errorReturn := models.ErrorResponse{
|
||
|
ErrorString: &s,
|
||
|
}
|
||
|
|
||
|
m.db.Metrics["api"].With(prometheus.Labels{"code": fmt.Sprint(http.StatusInternalServerError), "method": params.HTTPRequest.Method, "route": params.HTTPRequest.URL.Path}).Inc()
|
||
|
|
||
|
m.monit.APIHitDone("credit", callTime)
|
||
|
|
||
|
return credit_management.NewAddConsumptionInternalServerError().WithPayload(&errorReturn)
|
||
|
|
||
|
}
|
||
|
|
||
|
if creditStatus != nil {
|
||
|
|
||
|
m.db.Metrics["api"].With(prometheus.Labels{"code": fmt.Sprint(http.StatusOK), "method": params.HTTPRequest.Method, "route": params.HTTPRequest.URL.Path}).Inc()
|
||
|
|
||
|
m.monit.APIHitDone("credit", callTime)
|
||
|
|
||
|
return credit_management.NewAddConsumptionOK().WithPayload(creditStatus)
|
||
|
|
||
|
}
|
||
|
|
||
|
s := "The Account doesn't exists in the system."
|
||
|
missingReturn := models.ErrorResponse{
|
||
|
ErrorString: &s,
|
||
|
}
|
||
|
|
||
|
m.db.Metrics["api"].With(prometheus.Labels{"code": fmt.Sprint(http.StatusNotFound), "method": params.HTTPRequest.Method, "route": params.HTTPRequest.URL.Path}).Inc()
|
||
|
|
||
|
m.monit.APIHitDone("credit", callTime)
|
||
|
|
||
|
return credit_management.NewAddConsumptionNotFound().WithPayload(&missingReturn)
|
||
|
|
||
|
}
|
||
|
|
||
|
// DecreaseCredit (Swagger func) is the function behind the (POST) API Endpoint
|
||
|
// /credit/available/decrease/{id}
|
||
|
// Its job is to decrease the amount of credit for an account in the system
|
||
|
// provided the account ID.
|
||
|
func (m *CreditManager) DecreaseCredit(ctx context.Context, params credit_management.DecreaseCreditParams) middleware.Responder {
|
||
|
|
||
|
l.Trace.Printf("[CreditManager] DecreaseCredit endpoint invoked.\n")
|
||
|
|
||
|
callTime := time.Now()
|
||
|
m.monit.APIHit("credit", time.Now())
|
||
|
|
||
|
creditStatus, e := m.db.DecreaseCredit(params.ID, params.Amount, params.Medium)
|
||
|
|
||
|
if e != nil {
|
||
|
|
||
|
s := "Problem decreassing the Credit: " + e.Error()
|
||
|
errorReturn := models.ErrorResponse{
|
||
|
ErrorString: &s,
|
||
|
}
|
||
|
|
||
|
m.db.Metrics["api"].With(prometheus.Labels{"code": fmt.Sprint(http.StatusInternalServerError), "method": params.HTTPRequest.Method, "route": params.HTTPRequest.URL.Path}).Inc()
|
||
|
|
||
|
m.monit.APIHitDone("credit", callTime)
|
||
|
|
||
|
return credit_management.NewDecreaseCreditInternalServerError().WithPayload(&errorReturn)
|
||
|
|
||
|
}
|
||
|
|
||
|
if creditStatus != nil {
|
||
|
|
||
|
m.db.Metrics["api"].With(prometheus.Labels{"code": fmt.Sprint(http.StatusOK), "method": params.HTTPRequest.Method, "route": params.HTTPRequest.URL.Path}).Inc()
|
||
|
|
||
|
m.monit.APIHitDone("credit", callTime)
|
||
|
|
||
|
return credit_management.NewDecreaseCreditOK().WithPayload(creditStatus)
|
||
|
|
||
|
}
|
||
|
|
||
|
s := "The Account doesn't exists in the system."
|
||
|
missingReturn := models.ErrorResponse{
|
||
|
ErrorString: &s,
|
||
|
}
|
||
|
|
||
|
m.db.Metrics["api"].With(prometheus.Labels{"code": fmt.Sprint(http.StatusNotFound), "method": params.HTTPRequest.Method, "route": params.HTTPRequest.URL.Path}).Inc()
|
||
|
|
||
|
m.monit.APIHitDone("credit", callTime)
|
||
|
|
||
|
return credit_management.NewDecreaseCreditNotFound().WithPayload(&missingReturn)
|
||
|
|
||
|
}
|
||
|
|
||
|
// GetCredit (Swagger func) is the function behind the (GET) API Endpoint
|
||
|
// /account/available/{id}
|
||
|
// Its job is to retrieve the amount of credit available fo an account in the
|
||
|
// system provided the account ID.
|
||
|
func (m *CreditManager) GetCredit(ctx context.Context, params credit_management.GetCreditParams) middleware.Responder {
|
||
|
|
||
|
l.Trace.Printf("[CreditManager] GetCredit endpoint invoked.\n")
|
||
|
|
||
|
callTime := time.Now()
|
||
|
m.monit.APIHit("credit", time.Now())
|
||
|
|
||
|
creditStatus, e := m.db.GetCredit(params.ID)
|
||
|
|
||
|
if e != nil {
|
||
|
|
||
|
s := "Problem getting the Credit Status: " + e.Error()
|
||
|
errorReturn := models.ErrorResponse{
|
||
|
ErrorString: &s,
|
||
|
}
|
||
|
|
||
|
m.db.Metrics["api"].With(prometheus.Labels{"code": fmt.Sprint(http.StatusInternalServerError), "method": params.HTTPRequest.Method, "route": params.HTTPRequest.URL.Path}).Inc()
|
||
|
|
||
|
m.monit.APIHitDone("credit", callTime)
|
||
|
|
||
|
return credit_management.NewGetCreditInternalServerError().WithPayload(&errorReturn)
|
||
|
|
||
|
}
|
||
|
|
||
|
if creditStatus != nil {
|
||
|
|
||
|
m.db.Metrics["api"].With(prometheus.Labels{"code": fmt.Sprint(http.StatusOK), "method": params.HTTPRequest.Method, "route": params.HTTPRequest.URL.Path}).Inc()
|
||
|
|
||
|
m.monit.APIHitDone("credit", callTime)
|
||
|
|
||
|
return credit_management.NewGetCreditOK().WithPayload(creditStatus)
|
||
|
|
||
|
}
|
||
|
|
||
|
s := "The Account doesn't exists in the system."
|
||
|
missingReturn := models.ErrorResponse{
|
||
|
ErrorString: &s,
|
||
|
}
|
||
|
|
||
|
m.db.Metrics["api"].With(prometheus.Labels{"code": fmt.Sprint(http.StatusNotFound), "method": params.HTTPRequest.Method, "route": params.HTTPRequest.URL.Path}).Inc()
|
||
|
|
||
|
m.monit.APIHitDone("credit", callTime)
|
||
|
|
||
|
return credit_management.NewGetCreditNotFound().WithPayload(&missingReturn)
|
||
|
|
||
|
}
|
||
|
|
||
|
// GetHistory (Swagger func) is the function behind the (GET) API Endpoint
|
||
|
// /credit/history/{id}
|
||
|
// Its job is to retrieve history of the credit balance for an account in the
|
||
|
// system provided the account ID.
|
||
|
func (m *CreditManager) GetHistory(ctx context.Context, params credit_management.GetHistoryParams) middleware.Responder {
|
||
|
|
||
|
l.Trace.Printf("[CreditManager] GetHistory endpoint invoked.\n")
|
||
|
|
||
|
callTime := time.Now()
|
||
|
m.monit.APIHit("credit", time.Now())
|
||
|
|
||
|
var filter bool
|
||
|
var medium string
|
||
|
|
||
|
if params.FilterSystem != nil {
|
||
|
|
||
|
filter = *params.FilterSystem
|
||
|
|
||
|
} else {
|
||
|
|
||
|
filter = false
|
||
|
|
||
|
}
|
||
|
|
||
|
if params.Medium != nil {
|
||
|
|
||
|
medium = *params.Medium
|
||
|
|
||
|
}
|
||
|
|
||
|
creditStatus, e := m.db.GetHistory(params.ID, filter, medium)
|
||
|
|
||
|
if e != nil {
|
||
|
|
||
|
s := "Problem getting the Credit History: " + e.Error()
|
||
|
errorReturn := models.ErrorResponse{
|
||
|
ErrorString: &s,
|
||
|
}
|
||
|
|
||
|
m.db.Metrics["api"].With(prometheus.Labels{"code": fmt.Sprint(http.StatusInternalServerError), "method": params.HTTPRequest.Method, "route": params.HTTPRequest.URL.Path}).Inc()
|
||
|
|
||
|
m.monit.APIHitDone("credit", callTime)
|
||
|
|
||
|
return credit_management.NewGetHistoryInternalServerError().WithPayload(&errorReturn)
|
||
|
|
||
|
}
|
||
|
|
||
|
if creditStatus != nil {
|
||
|
|
||
|
m.db.Metrics["api"].With(prometheus.Labels{"code": fmt.Sprint(http.StatusOK), "method": params.HTTPRequest.Method, "route": params.HTTPRequest.URL.Path}).Inc()
|
||
|
|
||
|
m.monit.APIHitDone("credit", callTime)
|
||
|
|
||
|
return credit_management.NewGetHistoryOK().WithPayload(creditStatus)
|
||
|
|
||
|
}
|
||
|
|
||
|
s := "The Account doesn't exists in the system."
|
||
|
missingReturn := models.ErrorResponse{
|
||
|
ErrorString: &s,
|
||
|
}
|
||
|
|
||
|
m.db.Metrics["api"].With(prometheus.Labels{"code": fmt.Sprint(http.StatusNotFound), "method": params.HTTPRequest.Method, "route": params.HTTPRequest.URL.Path}).Inc()
|
||
|
|
||
|
m.monit.APIHitDone("credit", callTime)
|
||
|
|
||
|
return credit_management.NewGetHistoryNotFound().WithPayload(&missingReturn)
|
||
|
|
||
|
}
|
||
|
|
||
|
// IncreaseCredit (Swagger func) is the function behind the (POST) API Endpoint
|
||
|
// /credit/available/increase/{id}
|
||
|
// Its job is to increase the amount of credit for an account in the system
|
||
|
// provided the account ID.
|
||
|
func (m *CreditManager) IncreaseCredit(ctx context.Context, params credit_management.IncreaseCreditParams) middleware.Responder {
|
||
|
|
||
|
l.Trace.Printf("[CreditManager] IncreaseCredit endpoint invoked.\n")
|
||
|
|
||
|
callTime := time.Now()
|
||
|
m.monit.APIHit("credit", time.Now())
|
||
|
|
||
|
creditStatus, e := m.db.IncreaseCredit(params.ID, params.Amount, params.Medium)
|
||
|
|
||
|
if e != nil {
|
||
|
|
||
|
s := "Problem increassing the Credit: " + e.Error()
|
||
|
errorReturn := models.ErrorResponse{
|
||
|
ErrorString: &s,
|
||
|
}
|
||
|
|
||
|
m.db.Metrics["api"].With(prometheus.Labels{"code": fmt.Sprint(http.StatusInternalServerError), "method": params.HTTPRequest.Method, "route": params.HTTPRequest.URL.Path}).Inc()
|
||
|
|
||
|
m.monit.APIHitDone("credit", callTime)
|
||
|
|
||
|
return credit_management.NewIncreaseCreditInternalServerError().WithPayload(&errorReturn)
|
||
|
|
||
|
}
|
||
|
|
||
|
if creditStatus != nil {
|
||
|
|
||
|
m.db.Metrics["api"].With(prometheus.Labels{"code": fmt.Sprint(http.StatusOK), "method": params.HTTPRequest.Method, "route": params.HTTPRequest.URL.Path}).Inc()
|
||
|
|
||
|
m.monit.APIHitDone("credit", callTime)
|
||
|
|
||
|
return credit_management.NewIncreaseCreditOK().WithPayload(creditStatus)
|
||
|
|
||
|
}
|
||
|
|
||
|
s := "The Account doesn't exists in the system."
|
||
|
missingReturn := models.ErrorResponse{
|
||
|
ErrorString: &s,
|
||
|
}
|
||
|
|
||
|
m.db.Metrics["api"].With(prometheus.Labels{"code": fmt.Sprint(http.StatusNotFound), "method": params.HTTPRequest.Method, "route": params.HTTPRequest.URL.Path}).Inc()
|
||
|
|
||
|
m.monit.APIHitDone("credit", callTime)
|
||
|
|
||
|
return credit_management.NewIncreaseCreditNotFound().WithPayload(&missingReturn)
|
||
|
|
||
|
}
|