package redis import ( "errors" "fmt" "time" "src.dualinventive.com/go/authentication-service/internal/storage" "src.dualinventive.com/go/lib/kv" ) const expirationDuration = 1 * time.Minute //ResetCodeRepository contains functions to manage tokens. type ResetCodeRepository struct { kvstore kv.KV } //NewResetCodeRepository returns a new instance of a redis or ram backed repository func NewResetCodeRepository(host, port string) (storage.ResetCodeRepository, error) { repo := &ResetCodeRepository{} kvstore, err := kv.New(kv.TypeRedis, fmt.Sprintf("%s:%s", host, port)) if err != nil { return nil, NewErr(err) } repo.kvstore = kvstore return repo, nil } //CreateCode creates a code using redis SET operation. func (tr *ResetCodeRepository) CreateCode(userName string, uuid string) error { err := tr.kvstore.SetExp("reset:"+userName, uuid, expirationDuration) if err != nil { return NewErr(err) } return nil } //DeleteCode deletes a code using redis DEL operation. func (tr *ResetCodeRepository) DeleteCode(userName string) error { ok, err := tr.kvstore.Del("reset:" + userName) if err != nil { return NewErr(err) } if !ok { return NewErr(errors.New("password reset code not found")) } return nil } //GetCode returns a code using redis GET operation. func (tr *ResetCodeRepository) GetCode(userName string) (string, error) { code, err := tr.kvstore.Get("reset:" + userName) if err != nil { return "", NewErr(err) } return code, err }