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.
330 lines
9.6 KiB
330 lines
9.6 KiB
package planManager
|
|
|
|
import (
|
|
"context"
|
|
"time"
|
|
|
|
"github.com/go-openapi/runtime/middleware"
|
|
"github.com/prometheus/client_golang/prometheus"
|
|
"github.com/Cyclops-Labs/cyclops-4-hpc.git/services/plan-manager/models"
|
|
"github.com/Cyclops-Labs/cyclops-4-hpc.git/services/plan-manager/restapi/operations/plan_management"
|
|
"github.com/Cyclops-Labs/cyclops-4-hpc.git/services/plan-manager/server/dbManager"
|
|
"github.com/Cyclops-Labs/cyclops-4-hpc.git/services/plan-manager/server/statusManager"
|
|
l "gitlab.com/cyclops-utilities/logging"
|
|
)
|
|
|
|
const (
|
|
statusDuplicated = iota
|
|
statusFail
|
|
statusMissing
|
|
statusOK
|
|
)
|
|
|
|
// PlanManager is the struct defined to group and contain all the methods
|
|
// that interact with the plan subsystem.
|
|
// Parameters:
|
|
// - basePath: a string with the base path of the system.
|
|
// - 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 PlanManager struct {
|
|
basePath string
|
|
db *dbManager.DbParameter
|
|
monit *statusManager.StatusManager
|
|
}
|
|
|
|
// New is the function to create the struct PlanManager.
|
|
// 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:
|
|
// - PlanManager: struct to interact with PlanManager subsystem functionalities.
|
|
func New(db *dbManager.DbParameter, monit *statusManager.StatusManager, bp string) *PlanManager {
|
|
|
|
l.Trace.Printf("[PlanManager] Generating new planManager.\n")
|
|
|
|
monit.InitEndpoint("plan")
|
|
|
|
return &PlanManager{
|
|
basePath: bp,
|
|
db: db,
|
|
monit: monit,
|
|
}
|
|
|
|
}
|
|
|
|
// CreatePlan (Swagger func) is the function behind the (POST) endpoint /plan
|
|
// Its job is to add a new plan in the system.
|
|
func (m *PlanManager) CreatePlan(ctx context.Context, params plan_management.CreatePlanParams) middleware.Responder {
|
|
|
|
l.Trace.Printf("[PlanManager] CreatePlan endpoint invoked.\n")
|
|
|
|
callTime := time.Now()
|
|
m.monit.APIHit("plan", callTime)
|
|
|
|
id, state, e := m.db.CreatePlan(params.Plan)
|
|
|
|
if e != nil {
|
|
|
|
s := "Problem creating the new Plan: " + e.Error()
|
|
errorReturn := models.ErrorResponse{
|
|
ErrorString: &s,
|
|
}
|
|
|
|
m.db.Metrics["api"].With(prometheus.Labels{"code": "500", "method": "POST", "route": "/plan"}).Inc()
|
|
|
|
m.monit.APIHitDone("plan", callTime)
|
|
|
|
return plan_management.NewCreatePlanInternalServerError().WithPayload(&errorReturn)
|
|
|
|
}
|
|
|
|
if state == statusDuplicated {
|
|
|
|
s := "The Plan already exists in the system."
|
|
conflictReturn := models.ErrorResponse{
|
|
ErrorString: &s,
|
|
}
|
|
|
|
m.db.Metrics["api"].With(prometheus.Labels{"code": "409", "method": "POST", "route": "/plan"}).Inc()
|
|
|
|
m.monit.APIHitDone("plan", callTime)
|
|
|
|
return plan_management.NewCreatePlanConflict().WithPayload(&conflictReturn)
|
|
|
|
}
|
|
|
|
link := m.basePath + "/plan/" + id
|
|
|
|
createReturn := models.ItemCreatedResponse{
|
|
ID: id,
|
|
Link: link,
|
|
}
|
|
|
|
m.db.Metrics["api"].With(prometheus.Labels{"code": "201", "method": "GET", "route": "/plan"}).Inc()
|
|
|
|
m.monit.APIHitDone("plan", callTime)
|
|
|
|
return plan_management.NewCreatePlanCreated().WithPayload(&createReturn)
|
|
|
|
}
|
|
|
|
// GetCompletePlan (Swagger func) is the function behind the (GET) endpoint
|
|
// /plan/complete/{id}
|
|
// Its job is to retrieve the full information related to a plan provided its ID.
|
|
func (m *PlanManager) GetCompletePlan(ctx context.Context, params plan_management.GetCompletePlanParams) middleware.Responder {
|
|
|
|
l.Trace.Printf("[PlanManager] GetCompletePlan endpoint invoked.\n")
|
|
|
|
callTime := time.Now()
|
|
m.monit.APIHit("plan", callTime)
|
|
|
|
plan, e := m.db.GetCompletePlan(params.ID)
|
|
|
|
if e != nil {
|
|
|
|
s := "Problem retrieving the Plan from the system: " + e.Error()
|
|
errorReturn := models.ErrorResponse{
|
|
ErrorString: &s,
|
|
}
|
|
|
|
m.db.Metrics["api"].With(prometheus.Labels{"code": "500", "method": "GET", "route": "/plan/complete/" + params.ID}).Inc()
|
|
|
|
m.monit.APIHitDone("plan", callTime)
|
|
|
|
return plan_management.NewGetCompletePlanInternalServerError().WithPayload(&errorReturn)
|
|
|
|
}
|
|
|
|
if plan != nil {
|
|
|
|
m.db.Metrics["api"].With(prometheus.Labels{"code": "200", "method": "GET", "route": "/plan/complete/" + params.ID}).Inc()
|
|
|
|
m.monit.APIHitDone("plan", callTime)
|
|
|
|
return plan_management.NewGetCompletePlanOK().WithPayload(plan)
|
|
|
|
}
|
|
|
|
s := "The Plan doesn't exists in the system."
|
|
missingReturn := models.ErrorResponse{
|
|
ErrorString: &s,
|
|
}
|
|
|
|
m.db.Metrics["api"].With(prometheus.Labels{"code": "404", "method": "GET", "route": "/plan/complete/" + params.ID}).Inc()
|
|
|
|
m.monit.APIHitDone("plan", callTime)
|
|
|
|
return plan_management.NewGetCompletePlanNotFound().WithPayload(&missingReturn)
|
|
|
|
}
|
|
|
|
// GetPlan (Swagger func) is the function behind the (GET) endpoint /plan/{id}
|
|
// Its job is to retrieve the information related to a plan provided its ID.
|
|
func (m *PlanManager) GetPlan(ctx context.Context, params plan_management.GetPlanParams) middleware.Responder {
|
|
|
|
l.Trace.Printf("[PlanManager] GetPlan endpoint invoked.\n")
|
|
|
|
callTime := time.Now()
|
|
m.monit.APIHit("plan", callTime)
|
|
|
|
plan, e := m.db.GetPlan(params.ID)
|
|
|
|
if e != nil {
|
|
|
|
s := "Problem retrieving the Plan from the system: " + e.Error()
|
|
errorReturn := models.ErrorResponse{
|
|
ErrorString: &s,
|
|
}
|
|
|
|
m.db.Metrics["api"].With(prometheus.Labels{"code": "500", "method": "GET", "route": "/plan/" + params.ID}).Inc()
|
|
|
|
m.monit.APIHitDone("plan", callTime)
|
|
|
|
return plan_management.NewGetPlanInternalServerError().WithPayload(&errorReturn)
|
|
|
|
}
|
|
|
|
if plan != nil {
|
|
|
|
m.db.Metrics["api"].With(prometheus.Labels{"code": "200", "method": "GET", "route": "/plan/" + params.ID}).Inc()
|
|
|
|
m.monit.APIHitDone("plan", callTime)
|
|
|
|
return plan_management.NewGetPlanOK().WithPayload(plan)
|
|
|
|
}
|
|
|
|
s := "The Plan doesn't exists in the system."
|
|
missingReturn := models.ErrorResponse{
|
|
ErrorString: &s,
|
|
}
|
|
|
|
m.db.Metrics["api"].With(prometheus.Labels{"code": "404", "method": "GET", "route": "/plan/" + params.ID}).Inc()
|
|
|
|
m.monit.APIHitDone("plan", callTime)
|
|
|
|
return plan_management.NewGetPlanNotFound().WithPayload(&missingReturn)
|
|
|
|
}
|
|
|
|
// ListCompletePlans (Swagger func) is the function behind the (GET) endpoint
|
|
// /plan/complete
|
|
// Its job is to retrieve the full information, including linked skus, related
|
|
// to a plan provided its ID.
|
|
func (m *PlanManager) ListCompletePlans(ctx context.Context, params plan_management.ListCompletePlansParams) middleware.Responder {
|
|
|
|
l.Trace.Printf("[PlanManager] ListCompletePlans endpoint invoked.\n")
|
|
|
|
callTime := time.Now()
|
|
m.monit.APIHit("plan", callTime)
|
|
|
|
plans, e := m.db.ListCompletePlans()
|
|
|
|
if e != nil {
|
|
|
|
s := "Problem retrieving the Plan from the system: " + e.Error()
|
|
errorReturn := models.ErrorResponse{
|
|
ErrorString: &s,
|
|
}
|
|
|
|
m.db.Metrics["api"].With(prometheus.Labels{"code": "500", "method": "GET", "route": "/plan/complete"}).Inc()
|
|
|
|
m.monit.APIHitDone("plan", callTime)
|
|
|
|
return plan_management.NewListCompletePlansInternalServerError().WithPayload(&errorReturn)
|
|
|
|
}
|
|
|
|
m.db.Metrics["api"].With(prometheus.Labels{"code": "200", "method": "GET", "route": "/plan/complete"}).Inc()
|
|
|
|
m.monit.APIHitDone("plan", callTime)
|
|
|
|
return plan_management.NewListCompletePlansOK().WithPayload(plans)
|
|
|
|
}
|
|
|
|
// ListPlans (Swagger func) is the function behind the (GET) endpoint /plan
|
|
// Its job is to retrieve the information related to a plan provided its ID.
|
|
func (m *PlanManager) ListPlans(ctx context.Context, params plan_management.ListPlansParams) middleware.Responder {
|
|
|
|
l.Trace.Printf("[PlanManager] ListPlans endpoint invoked.\n")
|
|
|
|
callTime := time.Now()
|
|
m.monit.APIHit("plan", callTime)
|
|
|
|
plans, e := m.db.ListPlans()
|
|
|
|
if e != nil {
|
|
|
|
s := "Problem retrieving the Plan from the system: " + e.Error()
|
|
errorReturn := models.ErrorResponse{
|
|
ErrorString: &s,
|
|
}
|
|
|
|
m.db.Metrics["api"].With(prometheus.Labels{"code": "500", "method": "GET", "route": "/plan"}).Inc()
|
|
|
|
m.monit.APIHitDone("plan", callTime)
|
|
|
|
return plan_management.NewListPlansInternalServerError().WithPayload(&errorReturn)
|
|
|
|
}
|
|
|
|
m.db.Metrics["api"].With(prometheus.Labels{"code": "200", "method": "GET", "route": "/plan"}).Inc()
|
|
|
|
m.monit.APIHitDone("plan", callTime)
|
|
|
|
return plan_management.NewListPlansOK().WithPayload(plans)
|
|
|
|
}
|
|
|
|
// UpdatePlan (Swagger func) is the function behind the (PUT) endpoint /plan/{id}
|
|
// Its job is to update the plan linked to the provided ID with the new plan data.
|
|
func (m *PlanManager) UpdatePlan(ctx context.Context, params plan_management.UpdatePlanParams) middleware.Responder {
|
|
|
|
l.Trace.Printf("[PlanManager] UpdatePlan endpoint invoked.\n")
|
|
|
|
callTime := time.Now()
|
|
m.monit.APIHit("plan", callTime)
|
|
|
|
state, e := m.db.UpdatePlan(params.ID, params.Plan)
|
|
|
|
if e != nil {
|
|
|
|
s := "Problem retrieving the Plan from the system: " + e.Error()
|
|
errorReturn := models.ErrorResponse{
|
|
ErrorString: &s,
|
|
}
|
|
|
|
m.db.Metrics["api"].With(prometheus.Labels{"code": "500", "method": "PUT", "route": "/plan/" + params.ID}).Inc()
|
|
|
|
m.monit.APIHitDone("plan", callTime)
|
|
|
|
return plan_management.NewUpdatePlanInternalServerError().WithPayload(&errorReturn)
|
|
|
|
}
|
|
|
|
if state == statusMissing {
|
|
|
|
s := "The Plan doesn't exists in the system."
|
|
missingReturn := models.ErrorResponse{
|
|
ErrorString: &s,
|
|
}
|
|
|
|
m.db.Metrics["api"].With(prometheus.Labels{"code": "404", "method": "PUT", "route": "/plan/" + params.ID}).Inc()
|
|
|
|
m.monit.APIHitDone("plan", callTime)
|
|
|
|
return plan_management.NewUpdatePlanNotFound().WithPayload(&missingReturn)
|
|
|
|
}
|
|
|
|
m.db.Metrics["api"].With(prometheus.Labels{"code": "200", "method": "PUT", "route": "/plan/" + params.ID}).Inc()
|
|
|
|
m.monit.APIHitDone("plan", callTime)
|
|
|
|
return plan_management.NewUpdatePlanOK().WithPayload(params.Plan)
|
|
|
|
}
|
|
|