mongo.go 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509
  1. package api
  2. import (
  3. "bytes"
  4. "context"
  5. "encoding/base64"
  6. "fmt" // "html/template"
  7. "reflect"
  8. "regexp"
  9. "strconv"
  10. "strings"
  11. "text/template"
  12. "time"
  13. "git.eugeniocarvalho.dev/eugeniucarvalho/apicodegen/api/errs"
  14. "github.com/davecgh/go-spew/spew"
  15. iriscontext "github.com/kataras/iris/v12/context"
  16. "go.mongodb.org/mongo-driver/bson"
  17. "go.mongodb.org/mongo-driver/bson/primitive"
  18. "go.mongodb.org/mongo-driver/mongo"
  19. "go.mongodb.org/mongo-driver/mongo/options"
  20. "go.mongodb.org/mongo-driver/mongo/readconcern"
  21. "go.mongodb.org/mongo-driver/mongo/readpref"
  22. "go.mongodb.org/mongo-driver/mongo/writeconcern"
  23. )
  24. const (
  25. DefaultAddrConnect = "mongodb://localhost:27017"
  26. InsertOne = iota + 1
  27. InsertMany
  28. Patch
  29. )
  30. var (
  31. QueriesMap = map[string]*template.Template{}
  32. EMPTYQUERY_REGEX = regexp.MustCompile(`{\s*}`)
  33. )
  34. func GetSessionContext(ctx iriscontext.Context) mongo.SessionContext {
  35. context := ctx.Values().Get("$SessionContext")
  36. if context != nil {
  37. return context.(mongo.SessionContext)
  38. }
  39. return nil
  40. }
  41. func init() {
  42. errs.RegisterMapErrorFunction("MONGO_ERROS", func(source error) (err *errs.Error) {
  43. message := source.Error()
  44. switch {
  45. case strings.Contains(message, "E11000"):
  46. err = errs.AlreadyExists().Details(&errs.Detail{
  47. Message: "DUPLICATED_ITEM",
  48. })
  49. case strings.Contains(message, "cannot decode"):
  50. err = errs.DataCaps().Details(&errs.Detail{
  51. Message: message,
  52. })
  53. case strings.Contains(message, "no documents in result"):
  54. errs.NotFound().Details(&errs.Detail{
  55. Message: "NOT_FOUND",
  56. })
  57. }
  58. return
  59. })
  60. }
  61. type Mongo struct {
  62. // Sessions map[string]*mgo.Session
  63. // Session *mgo.Session
  64. // Uri string
  65. // Configs
  66. //DefaultDB string
  67. // User string `json:"user"`
  68. // Password string `json:"password"`
  69. // DataBase string `json:"database"`
  70. // Addrs string `json:"addrs"`
  71. subject *BehaviorSubjectStruct
  72. client *mongo.Client
  73. Credential *options.Credential
  74. Config string `json:"config"`
  75. Clients map[string]*mongo.Client
  76. }
  77. type execfn func(context.Context, *mongo.Collection)
  78. type EntityInterface interface {
  79. Patch() *bson.A
  80. }
  81. // Modelo de comunicação entre o controle da API e a camada de persistencia.
  82. type Filter struct {
  83. Id primitive.ObjectID
  84. UserId primitive.ObjectID
  85. // NextPageToken primitive.ObjectID
  86. // PageToken PageToken
  87. Fields *bson.M
  88. Query *bson.M
  89. Patchs *bson.A
  90. Sort *bson.M
  91. // Sort []string
  92. Collection string
  93. QueryType string
  94. DB string
  95. Format string
  96. Insertion int
  97. CheckQuery bool
  98. IgnoreNoEntityFound bool
  99. MaxResults int
  100. Entity interface{}
  101. Entities interface{}
  102. SessionContext mongo.SessionContext
  103. // Aggregate interface{}
  104. Pipeline primitive.A
  105. Options interface{}
  106. }
  107. func (f *Filter) Aggregate(ctx context.Context, collection *mongo.Collection, opts *options.AggregateOptions) (cursor *mongo.Cursor, err *errs.Error) {
  108. var errl error
  109. if opts == nil {
  110. opts = options.Aggregate().SetBatchSize(int32(f.MaxResults))
  111. }
  112. // cmd := command.Aggregate{
  113. // NS: ns,
  114. // Pipeline: pipeline,
  115. // ReadPref: rp,
  116. // }
  117. if cursor, errl = collection.Aggregate(ctx, f.Pipeline, opts); errl != nil {
  118. err = errs.FromError(errl)
  119. }
  120. return
  121. }
  122. func (t *Filter) Check() (err *errs.Error) {
  123. if t.CheckQuery {
  124. if t.Query == nil {
  125. if !t.Id.IsZero() {
  126. t.Query = &bson.M{"_id": t.Id}
  127. } else {
  128. err = errs.InvalidArgument().Details(&errs.Detail{
  129. LocationType: "query",
  130. Location: "q",
  131. Message: "emptyValue",
  132. })
  133. return
  134. }
  135. }
  136. }
  137. if t.Query == nil {
  138. t.Query = &bson.M{}
  139. }
  140. return
  141. }
  142. func (t *Mongo) Ready() *BehaviorSubjectStruct {
  143. if t.subject == nil {
  144. t.subject = BehaviorSubject()
  145. }
  146. return t.subject
  147. }
  148. func (t *Mongo) Init() (err error) {
  149. defer func(){
  150. spew.Dump(err)
  151. }()
  152. fmt.Printf("Connection string '%s'", t.Config)
  153. clientOpts := options.Client().ApplyURI(t.Config)
  154. if t.Credential != nil {
  155. clientOpts.SetAuth(*t.Credential)
  156. }
  157. connectContext, _ := context.WithTimeout(context.Background(), 10*time.Second)
  158. // if t.client, err = mongo.NewClient(setOptions); err != nil {
  159. if t.client, err = mongo.Connect(
  160. connectContext,
  161. clientOpts,
  162. ); err != nil {
  163. return
  164. }
  165. // ctx, cancel := context.WithTimeout(context.Background(), 20*time.Second)
  166. // defer cancel()
  167. // if err = t.client.Connect(ctx); err != nil {
  168. // return
  169. // }
  170. t.Ready().Next(true)
  171. return nil
  172. }
  173. func (t *Mongo) CommitTransaction(opts *options.SessionOptions) {
  174. }
  175. func (t *Mongo) StartTransaction(
  176. sessionOptions *options.SessionOptions,
  177. transactionOptions *options.TransactionOptions,
  178. ) (
  179. sessionContext mongo.SessionContext,
  180. err *errs.Error,
  181. ) {
  182. var (
  183. session mongo.Session
  184. localError error
  185. )
  186. defer func() {
  187. if localError != nil {
  188. err = errs.Internal().Details(&errs.Detail{
  189. Message: localError.Error(),
  190. })
  191. }
  192. }()
  193. if session, localError = t.client.StartSession(sessionOptions); localError == nil {
  194. ctx, _ := context.WithTimeout(context.Background(), 60*time.Second)
  195. mongo.WithSession(ctx, session, func(sctx mongo.SessionContext) error {
  196. if localError = session.StartTransaction(transactionOptions); localError == nil {
  197. sessionContext = sctx
  198. }
  199. return nil
  200. })
  201. }
  202. return
  203. }
  204. func (t *Mongo) Dispatch(f *Filter) {
  205. }
  206. func (t *Mongo) InsertOne(f *Filter) (res *mongo.InsertOneResult, err *errs.Error) {
  207. f.Insertion = InsertOne
  208. t.exec(f, func(ctx context.Context, collection *mongo.Collection) {
  209. var lerr error
  210. if res, lerr = collection.InsertOne(ctx, f.Entity); lerr != nil {
  211. err = errs.FromError(lerr)
  212. }
  213. }, func(e *errs.Error) { err = e })
  214. return
  215. }
  216. func (t *Mongo) InsertMany(f *Filter) (res *mongo.InsertManyResult, err *errs.Error) {
  217. f.Insertion = InsertMany
  218. t.exec(f, func(ctx context.Context, collection *mongo.Collection) {
  219. var (
  220. lerr error
  221. entities []interface{}
  222. value = reflect.ValueOf(f.Entities)
  223. )
  224. for index := 0; index < value.Len(); index++ {
  225. entities = append(entities, value.Index(index).Interface())
  226. }
  227. if res, lerr = collection.InsertMany(ctx, entities); lerr != nil {
  228. err = errs.FromError(lerr)
  229. }
  230. }, func(e *errs.Error) { err = e })
  231. return
  232. }
  233. //Remove os elementos da colecao, selecionados pela query
  234. func (t *Mongo) RemoveOne(f *Filter) (res *mongo.DeleteResult, err *errs.Error) {
  235. f.CheckQuery = true
  236. t.exec(f, func(ctx context.Context, collection *mongo.Collection) {
  237. var lerr error
  238. if res, lerr = collection.DeleteOne(ctx, f.Query); lerr != nil {
  239. err = errs.FromError(lerr)
  240. } else if res.DeletedCount == 0 {
  241. err = errs.NotFound().Details(&errs.Detail{
  242. Message: "No entity has been deleted",
  243. })
  244. }
  245. }, func(e *errs.Error) { err = e })
  246. return
  247. }
  248. //Remove os elementos da colecao, selecionados pela query
  249. func (t *Mongo) RemoveMany(f *Filter) (res *mongo.DeleteResult, err *errs.Error) {
  250. var lerr error
  251. f.CheckQuery = true
  252. t.exec(f, func(ctx context.Context, collection *mongo.Collection) {
  253. if res, lerr = collection.DeleteMany(ctx, f.Entities); lerr != nil {
  254. err = errs.FromError(lerr)
  255. } else if res.DeletedCount == 0 {
  256. err = errs.NotFound().Details(&errs.Detail{
  257. Message: "No entity has been deleted",
  258. })
  259. }
  260. }, func(e *errs.Error) { err = e })
  261. return
  262. }
  263. func (t *Mongo) UpdateOne(f *Filter) (res *mongo.UpdateResult, err *errs.Error) {
  264. var lerr error
  265. f.Insertion = InsertOne
  266. f.CheckQuery = true
  267. t.exec(f, func(ctx context.Context, collection *mongo.Collection) {
  268. if res, lerr = collection.ReplaceOne(ctx, f.Query, f.Entity); lerr != nil {
  269. err = errs.FromError(lerr)
  270. } else if !f.IgnoreNoEntityFound && (res.ModifiedCount+res.UpsertedCount) == 0 {
  271. err = errs.NotFound().Details(&errs.Detail{
  272. Message: "No entity has been updated",
  273. })
  274. }
  275. }, func(e *errs.Error) { err = e })
  276. return
  277. }
  278. func (t *Mongo) UpdateMany(f *Filter) (res *mongo.UpdateResult, err *errs.Error) {
  279. var (
  280. lerr error
  281. entity interface{}
  282. entities []interface{}
  283. value = reflect.ValueOf(f.Entities)
  284. )
  285. f.Insertion = InsertMany
  286. f.CheckQuery = true
  287. t.exec(f, func(ctx context.Context, collection *mongo.Collection) {
  288. for index := 0; index < value.Len(); index++ {
  289. entity = value.Index(index).Interface()
  290. entities = append(entities, entity)
  291. }
  292. if res, lerr = collection.UpdateMany(ctx, f.Query, entities); lerr != nil {
  293. err = errs.FromError(lerr)
  294. } else if !f.IgnoreNoEntityFound && (res.ModifiedCount+res.UpsertedCount) == 0 {
  295. err = errs.NotFound().Details(&errs.Detail{
  296. Message: "No entity has been updated ",
  297. })
  298. }
  299. }, func(e *errs.Error) { err = e })
  300. return
  301. }
  302. func RegisterQuery(id, query string) {
  303. QueriesMap[id] = template.Must(template.New(id).Parse(query))
  304. }
  305. func ParseQuery(ctx iriscontext.Context, filter *Filter, basequery string, data map[string]interface{}) (err *errs.Error) {
  306. var (
  307. found bool
  308. templateErr error
  309. buf bytes.Buffer
  310. baseQueryTemplate *template.Template
  311. // baseQeuryDocument *bson.M
  312. // errbq *errs.Error
  313. queryDecodedString []byte
  314. userQueryString = Q(ctx, "q", "e30=") // default base64 encoded from "{}"
  315. includeInTrash, _ = strconv.ParseBool(Q(ctx, "includeInTrash", "false")) // default base64 encoded from "{}"
  316. )
  317. // defer func() {
  318. // spew.Dump(filter.Query)
  319. // }()
  320. // Faz o parse da userQueryString enviada pelo usuario que deve ser um base64
  321. if queryDecodedString, templateErr = base64.StdEncoding.DecodeString(userQueryString); templateErr != nil {
  322. err = errs.InvalidArgument().Details(&errs.Detail{
  323. Message: "Query param isn't a base64 json",
  324. })
  325. return
  326. }
  327. if baseQueryTemplate, found = QueriesMap[basequery]; !found {
  328. err = errs.Internal().Details(&errs.Detail{
  329. Message: "Invalid query input",
  330. })
  331. return
  332. }
  333. // transclude the query to base query
  334. data["_transclude_"] = string(queryDecodedString)
  335. data["_deleted_"] = includeInTrash
  336. fmt.Println(
  337. basequery,
  338. string(queryDecodedString),
  339. data,
  340. )
  341. if templateErr = baseQueryTemplate.Execute(&buf, data); templateErr != nil {
  342. err = errs.InvalidArgument().Details(&errs.Detail{
  343. Message: "Failed on interpolate data with template query",
  344. })
  345. return
  346. }
  347. x := buf.Bytes()
  348. fmt.Println("buf.Bytes()", string(x))
  349. if templateErr = bson.UnmarshalExtJSON(x, false, &filter.Query); templateErr != nil {
  350. err = errs.InvalidArgument().Details(&errs.Detail{
  351. Message: "Failed on interpolate data with template query",
  352. })
  353. return
  354. }
  355. return
  356. }
  357. func (t *Mongo) PatchOne(f *Filter) (res *mongo.UpdateResult, err *errs.Error) {
  358. f.Insertion = Patch
  359. f.CheckQuery = true
  360. // out, _ := json.Marshal()
  361. // fmt.Println(string(out))
  362. // spew.Dump(f.Patchs)
  363. t.exec(f, func(ctx context.Context, collection *mongo.Collection) {
  364. var (
  365. lerr error
  366. // client *mongo.Client
  367. )
  368. // if client, err = t.GetClient(f.DB); err != nil {
  369. // return
  370. // }
  371. // spew.Dump(f.Query)
  372. // spew.Dump(f.Patchs)
  373. // id := primitive.NewObjectID()
  374. t.client.UseSessionWithOptions(
  375. ctx,
  376. options.Session().SetDefaultReadPreference(readpref.Primary()),
  377. func(sctx mongo.SessionContext) error {
  378. defer func() {
  379. if err != nil {
  380. // fmt.Println("abort patch ", id.Hex())
  381. sctx.AbortTransaction(sctx)
  382. } else {
  383. // fmt.Println("commit patch ", id.Hex())
  384. sctx.CommitTransaction(sctx)
  385. }
  386. sctx.EndSession(sctx)
  387. }()
  388. sctx.StartTransaction(options.Transaction().
  389. SetReadConcern(readconcern.Snapshot()).
  390. SetWriteConcern(writeconcern.New(writeconcern.WMajority())))
  391. for _, p := range *f.Patchs {
  392. if f.Options == nil {
  393. f.Options = options.Update()
  394. }
  395. if res, lerr = collection.UpdateOne(ctx, f.Query, p, f.Options.(*options.UpdateOptions)); lerr != nil {
  396. err = errs.FromError(lerr)
  397. return lerr
  398. }
  399. if !f.IgnoreNoEntityFound && (res.ModifiedCount+res.UpsertedCount) == 0 {
  400. err = errs.NotFound().Details(&errs.Detail{
  401. Message: "No entity has been updated",
  402. })
  403. return fmt.Errorf("No entity has been updated")
  404. }
  405. }
  406. return nil
  407. },
  408. )
  409. }, func(e *errs.Error) { err = e })
  410. return
  411. }
  412. func (t *Mongo) PatchMany(f *Filter) (res *mongo.UpdateResult, err *errs.Error) {
  413. f.Insertion = Patch
  414. f.CheckQuery = true
  415. t.exec(f, func(ctx context.Context, collection *mongo.Collection) {
  416. var (
  417. lerr error
  418. // client *mongo.Client
  419. )
  420. // if client, err = t.GetClient(f.DB); err != nil {
  421. // return
  422. // }
  423. // o, _ := json.MarshalIndent(f.Query, "", " ")
  424. // fmt.Println("query", o)
  425. // o, _ = json.MarshalIndent(f.Patchs, "", " ")
  426. // fmt.Println("patch", o)
  427. t.client.UseSessionWithOptions(
  428. ctx,
  429. options.Session().SetDefaultReadPreference(readpref.Primary()),
  430. func(sctx mongo.SessionContext) error {
  431. defer func() {
  432. if err != nil {
  433. sctx.AbortTransaction(sctx)
  434. } else {
  435. sctx.CommitTransaction(sctx)
  436. }
  437. sctx.EndSession(sctx)
  438. }()
  439. sctx.StartTransaction(
  440. options.Transaction().
  441. SetReadConcern(readconcern.Snapshot()).
  442. SetWriteConcern(writeconcern.New(writeconcern.WMajority())),
  443. )
  444. for _, p := range *f.Patchs {
  445. if res, lerr = collection.UpdateMany(ctx, f.Query, p); lerr != nil {
  446. err = errs.FromError(lerr)
  447. return lerr
  448. }
  449. if !f.IgnoreNoEntityFound && (res.ModifiedCount+res.UpsertedCount) == 0 {
  450. err = errs.NotFound().Details(&errs.Detail{
  451. Message: "No entity has been updated",
  452. })
  453. err.CodeText = "noEntityUpdated"
  454. return fmt.Errorf("No entity has been updated")
  455. }
  456. }
  457. return nil
  458. },
  459. )
  460. }, func(e *errs.Error) { err = e })
  461. return
  462. }
  463. func (mongo *Mongo) CreateIndex(database, collectionString string, index mongo.IndexModel) *errs.Error {
  464. collection := mongo.client.Database(database).Collection(collectionString)
  465. opts := options.CreateIndexes().SetMaxTime(10 * time.Second)
  466. if _, err := collection.Indexes().CreateOne(context.Background(), index, opts); err != nil {
  467. return errs.FromError(err)
  468. }
  469. return nil
  470. }
  471. func (mongo *Mongo) FindOneRx(options *Filter) *ObservableStruct {
  472. return Observable(func(observer *Subscriber) {
  473. if res, err := mongo.FindOne(options); err != nil {
  474. observer.Err(err)
  475. } else {
  476. observer.Next(res)
  477. }
  478. })
  479. }
  480. func (t *Mongo) FindOne(f *Filter) (res *mongo.SingleResult, err *errs.Error) {
  481. f.CheckQuery = (f.QueryType != "aggregate")
  482. t.exec(f, func(ctx context.Context, collection *mongo.Collection) {
  483. var (
  484. lerr error
  485. cursor *mongo.Cursor
  486. )
  487. if f.QueryType == "aggregate" {
  488. if cursor, err = f.Aggregate(ctx, collection, nil); err != nil {
  489. return
  490. }
  491. if cursor.Next(ctx) {
  492. if lerr = cursor.Decode(f.Entity); lerr == nil {
  493. return
  494. }
  495. } else {
  496. lerr = fmt.Errorf("No document found")
  497. }
  498. } else {
  499. res = collection.FindOne(ctx, f.Query)
  500. if lerr = res.Err(); lerr == nil {
  501. if lerr = res.Decode(f.Entity); lerr == nil {
  502. return
  503. }
  504. }
  505. }
  506. err = errs.FromError(lerr)
  507. }, func(e *errs.Error) {
  508. err = e
  509. })
  510. return
  511. }
  512. func findIds(filter *Filter) (ids []primitive.ObjectID) {
  513. ids = []primitive.ObjectID{}
  514. // findIdsFilter = &Filter{}
  515. // cursor, err := executeFind(findIdsFilter)
  516. return
  517. }
  518. func (t *Mongo) FindMany(f *Filter) (cursor *mongo.Cursor, err *errs.Error) {
  519. // f.CheckQuery = true
  520. t.exec(f, func(ctx context.Context, collection *mongo.Collection) {
  521. var (
  522. lerr error
  523. elemp reflect.Value
  524. // ids = []primitive.ObjectID{}
  525. // limit = int64(f.MaxResults)
  526. // fields = f.Fields
  527. )
  528. // defer func() {
  529. // if errd := recover(); errd != nil {
  530. // // fmt.Println(errd)
  531. // // spew.Dump(Trace())
  532. // // fmt.Println(errors.WithStack(errd.(error)) )
  533. // LogError(0, fmt.Sprintf("FindMany - %v", errd))
  534. // }
  535. // }()
  536. // Carrega os ids e verifica o intervalo de paginacao da consulta.
  537. // f.Fields = &bson.M{"_id": 1}
  538. // ids = findIds(f)
  539. // Atualiza a consulta para o conjunto de ids da paginacao
  540. // f.Fields = fields
  541. // f.Query = &bson.M{"_id": bson.M{"$in": ids}}
  542. // fmt.Println("Query Type ", f.QueryType)
  543. if f.QueryType == "aggregate" {
  544. cursor, lerr = f.Aggregate(ctx, collection, nil)
  545. } else {
  546. findOptions := options.Find()
  547. findOptions.SetLimit(int64(f.MaxResults))
  548. // fmt.Printf("sort of query '%s'\n", f.Format)
  549. // spew.Dump(f.Sort)
  550. // spew.Dump(f.Fields)
  551. // spew.Dump(f.Query)
  552. if f.Sort != nil {
  553. findOptions.SetSort(f.Sort)
  554. }
  555. if f.Fields != nil {
  556. findOptions.SetProjection(f.Fields)
  557. }
  558. cursor, lerr = collection.Find(ctx, f.Query, findOptions)
  559. }
  560. if lerr == nil {
  561. defer cursor.Close(ctx)
  562. // spew.Dump(cursor)
  563. if f.Entities == nil {
  564. lerr = fmt.Errorf("Entities can't be nil")
  565. goto FindManyError
  566. }
  567. entitiesValue := reflect.ValueOf(f.Entities)
  568. if entitiesValue.Kind() != reflect.Ptr || entitiesValue.Elem().Kind() != reflect.Slice {
  569. lerr = fmt.Errorf("Entities argument must be a slice address")
  570. goto FindManyError
  571. }
  572. slicev := entitiesValue.Elem()
  573. slicev = slicev.Slice(0, slicev.Cap())
  574. typ := slicev.Type().Elem()
  575. for cursor.Next(ctx) {
  576. elemp = reflect.New(typ)
  577. // fmt.Println("aqui")
  578. if lerr = cursor.Decode(elemp.Interface()); lerr != nil {
  579. // spew.Dump(elemp)
  580. goto FindManyError
  581. }
  582. slicev = reflect.Append(slicev, elemp.Elem())
  583. }
  584. // spew.Dump(slicev)
  585. entitiesValue.Elem().Set(slicev)
  586. return
  587. }
  588. FindManyError:
  589. err = errs.FromError(lerr)
  590. }, func(e *errs.Error) { err = e })
  591. return
  592. }
  593. func (models *Mongo) Exists(options *Filter) (exists bool, err *errs.Error) {
  594. options.Fields = &bson.M{"_id": 1}
  595. if _, err = models.FindOne(options); err != nil {
  596. return
  597. }
  598. exists = true
  599. return
  600. }
  601. func (driver *Mongo) GetContext(options *Filter) (context.Context, *mongo.Collection) {
  602. var ctx context.Context
  603. if options.SessionContext != nil {
  604. ctx = options.SessionContext
  605. } else {
  606. ctx, _ = context.WithTimeout(context.Background(), 40*time.Second)
  607. }
  608. collection := driver.client.Database(options.DB).Collection(options.Collection)
  609. return ctx, collection
  610. }
  611. func (t *Mongo) exec(f *Filter, execAction execfn, errorAction func(*errs.Error)) {
  612. var (
  613. err *errs.Error
  614. errl error
  615. ctx context.Context
  616. // client *mongo.Client
  617. )
  618. defer func() {
  619. if err == nil {
  620. if errl == nil {
  621. return
  622. }
  623. err = errs.FromError(errl)
  624. }
  625. // spew.Dump(err)
  626. errorAction(err)
  627. }()
  628. if err = f.Check(); err != nil {
  629. return
  630. }
  631. switch f.Insertion {
  632. case InsertOne:
  633. if f.Entity == nil {
  634. errl = fmt.Errorf("Entity can't be nil")
  635. return
  636. }
  637. case InsertMany:
  638. if f.Entities == nil {
  639. errl = fmt.Errorf("Entities can't be nil")
  640. return
  641. }
  642. case Patch:
  643. if f.Patchs == nil {
  644. errl = fmt.Errorf("Patchs can't be nil")
  645. return
  646. }
  647. }
  648. // fmt.Println("passei do exec")
  649. if f.SessionContext != nil {
  650. ctx = f.SessionContext
  651. } else {
  652. ctx, _ = context.WithTimeout(context.Background(), time.Minute)
  653. }
  654. collection := t.client.Database(f.DB).Collection(f.Collection)
  655. execAction(ctx, collection)
  656. return
  657. }
  658. func DeletedPatch() *bson.A {
  659. return &bson.A{
  660. bson.M{
  661. "$set": bson.M{
  662. "deleted": true,
  663. "deletedIn": time.Now().Unix(),
  664. },
  665. },
  666. }
  667. }
  668. // func mergeQueries(filter *Filter) *bson.M {
  669. // if baseQeuryDocument != nil {
  670. // if filter.Query == nil {
  671. // filter.Query = baseQeuryDocument
  672. // } else {
  673. // filter.Query = &bson.M{
  674. // "$and": bson.A{baseQeuryDocument, filter.Query},
  675. // }
  676. // }
  677. // } else if filter.Query == nil {
  678. // filter.Query = &bson.M{}
  679. // }
  680. // }
  681. // func yieldIndexModel() mongo.IndexModel {
  682. // keys := bsonx.Doc{{Key: *key, Value: bsonx.Int32(int32(*value))}}
  683. // index := mongo.IndexModel{}
  684. // index.Keys = keys
  685. // if *unique {
  686. // index.Options = bsonx.Doc{{Key: "unique", Value: bsonx.Boolean(true)}}
  687. // }
  688. // return index
  689. // }
  690. // func (t *Mongo) GetClient() (*mgo.Session, *errs.Error) {
  691. // func (t *Mongo) GetClient(id string) (*mongo.Client, *errs.Error) {
  692. // var (
  693. // client *mongo.Client
  694. // found bool
  695. // )
  696. // if id == "" {
  697. // panic("Client id not defined!")
  698. // }
  699. // if client, found = t.Clients[id]; !found {
  700. // return nil, FullError(ERR_SERVICE_UNAVAILABLE, &errs.Detail{
  701. // Message: fmt.Sprintf("Client %s not exists!", id),
  702. // })
  703. // }
  704. // return client, nil
  705. // }
  706. // func errorcheck(err error) *errs.Error {
  707. // if err != nil {
  708. // return FullError(ERR_GENERAL, &errs.Detail{
  709. // Message: err.Error(),
  710. // })
  711. // }
  712. // return nil
  713. // }
  714. // func Paginate(collection *mongo.Collection, startValue primitive.ObjectID, nPerPage int64) ([]bson.D, *bson.Value, error) {
  715. // // Query range filter using the default indexed _id field.
  716. // filter := bson.VC.DocumentFromElements(
  717. // bson.EC.SubDocumentFromElements(
  718. // "_id",
  719. // bson.EC.ObjectID("$gt", startValue),
  720. // ),
  721. // )
  722. // var opts []findopt.Find
  723. // opts = append(opts, findopt.Sort(bson.NewDocument(bson.EC.Int32("_id", -1))))
  724. // opts = append(opts, findopt.Limit(nPerPage))
  725. // cursor, _ := collection.Find(context.Background(), filter, opts...)
  726. // var lastValue *bson.Value
  727. // var results []bson.Document
  728. // for cursor.Next(context.Background()) {
  729. // elem := bson.NewDocument()
  730. // err := cursor.Decode(elem)
  731. // if err != nil {
  732. // return results, lastValue, err
  733. // }
  734. // results = append(results, *elem)
  735. // lastValue = elem.Lookup("_id")
  736. // }
  737. // return results, lastValue, nil
  738. // }
  739. // func (t *Mongo) Patch(f *Filter) *errs.Error {
  740. // var (
  741. // entityinterface EntityInterface
  742. // col *mongo.Collection
  743. // entity interface{}
  744. // ok bool
  745. // session *mgo.Session
  746. // err error
  747. // x *bson.M
  748. // )
  749. // if session, err = t.GetClient(f.DB); err == nil {
  750. // if !f.Id.IsZero() {
  751. // f.Query = &bson.M{"_id": f.Id}
  752. // } else if f.Query == nil {
  753. // err = fmt.Errorf("Query not defined!")
  754. // goto ErrorPatch
  755. // }
  756. // defer session.Close()
  757. // if entityinterface, ok = f.Entity.(EntityInterface); ok {
  758. // entity = entityinterface.Update()
  759. // x = entity.(*bson.M)
  760. // // delete(*x, "$set")
  761. // } else {
  762. // entity = bson.M{"$set": f.Entity}
  763. // }
  764. // col = session.DB(f.DB).C(f.Collection)
  765. // // entity["$set"]
  766. // spew.Dump(entity)
  767. // _, err = col.Upsert(f.Query, entity)
  768. // }
  769. // ErrorPatch:
  770. // if err != nil {
  771. // return Error(ERR_PERSIST, err.Error())
  772. // }
  773. // return nil
  774. // }
  775. // func (t *Mongo) Upsert(f *Filter) *errs.Error {
  776. // var (
  777. // entityinterface EntityInterface
  778. // col *mongo.Collection
  779. // entity interface{}
  780. // ok bool
  781. // )
  782. // session, err := t.GetClient(f.DB)
  783. // if err == nil {
  784. // if !f.Id.IsZero() {
  785. // f.Query = &bson.M{"_id": f.Id}
  786. // } else if f.Query == nil {
  787. // err = fmt.Errorf("Query not defined!")
  788. // goto ErrorUp
  789. // }
  790. // defer session.Close()
  791. // col = session.DB(f.DB).C(f.Collection)
  792. // // update = bson.M{"$set": f.Entity}
  793. // // if data, ok = f.Entity.Push(); ok {
  794. // // update["$push"] = data
  795. // // }
  796. // // if data, ok = f.Entity.Pull(); ok {
  797. // // update["$pull"] = data
  798. // // }
  799. // // spew.Dump(f.Entity)
  800. // if entityinterface, ok = f.Entity.(EntityInterface); ok {
  801. // // fmt.Println("Implement interface")
  802. // entity = entityinterface.Update()
  803. // } else {
  804. // entity = f.Entity
  805. // }
  806. // // spew.Dump(entity)
  807. // // _, err = col.Upsert(f.Query, entity)
  808. // err = col.Update(f.Query, entity)
  809. // }
  810. // ErrorUp:
  811. // if err != nil {
  812. // return Error(ERR_PERSIST, err.Error())
  813. // }
  814. // return nil
  815. // }
  816. //-----------------------------------------------------------------------
  817. // func (t *Mongo) Find(f *Filter, one bool) (*errs.Error, int) {
  818. // var cursor string
  819. // pageToken := &f.PageToken
  820. // session, err := t.GetClient(f.DB)
  821. // if err == nil {
  822. // defer session.Close()
  823. // if f.Query == nil {
  824. // if one {
  825. // if !f.Id.IsZero() {
  826. // f.Query = &bson.M{"_id": f.Id}
  827. // } else {
  828. // return Error(ERR_INVALID_PARAM_VALUE, "Param id not valid."), 0
  829. // }
  830. // } else if f.Query == nil {
  831. // f.Query = &bson.M{}
  832. // }
  833. // }
  834. // query := minquery.New(session.DB(f.DB), f.Collection, f.Query)
  835. // // Se tem um token de paginacao
  836. // hasToken := pageToken.HasToken()
  837. // if hasToken {
  838. // fmt.Println("consultando com token", pageToken.Cursor)
  839. // query = query.Cursor(pageToken.Cursor)
  840. // }
  841. // // cursorFields := []string{"_id"}
  842. // cursorFields := []string{}
  843. // if len(f.Sort) > 0 {
  844. // query.Sort(f.Sort...)
  845. // for _, key := range f.Sort {
  846. // if !strings.Contains(key, ".") {
  847. // cursorFields = append(cursorFields, key)
  848. // }
  849. // }
  850. // } else {
  851. // cursorFields = append(cursorFields, "_id")
  852. // }
  853. // // Seleciona os campos se forem especificados
  854. // if f.Fields != nil {
  855. // query.Select(f.Fields)
  856. // }
  857. // // Determina o numero de itens a ser retornado
  858. // if f.MaxResults > 0 {
  859. // query.Limit(f.MaxResults)
  860. // }
  861. // if one {
  862. // err = query.One(f.Entity)
  863. // pageToken.Count = 1 // Filter one
  864. // } else {
  865. // // spew.Dump(f.Entity, cursorFields)
  866. // if cursor, err = query.All(f.Entity, cursorFields...); err != nil {
  867. // goto ErroFind
  868. // }
  869. // // Numero total de documentos
  870. // // Se tem um token de paginacao o valor total esta no token
  871. // // Caso contrario consulta no banco
  872. // if !hasToken {
  873. // c := session.DB(f.DB).C(f.Collection)
  874. // if pageToken.Count, err = c.Find(f.Query).Select(&bson.M{"_id": 1}).Count(); err != nil {
  875. // goto ErroFind
  876. // }
  877. // }
  878. // // if ()
  879. // fmt.Println("Cursor return", cursor, "-")
  880. // pageToken.NewCursor = cursor
  881. // }
  882. // }
  883. // ErroFind:
  884. // if err != nil {
  885. // return Error(ERR_PERSIST, err.Error()), 0
  886. // }
  887. // return nil, pageToken.Count
  888. // }
  889. // func (t *Mongo) FindOne(f *Filter) (*errs.Error, int) {
  890. // return t.Find(f, true)
  891. // }
  892. // func (t *Mongo) FindAll(f *Filter) (*errs.Error, int) {
  893. // return t.Find(f, false)
  894. // }
  895. // func (t *Mongo) Count(f *Filter) (*errs.Error, int) {
  896. // session, err := t.GetClient(f.DB)
  897. // if err == nil {
  898. // defer session.Close()
  899. // if f.Query == nil {
  900. // f.Query = &bson.M{}
  901. // }
  902. // query := session.DB(f.DB).C(f.Collection).Find(f.Query)
  903. // // Seleciona os campos se forem especificados
  904. // f.PageToken.Count, err = query.Select(&bson.M{"_id": 1}).Count()
  905. // }
  906. // if err != nil {
  907. // return Error(ERR_PERSIST, err.Error()), 0
  908. // }
  909. // return nil, f.PageToken.Count
  910. // }
  911. // func (t *Mongo) Update(f *Filter) *errs.Error {
  912. // var (
  913. // entityinterface EntityInterface
  914. // entity interface{}
  915. // )
  916. // one := false
  917. // ok := false
  918. // session, err := t.GetClient(f.DB)
  919. // if err == nil {
  920. // defer session.Close()
  921. // if !f.Id.IsZero() {
  922. // one = true
  923. // f.Query = &bson.M{"_id": f.Id}
  924. // } else if f.Query == nil {
  925. // err = fmt.Errorf("Query not defined!")
  926. // }
  927. // if entityinterface, ok = f.Entity.(EntityInterface); ok {
  928. // entity = entityinterface.Update()
  929. // } else {
  930. // entity = f.Entity
  931. // }
  932. // col := session.DB(f.DB).C(f.Collection)
  933. // if one {
  934. // err = col.Update(f.Query, entity)
  935. // } else {
  936. // _, err = col.UpdateAll(f.Query, entity)
  937. // }
  938. // }
  939. // if err != nil {
  940. // return Error(ERR_PERSIST, err.Error())
  941. // }
  942. // return nil
  943. // }
  944. //-----------------------------------------------------------------------
  945. // func (t *Mongo) Aggregation(f *Filter, q []bson.M, one bool) *errs.Error {
  946. // session, err := t.GetClient(f.DB)
  947. // if err == nil {
  948. // defer session.Close()
  949. // pipe := session.DB(f.DB).C(f.Collection).Pipe(q)
  950. // if one {
  951. // err = pipe.One(&f.Entity)
  952. // } else {
  953. // err = pipe.All(&f.Entity)
  954. // }
  955. // }
  956. // if err != nil {
  957. // return Error(ERR_PERSIST, err.Error())
  958. // }
  959. // return nil
  960. // }
  961. // all := true
  962. // session, err := t.GetClient(f.DB)
  963. // if err == nil {
  964. // defer session.Close()
  965. // if !f.Id.IsZero() {
  966. // all = false
  967. // f.Query = &bson.M{"_id": f.Id}
  968. // } else if f.Query == nil {
  969. // err = fmt.Errorf("Query not defined!")
  970. // }
  971. // C := session.DB(f.DB).C(f.Collection)
  972. // if all {
  973. // _, err = C.RemoveAll(f.Query)
  974. // } else {
  975. // err = C.Remove(f.Query)
  976. // }
  977. // }
  978. // if err != nil {
  979. // return Error(ERR_PERSIST, err.Error())
  980. // }
  981. // return nil
  982. // VERIFICAR A NECESSIDADE E CORRIGIR O ERRO
  983. // func (t *Mongo) GetArrayById(f *Filter, ids []primitive.ObjectID) error {
  984. // session, err := t.GetClient(f.DB)
  985. // if err != nil {
  986. // return err
  987. // }
  988. // defer session.Close()
  989. // q := bson.M{"_id": bson.M{"$in": ids}}
  990. // err = session.DB(f.DB).C(f.Collection).Find(q).One(f.Entity)
  991. // return err
  992. // }
  993. // func (t *Mongo) GetEmbedFromArray(f *Filter, embed string, id primitive.ObjectID, sid primitive.ObjectID) (errs error) {
  994. // session, err := t.GetClient(f.DB)
  995. // if err != nil {
  996. // return err
  997. // }
  998. // defer session.Close()
  999. // field := "$" + embed
  1000. // match := bson.M{"_id": id}
  1001. // match[embed] = bson.M{"$exists": true}
  1002. // aggregations := []bson.M{
  1003. // bson.M{"$unwind": field},
  1004. // bson.M{"$match": match},
  1005. // bson.M{"$replaceRoot": bson.M{"newRoot": field}},
  1006. // bson.M{"$match": bson.M{"_id": sid}},
  1007. // }
  1008. // C := session.DB(f.DB).C(f.Collection)
  1009. // return C.Pipe(aggregations).One(&f.Entity)
  1010. // }
  1011. // func (t *Mongo) UpdateEmbedFromArray(f *Filter, embed string, id primitive.ObjectID, sid primitive.ObjectID) error {
  1012. // session, err := t.GetClient(f.DB)
  1013. // if err != nil {
  1014. // return err
  1015. // }
  1016. // defer session.Close()
  1017. // col := session.DB(f.DB).C(f.Collection)
  1018. // //Define o elemento que sera atualizado
  1019. // element := bson.M{}
  1020. // element[embed+".$"] = &f.Entity
  1021. // //Define o seletor do elemento que sera atualizado
  1022. // selector := bson.M{"_id": id}
  1023. // selector[embed+"._id"] = sid
  1024. // return col.Update(selector, bson.M{"$set": element})
  1025. // }
  1026. // func (t *Mongo) AddEmbedFromArray(f *Filter, embed string, id primitive.ObjectID) error {
  1027. // session, errs := t.GetClient(f.DB)
  1028. // if errs != nil {
  1029. // return errs
  1030. // }
  1031. // defer session.Close()
  1032. // col := session.DB(f.DB).C(f.Collection)
  1033. // //Define o elemento que sera atualizado
  1034. // element := bson.M{}
  1035. // element[embed] = &f.Entity
  1036. // //Define o seletor do elemento que sera atualizado
  1037. // selector := bson.M{"_id": id}
  1038. // return col.Update(selector, bson.M{"$push": element})
  1039. // }
  1040. // 0000000000000000000000000000000000000000000000000000000000000000
  1041. // func (t *Mongo) NewTransaction(dbname string) (*Transaction, error) {
  1042. // session, e := t.GetClient(dbname)
  1043. // if e != nil {
  1044. // return nil, e
  1045. // }
  1046. // collection := session.DB(dbname).C("txns")
  1047. // return &Transaction{R: txn.NewRunner(collection)}, nil
  1048. // }
  1049. // Transactions
  1050. // type Transaction struct {
  1051. // R *txn.Runner
  1052. // Ops []txn.Op
  1053. // }
  1054. // func (t *Transaction) Insert(collection string, id primitive.ObjectID, entity interface{}) *Transaction {
  1055. // t.Ops = append(t.Ops, txn.Op{
  1056. // C: collection,
  1057. // Id: id,
  1058. // Insert: entity,
  1059. // })
  1060. // return t
  1061. // }
  1062. // func (t *Transaction) Update(collection string, id primitive.ObjectID, assert *bson.M, entity interface{}) *Transaction {
  1063. // op := txn.Op{
  1064. // C: collection,
  1065. // Id: id,
  1066. // Update: entity,
  1067. // }
  1068. // if assert != nil {
  1069. // op.Assert = assert
  1070. // }
  1071. // t.Ops = append(t.Ops, op)
  1072. // return t
  1073. // }
  1074. // func (t *Transaction) Remove(collection string, id primitive.ObjectID) *Transaction {
  1075. // t.Ops = append(t.Ops, txn.Op{
  1076. // C: collection,
  1077. // Id: id,
  1078. // Remove: true,
  1079. // })
  1080. // return t
  1081. // }
  1082. // func (t *Transaction) Run() error {
  1083. // return t.R.Run(t.Ops, primitive.NewObjectID(), nil)
  1084. // }
  1085. // func (t *Mongo) Find(f *Filter, one bool) (*errs.Error, int) {
  1086. // session, err := t.GetClient()
  1087. // if err == nil {
  1088. // defer session.Close()
  1089. // if !f.Id.IsZero() {
  1090. // f.Query = &bson.M{"_id": f.Id}
  1091. // } else if f.Query == nil {
  1092. // f.Query = &bson.M{}
  1093. // }
  1094. // pageToken := &f.PageToken
  1095. // aggregations := []*bson.M{}
  1096. // // Se tem um token de paginacao
  1097. // hasToken := pageToken.HasToken()
  1098. // if hasToken {
  1099. // fmt.Println("consultando com token", pageToken.CurrentID)
  1100. // // {$or:
  1101. // // [
  1102. // // {$and :
  1103. // // [
  1104. // // {<sort key>:{$gte: <last sort key value of previous page>}},
  1105. // // {"_id" : {$gt : <last result id of previous page>}}
  1106. // // ]
  1107. // // },
  1108. // // ou
  1109. // // {<sort key> :{$gt: <last sort key value>}}
  1110. // // ]
  1111. // // }.
  1112. // // f.Query = &bson.M{"$and": []bson.M{
  1113. // // *f.Query,
  1114. // // bson.M{"_id": bson.M{"$gt": f.NextPageToken}},
  1115. // // }}
  1116. // f.Query = &bson.M{"_id": bson.M{
  1117. // // "$gt": primitive.ObjectIDHex(pageToken.CurrentID),
  1118. // "$gt": pageToken.CurrentID,
  1119. // }}
  1120. // } else {
  1121. // }
  1122. // // Adiciona o primeiro estagio da agregacao
  1123. // aggregations = append(aggregations, &bson.M{"$match": f.Query})
  1124. // if len(f.Sort) > 0 {
  1125. // f.Sort = append(f.Sort, "_id")
  1126. // aggregations = append(aggregations, MgoSortBson(f.Sort))
  1127. // // query.Sort(f.Sort...)
  1128. // }
  1129. // // aggregations = append(aggregations, &bson.M{
  1130. // // "$addFields": bson.M{"position":},
  1131. // // })
  1132. // // Seleciona os campos se forem especificados
  1133. // if f.Fields != nil {
  1134. // // aggregations = append(aggregations, bson.M{"$limit": f.MaxResults})
  1135. // }
  1136. // // countQuery := session.DB(f.DB).C(f.Collection).Pipe(aggregations)
  1137. // // Determina o numero de itens a ser retornado
  1138. // if f.MaxResults > 0 {
  1139. // aggregations = append(aggregations, &bson.M{"$limit": f.MaxResults})
  1140. // }
  1141. // spew.Dump(aggregations)
  1142. // // query := session.DB(f.DB).C(f.Collection).Find(f.Query)
  1143. // collection := session.DB(f.DB).C(f.Collection)
  1144. // query := collection.Pipe(aggregations)
  1145. // if one {
  1146. // err = query.One(f.Entity)
  1147. // f.Count = 1 // Filter one
  1148. // } else {
  1149. // err = query.All(f.Entity)
  1150. // // Numero total de documentos
  1151. // // Se tem um token de paginacao o valor total esta no token
  1152. // // Caso contrario consulta no banco
  1153. // if hasToken {
  1154. // f.Count = pageToken.Count
  1155. // } else {
  1156. // f.Count, _ = collection.Find(f.Query).Select(&bson.M{"_id": 1}).Count()
  1157. // }
  1158. // }
  1159. // }
  1160. // if err != nil {
  1161. // return Error(ERR_PERSIST, err.Error()), 0
  1162. // }
  1163. // return nil, f.Count
  1164. // }
  1165. // v := reflect.ValueOf(f.Entity)
  1166. // fmt.Println("UpdateCursorResponse")
  1167. // // spew.Dump(f.PageToken)
  1168. // // fmt.Println(v.Kind())
  1169. // if v.Kind() == reflect.Ptr {
  1170. // // Atualiza v para o elemento apontado
  1171. // v = v.Elem()
  1172. // if v.Kind() == reflect.Slice || v.Kind() == reflect.Array {
  1173. // // Acessa o atributo ID da ultima entidade do array
  1174. // field := v.Index(v.Len() - 1).Elem().FieldByName("ID")
  1175. // // Converte o atributo ID para objectId
  1176. // last := field.Interface().(primitive.ObjectID)
  1177. // // Cria a consulta que verifica se existe outros registros alem do ultimo
  1178. // filter := &Filter{
  1179. // Collection: f.Collection,
  1180. // Query: &bson.M{"_id": bson.M{
  1181. // "$lt": last,
  1182. // }},
  1183. // }
  1184. // // Se existirem elementos adiciona o nextTOKEN
  1185. // if _, count := models.Count(filter); count > 0 {
  1186. // // atualiza os valores do token
  1187. // f.PageToken.StartID = last.Hex()
  1188. // f.PageToken.Count = f.Count
  1189. // resp.NextPageToken = f.PageToken.Encode()
  1190. // }
  1191. // }
  1192. // }
  1193. // func NewMongo() (*Mongo, error) {
  1194. // // session, err := mgo.Dial(addrs)
  1195. // // session, err := mgo.Dial("mongodb://localhost:27017")
  1196. // session, err := mgo.Dial("mongodb://localhost:27017")
  1197. // if err != nil {
  1198. // return nil, err
  1199. // }
  1200. // session.SetMode(mgo.Monotonic, true)
  1201. // // "addrs": "mongodb://localhost:27017",
  1202. // // "user": "guest",
  1203. // // "password": "welcome",
  1204. // // "database": "financeiro"
  1205. // m := &Mongo{
  1206. // Session: session,
  1207. // DataBase: "accounts",
  1208. // Addrs: ,
  1209. // // Config: cfg,
  1210. // }
  1211. // return m, err
  1212. // }