mongo.go 37 KB

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