bonsaif 1.10.40 → 1.10.42

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/execute.js CHANGED
@@ -45,6 +45,7 @@ const query = async (o)=>{
45
45
  switch(o.endpoint.client){
46
46
  case 'mariadb': rs = await mariadb(o); break;
47
47
  case 'mongodb': rs = await mongodb(o); break;
48
+ case 'mongoose': rs = await mongoose(o); break;
48
49
  case 'redis': rs = await redis(o); break;
49
50
  case 'api': rs = await api(o); break;
50
51
  case 'postgres': rs = await postgres(o); break;
@@ -127,6 +128,44 @@ const mariadb= async(o)=>{
127
128
 
128
129
  /**
129
130
  *
131
+ * @param {object} o Configuracion de mongoose
132
+ * @returns
133
+ */
134
+ const mongoose= async(o)=>{
135
+ const { local=false } = o.endpoint;
136
+ const { db = '', resultFormat=true} = o.options;
137
+ o.options.dml = 'api';
138
+ o.body = o.query;
139
+
140
+ if (local){
141
+ try {
142
+ let mongoose = require("../lib/hookup/mongoose");
143
+ let r = await mongoose.api(o,db,o.body);
144
+ try{ r.query = o.query }catch(e){}
145
+ return resultFormat ? resultSet(r) : r ;
146
+ } catch (e) {
147
+ return {
148
+ result: {
149
+ error: 1,
150
+ code: 503,
151
+ msg: 'Mongoose no disponible: ' + e.message
152
+ },
153
+ data: []
154
+ };
155
+ }
156
+ }else{
157
+ return new Promise((resolve, reject)=>{
158
+ backend(o)
159
+ .then(r=>{
160
+ try{ r.query = o.query }catch(e){}
161
+ resolve(resultFormat ? resultSet(r) : r);
162
+ });
163
+ });
164
+ }
165
+ }
166
+
167
+ /**
168
+ *
130
169
  * @param {object} o Configuracion de redis
131
170
  * @returns
132
171
  */
@@ -163,34 +163,40 @@ const update=async(options,dbm, col, json_obj, query)=>{
163
163
  }
164
164
 
165
165
  const upsert=async(options,dbm, col, json_obj, query)=>{
166
+ const exec = require("./exec");
167
+ const mongoclient = exec.mongoConn(options);
168
+ const start = Date.now();
169
+
166
170
  return new Promise((resolve, reject)=>{
167
- find(options, dbm,col, query)
168
- .then(result=>{
169
- if (result.error==1){
170
- resolve(result);
171
- }
172
-
173
- if (result.data[0]){ //update
174
- update(options,dbm,col, json_obj, query)
175
- .then(result_update=>{
176
- resolve(result_update);
177
- })
178
- .catch(err=>{
179
- reject(err);
180
- });
181
- }else{ // Insert
182
- insert(options,dbm,col, json_obj)
183
- .then(result_insert=>{
184
- resolve(result_insert);
185
- })
186
- .catch(err=>{
187
- reject(err);
188
- });
189
- }
190
- })
191
- .catch(err=>{
192
- reject(err);
193
- });
171
+ mongoclient.then(
172
+ function(client){
173
+ let db = client.db(dbm);
174
+ db.collection(col).updateOne(query, { $set: json_obj }, { upsert: true }, function(err, res) {
175
+ const end = Date.now();
176
+ const time = end - start;
177
+ let result, upsertedCount=0, modifiedCount=0, upsertedId=null;
178
+ try{
179
+ result = res.result;
180
+ upsertedCount = res.upsertedCount || 0;
181
+ modifiedCount = res.modifiedCount || 0;
182
+ upsertedId = res.upsertedId ? res.upsertedId._id : null;
183
+ } catch(e){ }
184
+ if (err) {
185
+ resolve({result:{dml:"upsert", headers:"", time:utl.milisegundosASegundos(time), code:204, error:1, msg:err}, results:err});
186
+ }else{
187
+ let action = upsertedCount > 0 ? 'inserted' : 'updated';
188
+ resolve({result:{dml:"upsert", headers:"upsert", insertId:upsertedId, time:utl.milisegundosASegundos(time), code:200, error:0}, results:{WriteResult:`1 document ${action}`, result }});
189
+ }
190
+ try{
191
+ exec.mongoClose(mongoclient);
192
+ }catch(e){
193
+ utl.log('err.upsert '+e);
194
+ }
195
+ });
196
+ }
197
+ ).catch(err=>{
198
+ resolve({result:{dml:"upsert", headers:"", time:0, code:404, error:1}, results:err});
199
+ });
194
200
  })
195
201
  }
196
202
 
@@ -607,7 +613,8 @@ const api=async(options,dbm, json)=>{
607
613
  }
608
614
 
609
615
  if (utl.ObjectEmpty(json, 'insert')){
610
- dml = 'insert';
616
+ dml = 'insert';
617
+ col = json.insert;
611
618
  json_api = json.documents?json.documents:[];
612
619
  if (json_api.length==1){
613
620
  json_api = json.documents[0];
@@ -617,7 +624,8 @@ const api=async(options,dbm, json)=>{
617
624
  }
618
625
 
619
626
  if (utl.ObjectEmpty(json, 'update')){
620
- dml = 'update';
627
+ dml = 'update';
628
+ col = json.update;
621
629
  json_api = json.documents?json.documents:[];
622
630
  if (json_api.length==1){
623
631
  json_api = json.documents[0];
@@ -627,7 +635,8 @@ const api=async(options,dbm, json)=>{
627
635
  }
628
636
 
629
637
  if (utl.ObjectEmpty(json, 'updateMany')){
630
- dml = 'updateMany';
638
+ dml = 'updateMany';
639
+ col = json.updateMany;
631
640
  json_api = json.documents?json.documents:[];
632
641
  if (json_api.length==1){
633
642
  json_api = json.documents[0];
@@ -636,7 +645,31 @@ const api=async(options,dbm, json)=>{
636
645
  }
637
646
  }
638
647
 
639
- let ltdml = ['find','delete','count','dbs','collections','deleteMany','drop'];
648
+ if (utl.ObjectEmpty(json, 'replaceOne')){
649
+ dml = 'replaceOne';
650
+ col = json.replaceOne;
651
+ json_api = json.documents?json.documents:[];
652
+ if (json_api.length==1){
653
+ json_api = json.documents[0];
654
+ }
655
+ }
656
+
657
+ if (utl.ObjectEmpty(json, 'findOneAndUpdate')){
658
+ dml = 'findOneAndUpdate';
659
+ col = json.findOneAndUpdate;
660
+ json_api = json.documents?json.documents:[];
661
+ if (json_api.length==1){
662
+ json_api = json.documents[0];
663
+ }
664
+ }
665
+
666
+ if (utl.ObjectEmpty(json, 'insertMany')){
667
+ dml = 'insertMany';
668
+ col = json.insertMany;
669
+ json_api = json.documents?json.documents:[];
670
+ }
671
+
672
+ let ltdml = ['find','findOne','delete','deleteOne','deleteMany','count','dbs','collections','drop','aggregate','distinct','findOneAndDelete'];
640
673
  for (let x of ltdml){
641
674
  if (utl.ObjectEmpty(json,x)){
642
675
  dml = x; break;
@@ -644,20 +677,30 @@ const api=async(options,dbm, json)=>{
644
677
  }
645
678
  dml==''? dml='command':'';
646
679
 
647
- eval(` try{ col = json.${dml}; } catch(e){ } `);
680
+ if (!col){
681
+ eval(` try{ col = json.${dml}; } catch(e){ } `);
682
+ }
648
683
  let r;
649
684
  switch (dml){
650
- case 'insert': r = await insert(options,dbm,col, json_api); break;
651
- case 'upsert': r = await upsert(options,dbm,col, json_api, query); break;
652
- case 'update': r = await update(options,dbm,col, json_api, query); break;
653
- case 'count': r = await count(options,dbm,col, json); break;
654
- case 'dbs': r = await dbs(options); break;
655
- case 'collections': r = await collections(options,dbm); break;
656
- case 'deleteMany': r = await deleteMany(options,dbm,col, json); break;
657
- case 'updateMany': r = await updateMany(options,dbm,col, json_api, query); break;
658
- case 'drop': r = await drop(options,dbm,col); break;
659
- case 'find': r = await findMany(options,dbm,col,json); break;
660
- default: r = await command(options,dbm,json);
685
+ case 'insert': r = await insert(options,dbm,col, json_api); break;
686
+ case 'insertMany': r = await insertMany(options,dbm,col, json_api); break;
687
+ case 'upsert': r = await upsert(options,dbm,col, json_api, query); break;
688
+ case 'update': r = await update(options,dbm,col, json_api, query); break;
689
+ case 'updateMany': r = await updateMany(options,dbm,col, json_api, query); break;
690
+ case 'deleteOne': r = await deleteOne(options,dbm,col, query); break;
691
+ case 'deleteMany': r = await deleteMany(options,dbm,col, json); break;
692
+ case 'count': r = await count(options,dbm,col, json); break;
693
+ case 'dbs': r = await dbs(options); break;
694
+ case 'collections': r = await collections(options,dbm); break;
695
+ case 'drop': r = await drop(options,dbm,col); break;
696
+ case 'find': r = await findMany(options,dbm,col,json); break;
697
+ case 'findOne': r = await findOne(options,dbm,col, query, json.sort); break;
698
+ case 'aggregate': r = await aggregate(options,dbm,col, json.pipeline); break;
699
+ case 'distinct': r = await distinct(options,dbm,col, json.field, query); break;
700
+ case 'findOneAndUpdate': r = await findOneAndUpdate(options,dbm,col, query, json_api, json.returnNew); break;
701
+ case 'findOneAndDelete': r = await findOneAndDelete(options,dbm,col, query); break;
702
+ case 'replaceOne': r = await replaceOne(options,dbm,col, query, json_api); break;
703
+ default: r = await command(options,dbm,json);
661
704
  }
662
705
 
663
706
  return new Promise((resolve, reject)=>{
@@ -665,10 +708,271 @@ const api=async(options,dbm, json)=>{
665
708
  })
666
709
  }
667
710
 
711
+ const findOne=async(options,dbm, col, query, orderby)=>{
712
+ const exec = require("./exec");
713
+ const mongoclient = exec.mongoConn(options);
714
+ orderby = orderby!=null?orderby:'';
715
+ const start = Date.now();
716
+
717
+ return new Promise((resolve, reject)=>{
718
+ mongoclient.then(
719
+ function(client){
720
+ let db = client.db(dbm);
721
+ db.collection(col).findOne(query, {sort: orderby}, function(err, result) {
722
+ const end = Date.now();
723
+ const time = end - start;
724
+
725
+ if (err) {
726
+ resolve({"result":{"dml":"findOne", "headers":"", "time":utl.milisegundosASegundos(time), code:204, error:1, msg:err}, results:err});
727
+ }else{
728
+ resolve({"result":{"dml":"findOne", "headers":getFields(result), "time":utl.milisegundosASegundos(time), code:200, error:0}, data:result ? [result] : []});
729
+ }
730
+
731
+ try{
732
+ exec.mongoClose(mongoclient);
733
+ }catch(e){
734
+ utl.log('err.findOne '+e);
735
+ }
736
+ });
737
+ }
738
+ ).catch(err=>{
739
+ resolve({"result":{"dml":"findOne", "headers":"", time:0, code:404, error:1}, "results":err});
740
+ });
741
+ })
742
+ }
743
+
744
+ const deleteOne=async(options,dbm, col, query)=>{
745
+ const exec = require("./exec");
746
+ const mongoclient = exec.mongoConn(options);
747
+ const start = Date.now();
748
+
749
+ return new Promise((resolve, reject)=>{
750
+ mongoclient.then(
751
+ function(client){
752
+ let db = client.db(dbm);
753
+ db.collection(col).deleteOne(query, function(err, res) {
754
+ const end = Date.now();
755
+ const time = end - start;
756
+ let result, deletedCount=0;
757
+ try{ result = res.result; deletedCount = res.result.n; } catch(e){ }
758
+ if (err) {
759
+ resolve({result:{dml:"deleteOne", headers:"", time:utl.milisegundosASegundos(time), code:204, error:1, msg:err}, results:err});
760
+ }else{
761
+ resolve({result:{dml:"deleteOne", headers:"deletedCount", time:utl.milisegundosASegundos(time), code:200, error:0}, results:{WriteResult:`${deletedCount} document deleted`, result }});
762
+ }
763
+ try{
764
+ exec.mongoClose(mongoclient);
765
+ }catch(e){
766
+ utl.log('err.deleteOne '+e);
767
+ }
768
+ });
769
+ }
770
+ ).catch(err=>{
771
+ resolve({result:{dml:"deleteOne", headers:"", time:0, code:404, error:1}, results:err});
772
+ });
773
+ })
774
+ }
775
+
776
+ const insertMany=async(options,dbm, col, documents)=>{
777
+ const exec = require("./exec");
778
+ const mongoclient = exec.mongoConn(options);
779
+ const start = Date.now();
780
+
781
+ return new Promise((resolve, reject)=>{
782
+ mongoclient.then(
783
+ function(client){
784
+ let db = client.db(dbm);
785
+ db.collection(col).insertMany(documents, function(err, res) {
786
+ const end = Date.now();
787
+ const time = end - start;
788
+ if (err) {
789
+ resolve({result:{dml:"insertMany", headers:"", time:utl.milisegundosASegundos(time), code:204, error:1, msg:err}, results:err});
790
+ }else{
791
+ let ops=res.ops!=null?res.ops:{};
792
+ resolve({result:{dml:"insertMany", headers:"insertedCount", insertedCount:res.insertedCount, time:utl.milisegundosASegundos(time), code:200, error:0}, results:{WriteResult:`${res.insertedCount} documents inserted`, ops}});
793
+ }
794
+ try{
795
+ exec.mongoClose(mongoclient);
796
+ }catch(e){
797
+ utl.log('err.insertMany '+e);
798
+ }
799
+ });
800
+ }
801
+ ).catch(err=>{
802
+ resolve({"result":{"dml":"insertMany", "headers":"", time:0, code:404, error:1}, results:err});
803
+ });
804
+ })
805
+ }
806
+
807
+ const aggregate=async(options,dbm, col, pipeline)=>{
808
+ const exec = require("./exec");
809
+ const mongoclient = exec.mongoConn(options);
810
+ const start = Date.now();
811
+
812
+ return new Promise((resolve, reject)=>{
813
+ mongoclient.then(
814
+ function(client){
815
+ let db = client.db(dbm);
816
+ db.collection(col).aggregate(pipeline).toArray(function(err, result) {
817
+ const end = Date.now();
818
+ const time = end - start;
819
+
820
+ if (err) {
821
+ resolve({"result":{"dml":"aggregate", "headers":"", "time":utl.milisegundosASegundos(time), code:204, error:1, msg:err}, results:err});
822
+ }else{
823
+ resolve({"result":{"dml":"aggregate", "headers":getFields(result[0]), "time":utl.milisegundosASegundos(time), code:200, error:0}, data:result});
824
+ }
825
+
826
+ try{
827
+ exec.mongoClose(mongoclient);
828
+ }catch(e){
829
+ utl.log('err.aggregate '+e);
830
+ }
831
+ });
832
+ }
833
+ ).catch(err=>{
834
+ resolve({"result":{"dml":"aggregate", "headers":"", time:0, code:404, error:1}, "results":err});
835
+ });
836
+ })
837
+ }
838
+
839
+ const distinct=async(options,dbm, col, field, query={})=>{
840
+ const exec = require("./exec");
841
+ const mongoclient = exec.mongoConn(options);
842
+ const start = Date.now();
843
+
844
+ return new Promise((resolve, reject)=>{
845
+ mongoclient.then(
846
+ function(client){
847
+ let db = client.db(dbm);
848
+ db.collection(col).distinct(field, query, function(err, result) {
849
+ const end = Date.now();
850
+ const time = end - start;
851
+
852
+ if (err) {
853
+ resolve({"result":{"dml":"distinct", "headers":"", "time":utl.milisegundosASegundos(time), code:204, error:1, msg:err}, results:err});
854
+ }else{
855
+ resolve({"result":{"dml":"distinct", "headers":field, "time":utl.milisegundosASegundos(time), code:200, error:0}, data:result});
856
+ }
857
+
858
+ try{
859
+ exec.mongoClose(mongoclient);
860
+ }catch(e){
861
+ utl.log('err.distinct '+e);
862
+ }
863
+ });
864
+ }
865
+ ).catch(err=>{
866
+ resolve({"result":{"dml":"distinct", "headers":"", time:0, code:404, error:1}, "results":err});
867
+ });
868
+ })
869
+ }
870
+
871
+ const findOneAndUpdate=async(options,dbm, col, query, json_obj, returnNew=true)=>{
872
+ const exec = require("./exec");
873
+ const mongoclient = exec.mongoConn(options);
874
+ const start = Date.now();
875
+
876
+ return new Promise((resolve, reject)=>{
877
+ mongoclient.then(
878
+ function(client){
879
+ let db = client.db(dbm);
880
+ db.collection(col).findOneAndUpdate(query, { $set: json_obj }, { returnDocument: returnNew ? 'after' : 'before' }, function(err, res) {
881
+ const end = Date.now();
882
+ const time = end - start;
883
+ let result;
884
+ try{ result = res.value; } catch(e){ }
885
+ if (err) {
886
+ resolve({result:{dml:"findOneAndUpdate", headers:"", time:utl.milisegundosASegundos(time), code:204, error:1, msg:err}, results:err});
887
+ }else{
888
+ resolve({result:{dml:"findOneAndUpdate", headers:getFields(result), time:utl.milisegundosASegundos(time), code:200, error:0}, data:result ? [result] : [], results:{ok: res.ok, lastErrorObject: res.lastErrorObject}});
889
+ }
890
+ try{
891
+ exec.mongoClose(mongoclient);
892
+ }catch(e){
893
+ utl.log('err.findOneAndUpdate '+e);
894
+ }
895
+ });
896
+ }
897
+ ).catch(err=>{
898
+ resolve({result:{dml:"findOneAndUpdate", headers:"", time:0, code:404, error:1}, results:err});
899
+ });
900
+ })
901
+ }
902
+
903
+ const findOneAndDelete=async(options,dbm, col, query)=>{
904
+ const exec = require("./exec");
905
+ const mongoclient = exec.mongoConn(options);
906
+ const start = Date.now();
907
+
908
+ return new Promise((resolve, reject)=>{
909
+ mongoclient.then(
910
+ function(client){
911
+ let db = client.db(dbm);
912
+ db.collection(col).findOneAndDelete(query, function(err, res) {
913
+ const end = Date.now();
914
+ const time = end - start;
915
+ let result;
916
+ try{ result = res.value; } catch(e){ }
917
+ if (err) {
918
+ resolve({result:{dml:"findOneAndDelete", headers:"", time:utl.milisegundosASegundos(time), code:204, error:1, msg:err}, results:err});
919
+ }else{
920
+ resolve({result:{dml:"findOneAndDelete", headers:getFields(result), time:utl.milisegundosASegundos(time), code:200, error:0}, data:result ? [result] : [], results:{ok: res.ok, lastErrorObject: res.lastErrorObject}});
921
+ }
922
+ try{
923
+ exec.mongoClose(mongoclient);
924
+ }catch(e){
925
+ utl.log('err.findOneAndDelete '+e);
926
+ }
927
+ });
928
+ }
929
+ ).catch(err=>{
930
+ resolve({result:{dml:"findOneAndDelete", headers:"", time:0, code:404, error:1}, results:err});
931
+ });
932
+ })
933
+ }
934
+
935
+ const replaceOne=async(options,dbm, col, query, json_obj)=>{
936
+ const exec = require("./exec");
937
+ const mongoclient = exec.mongoConn(options);
938
+ const start = Date.now();
939
+
940
+ return new Promise((resolve, reject)=>{
941
+ mongoclient.then(
942
+ function(client){
943
+ let db = client.db(dbm);
944
+ db.collection(col).replaceOne(query, json_obj, function(err, res) {
945
+ const end = Date.now();
946
+ const time = end - start;
947
+ let result, modifiedCount=0;
948
+ try{ result = res.result; modifiedCount = res.result.nModified; } catch(e){ }
949
+ if (err) {
950
+ resolve({result:{dml:"replaceOne", headers:"", time:utl.milisegundosASegundos(time), code:204, error:1, msg:err}, results:err});
951
+ }else{
952
+ resolve({result:{dml:"replaceOne", headers:"replaceOne", time:utl.milisegundosASegundos(time), code:200, error:0}, results:{WriteResult:`${modifiedCount} document replaced`, result }});
953
+ }
954
+ try{
955
+ exec.mongoClose(mongoclient);
956
+ }catch(e){
957
+ utl.log('err.replaceOne '+e);
958
+ }
959
+ });
960
+ }
961
+ ).catch(err=>{
962
+ resolve({result:{dml:"replaceOne", headers:"", time:0, code:404, error:1}, results:err});
963
+ });
964
+ })
965
+ }
966
+
668
967
  module.exports ={
669
968
  find,
969
+ findOne,
670
970
  insert,
971
+ insertMany,
671
972
  update,
973
+ updateMany,
974
+ deleteMany,
975
+ deleteOne,
672
976
  count,
673
977
  dbs,
674
978
  collections,
@@ -678,5 +982,10 @@ module.exports ={
678
982
  command,
679
983
  api,
680
984
  drop,
681
- findMany
985
+ findMany,
986
+ aggregate,
987
+ distinct,
988
+ findOneAndUpdate,
989
+ findOneAndDelete,
990
+ replaceOne
682
991
  }