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.

254 lines
7.7 KiB

package productManager
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/product_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
)
// ProductManager is the struct defined to group and contain all the methods
// that interact with the product 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 ProductManager struct {
db *dbManager.DbParameter
monit *statusManager.StatusManager
BasePath string
}
// New is the function to create the struct ProductManager that grant
// access to the methods to interact with the Product 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:
// - ProductManager: struct to interact with product endpoint functionalities.
func New(db *dbManager.DbParameter, monit *statusManager.StatusManager, bp string) *ProductManager {
l.Trace.Printf("[ProductManager] Generating new ProductManager.\n")
monit.InitEndpoint("product")
return &ProductManager{
db: db,
monit: monit,
BasePath: bp,
}
}
// AddProduct (Swagger func) is the function behind the (POST) API Endpoint
// /product
// Its function is to add the provided product into the db.
func (m *ProductManager) AddProduct(ctx context.Context, params product_management.AddProductParams) middleware.Responder {
l.Trace.Printf("[ProductManager] AddProduct endpoint invoked.\n")
callTime := time.Now()
m.monit.APIHit("product", callTime)
id, productStatus := m.db.AddProduct(params.Product)
switch productStatus {
case statusOK:
acceptedReturn := models.ItemCreatedResponse{
Message: "Product added to the system",
APILink: m.BasePath + "/product/" + id,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "201", "method": "POST", "route": "/product"}).Inc()
m.monit.APIHitDone("product", callTime)
return product_management.NewAddProductCreated().WithPayload(&acceptedReturn)
case statusFail:
s := "It wasn't possible to insert the Product in the system."
errorReturn := models.ErrorResponse{
ErrorString: &s,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "500", "method": "POST", "route": "/product"}).Inc()
m.monit.APIHitDone("product", callTime)
return product_management.NewAddProductInternalServerError().WithPayload(&errorReturn)
}
s := "The Product already exists in the system."
conflictReturn := models.ErrorResponse{
ErrorString: &s,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "409", "method": "POST", "route": "/product"}).Inc()
m.monit.APIHitDone("product", callTime)
return product_management.NewAddProductConflict().WithPayload(&conflictReturn)
}
// GetProduct (Swagger func) is the function behind the (GET) API Endpoint
// /product/{id}
// Its function is to retrieve the information that the system has about the
// product whose ID has been provided.
func (m *ProductManager) GetProduct(ctx context.Context, params product_management.GetProductParams) middleware.Responder {
l.Trace.Printf("[ProductManager] GetProduct endpoint invoked.\n")
callTime := time.Now()
m.monit.APIHit("product", callTime)
product, e := m.db.GetProduct(params.ID)
if e != nil {
s := "There was an error retrieving the Product from the system: " + e.Error()
errorReturn := models.ErrorResponse{
ErrorString: &s,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "500", "method": "POST", "route": "/product/" + params.ID}).Inc()
m.monit.APIHitDone("product", callTime)
return product_management.NewGetProductInternalServerError().WithPayload(&errorReturn)
}
if product != nil {
m.db.Metrics["api"].With(prometheus.Labels{"code": "200", "method": "GET", "route": "/product/" + params.ID}).Inc()
m.monit.APIHitDone("product", callTime)
return product_management.NewGetProductOK().WithPayload(product)
}
s := "The Product doesn't exists in the system."
missingReturn := models.ErrorResponse{
ErrorString: &s,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "404", "method": "GET", "route": "/product/" + params.ID}).Inc()
m.monit.APIHitDone("product", callTime)
return product_management.NewGetProductNotFound().WithPayload(&missingReturn)
}
// ListProducts (Swagger func) is the function behind the (GET) API Endpoint
// /product
// Its function is to provide a list containing all the products in the system.
func (m *ProductManager) ListProducts(ctx context.Context, params product_management.ListProductsParams) middleware.Responder {
l.Trace.Printf("[ProductManager] ListProducts endpoint invoked.\n")
callTime := time.Now()
m.monit.APIHit("product", callTime)
products, e := m.db.ListProducts()
if e != nil {
s := "There was an error retrieving the Products from the system: " + e.Error()
errorReturn := models.ErrorResponse{
ErrorString: &s,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "500", "method": "GET", "route": "/product"}).Inc()
m.monit.APIHitDone("product", callTime)
return product_management.NewListProductsInternalServerError().WithPayload(&errorReturn)
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "200", "method": "GET", "route": "/product"}).Inc()
m.monit.APIHitDone("product", callTime)
return product_management.NewListProductsOK().WithPayload(products)
}
// UpdateProduct (Swagger func) is the function behind the (PUT) API Endpoint
// /product/{id}
// Its function is to update the product whose ID is provided with the new data.
func (m *ProductManager) UpdateProduct(ctx context.Context, params product_management.UpdateProductParams) middleware.Responder {
l.Trace.Printf("[ProductManager] UpdateProduct endpoint invoked.\n")
callTime := time.Now()
m.monit.APIHit("product", callTime)
product := params.Product
product.ProductID = params.ID
switch productStatus := m.db.UpdateProduct(product); productStatus {
case statusOK:
acceptedReturn := models.ItemCreatedResponse{
Message: "Product updated in the system",
APILink: m.BasePath + "/product/" + params.Product.ProductID,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "200", "method": "PUT", "route": "/product/" + params.ID}).Inc()
m.monit.APIHitDone("product", callTime)
return product_management.NewUpdateProductOK().WithPayload(&acceptedReturn)
case statusFail:
s := "It wasn't possible to update the product in the system."
errorReturn := models.ErrorResponse{
ErrorString: &s,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "500", "method": "PUT", "route": "/product/" + params.ID}).Inc()
m.monit.APIHitDone("product", callTime)
return product_management.NewUpdateProductInternalServerError().WithPayload(&errorReturn)
}
s := "The Product doesn't exists in the system."
missingReturn := models.ErrorResponse{
ErrorString: &s,
}
m.db.Metrics["api"].With(prometheus.Labels{"code": "404", "method": "PUT", "route": "/product/" + params.ID}).Inc()
m.monit.APIHitDone("product", callTime)
return product_management.NewUpdateProductNotFound().WithPayload(&missingReturn)
}