mongo.go 36 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565
  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. event := debug.Event(eventType)
  638. event.Data = iris.Map{}
  639. return event
  640. }
  641. func (models *Mongo) Exists(options *Filter) (exists bool, err *errs.Error) {
  642. defer func() {
  643. event := createDebugEvent(options, "models.exists")
  644. event.Data = iris.Map{"response": exists}
  645. event.Error = err
  646. }()
  647. options.Fields = &bson.M{"_id": 1}
  648. if _, err = models.FindOne(options); err != nil {
  649. return
  650. }
  651. exists = true
  652. return
  653. }
  654. func (driver *Mongo) GetContext(options *Filter) (context.Context, *mongo.Collection) {
  655. var ctx context.Context
  656. if options.SessionContext != nil {
  657. ctx = options.SessionContext
  658. } else {
  659. ctx, _ = context.WithTimeout(context.Background(), 40*time.Second)
  660. }
  661. collection := driver.client.Database(options.DB).Collection(options.Collection)
  662. return ctx, collection
  663. }
  664. func (t *Mongo) exec(f *Filter, execAction execfn, errorAction func(*errs.Error)) {
  665. var (
  666. err *errs.Error
  667. errl error
  668. ctx context.Context
  669. // client *mongo.Client
  670. )
  671. defer func() {
  672. if err == nil {
  673. if errl == nil {
  674. return
  675. }
  676. err = errs.FromError(errl)
  677. }
  678. // spew.Dump(err)
  679. errorAction(err)
  680. }()
  681. if err = f.Check(); err != nil {
  682. return
  683. }
  684. switch f.Insertion {
  685. case InsertOne:
  686. if f.Entity == nil {
  687. errl = fmt.Errorf("Entity can't be nil")
  688. return
  689. }
  690. case InsertMany:
  691. if f.Entities == nil {
  692. errl = fmt.Errorf("Entities can't be nil")
  693. return
  694. }
  695. case Patch:
  696. if f.Patchs == nil {
  697. errl = fmt.Errorf("Patchs can't be nil")
  698. return
  699. }
  700. }
  701. // fmt.Println("passei do exec")
  702. if f.SessionContext != nil {
  703. ctx = f.SessionContext
  704. } else {
  705. ctx, _ = context.WithTimeout(context.Background(), time.Minute)
  706. }
  707. collection := t.client.Database(f.DB).Collection(f.Collection)
  708. execAction(ctx, collection)
  709. return
  710. }
  711. func DeletedPatch() *bson.A {
  712. return &bson.A{
  713. bson.M{
  714. "$set": bson.M{
  715. "deleted": true,
  716. "deletedIn": time.Now().Unix(),
  717. },
  718. },
  719. }
  720. }
  721. // func mergeQueries(filter *Filter) *bson.M {
  722. // if baseQeuryDocument != nil {
  723. // if filter.Query == nil {
  724. // filter.Query = baseQeuryDocument
  725. // } else {
  726. // filter.Query = &bson.M{
  727. // "$and": bson.A{baseQeuryDocument, filter.Query},
  728. // }
  729. // }
  730. // } else if filter.Query == nil {
  731. // filter.Query = &bson.M{}
  732. // }
  733. // }
  734. // func yieldIndexModel() mongo.IndexModel {
  735. // keys := bsonx.Doc{{Key: *key, Value: bsonx.Int32(int32(*value))}}
  736. // index := mongo.IndexModel{}
  737. // index.Keys = keys
  738. // if *unique {
  739. // index.Options = bsonx.Doc{{Key: "unique", Value: bsonx.Boolean(true)}}
  740. // }
  741. // return index
  742. // }
  743. // func (t *Mongo) GetClient() (*mgo.Session, *errs.Error) {
  744. // func (t *Mongo) GetClient(id string) (*mongo.Client, *errs.Error) {
  745. // var (
  746. // client *mongo.Client
  747. // found bool
  748. // )
  749. // if id == "" {
  750. // panic("Client id not defined!")
  751. // }
  752. // if client, found = t.Clients[id]; !found {
  753. // return nil, FullError(ERR_SERVICE_UNAVAILABLE, &errs.Detail{
  754. // Message: fmt.Sprintf("Client %s not exists!", id),
  755. // })
  756. // }
  757. // return client, nil
  758. // }
  759. // func errorcheck(err error) *errs.Error {
  760. // if err != nil {
  761. // return FullError(ERR_GENERAL, &errs.Detail{
  762. // Message: err.Error(),
  763. // })
  764. // }
  765. // return nil
  766. // }
  767. // func Paginate(collection *mongo.Collection, startValue primitive.ObjectID, nPerPage int64) ([]bson.D, *bson.Value, error) {
  768. // // Query range filter using the default indexed _id field.
  769. // filter := bson.VC.DocumentFromElements(
  770. // bson.EC.SubDocumentFromElements(
  771. // "_id",
  772. // bson.EC.ObjectID("$gt", startValue),
  773. // ),
  774. // )
  775. // var opts []findopt.Find
  776. // opts = append(opts, findopt.Sort(bson.NewDocument(bson.EC.Int32("_id", -1))))
  777. // opts = append(opts, findopt.Limit(nPerPage))
  778. // cursor, _ := collection.Find(context.Background(), filter, opts...)
  779. // var lastValue *bson.Value
  780. // var results []bson.Document
  781. // for cursor.Next(context.Background()) {
  782. // elem := bson.NewDocument()
  783. // err := cursor.Decode(elem)
  784. // if err != nil {
  785. // return results, lastValue, err
  786. // }
  787. // results = append(results, *elem)
  788. // lastValue = elem.Lookup("_id")
  789. // }
  790. // return results, lastValue, nil
  791. // }
  792. // func (t *Mongo) Patch(f *Filter) *errs.Error {
  793. // var (
  794. // entityinterface EntityInterface
  795. // col *mongo.Collection
  796. // entity interface{}
  797. // ok bool
  798. // session *mgo.Session
  799. // err error
  800. // x *bson.M
  801. // )
  802. // if session, err = t.GetClient(f.DB); err == nil {
  803. // if !f.Id.IsZero() {
  804. // f.Query = &bson.M{"_id": f.Id}
  805. // } else if f.Query == nil {
  806. // err = fmt.Errorf("Query not defined!")
  807. // goto ErrorPatch
  808. // }
  809. // defer session.Close()
  810. // if entityinterface, ok = f.Entity.(EntityInterface); ok {
  811. // entity = entityinterface.Update()
  812. // x = entity.(*bson.M)
  813. // // delete(*x, "$set")
  814. // } else {
  815. // entity = bson.M{"$set": f.Entity}
  816. // }
  817. // col = session.DB(f.DB).C(f.Collection)
  818. // // entity["$set"]
  819. // spew.Dump(entity)
  820. // _, err = col.Upsert(f.Query, entity)
  821. // }
  822. // ErrorPatch:
  823. // if err != nil {
  824. // return Error(ERR_PERSIST, err.Error())
  825. // }
  826. // return nil
  827. // }
  828. // func (t *Mongo) Upsert(f *Filter) *errs.Error {
  829. // var (
  830. // entityinterface EntityInterface
  831. // col *mongo.Collection
  832. // entity interface{}
  833. // ok bool
  834. // )
  835. // session, err := t.GetClient(f.DB)
  836. // if err == nil {
  837. // if !f.Id.IsZero() {
  838. // f.Query = &bson.M{"_id": f.Id}
  839. // } else if f.Query == nil {
  840. // err = fmt.Errorf("Query not defined!")
  841. // goto ErrorUp
  842. // }
  843. // defer session.Close()
  844. // col = session.DB(f.DB).C(f.Collection)
  845. // // update = bson.M{"$set": f.Entity}
  846. // // if data, ok = f.Entity.Push(); ok {
  847. // // update["$push"] = data
  848. // // }
  849. // // if data, ok = f.Entity.Pull(); ok {
  850. // // update["$pull"] = data
  851. // // }
  852. // // spew.Dump(f.Entity)
  853. // if entityinterface, ok = f.Entity.(EntityInterface); ok {
  854. // // fmt.Println("Implement interface")
  855. // entity = entityinterface.Update()
  856. // } else {
  857. // entity = f.Entity
  858. // }
  859. // // spew.Dump(entity)
  860. // // _, err = col.Upsert(f.Query, entity)
  861. // err = col.Update(f.Query, entity)
  862. // }
  863. // ErrorUp:
  864. // if err != nil {
  865. // return Error(ERR_PERSIST, err.Error())
  866. // }
  867. // return nil
  868. // }
  869. //-----------------------------------------------------------------------
  870. // func (t *Mongo) Find(f *Filter, one bool) (*errs.Error, int) {
  871. // var cursor string
  872. // pageToken := &f.PageToken
  873. // session, err := t.GetClient(f.DB)
  874. // if err == nil {
  875. // defer session.Close()
  876. // if f.Query == nil {
  877. // if one {
  878. // if !f.Id.IsZero() {
  879. // f.Query = &bson.M{"_id": f.Id}
  880. // } else {
  881. // return Error(ERR_INVALID_PARAM_VALUE, "Param id not valid."), 0
  882. // }
  883. // } else if f.Query == nil {
  884. // f.Query = &bson.M{}
  885. // }
  886. // }
  887. // query := minquery.New(session.DB(f.DB), f.Collection, f.Query)
  888. // // Se tem um token de paginacao
  889. // hasToken := pageToken.HasToken()
  890. // if hasToken {
  891. // fmt.Println("consultando com token", pageToken.Cursor)
  892. // query = query.Cursor(pageToken.Cursor)
  893. // }
  894. // // cursorFields := []string{"_id"}
  895. // cursorFields := []string{}
  896. // if len(f.Sort) > 0 {
  897. // query.Sort(f.Sort...)
  898. // for _, key := range f.Sort {
  899. // if !strings.Contains(key, ".") {
  900. // cursorFields = append(cursorFields, key)
  901. // }
  902. // }
  903. // } else {
  904. // cursorFields = append(cursorFields, "_id")
  905. // }
  906. // // Seleciona os campos se forem especificados
  907. // if f.Fields != nil {
  908. // query.Select(f.Fields)
  909. // }
  910. // // Determina o numero de itens a ser retornado
  911. // if f.MaxResults > 0 {
  912. // query.Limit(f.MaxResults)
  913. // }
  914. // if one {
  915. // err = query.One(f.Entity)
  916. // pageToken.Count = 1 // Filter one
  917. // } else {
  918. // // spew.Dump(f.Entity, cursorFields)
  919. // if cursor, err = query.All(f.Entity, cursorFields...); err != nil {
  920. // goto ErroFind
  921. // }
  922. // // Numero total de documentos
  923. // // Se tem um token de paginacao o valor total esta no token
  924. // // Caso contrario consulta no banco
  925. // if !hasToken {
  926. // c := session.DB(f.DB).C(f.Collection)
  927. // if pageToken.Count, err = c.Find(f.Query).Select(&bson.M{"_id": 1}).Count(); err != nil {
  928. // goto ErroFind
  929. // }
  930. // }
  931. // // if ()
  932. // fmt.Println("Cursor return", cursor, "-")
  933. // pageToken.NewCursor = cursor
  934. // }
  935. // }
  936. // ErroFind:
  937. // if err != nil {
  938. // return Error(ERR_PERSIST, err.Error()), 0
  939. // }
  940. // return nil, pageToken.Count
  941. // }
  942. // func (t *Mongo) FindOne(f *Filter) (*errs.Error, int) {
  943. // return t.Find(f, true)
  944. // }
  945. // func (t *Mongo) FindAll(f *Filter) (*errs.Error, int) {
  946. // return t.Find(f, false)
  947. // }
  948. // func (t *Mongo) Count(f *Filter) (*errs.Error, int) {
  949. // session, err := t.GetClient(f.DB)
  950. // if err == nil {
  951. // defer session.Close()
  952. // if f.Query == nil {
  953. // f.Query = &bson.M{}
  954. // }
  955. // query := session.DB(f.DB).C(f.Collection).Find(f.Query)
  956. // // Seleciona os campos se forem especificados
  957. // f.PageToken.Count, err = query.Select(&bson.M{"_id": 1}).Count()
  958. // }
  959. // if err != nil {
  960. // return Error(ERR_PERSIST, err.Error()), 0
  961. // }
  962. // return nil, f.PageToken.Count
  963. // }
  964. // func (t *Mongo) Update(f *Filter) *errs.Error {
  965. // var (
  966. // entityinterface EntityInterface
  967. // entity interface{}
  968. // )
  969. // one := false
  970. // ok := false
  971. // session, err := t.GetClient(f.DB)
  972. // if err == nil {
  973. // defer session.Close()
  974. // if !f.Id.IsZero() {
  975. // one = true
  976. // f.Query = &bson.M{"_id": f.Id}
  977. // } else if f.Query == nil {
  978. // err = fmt.Errorf("Query not defined!")
  979. // }
  980. // if entityinterface, ok = f.Entity.(EntityInterface); ok {
  981. // entity = entityinterface.Update()
  982. // } else {
  983. // entity = f.Entity
  984. // }
  985. // col := session.DB(f.DB).C(f.Collection)
  986. // if one {
  987. // err = col.Update(f.Query, entity)
  988. // } else {
  989. // _, err = col.UpdateAll(f.Query, entity)
  990. // }
  991. // }
  992. // if err != nil {
  993. // return Error(ERR_PERSIST, err.Error())
  994. // }
  995. // return nil
  996. // }
  997. //-----------------------------------------------------------------------
  998. // func (t *Mongo) Aggregation(f *Filter, q []bson.M, one bool) *errs.Error {
  999. // session, err := t.GetClient(f.DB)
  1000. // if err == nil {
  1001. // defer session.Close()
  1002. // pipe := session.DB(f.DB).C(f.Collection).Pipe(q)
  1003. // if one {
  1004. // err = pipe.One(&f.Entity)
  1005. // } else {
  1006. // err = pipe.All(&f.Entity)
  1007. // }
  1008. // }
  1009. // if err != nil {
  1010. // return Error(ERR_PERSIST, err.Error())
  1011. // }
  1012. // return nil
  1013. // }
  1014. // all := true
  1015. // session, err := t.GetClient(f.DB)
  1016. // if err == nil {
  1017. // defer session.Close()
  1018. // if !f.Id.IsZero() {
  1019. // all = false
  1020. // f.Query = &bson.M{"_id": f.Id}
  1021. // } else if f.Query == nil {
  1022. // err = fmt.Errorf("Query not defined!")
  1023. // }
  1024. // C := session.DB(f.DB).C(f.Collection)
  1025. // if all {
  1026. // _, err = C.RemoveAll(f.Query)
  1027. // } else {
  1028. // err = C.Remove(f.Query)
  1029. // }
  1030. // }
  1031. // if err != nil {
  1032. // return Error(ERR_PERSIST, err.Error())
  1033. // }
  1034. // return nil
  1035. // VERIFICAR A NECESSIDADE E CORRIGIR O ERRO
  1036. // func (t *Mongo) GetArrayById(f *Filter, ids []primitive.ObjectID) error {
  1037. // session, err := t.GetClient(f.DB)
  1038. // if err != nil {
  1039. // return err
  1040. // }
  1041. // defer session.Close()
  1042. // q := bson.M{"_id": bson.M{"$in": ids}}
  1043. // err = session.DB(f.DB).C(f.Collection).Find(q).One(f.Entity)
  1044. // return err
  1045. // }
  1046. // func (t *Mongo) GetEmbedFromArray(f *Filter, embed string, id primitive.ObjectID, sid primitive.ObjectID) (errs error) {
  1047. // session, err := t.GetClient(f.DB)
  1048. // if err != nil {
  1049. // return err
  1050. // }
  1051. // defer session.Close()
  1052. // field := "$" + embed
  1053. // match := bson.M{"_id": id}
  1054. // match[embed] = bson.M{"$exists": true}
  1055. // aggregations := []bson.M{
  1056. // bson.M{"$unwind": field},
  1057. // bson.M{"$match": match},
  1058. // bson.M{"$replaceRoot": bson.M{"newRoot": field}},
  1059. // bson.M{"$match": bson.M{"_id": sid}},
  1060. // }
  1061. // C := session.DB(f.DB).C(f.Collection)
  1062. // return C.Pipe(aggregations).One(&f.Entity)
  1063. // }
  1064. // func (t *Mongo) UpdateEmbedFromArray(f *Filter, embed string, id primitive.ObjectID, sid primitive.ObjectID) error {
  1065. // session, err := t.GetClient(f.DB)
  1066. // if err != nil {
  1067. // return err
  1068. // }
  1069. // defer session.Close()
  1070. // col := session.DB(f.DB).C(f.Collection)
  1071. // //Define o elemento que sera atualizado
  1072. // element := bson.M{}
  1073. // element[embed+".$"] = &f.Entity
  1074. // //Define o seletor do elemento que sera atualizado
  1075. // selector := bson.M{"_id": id}
  1076. // selector[embed+"._id"] = sid
  1077. // return col.Update(selector, bson.M{"$set": element})
  1078. // }
  1079. // func (t *Mongo) AddEmbedFromArray(f *Filter, embed string, id primitive.ObjectID) error {
  1080. // session, errs := t.GetClient(f.DB)
  1081. // if errs != nil {
  1082. // return errs
  1083. // }
  1084. // defer session.Close()
  1085. // col := session.DB(f.DB).C(f.Collection)
  1086. // //Define o elemento que sera atualizado
  1087. // element := bson.M{}
  1088. // element[embed] = &f.Entity
  1089. // //Define o seletor do elemento que sera atualizado
  1090. // selector := bson.M{"_id": id}
  1091. // return col.Update(selector, bson.M{"$push": element})
  1092. // }
  1093. // 0000000000000000000000000000000000000000000000000000000000000000
  1094. // func (t *Mongo) NewTransaction(dbname string) (*Transaction, error) {
  1095. // session, e := t.GetClient(dbname)
  1096. // if e != nil {
  1097. // return nil, e
  1098. // }
  1099. // collection := session.DB(dbname).C("txns")
  1100. // return &Transaction{R: txn.NewRunner(collection)}, nil
  1101. // }
  1102. // Transactions
  1103. // type Transaction struct {
  1104. // R *txn.Runner
  1105. // Ops []txn.Op
  1106. // }
  1107. // func (t *Transaction) Insert(collection string, id primitive.ObjectID, entity interface{}) *Transaction {
  1108. // t.Ops = append(t.Ops, txn.Op{
  1109. // C: collection,
  1110. // Id: id,
  1111. // Insert: entity,
  1112. // })
  1113. // return t
  1114. // }
  1115. // func (t *Transaction) Update(collection string, id primitive.ObjectID, assert *bson.M, entity interface{}) *Transaction {
  1116. // op := txn.Op{
  1117. // C: collection,
  1118. // Id: id,
  1119. // Update: entity,
  1120. // }
  1121. // if assert != nil {
  1122. // op.Assert = assert
  1123. // }
  1124. // t.Ops = append(t.Ops, op)
  1125. // return t
  1126. // }
  1127. // func (t *Transaction) Remove(collection string, id primitive.ObjectID) *Transaction {
  1128. // t.Ops = append(t.Ops, txn.Op{
  1129. // C: collection,
  1130. // Id: id,
  1131. // Remove: true,
  1132. // })
  1133. // return t
  1134. // }
  1135. // func (t *Transaction) Run() error {
  1136. // return t.R.Run(t.Ops, primitive.NewObjectID(), nil)
  1137. // }
  1138. // func (t *Mongo) Find(f *Filter, one bool) (*errs.Error, int) {
  1139. // session, err := t.GetClient()
  1140. // if err == nil {
  1141. // defer session.Close()
  1142. // if !f.Id.IsZero() {
  1143. // f.Query = &bson.M{"_id": f.Id}
  1144. // } else if f.Query == nil {
  1145. // f.Query = &bson.M{}
  1146. // }
  1147. // pageToken := &f.PageToken
  1148. // aggregations := []*bson.M{}
  1149. // // Se tem um token de paginacao
  1150. // hasToken := pageToken.HasToken()
  1151. // if hasToken {
  1152. // fmt.Println("consultando com token", pageToken.CurrentID)
  1153. // // {$or:
  1154. // // [
  1155. // // {$and :
  1156. // // [
  1157. // // {<sort key>:{$gte: <last sort key value of previous page>}},
  1158. // // {"_id" : {$gt : <last result id of previous page>}}
  1159. // // ]
  1160. // // },
  1161. // // ou
  1162. // // {<sort key> :{$gt: <last sort key value>}}
  1163. // // ]
  1164. // // }.
  1165. // // f.Query = &bson.M{"$and": []bson.M{
  1166. // // *f.Query,
  1167. // // bson.M{"_id": bson.M{"$gt": f.NextPageToken}},
  1168. // // }}
  1169. // f.Query = &bson.M{"_id": bson.M{
  1170. // // "$gt": primitive.ObjectIDHex(pageToken.CurrentID),
  1171. // "$gt": pageToken.CurrentID,
  1172. // }}
  1173. // } else {
  1174. // }
  1175. // // Adiciona o primeiro estagio da agregacao
  1176. // aggregations = append(aggregations, &bson.M{"$match": f.Query})
  1177. // if len(f.Sort) > 0 {
  1178. // f.Sort = append(f.Sort, "_id")
  1179. // aggregations = append(aggregations, MgoSortBson(f.Sort))
  1180. // // query.Sort(f.Sort...)
  1181. // }
  1182. // // aggregations = append(aggregations, &bson.M{
  1183. // // "$addFields": bson.M{"position":},
  1184. // // })
  1185. // // Seleciona os campos se forem especificados
  1186. // if f.Fields != nil {
  1187. // // aggregations = append(aggregations, bson.M{"$limit": f.MaxResults})
  1188. // }
  1189. // // countQuery := session.DB(f.DB).C(f.Collection).Pipe(aggregations)
  1190. // // Determina o numero de itens a ser retornado
  1191. // if f.MaxResults > 0 {
  1192. // aggregations = append(aggregations, &bson.M{"$limit": f.MaxResults})
  1193. // }
  1194. // spew.Dump(aggregations)
  1195. // // query := session.DB(f.DB).C(f.Collection).Find(f.Query)
  1196. // collection := session.DB(f.DB).C(f.Collection)
  1197. // query := collection.Pipe(aggregations)
  1198. // if one {
  1199. // err = query.One(f.Entity)
  1200. // f.Count = 1 // Filter one
  1201. // } else {
  1202. // err = query.All(f.Entity)
  1203. // // Numero total de documentos
  1204. // // Se tem um token de paginacao o valor total esta no token
  1205. // // Caso contrario consulta no banco
  1206. // if hasToken {
  1207. // f.Count = pageToken.Count
  1208. // } else {
  1209. // f.Count, _ = collection.Find(f.Query).Select(&bson.M{"_id": 1}).Count()
  1210. // }
  1211. // }
  1212. // }
  1213. // if err != nil {
  1214. // return Error(ERR_PERSIST, err.Error()), 0
  1215. // }
  1216. // return nil, f.Count
  1217. // }
  1218. // v := reflect.ValueOf(f.Entity)
  1219. // fmt.Println("UpdateCursorResponse")
  1220. // // spew.Dump(f.PageToken)
  1221. // // fmt.Println(v.Kind())
  1222. // if v.Kind() == reflect.Ptr {
  1223. // // Atualiza v para o elemento apontado
  1224. // v = v.Elem()
  1225. // if v.Kind() == reflect.Slice || v.Kind() == reflect.Array {
  1226. // // Acessa o atributo ID da ultima entidade do array
  1227. // field := v.Index(v.Len() - 1).Elem().FieldByName("ID")
  1228. // // Converte o atributo ID para objectId
  1229. // last := field.Interface().(primitive.ObjectID)
  1230. // // Cria a consulta que verifica se existe outros registros alem do ultimo
  1231. // filter := &Filter{
  1232. // Collection: f.Collection,
  1233. // Query: &bson.M{"_id": bson.M{
  1234. // "$lt": last,
  1235. // }},
  1236. // }
  1237. // // Se existirem elementos adiciona o nextTOKEN
  1238. // if _, count := models.Count(filter); count > 0 {
  1239. // // atualiza os valores do token
  1240. // f.PageToken.StartID = last.Hex()
  1241. // f.PageToken.Count = f.Count
  1242. // resp.NextPageToken = f.PageToken.Encode()
  1243. // }
  1244. // }
  1245. // }
  1246. // func NewMongo() (*Mongo, error) {
  1247. // // session, err := mgo.Dial(addrs)
  1248. // // session, err := mgo.Dial("mongodb://localhost:27017")
  1249. // session, err := mgo.Dial("mongodb://localhost:27017")
  1250. // if err != nil {
  1251. // return nil, err
  1252. // }
  1253. // session.SetMode(mgo.Monotonic, true)
  1254. // // "addrs": "mongodb://localhost:27017",
  1255. // // "user": "guest",
  1256. // // "password": "welcome",
  1257. // // "database": "financeiro"
  1258. // m := &Mongo{
  1259. // Session: session,
  1260. // DataBase: "accounts",
  1261. // Addrs: ,
  1262. // // Config: cfg,
  1263. // }
  1264. // return m, err
  1265. // }