package mongos import ( "amocrm_templategen_back/dal/model" "context" "errors" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/bson/primitive" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" "go.uber.org/zap" "time" ) type GDisk struct { coll *mongo.Collection logger *zap.Logger } func InitGDisk(db *mongo.Database, logger *zap.Logger) *GDisk { return &GDisk{coll: db.Collection("gDisk"), logger: logger} } func (d *GDisk) InsertOrUpdate(ctx context.Context, record *model.GDisk) (string, error) { record.CreatedAt = time.Now() if record.UserID == "" { err := errors.New("got empty user id") d.logger.Error("ErrorDeleteGDisk", zap.Error(err)) return "", err } found, err := d.GetByUserID(ctx, record.UserID) if err != nil { return "", err } if found == nil { // Set default TemplateFolder && SaveFolder if record.TemplateFolder == "" { record.TemplateFolder = "templategen/templates" } if record.SaveFolder == "" { record.SaveFolder = "templategen/saved" } result, err := d.coll.InsertOne(ctx, record) if err != nil { d.logger.Error("ErrorInsertOrUpdateGDisk", zap.Error(err)) return "", err } return result.InsertedID.(primitive.ObjectID).Hex(), nil } record.CreatedAt = found.CreatedAt err = d.Update(ctx, record) if err != nil { d.logger.Error("ErrorInsertOrUpdateGDisk", zap.Error(err)) return "", err } return found.ID, nil } func (d *GDisk) InsertOrUpdateOLD(ctx context.Context, record *model.GDisk) (string, error) { now := time.Now() record.UpdatedAt = now record.CreatedAt = now record.IsDeleted = false if record.UserID == "" { err := errors.New("got empty user id") d.logger.Error("ErrorDeleteGDisk", zap.Error(err)) return "", err } filter := bson.M{"user_id": record.UserID, "is_deleted": false} opts := options.FindOneAndUpdate().SetUpsert(true) var result model.GDisk err := d.coll.FindOneAndUpdate(ctx, filter, bson.D{{"$set", record}}, opts).Decode(&result) if err != nil { if err != mongo.ErrNoDocuments { d.logger.Error("ErrorInsertOrUpdateGDisk", zap.Error(err)) return "", err } } return result.ID, nil } func (d *GDisk) GetByUserID(ctx context.Context, userID string) (*model.GDisk, error) { filter := bson.M{"user_id": userID, "is_deleted": false} var result model.GDisk err := d.coll.FindOne(ctx, filter).Decode(&result) if err == mongo.ErrNoDocuments { return nil, nil } else { if err != nil { d.logger.Error("ErrorGetGDisk", zap.Error(err)) return nil, err } } d.logger.Info("InfoGetGDisk", zap.String("id", result.ID)) return &result, nil } func (d *GDisk) Update(ctx context.Context, record *model.GDisk) error { if record.UserID == "" && record.ID == "" { err := errors.New("got empty id and user id") d.logger.Error("ErrorUpdateGDisk", zap.Error(err)) return err } filter := bson.M{"is_deleted": false} if record.ID != "" { objID, err := primitive.ObjectIDFromHex(record.ID) if err != nil { d.logger.Error("ErrorUpdateGDisk", zap.Error(err)) return err } filter["_id"] = objID } if record.UserID != "" { filter["user_id"] = record.UserID } update := bson.M{"updated_at": time.Now()} if record.AccessToken != "" { update["access_token"] = record.AccessToken } if !record.ExpiresIn.IsZero() { update["expires_in"] = record.ExpiresIn } if record.TokenType != "" { update["token_type"] = record.TokenType } if record.TemplateFolder != "" { update["save_folder"] = record.TemplateFolder } if record.SaveFolder != "" { update["save_folder"] = record.SaveFolder } _, err := d.coll.UpdateOne(ctx, filter, bson.D{{"$set", update}}) if err != nil { d.logger.Error("ErrorUpdateGDisk", zap.Error(err)) return err } return nil } func (d *GDisk) DeleteByUserID(ctx context.Context, userID string) error { if userID == "" { err := errors.New("got empty user id") d.logger.Error("ErrorDeleteGDisk", zap.Error(err)) return err } filter := bson.M{"user_id": userID, "is_deleted": false} update := bson.M{"updated_at": time.Now(), "is_deleted": true} _, err := d.coll.UpdateOne(ctx, filter, bson.D{{"$set", update}}) if err != nil { d.logger.Error("ErrorDeleteGDisk", zap.Error(err)) return err } return nil }