package live import ( "encoding/json" "errors" "cloud.o-forge.io/core/oc-lib/dbs" "cloud.o-forge.io/core/oc-lib/logs" "cloud.o-forge.io/core/oc-lib/models/utils" "cloud.o-forge.io/core/oc-lib/tools" ) type computeUnitsMongoAccessor[T LiveInterface] struct { utils.AbstractAccessor // AbstractAccessor contains the basic fields of an accessor (model, caller) } // New creates a new instance of the computeUnitsMongoAccessor func NewAccessor[T LiveInterface](t tools.DataType, request *tools.APIRequest) *computeUnitsMongoAccessor[T] { return &computeUnitsMongoAccessor[T]{ AbstractAccessor: utils.AbstractAccessor{ Logger: logs.CreateLogger(t.String()), // Create a logger with the data type Request: request, Type: t, }, } } /* * Nothing special here, just the basic CRUD operations */ func (a *computeUnitsMongoAccessor[T]) DeleteOne(id string) (utils.DBObject, int, error) { return utils.GenericDeleteOne(id, a) } func (a *computeUnitsMongoAccessor[T]) UpdateOne(set utils.DBObject, id string) (utils.DBObject, int, error) { // should verify if a source is existing... return utils.GenericUpdateOne(set, id, a, &LiveDatacenter{}) } func (a *computeUnitsMongoAccessor[T]) StoreOne(data utils.DBObject) (utils.DBObject, int, error) { return utils.GenericStoreOne(data.(*LiveDatacenter), a) } func (a *computeUnitsMongoAccessor[T]) CopyOne(data utils.DBObject) (utils.DBObject, int, error) { // is a publisher... that become a resources. if data.IsDrafted() { return nil, 422, errors.New("can't publish a drafted compute units") } live := data.(T) if live.GetMonitorPath() == "" || live.GetID() != "" { return nil, 422, errors.New("publishing is only allowed is it can be monitored and be accessible") } if res, code, err := a.LoadOne(live.GetID()); err != nil { return nil, code, err } else { live = res.(T) } resAccess := live.GetResourceAccessor(a.Request) instance := live.GetResourceInstance() b, _ := json.Marshal(live) json.Unmarshal(b, instance) if len(live.GetResourcesID()) > 0 { for _, r := range live.GetResourcesID() { // TODO dependent of a existing resource res, code, err := resAccess.LoadOne(r) if err == nil { return nil, code, err } existingResource := live.GetResource() b, _ := json.Marshal(res) json.Unmarshal(b, existingResource) live.SetResourceInstance(existingResource, instance) resAccess.UpdateOne(existingResource, existingResource.GetID()) } if live.GetID() != "" { return a.LoadOne(live.GetID()) } else { return a.StoreOne(live) } } else { r := live.GetResource() b, _ := json.Marshal(live) json.Unmarshal(b, &r) live.SetResourceInstance(r, instance) res, code, err := resAccess.StoreOne(r) if err != nil { return nil, code, err } live.SetResourcesID(res.GetID()) if live.GetID() != "" { return a.UpdateOne(live, live.GetID()) } else { return a.StoreOne(live) } } } func (a *computeUnitsMongoAccessor[T]) LoadOne(id string) (utils.DBObject, int, error) { return utils.GenericLoadOne[T](id, func(d utils.DBObject) (utils.DBObject, int, error) { return d, 200, nil }, a) } func (a *computeUnitsMongoAccessor[T]) LoadAll(isDraft bool) ([]utils.ShallowDBObject, int, error) { return utils.GenericLoadAll[T](a.getExec(), isDraft, a) } func (a *computeUnitsMongoAccessor[T]) Search(filters *dbs.Filters, search string, isDraft bool) ([]utils.ShallowDBObject, int, error) { return utils.GenericSearch[*LiveDatacenter](filters, search, (&LiveDatacenter{}).GetObjectFilters(search), a.getExec(), isDraft, a) } func (a *computeUnitsMongoAccessor[T]) getExec() func(utils.DBObject) utils.ShallowDBObject { return func(d utils.DBObject) utils.ShallowDBObject { return d } }