Cyclops 4 HPC is the purpose built stack to support large HPC centers with resource accounting and billing of cluster as well as cloud resources.
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.
 
 

432 lines
13 KiB

package invoiceManager
import (
"context"
"net/http"
"strings"
"time"
"github.com/go-openapi/runtime/middleware"
"github.com/go-openapi/strfmt"
"github.com/prometheus/client_golang/prometheus"
"github.com/Cyclops-Labs/cyclops-4-hpc.git/services/billing/models"
"github.com/Cyclops-Labs/cyclops-4-hpc.git/services/billing/restapi/operations/invoice_management"
"github.com/Cyclops-Labs/cyclops-4-hpc.git/services/billing/server/dbManager"
"github.com/Cyclops-Labs/cyclops-4-hpc.git/services/billing/server/statusManager"
l "gitlab.com/cyclops-utilities/logging"
)
// InvoiceManager is the struct defined to group and contain all the methods
// that interact with the invoice subsystem.
// 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.
// - BasePath: a string with the base path of the system.
type InvoiceManager struct {
db *dbManager.DbParameter
monit *statusManager.StatusManager
BasePath string
}
// New is the function to create the struct InvoiceManager.
// Parameters:
// - DbParameter: reference pointing to the DbParameter that allows the interaction
// with the DBManager methods.
// - StatusParameter: reference poining to the StatusManager that allows the
// interaction with the StatusManager methods.
// - bp: a string containing the base path of the service.
// Returns:
// - InvoiceManager: struct to interact with InvoiceManager subsystem functionalities.
func New(db *dbManager.DbParameter, monit *statusManager.StatusManager, bp string) *InvoiceManager {
l.Trace.Printf("[InvoiceManager] Generating new invoiceManager.\n")
monit.InitEndpoint("invoice")
return &InvoiceManager{
db: db,
monit: monit,
BasePath: bp,
}
}
func (m *InvoiceManager) getToken(param *http.Request) (token string) {
if len(param.Header.Get("Authorization")) > 0 {
token = strings.Fields(param.Header.Get("Authorization"))[1]
}
return
}
// GenerateInvoiceForCustomer (Swagger func) is the function behind
// the (POST) endpoint /invoice/customer/{id}
// It's job is to start the generation of the invoices associated with the
// requested customer in the system within the optional declared time-window.
func (m *InvoiceManager) GenerateInvoiceForCustomer(ctx context.Context, params invoice_management.GenerateInvoiceForCustomerParams) middleware.Responder {
l.Trace.Printf("[InvoiceManager] GenerateInvoiceForCustomer endpoint invoked.\n")
callTime := time.Now()
m.monit.APIHit("invoice", callTime)
var from, to strfmt.DateTime
token := m.getToken(params.HTTPRequest)
if params.From != nil {
from = *params.From
}
if params.To != nil {
to = *params.To
}
billrun, e := m.db.GenerateInvoicesBy("customer", params.ID, token, from, to)
if e != nil {
s := "Problem while trying to generate the Invoice: " + e.Error()
errorReturn := models.ErrorResponse{
ErrorString: &s,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "500", "method": "POST", "route": "/invoice/customer/" + string(params.ID)}).Inc()
m.monit.APIHitDone("invoice", callTime)
return invoice_management.NewGenerateInvoiceForCustomerInternalServerError().WithPayload(&errorReturn)
}
acceptedReturn := models.ItemCreatedResponse{
APILink: m.BasePath + "/billrun/" + billrun,
Message: "The request has been added to the queue",
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "202", "method": "POST", "route": "/invoice/customer/" + string(params.ID)}).Inc()
m.monit.APIHitDone("invoice", callTime)
return invoice_management.NewGenerateInvoiceForCustomerAccepted().WithPayload(&acceptedReturn)
}
// GenerateInvoiceForReseller (Swagger func) is the function behind
// the (POST) endpoint /invoice/reseller/{id}
// It's job is to start the generation of the invoices associated with the
// requested reseller in the system within the optional declared time-window.
func (m *InvoiceManager) GenerateInvoiceForReseller(ctx context.Context, params invoice_management.GenerateInvoiceForResellerParams) middleware.Responder {
l.Trace.Printf("[InvoiceManager] GenerateInvoiceForReseller endpoint invoked.\n")
callTime := time.Now()
m.monit.APIHit("invoice", callTime)
var from, to strfmt.DateTime
token := m.getToken(params.HTTPRequest)
if params.From != nil {
from = *params.From
}
if params.To != nil {
to = *params.To
}
billrun, e := m.db.GenerateInvoicesBy("reseller", params.ID, token, from, to)
if e != nil {
s := "Problem while trying to generate the Invoice: " + e.Error()
errorReturn := models.ErrorResponse{
ErrorString: &s,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "500", "method": "POST", "route": "/invoice/reseller/" + string(params.ID)}).Inc()
m.monit.APIHitDone("invoice", callTime)
return invoice_management.NewGenerateInvoiceForResellerInternalServerError().WithPayload(&errorReturn)
}
acceptedReturn := models.ItemCreatedResponse{
APILink: m.BasePath + "/billrun/" + billrun,
Message: "The request has been added to the queue",
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "202", "method": "POST", "route": "/invoice/reseller/" + string(params.ID)}).Inc()
m.monit.APIHitDone("invoice", callTime)
return invoice_management.NewGenerateInvoiceForResellerAccepted().WithPayload(&acceptedReturn)
}
// GetInvoice (Swagger func) is the function behind the (GET) endpoint
// /invoice/{id}
// It's job is to provide the requested invoice from the system
func (m *InvoiceManager) GetInvoice(ctx context.Context, params invoice_management.GetInvoiceParams) middleware.Responder {
l.Trace.Printf("[InvoiceManager] GetInvoice endpoint invoked.\n")
callTime := time.Now()
m.monit.APIHit("invoice", callTime)
object, e := m.db.GetInvoice(params.ID)
if e != nil {
s := "Problem while retrieving the Invoice from the db: " + e.Error()
errorReturn := models.ErrorResponse{
ErrorString: &s,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "500", "method": "GET", "route": "/invoice/" + string(params.ID)}).Inc()
m.monit.APIHitDone("invoice", callTime)
return invoice_management.NewGetInvoiceInternalServerError().WithPayload(&errorReturn)
}
if object != nil {
m.db.Metrics["api"].With(prometheus.Labels{"code": "200", "method": "GET", "route": "/invoice/" + string(params.ID)}).Inc()
m.monit.APIHitDone("invoice", callTime)
return invoice_management.NewGetInvoiceOK().WithPayload(object)
}
s := "The Invoice doesn't exists in the system."
missingReturn := models.ErrorResponse{
ErrorString: &s,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "404", "method": "GET", "route": "/invoice/" + string(params.ID)}).Inc()
m.monit.APIHitDone("invoice", callTime)
return invoice_management.NewGetInvoiceNotFound().WithPayload(&missingReturn)
}
// GetInvoicesByCustomer (Swagger func) is the function behind
// the (GET) endpoint /invoice/customer/{id}
// It's job is to provide the invoices associated to the requested customer
// in the system.
func (m *InvoiceManager) GetInvoicesByCustomer(ctx context.Context, params invoice_management.GetInvoicesByCustomerParams) middleware.Responder {
l.Trace.Printf("[InvoiceManager] GetInvoicesByCustomer endpoint invoked.\n")
callTime := time.Now()
m.monit.APIHit("invoice", callTime)
object, e := m.db.GetInvoicesByOrganization(params.ID, params.Months)
if e != nil {
s := "Problem while retrieving the Invoice from the db: " + e.Error()
errorReturn := models.ErrorResponse{
ErrorString: &s,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "500", "method": "GET", "route": "/invoice/customer/" + string(params.ID)}).Inc()
m.monit.APIHitDone("invoice", callTime)
return invoice_management.NewGetInvoicesByCustomerInternalServerError().WithPayload(&errorReturn)
}
if object != nil {
m.db.Metrics["api"].With(prometheus.Labels{"code": "200", "method": "GET", "route": "/invoice/customer/" + string(params.ID)}).Inc()
m.monit.APIHitDone("invoice", callTime)
return invoice_management.NewGetInvoicesByCustomerOK().WithPayload(object)
}
s := "The invoice doesn't exists in the system."
missingReturn := models.ErrorResponse{
ErrorString: &s,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "404", "method": "GET", "route": "/invoice/customer/" + string(params.ID)}).Inc()
m.monit.APIHitDone("invoice", callTime)
return invoice_management.NewGetInvoicesByCustomerNotFound().WithPayload(&missingReturn)
}
// GetInvoicesByReseller (Swagger func) is the function behind
// the (GET) endpoint /invoice/reseller/{id}
// It's job is to provide the invoices associated to the requested reseller
// in the system.
func (m *InvoiceManager) GetInvoicesByReseller(ctx context.Context, params invoice_management.GetInvoicesByResellerParams) middleware.Responder {
l.Trace.Printf("[InvoiceManager] GetInvoicesByReseller endpoint invoked.\n")
callTime := time.Now()
m.monit.APIHit("invoice", callTime)
object, e := m.db.GetInvoicesByOrganization(params.ID, params.Months)
if e != nil {
s := "Problem while retrieving the Invoice from the db: " + e.Error()
errorReturn := models.ErrorResponse{
ErrorString: &s,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "500", "method": "GET", "route": "/invoice/reseller/" + string(params.ID)}).Inc()
m.monit.APIHitDone("invoice", callTime)
return invoice_management.NewGetInvoicesByResellerInternalServerError().WithPayload(&errorReturn)
}
if object != nil {
m.db.Metrics["api"].With(prometheus.Labels{"code": "200", "method": "GET", "route": "/invoice/reseller/" + string(params.ID)}).Inc()
m.monit.APIHitDone("invoice", callTime)
return invoice_management.NewGetInvoicesByResellerOK().WithPayload(object)
}
s := "The Invoice doesn't exists in the system."
missingReturn := models.ErrorResponse{
ErrorString: &s,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "404", "method": "GET", "route": "/invoice/reseller/" + string(params.ID)}).Inc()
m.monit.APIHitDone("invoice", callTime)
return invoice_management.NewGetInvoicesByResellerNotFound().WithPayload(&missingReturn)
}
// ListInvoices (Swagger func) is the function behind the (GET) endpoint
// /invoice
// It's job is to provide all the invoices contained in the system.
func (m *InvoiceManager) ListInvoices(ctx context.Context, params invoice_management.ListInvoicesParams) middleware.Responder {
l.Trace.Printf("[InvoiceManager] ListInvoices endpoint invoked.\n")
callTime := time.Now()
m.monit.APIHit("invoice", callTime)
object, e := m.db.ListInvoices(params.Model)
if e != nil {
s := "Problem while retrieving the Invoices from the system: " + e.Error()
errorReturn := models.ErrorResponse{
ErrorString: &s,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "500", "method": "GET", "route": "/invoice"}).Inc()
m.monit.APIHitDone("invoice", callTime)
return invoice_management.NewListInvoicesInternalServerError().WithPayload(&errorReturn)
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "200", "method": "GET", "route": "/invoice"}).Inc()
m.monit.APIHitDone("invoice", callTime)
return invoice_management.NewListInvoicesOK().WithPayload(object)
}
// ListCustomerInvoices (Swagger func) is the function behind the (GET) endpoint
// /invoice/customer
// It's job is to provide all the customers invoices contained in the system.
func (m *InvoiceManager) ListCustomerInvoices(ctx context.Context, params invoice_management.ListCustomerInvoicesParams) middleware.Responder {
l.Trace.Printf("[InvoiceManager] ListCustomerInvoices endpoint invoked.\n")
callTime := time.Now()
m.monit.APIHit("invoice", callTime)
object, e := m.db.ListInvoices(&models.Invoice{OrganizationType: "customer"})
if e != nil {
s := "Problem while retrieving the Customers Invoices from the system: " + e.Error()
errorReturn := models.ErrorResponse{
ErrorString: &s,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "500", "method": "GET", "route": "/invoice/customer"}).Inc()
m.monit.APIHitDone("invoice", callTime)
return invoice_management.NewListCustomerInvoicesInternalServerError().WithPayload(&errorReturn)
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "200", "method": "GET", "route": "/invoice/customer"}).Inc()
m.monit.APIHitDone("invoice", callTime)
return invoice_management.NewListCustomerInvoicesOK().WithPayload(object)
}
// ListResellerInvoices (Swagger func) is the function behind the (GET) endpoint
// /invoice/reseller
// It's job is to provide all the resellers invoices contained in the system.
func (m *InvoiceManager) ListResellerInvoices(ctx context.Context, params invoice_management.ListResellerInvoicesParams) middleware.Responder {
l.Trace.Printf("[InvoiceManager] ListResellerInvoices endpoint invoked.\n")
callTime := time.Now()
m.monit.APIHit("invoice", callTime)
object, e := m.db.ListInvoices(&models.Invoice{OrganizationType: "reseller"})
if e != nil {
s := "Problem while retrieving the Resellers Invoices from the system: " + e.Error()
errorReturn := models.ErrorResponse{
ErrorString: &s,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "500", "method": "GET", "route": "/invoice/reseller"}).Inc()
m.monit.APIHitDone("invoice", callTime)
return invoice_management.NewListResellerInvoicesInternalServerError().WithPayload(&errorReturn)
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "200", "method": "GET", "route": "/invoice/reseller"}).Inc()
m.monit.APIHitDone("invoice", callTime)
return invoice_management.NewListResellerInvoicesOK().WithPayload(object)
}