package storage import ( "backend/internal/domain" "backend/internal/repository/storage/types" "context" "github.com/google/uuid" "gorm.io/gorm" ) type UserRepository struct { db *gorm.DB } func NewUserRepository(db *gorm.DB) domain.UserRepo { return &UserRepository{ db: db, } } func (r *UserRepository) Create(ctx context.Context, user *domain.User) error { model := types.CastUserToStorage(*user) if err := r.db.WithContext(ctx).Create(model).Error; err != nil { return err } *user = *types.CastUserToDomain(*model) return nil } func (r *UserRepository) GetByID(ctx context.Context, id uuid.UUID) (*domain.User, error) { var user types.User if err := r.db.WithContext(ctx).First(&user, "id = ?", id).Error; err != nil { return nil, err } return types.CastUserToDomain(user), nil } func (r *UserRepository) GetByPhone(ctx context.Context, phone string) (*domain.User, error) { var user types.User if err := r.db.WithContext(ctx).First(&user, "phone = ?", phone).Error; err != nil { return nil, err } return types.CastUserToDomain(user), nil } func (r *UserRepository) Update(ctx context.Context, user *domain.User) error { userModel := types.CastUserToStorage(*user) return r.db.WithContext(ctx).Save(&userModel).Error } func (r *UserRepository) Delete(ctx context.Context, id uuid.UUID) error { return r.db.WithContext(ctx).Delete(&types.User{}, "id = ?", id).Error } func (r *UserRepository) GetByPubKey(ctx context.Context, pubKey string) (*domain.User, error) { var user types.User if err := r.db.WithContext(ctx).First(&user, "pub_key = ?", pubKey).Error; err != nil { return nil, err } return types.CastUserToDomain(user), nil } func (r *UserRepository) GetOrCreateUserByPubKey(ctx context.Context, pubKey string) (*domain.User, error) { var user types.User err := r.db.WithContext(ctx).First(&user, "pub_key = ?", pubKey).Error if err == nil { return types.CastUserToDomain(user), nil } if err != gorm.ErrRecordNotFound { return nil, err } user = types.User{ PubKey: pubKey, } if err := r.db.WithContext(ctx).Create(&user).Error; err != nil { return nil, err } return types.CastUserToDomain(user), nil }