refactor: update api and client to reference humanIds

This commit is contained in:
talksik
2026-03-24 19:08:51 -07:00
parent 3bf3f16be7
commit 57a1cbc696
24 changed files with 666 additions and 416 deletions
+28 -12
View File
@@ -2,6 +2,7 @@ package auth
import (
"context"
"encoding/json"
"errors"
"fmt"
"log/slog"
@@ -37,14 +38,20 @@ func newSessionToken() (sessionToken, error) {
return typeid.New[sessionToken]()
}
type Session struct {
Email string `json:"email"`
HumanId string `json:"human_id"`
}
type AuthService interface {
// RequestSignInCode generates a code and emails it to the provided email.
// To retrieve a session, client must verify with VerifySignInCode.
RequestSignInCode(ctx context.Context, email string) error
// VerifySignInCode returns ErrInvalidCode if incorrect code
VerifySignInCode(ctx context.Context, email, code string) (sessionToken string, err error)
// VerifySignInCode returns ErrInvalidCode if incorrect code, otherwise creates a session.
// humanId is stored in the session alongside the email.
VerifySignInCode(ctx context.Context, email, code, humanId string) (sessionToken string, err error)
// GetSession returns ErrSessionNotFound if no valid session
GetSession(ctx context.Context, sessionToken string) (email string, err error)
GetSession(ctx context.Context, sessionToken string) (*Session, error)
// ExtendSession returns ErrSessionNotFound if no valid session
ExtendSession(ctx context.Context, sessionToken string) error
SignOut(ctx context.Context, sessionToken string) error
@@ -111,7 +118,7 @@ func (a *authServiceImpl) RequestSignInCode(ctx context.Context, email string) e
return nil
}
func (a *authServiceImpl) VerifySignInCode(ctx context.Context, email, code string) (string, error) {
func (a *authServiceImpl) VerifySignInCode(ctx context.Context, email, code, humanId string) (string, error) {
formattedEmail, err := utils.NormalizeEmail(email)
if err != nil {
return "", fmt.Errorf("invalid email: %w", err)
@@ -134,7 +141,7 @@ func (a *authServiceImpl) VerifySignInCode(ctx context.Context, email, code stri
slog.Error("error deleting code from redis", "error", err)
}
token, err := a.createSession(ctx, formattedEmail)
token, err := a.createSession(ctx, formattedEmail, humanId)
if err != nil {
return "", err
}
@@ -142,16 +149,19 @@ func (a *authServiceImpl) VerifySignInCode(ctx context.Context, email, code stri
return token, nil
}
func (a *authServiceImpl) GetSession(ctx context.Context, token string) (string, error) {
email, err := a.redisClient.Get(ctx, token).Result()
func (a *authServiceImpl) GetSession(ctx context.Context, token string) (*Session, error) {
sessionInfo, err := a.redisClient.Get(ctx, token).Result()
if err != nil {
if errors.Is(err, redis.Nil) {
return "", ErrSessionNotFound
return nil, ErrSessionNotFound
}
return "", fmt.Errorf("error getting session: %w", err)
return nil, fmt.Errorf("error getting session: %w", err)
}
return email, nil
var session Session
err = json.Unmarshal([]byte(sessionInfo), &session)
return &session, nil
}
func (a *authServiceImpl) ExtendSession(ctx context.Context, token string) error {
@@ -180,7 +190,7 @@ func (a *authServiceImpl) SignOut(ctx context.Context, token string) error {
return nil
}
func (a *authServiceImpl) createSession(ctx context.Context, email string) (string, error) {
func (a *authServiceImpl) createSession(ctx context.Context, email, humanId string) (string, error) {
formattedEmail, err := utils.NormalizeEmail(email)
if err != nil {
return "", fmt.Errorf("invalid email: %w", err)
@@ -191,7 +201,13 @@ func (a *authServiceImpl) createSession(ctx context.Context, email string) (stri
return "", fmt.Errorf("error generating session token: %w", err)
}
if err := a.redisClient.Set(ctx, token.String(), formattedEmail, sessionExpiry).Err(); err != nil {
session := Session{Email: formattedEmail, HumanId: humanId}
data, err := json.Marshal(session)
if err != nil {
return "", fmt.Errorf("error marshaling session: %w", err)
}
if err := a.redisClient.Set(ctx, token.String(), data, sessionExpiry).Err(); err != nil {
return "", fmt.Errorf("error storing session: %w", err)
}