122 lines
3.0 KiB
Go
122 lines
3.0 KiB
Go
package unit
|
|
|
|
import (
|
|
"errors"
|
|
"time"
|
|
"wish-list-api/pkg/auth"
|
|
"wish-list-api/pkg/entities"
|
|
|
|
"github.com/golang-jwt/jwt/v5"
|
|
"go.mongodb.org/mongo-driver/bson/primitive"
|
|
)
|
|
|
|
type MockAuthService struct {
|
|
users map[primitive.ObjectID]*entities.User
|
|
tokens map[string]primitive.ObjectID
|
|
}
|
|
|
|
func NewMockAuthService() auth.Service {
|
|
return &MockAuthService{
|
|
users: make(map[primitive.ObjectID]*entities.User),
|
|
tokens: make(map[string]primitive.ObjectID),
|
|
}
|
|
}
|
|
|
|
func (m *MockAuthService) AddMockUser(user *entities.User, token string) {
|
|
m.users[user.ID] = user
|
|
m.tokens[token] = user.ID
|
|
}
|
|
|
|
func (m *MockAuthService) Login(credentials *entities.LoginRequest) (*entities.TokenPair, error) {
|
|
for _, user := range m.users {
|
|
if user.Email == credentials.Email && m.ComparePasswords(user.Password, credentials.Password) {
|
|
token := "mock-token-for-" + user.ID.Hex()
|
|
m.tokens[token] = user.ID
|
|
return &entities.TokenPair{
|
|
AccessToken: token,
|
|
RefreshToken: "refresh-" + token,
|
|
}, nil
|
|
}
|
|
}
|
|
return nil, errors.New("invalid credentials")
|
|
}
|
|
|
|
func (m *MockAuthService) Register(userData *entities.RegisterRequest) (*entities.User, error) {
|
|
for _, existingUser := range m.users {
|
|
if existingUser.Email == userData.Email {
|
|
return nil, errors.New("email already exists")
|
|
}
|
|
}
|
|
|
|
hashedPassword, _ := m.HashPassword(userData.Password)
|
|
user := &entities.User{
|
|
ID: primitive.NewObjectID(),
|
|
Email: userData.Email,
|
|
Password: hashedPassword,
|
|
CreatedAt: time.Now(),
|
|
UpdatedAt: time.Now(),
|
|
}
|
|
|
|
m.users[user.ID] = user
|
|
|
|
return user, nil
|
|
}
|
|
|
|
func (m *MockAuthService) RefreshToken(refreshToken string) (*entities.TokenPair, error) {
|
|
if len(refreshToken) < 8 {
|
|
return nil, errors.New("invalid refresh token")
|
|
}
|
|
|
|
accessToken := refreshToken[8:]
|
|
userID, ok := m.tokens[accessToken]
|
|
if !ok {
|
|
return nil, errors.New("invalid refresh token")
|
|
}
|
|
|
|
newToken := "mock-token-for-" + userID.Hex() + "-refreshed"
|
|
m.tokens[newToken] = userID
|
|
|
|
return &entities.TokenPair{
|
|
AccessToken: newToken,
|
|
RefreshToken: "refresh-" + newToken,
|
|
}, nil
|
|
}
|
|
|
|
func (m *MockAuthService) ValidateToken(tokenString string) (*jwt.Token, error) {
|
|
if len(tokenString) > 7 && tokenString[:7] == "Bearer " {
|
|
tokenString = tokenString[7:]
|
|
}
|
|
|
|
userID, ok := m.tokens[tokenString]
|
|
if !ok {
|
|
return nil, errors.New("invalid token")
|
|
}
|
|
|
|
token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
|
|
"user_id": userID.Hex(),
|
|
"exp": time.Now().Add(time.Hour).Unix(),
|
|
})
|
|
|
|
return token, nil
|
|
}
|
|
|
|
func (m *MockAuthService) GetUserIDFromToken(tokenString string) (string, error) {
|
|
if len(tokenString) > 7 && tokenString[:7] == "Bearer " {
|
|
tokenString = tokenString[7:]
|
|
}
|
|
|
|
userID, ok := m.tokens[tokenString]
|
|
if !ok {
|
|
return "", errors.New("invalid token")
|
|
}
|
|
return userID.Hex(), nil
|
|
}
|
|
|
|
func (m *MockAuthService) HashPassword(password string) (string, error) {
|
|
return "hashed_" + password, nil
|
|
}
|
|
|
|
func (m *MockAuthService) ComparePasswords(hashedPassword string, plainPassword string) bool {
|
|
return hashedPassword == "hashed_"+plainPassword
|
|
}
|