54 lines
1.9 KiB
Go
54 lines
1.9 KiB
Go
package store
|
|
|
|
import (
|
|
"context"
|
|
model "git.sendico.io/tech/sxchnge/product/twofactor/model"
|
|
db "git.sendico.io/tech/sxchnge/shared/database"
|
|
deps "git.sendico.io/tech/sxchnge/shared/database/dependencies"
|
|
ri "git.sendico.io/tech/sxchnge/shared/database/repository/index"
|
|
"git.sendico.io/tech/sxchnge/shared/database/template"
|
|
mlogger "git.sendico.io/tech/sxchnge/shared/logging"
|
|
"go.mongodb.org/mongo-driver/v2/bson"
|
|
)
|
|
|
|
type Store struct {
|
|
profiles *template.DBImp[*model.Profile]
|
|
challenges *template.DBImp[*model.Record]
|
|
}
|
|
|
|
func Open(logger mlogger.Logger, factory db.Factory) (*Store, error) {
|
|
d, err := deps.ResolveDependencies(factory)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
s := &Store{profiles: template.Create[*model.Profile](logger, "two_factor_profiles", d.Database), challenges: template.Create[*model.Record](logger, "two_factor_challenges", d.Database)}
|
|
retention := int32(86400)
|
|
err = s.challenges.Repository.CreateIndex(&ri.Definition{Name: "two_factor_expiry", Keys: []ri.Key{{Field: "expiresAt", Sort: ri.Asc}}, TTL: &retention})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return s, nil
|
|
}
|
|
func (s *Store) Profile(ctx context.Context, id bson.ObjectID) (*model.Profile, error) {
|
|
p := &model.Profile{}
|
|
err := s.profiles.Get(ctx, id, p)
|
|
return p, err
|
|
}
|
|
func (s *Store) CreateProfile(ctx context.Context, p *model.Profile) error {
|
|
return s.profiles.Create(ctx, p)
|
|
}
|
|
func (s *Store) UpdateProfile(ctx context.Context, p *model.Profile) error {
|
|
return s.profiles.Update(ctx, p)
|
|
}
|
|
func (s *Store) Challenge(ctx context.Context, id bson.ObjectID) (*model.Record, error) {
|
|
r := &model.Record{}
|
|
err := s.challenges.Get(ctx, id, r)
|
|
return r, err
|
|
}
|
|
func (s *Store) CreateChallenge(ctx context.Context, r *model.Record) error {
|
|
return s.challenges.Create(ctx, r)
|
|
}
|
|
func (s *Store) UpdateChallenge(ctx context.Context, r *model.Record) error {
|
|
return s.challenges.Update(ctx, r)
|
|
}
|