package api import ( "fmt" // "html/template" "reflect" "git.eugeniocarvalho.dev/eugeniucarvalho/apicodegen/api/errs" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" ) func (mongo *Mongo) InsertOneRx(options *Filter) *ObservableStruct { return Observable(func(observer *Subscriber) { if res, err := mongo.InsertOne(options); err != nil { observer.Err(err) } else { observer.Next(res) } }) } func (_mongo *Mongo) FindManyRx(params *Filter) *ObservableStruct { var ( ctx, collection = _mongo.GetContext(params) cursor *mongo.Cursor err error ) return Observable(func(observer *Subscriber) { switch { case params.Pipeline != nil: // opts := options.Aggregate().SetBatchSize(int32(params.MaxResults)) opts := options.Aggregate() if cursor, err = collection.Aggregate(ctx, params.Pipeline, opts); err != nil { err = errs.FromError(err) return } case params.Query != nil: findOptions := options.Find() findOptions.SetLimit(int64(params.MaxResults)) if params.Sort != nil { findOptions.SetSort(params.Sort) } if params.Fields != nil { findOptions.SetProjection(params.Fields) } cursor, err = collection.Find(ctx, params.Query, findOptions) fmt.Println("erro no query") default: err = errs.Internal().Details(&errs.Detail{ Message: "FindMany requires a Pipeline or Query param.", }) } if err == nil { observer.Next(cursor) } else { observer.Next(err) } }).Pipe( RxMap(func(value interface{}) (interface{}, error) { var ( cursor, _ = value.(*mongo.Cursor) elemp reflect.Value err error ) defer cursor.Close(ctx) if params.Entities == nil { return nil, fmt.Errorf("Entities can't be nil") } entitiesValue := reflect.ValueOf(params.Entities) if entitiesValue.Kind() != reflect.Ptr || entitiesValue.Elem().Kind() != reflect.Slice { return nil, fmt.Errorf("Entities argument must be a slice address") } sliceVector := entitiesValue.Elem() sliceVector = sliceVector.Slice(0, sliceVector.Cap()) typ := sliceVector.Type().Elem() // LogError(0, cursor.Err().Error()) for cursor.Next(ctx) { fmt.Println("interate") elemp = reflect.New(typ) if err = cursor.Decode(elemp.Interface()); err != nil { return nil, err } sliceVector = reflect.Append(sliceVector, elemp.Elem()) } entitiesValue.Elem().Set(sliceVector) return entitiesValue.Elem(), nil }), ) }