From dbbad794807d36a144349c38080020bdc250f3b4 Mon Sep 17 00:00:00 2001 From: mr Date: Wed, 8 Apr 2026 15:18:20 +0200 Subject: [PATCH] Resource Buy & Limitation --- models/resources/interfaces.go | 1 + models/resources/resource.go | 31 +++++++++++++++++++-------- models/resources/resource_accessor.go | 13 +++++++++++ 3 files changed, 36 insertions(+), 9 deletions(-) diff --git a/models/resources/interfaces.go b/models/resources/interfaces.go index cd6dfe3..f840a5c 100755 --- a/models/resources/interfaces.go +++ b/models/resources/interfaces.go @@ -20,6 +20,7 @@ type ResourceInterface interface { ConvertToPricedResource(t tools.DataType, a *int, selectedPartnership *int, selectedBuyingStrategy *int, selectedStrategy *int, b *int, request *tools.APIRequest) (pricing.PricedItemITF, error) GetType() string ClearEnv() utils.DBObject + VerifyBuy() SetAllowedInstances(request *tools.APIRequest, instance_id ...string) []ResourceInstanceITF AddInstances(instance ResourceInstanceITF) GetSelectedInstance(index *int) ResourceInstanceITF diff --git a/models/resources/resource.go b/models/resources/resource.go index 0bcdd63..b2275bf 100755 --- a/models/resources/resource.go +++ b/models/resources/resource.go @@ -12,6 +12,7 @@ import ( "cloud.o-forge.io/core/oc-lib/models/common/models" "cloud.o-forge.io/core/oc-lib/models/common/pricing" "cloud.o-forge.io/core/oc-lib/models/peer" + "cloud.o-forge.io/core/oc-lib/models/resources/purchase_resource" "cloud.o-forge.io/core/oc-lib/models/utils" "cloud.o-forge.io/core/oc-lib/tools" "github.com/biter777/countries" @@ -20,21 +21,33 @@ import ( // AbstractResource is the struct containing all of the attributes commons to all ressources type AbstractResource struct { - utils.AbstractObject // AbstractObject contains the basic fields of an object (id, name) - - Type string `json:"type,omitempty" bson:"type,omitempty"` // Type is the type of the resource - Logo string `json:"logo,omitempty" bson:"logo,omitempty"` // Logo is the logo of the resource - Description string `json:"description,omitempty" bson:"description,omitempty"` // Description is the description of the resource - ShortDescription string `json:"short_description,omitempty" bson:"short_description,omitempty"` // ShortDescription is the short description of the resource - Owners []utils.Owner `json:"owners,omitempty" bson:"owners,omitempty"` // Owners is the list of owners of the resource - UsageRestrictions string `bson:"usage_restrictions,omitempty" json:"usage_restrictions,omitempty"` - AllowedBookingModes map[booking.BookingMode]*pricing.PricingVariation `bson:"allowed_booking_modes" json:"allowed_booking_modes"` + utils.AbstractObject // AbstractObject contains the basic fields of an object (id, name) + IsBuy bool `json:"is_buy"` // is_buy precise if a resource is buy or not + Type string `json:"type,omitempty" bson:"type,omitempty"` // Type is the type of the resource + Logo string `json:"logo,omitempty" bson:"logo,omitempty"` // Logo is the logo of the resource + Description string `json:"description,omitempty" bson:"description,omitempty"` // Description is the description of the resource + ShortDescription string `json:"short_description,omitempty" bson:"short_description,omitempty"` // ShortDescription is the short description of the resource + Owners []utils.Owner `json:"owners,omitempty" bson:"owners,omitempty"` // Owners is the list of owners of the resource + UsageRestrictions string `bson:"usage_restrictions,omitempty" json:"usage_restrictions,omitempty"` + AllowedBookingModes map[booking.BookingMode]*pricing.PricingVariation `bson:"allowed_booking_modes" json:"allowed_booking_modes"` Env []models.Param `json:"env,omitempty" bson:"env,omitempty"` Inputs []models.Param `json:"inputs,omitempty" bson:"inputs,omitempty"` Outputs []models.Param `json:"outputs,omitempty" bson:"outputs,omitempty"` } +func (abs *AbstractResource) VerifyBuy() { + p := &purchase_resource.PurchaseResource{} + access := p.GetAccessor(&tools.APIRequest{Admin: true}) + + access.Search(&dbs.Filters{ + And: map[string][]dbs.Filter{ + "resource_id": {{Operator: dbs.EQUAL.String(), Value: abs.GetID()}}, + }, + }, "", false, 0, 1) + +} + func (abs *AbstractResource) GetEnv() []models.Param { return abs.Env } diff --git a/models/resources/resource_accessor.go b/models/resources/resource_accessor.go index 4452867..969431d 100755 --- a/models/resources/resource_accessor.go +++ b/models/resources/resource_accessor.go @@ -55,6 +55,16 @@ func NewAccessor[T ResourceInterface](t tools.DataType, request *tools.APIReques * Nothing special here, just the basic CRUD operations */ +func (dca *ResourceMongoAccessor[T]) LoadOne(id string) (utils.DBObject, int, error) { + data, code, err := dca.AbstractAccessor.LoadOne(id) + if err == nil { + data.(T).VerifyBuy() + data.(T).SetAllowedInstances(dca.Request) + return data, code, err + } + return data, code, err +} + func (dca *ResourceMongoAccessor[T]) UpdateOne(set map[string]interface{}, id string) (utils.DBObject, int, error) { if dca.GetType() == tools.COMPUTE_RESOURCE { return nil, 404, errors.New("can't update a non existing computing units resource not reported onto compute units catalog") @@ -87,12 +97,14 @@ func (wfa *ResourceMongoAccessor[T]) LoadAll(isDraft bool, offset int64, limit i func (wfa *ResourceMongoAccessor[T]) Search(filters *dbs.Filters, search string, isDraft bool, offset int64, limit int64) ([]utils.ShallowDBObject, int, error) { if filters == nil && search == "*" { return utils.GenericLoadAll[T](func(d utils.DBObject) utils.ShallowDBObject { + d.(T).VerifyBuy() d.(T).SetAllowedInstances(wfa.Request) return d }, isDraft, wfa, offset, limit) } return utils.GenericSearch[T](filters, search, wfa.GetObjectFilters(search), func(d utils.DBObject) utils.ShallowDBObject { + d.(T).VerifyBuy() d.(T).SetAllowedInstances(wfa.Request) return d }, isDraft, wfa, offset, limit) @@ -100,6 +112,7 @@ func (wfa *ResourceMongoAccessor[T]) Search(filters *dbs.Filters, search string, func (a *ResourceMongoAccessor[T]) GetExec(isDraft bool) func(utils.DBObject) utils.ShallowDBObject { return func(d utils.DBObject) utils.ShallowDBObject { + d.(T).VerifyBuy() d.(T).SetAllowedInstances(a.Request) return d }