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.
 
 

289 lines
9.0 KiB

package resellerManager
import (
"context"
"time"
"github.com/go-openapi/runtime/middleware"
"github.com/prometheus/client_golang/prometheus"
"github.com/Cyclops-Labs/cyclops-4-hpc.git/services/customerdb/models"
"github.com/Cyclops-Labs/cyclops-4-hpc.git/services/customerdb/restapi/operations/reseller_management"
"github.com/Cyclops-Labs/cyclops-4-hpc.git/services/customerdb/server/dbManager"
"github.com/Cyclops-Labs/cyclops-4-hpc.git/services/customerdb/server/statusManager"
l "gitlab.com/cyclops-utilities/logging"
)
const (
statusDuplicated = iota
statusFail
statusMissing
statusOK
)
// ResellerManager is the struct defined to group and contain all the methods
// that interact with the reseller 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.
// - BasePath: a string with the base path of the system.
type ResellerManager struct {
db *dbManager.DbParameter
monit *statusManager.StatusManager
BasePath string
}
// New is the function to create the struct ResellerManager that grant
// access to the methods to interact with the reseller endpoint.
// Parameters:
// - db: a reference to the DbParameter to be able to interact with the db methods.
// - monit: a reference to the StatusManager to be able to interact with the
// status subsystem.
// - bp: a string containing the base path of the service.
// Returns:
// - ResellerManager: struct to interact with the reseller endpoint functionalities.
func New(db *dbManager.DbParameter, monit *statusManager.StatusManager, bp string) *ResellerManager {
l.Trace.Printf("[ResellerManager] Generating new ResellerManager.\n")
monit.InitEndpoint("reseller")
return &ResellerManager{
db: db,
monit: monit,
BasePath: bp,
}
}
// AddReseller (Swagger func) is the function behind the (POST) API Endpoint
// /reseller
// Its function is to add the provided reseller into the db.
func (m *ResellerManager) AddReseller(ctx context.Context, params reseller_management.AddResellerParams) middleware.Responder {
l.Trace.Printf("[ResellerManager] AddReseller endpoint invoked.\n")
callTime := time.Now()
m.monit.APIHit("reseller", callTime)
id, resellerStatus, customerStatus, productStatus := m.db.AddReseller(params.Reseller)
switch resellerStatus {
case statusOK:
if customerStatus == statusOK && productStatus == statusOK {
acceptedReturn := models.ItemCreatedResponse{
Message: "Reseller added to the system",
APILink: m.BasePath + "/reseller/" + id,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "201", "method": "POST", "route": "/reseller"}).Inc()
m.monit.APIHitDone("reseller", callTime)
return reseller_management.NewAddResellerCreated().WithPayload(&acceptedReturn)
}
case statusFail:
s := "It wasn't possible to insert the Reseller in the system."
errorReturn := models.ErrorResponse{
ErrorString: &s,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "500", "method": "POST", "route": "/reseller"}).Inc()
m.monit.APIHitDone("reseller", callTime)
return reseller_management.NewAddResellerInternalServerError().WithPayload(&errorReturn)
case statusDuplicated:
s := "The Reseller already exists in the system."
conflictReturn := models.ErrorResponse{
ErrorString: &s,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "409", "method": "POST", "route": "/reseller"}).Inc()
m.monit.APIHitDone("reseller", callTime)
return reseller_management.NewAddResellerConflict().WithPayload(&conflictReturn)
}
acceptedReturn := models.ItemCreatedResponse{
Message: "Reseller added to the system. There might have been problems when adding asociated resellers and/or products",
APILink: m.BasePath + "/reseller/" + id,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "202", "method": "POST", "route": "/reseller"}).Inc()
m.monit.APIHitDone("reseller", callTime)
return reseller_management.NewAddResellerAccepted().WithPayload(&acceptedReturn)
}
// GetReseller (Swagger func) is the function behind the (GET) API Endpoint
// /reseller/{id}
// Its function is to retrieve the information that the system has about the
// reseller whose ID has been provided.
func (m *ResellerManager) GetReseller(ctx context.Context, params reseller_management.GetResellerParams) middleware.Responder {
l.Trace.Printf("[ResellerManager] GetReseller endpoint invoked.\n")
callTime := time.Now()
m.monit.APIHit("reseller", callTime)
reseller, e := m.db.GetReseller(params.ID, m.BasePath)
if e != nil {
s := "There was an error retrieving the Reseller from the system: " + e.Error()
errorReturn := models.ErrorResponse{
ErrorString: &s,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "500", "method": "POST", "route": "/reseller/" + params.ID}).Inc()
m.monit.APIHitDone("reseller", callTime)
return reseller_management.NewGetResellerInternalServerError().WithPayload(&errorReturn)
}
if reseller != nil {
m.db.Metrics["api"].With(prometheus.Labels{"code": "200", "method": "GET", "route": "/reseller/" + params.ID}).Inc()
m.monit.APIHitDone("reseller", callTime)
return reseller_management.NewGetResellerOK().WithPayload(reseller)
}
s := "The Reseller doesn't exists in the system."
missingReturn := models.ErrorResponse{
ErrorString: &s,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "404", "method": "GET", "route": "/reseller/" + params.ID}).Inc()
m.monit.APIHitDone("reseller", callTime)
return reseller_management.NewGetResellerNotFound().WithPayload(&missingReturn)
}
// ListResellers (Swagger func) is the function behind the (GET) API Endpoint
// /reseller
// Its function is to provide a list containing all the resellers in the system.
func (m *ResellerManager) ListResellers(ctx context.Context, params reseller_management.ListResellersParams) middleware.Responder {
l.Trace.Printf("[ResellerManager] ListResellers endpoint invoked.\n")
callTime := time.Now()
m.monit.APIHit("reseller", callTime)
resellers, e := m.db.ListResellers()
if e != nil {
s := "There was an error retrieving the Resellers from the system: " + e.Error()
errorReturn := models.ErrorResponse{
ErrorString: &s,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "500", "method": "GET", "route": "/reseller"}).Inc()
m.monit.APIHitDone("reseller", callTime)
return reseller_management.NewListResellersInternalServerError().WithPayload(&errorReturn)
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "200", "method": "GET", "route": "/reseller"}).Inc()
m.monit.APIHitDone("reseller", callTime)
return reseller_management.NewListResellersOK().WithPayload(resellers)
}
// UpdateReseller (Swagger func) is the function behind the (PUT) API Endpoint
// /reseller/{id}
// Its function is to update the reseller whose ID is provided with the new data.
func (m *ResellerManager) UpdateReseller(ctx context.Context, params reseller_management.UpdateResellerParams) middleware.Responder {
l.Trace.Printf("[ResellerManager] UpdateReseller endpoint invoked.\n")
callTime := time.Now()
m.monit.APIHit("reseller", callTime)
reseller := params.Reseller
reseller.ResellerID = params.ID
resellerStatus, customerStatus, productStatus := m.db.UpdateReseller(reseller)
switch resellerStatus {
case statusOK:
if customerStatus == statusOK && productStatus == statusOK {
acceptedReturn := models.ItemCreatedResponse{
Message: "Reseller updated in the system",
APILink: m.BasePath + "/reseller/" + params.Reseller.ResellerID,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "200", "method": "PUT", "route": "/reseller/" + params.ID}).Inc()
m.monit.APIHitDone("reseller", callTime)
return reseller_management.NewUpdateResellerOK().WithPayload(&acceptedReturn)
}
case statusFail:
s := "It wasn't possible to update the Reseller in the system."
errorReturn := models.ErrorResponse{
ErrorString: &s,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "500", "method": "PUT", "route": "/reseller/" + params.ID}).Inc()
m.monit.APIHitDone("reseller", callTime)
return reseller_management.NewUpdateResellerInternalServerError().WithPayload(&errorReturn)
case statusMissing:
s := "The Reseller doesn't exists in the system."
missingReturn := models.ErrorResponse{
ErrorString: &s,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "404", "method": "PUT", "route": "/reseller/" + params.ID}).Inc()
m.monit.APIHitDone("reseller", callTime)
return reseller_management.NewUpdateResellerNotFound().WithPayload(&missingReturn)
}
acceptedReturn := models.ItemCreatedResponse{
Message: "Reseller updated in the system. There might have been problems when updating asociated resellers and/or products",
APILink: m.BasePath + "/reseller/" + params.Reseller.ResellerID,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "202", "method": "PUT", "route": "/reseller/" + params.ID}).Inc()
m.monit.APIHitDone("reseller", callTime)
return reseller_management.NewUpdateResellerAccepted().WithPayload(&acceptedReturn)
}