From c4448fd3af2003f3491df60c75962745f5ff4364 Mon Sep 17 00:00:00 2001 From: mr Date: Wed, 31 Jul 2024 16:06:47 +0200 Subject: [PATCH] mongo unfatal --- dbs/mongo/mongo.go | 74 ++++++++++++++++++------- models/resource_model/resource_model.go | 1 - 2 files changed, 54 insertions(+), 21 deletions(-) diff --git a/dbs/mongo/mongo.go b/dbs/mongo/mongo.go index 37342ee..c2c6e80 100644 --- a/dbs/mongo/mongo.go +++ b/dbs/mongo/mongo.go @@ -23,8 +23,9 @@ var ( cancel context.CancelFunc existingCollections []string - - ResourceMap map[string]interface{} + mngoCollections []string + mngoConfig MongoConf + ResourceMap map[string]interface{} ) var MONGOService = MongoDB{} @@ -46,20 +47,27 @@ func (m *MongoDB) Init(collections []string, config MongoConf) { m.Logger.Info().Msg("Connecting to" + config.GetUrl()) MngoCtx, cancel = context.WithTimeout(context.Background(), 10*time.Second) defer cancel() - - m.createClient(config.GetUrl()) - - m.Logger.Info().Msg("Connecting mongo client to db " + config.GetDatabase()) - m.prepareDB(collections, config) - - m.Logger.Info().Msg("Database is READY") - + mngoCollections = collections + mngoConfig = config + if err := m.createClient(config.GetUrl()); err == nil { + m.connect() + } } -func (m *MongoDB) createClient(MongoURL string) { +func (m *MongoDB) connect() error { + if mngoClient == nil { + m.Logger.Info().Msg("Connecting mongo client to db " + mngoConfig.GetDatabase()) + m.prepareDB(mngoCollections, mngoConfig) + m.Logger.Info().Msg("Database is READY") + return nil + } else { + return m.createClient(mngoConfig.GetUrl()) + } +} + +func (m *MongoDB) createClient(MongoURL string) error { var err error - // Allows us to use marshal and unmarshall with results of FindOne() and others bsonOpts := &options.BSONOptions{ UseJSONStructTags: true, @@ -69,21 +77,21 @@ func (m *MongoDB) createClient(MongoURL string) { clientOptions := options.Client().ApplyURI(MongoURL).SetBSONOptions(bsonOpts) mngoClient, err = mongo.Connect(MngoCtx, clientOptions) if err != nil { - m.Logger.Fatal().Msg("Mongodb NewClient " + MongoURL + ":" + "err") - panic(err) + mngoClient = nil + return errors.New("Mongodb NewClient " + MongoURL + ":" + "err") } // Ping the primary if mngoClient, err = mongo.Connect(MngoCtx, clientOptions); err != nil { - m.Logger.Fatal().Msg("Mongodb connect " + MongoURL + ":" + "err") - panic(err) + mngoClient = nil + return errors.New("Mongodb connect " + MongoURL + ":" + "err") } if err = mngoClient.Ping(MngoCtx, nil); err != nil { - m.Logger.Fatal().Msg("Mongodb ping " + MongoURL + ":" + "err") - panic(err) + mngoClient = nil + return errors.New("Mongodb connect " + MongoURL + ":" + "err") } - + return nil } func (m *MongoDB) prepareDB(list_collection []string, config MongoConf) { @@ -133,6 +141,9 @@ func (m *MongoDB) createCollection(collection_name string, new_collection *mongo } func (m *MongoDB) DeleteOne(id string, collection_name string) (int64, int, error) { + if err := m.createClient(mngoConfig.GetUrl()); err != nil { + return 0, 503, err + } filter := bson.M{"_id": id} targetDBCollection := CollectionMap[collection_name] opts := options.Delete().SetHint(bson.D{{Key: "_id", Value: 1}}) @@ -148,6 +159,9 @@ func (m *MongoDB) DeleteOne(id string, collection_name string) (int64, int, erro } func (m *MongoDB) DeleteMultiple(f map[string]interface{}, collection_name string) (int64, int, error) { + if err := m.createClient(mngoConfig.GetUrl()); err != nil { + return 0, 503, err + } filter := bson.D{} for k, v := range f { filter = append(filter, bson.E{Key: k, Value: v}) @@ -166,13 +180,15 @@ func (m *MongoDB) DeleteMultiple(f map[string]interface{}, collection_name strin } func (m *MongoDB) UpdateMultiple(set interface{}, filter map[string]interface{}, collection_name string) (int64, int, error) { + if err := m.createClient(mngoConfig.GetUrl()); err != nil { + return 0, 503, err + } var doc map[string]interface{} b, _ := bson.Marshal(set) bson.Unmarshal(b, &doc) f := bson.D{} for k, v := range filter { f = append(f, bson.E{Key: k, Value: v}) - } targetDBCollection := CollectionMap[collection_name] MngoCtx, cancel = context.WithTimeout(context.Background(), 10*time.Second) @@ -186,6 +202,9 @@ func (m *MongoDB) UpdateMultiple(set interface{}, filter map[string]interface{}, } func (m *MongoDB) UpdateOne(set interface{}, id string, collection_name string) (string, int, error) { + if err := m.createClient(mngoConfig.GetUrl()); err != nil { + return "", 503, err + } var doc map[string]interface{} b, _ := bson.Marshal(set) bson.Unmarshal(b, &doc) @@ -202,6 +221,9 @@ func (m *MongoDB) UpdateOne(set interface{}, id string, collection_name string) } func (m *MongoDB) StoreOne(obj interface{}, id string, collection_name string) (string, int, error) { + if err := m.createClient(mngoConfig.GetUrl()); err != nil { + return "", 503, err + } var doc map[string]interface{} b, _ := bson.Marshal(obj) bson.Unmarshal(b, &doc) @@ -221,6 +243,9 @@ func (m *MongoDB) StoreOne(obj interface{}, id string, collection_name string) ( } func (m *MongoDB) LoadOne(id string, collection_name string) (*mongo.SingleResult, int, error) { + if err := m.createClient(mngoConfig.GetUrl()); err != nil { + return nil, 503, err + } filter := bson.M{"_id": id} targetDBCollection := CollectionMap[collection_name] @@ -237,6 +262,9 @@ func (m *MongoDB) LoadOne(id string, collection_name string) (*mongo.SingleResul } func (m *MongoDB) Search(search string, filter []string, collection_name string) (*mongo.Cursor, int, error) { + if err := m.createClient(mngoConfig.GetUrl()); err != nil { + return nil, 503, err + } opts := options.Find() opts.SetLimit(100) if strings.TrimSpace(search) == "*" { @@ -263,6 +291,9 @@ func (m *MongoDB) Search(search string, filter []string, collection_name string) } func (m *MongoDB) LoadFilter(filter map[string]interface{}, collection_name string) (*mongo.Cursor, int, error) { + if err := m.createClient(mngoConfig.GetUrl()); err != nil { + return nil, 503, err + } f := bson.D{} for k, v := range filter { f = append(f, bson.E{Key: k, Value: v}) @@ -281,6 +312,9 @@ func (m *MongoDB) LoadFilter(filter map[string]interface{}, collection_name stri } func (m *MongoDB) LoadAll(collection_name string) (*mongo.Cursor, int, error) { + if err := m.createClient(mngoConfig.GetUrl()); err != nil { + return nil, 503, err + } targetDBCollection := CollectionMap[collection_name] MngoCtx, cancel = context.WithTimeout(context.Background(), 10*time.Second) diff --git a/models/resource_model/resource_model.go b/models/resource_model/resource_model.go index 115cced..1235f54 100644 --- a/models/resource_model/resource_model.go +++ b/models/resource_model/resource_model.go @@ -18,7 +18,6 @@ type AbstractResource struct { Price string `json:"price,omitempty" bson:"price,omitempty"` License string `json:"license,omitempty" bson:"license,omitempty"` ResourceModel *ResourceModel `json:"resource_model,omitempty" bson:"resource_model,omitempty"` - //Proxy *ResourceProxy `json:"proxy,omitempty" bson:"proxy,omitempty"` } type Model struct {