mongo.go 37 KB

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