package repository import ( "codeword/internal/models" "context" "encoding/json" "github.com/go-redis/redis/v8" "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/readpref" "time" ) type codewordRepository struct { mdb *mongo.Collection rdb *redis.Client } func NewCodewordRepository(deps Deps) *codewordRepository { return &codewordRepository{mdb: deps.Mdb, rdb: deps.Rdb} } // сохраняем полученные данные о пользователе и подписи в бд func (r *codewordRepository) StoreRecoveryRecord(ctx context.Context, deps models.StoreRecDeps) (string, error) { newID := primitive.NewObjectID() signID := deps.Key + newID.Hex() record := models.RestoreRequest{ ID: newID, UserID: deps.UserID, Email: deps.Email, Sign: deps.Key, SignUrl: deps.Url, SignID: signID, CreatedAt: time.Now(), } _, err := r.mdb.InsertOne(ctx, record) if err != nil { return "", err } return newID.Hex(), nil } // добавляем в очередь данные для отправки на почту в редис func (r *codewordRepository) InsertToQueue(ctx context.Context, deps models.RecEmailDeps) error { task := models.RecoveryRecord{ ID: deps.ID, UserID: deps.UserID, Email: deps.Email, Key: deps.SignWithID, } taskBytes, err := json.Marshal(task) if err != nil { return err } if err := r.rdb.LPush(ctx, "recoveryQueue", taskBytes).Err(); err != nil { return err } return nil } // получаем данные юзера по подписи func (r *codewordRepository) GetRecoveryRecord(ctx context.Context, key string) (*models.RestoreRequest, error) { var restoreRequest models.RestoreRequest filter := bson.M{"sign_id": key} err := r.mdb.FindOne(ctx, filter).Decode(&restoreRequest) if err != nil { return nil, err } return &restoreRequest, nil } // пингует в монгу чтобы проверить подключение func (r *codewordRepository) Ping(ctx context.Context) error { if err := r.mdb.Database().Client().Ping(ctx, readpref.Primary()); err != nil { return err } return nil }