src.dualinventive.com/go/authentication-service/internal/storage/redis/codeRepository.go

63 lines
1.4 KiB
Go

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
}