generated from VLADIMIR/template
add generate and hash password
This commit is contained in:
@@ -4,6 +4,7 @@ import (
|
||||
"context"
|
||||
_ "embed"
|
||||
"evening_detective_server/internal/app"
|
||||
"evening_detective_server/internal/modules/password_generator"
|
||||
"evening_detective_server/internal/repos/users_repo"
|
||||
"evening_detective_server/internal/services/users_service"
|
||||
proto "evening_detective_server/proto"
|
||||
@@ -41,7 +42,8 @@ func main() {
|
||||
}
|
||||
|
||||
usersRepo := users_repo.NewUserRepo(dbpool)
|
||||
usersService := users_service.NewUsersService(usersRepo)
|
||||
passwordGenerator := password_generator.NewGenerator(8)
|
||||
usersService := users_service.NewUsersService(usersRepo, passwordGenerator)
|
||||
|
||||
// Create a listener on TCP port
|
||||
lis, err := net.Listen("tcp", ":8080")
|
||||
|
||||
@@ -18,9 +18,10 @@ require (
|
||||
github.com/jackc/puddle/v2 v2.2.2 // indirect
|
||||
github.com/joho/godotenv v1.5.1
|
||||
github.com/swaggest/swgui v1.8.8
|
||||
golang.org/x/net v0.23.0 // indirect
|
||||
golang.org/x/sync v0.17.0 // indirect
|
||||
golang.org/x/sys v0.18.0 // indirect
|
||||
golang.org/x/text v0.29.0 // indirect
|
||||
golang.org/x/crypto v0.53.0
|
||||
golang.org/x/net v0.55.0 // indirect
|
||||
golang.org/x/sync v0.21.0 // indirect
|
||||
golang.org/x/sys v0.46.0 // indirect
|
||||
golang.org/x/text v0.38.0 // indirect
|
||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20240513163218-0867130af1f8 // indirect
|
||||
)
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
package password_generator
|
||||
|
||||
import (
|
||||
"crypto/rand"
|
||||
"math/big"
|
||||
)
|
||||
|
||||
const (
|
||||
charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
|
||||
)
|
||||
|
||||
type generator struct {
|
||||
length int
|
||||
}
|
||||
|
||||
func NewGenerator(length int) IPasswordGenerator {
|
||||
return &generator{
|
||||
length: length,
|
||||
}
|
||||
}
|
||||
|
||||
func (g *generator) Generate() (string, error) {
|
||||
password := make([]byte, g.length)
|
||||
for i := range password {
|
||||
num, err := rand.Int(rand.Reader, big.NewInt(int64(len(charset))))
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
password[i] = charset[num.Int64()]
|
||||
}
|
||||
return string(password), nil
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
package password_generator
|
||||
|
||||
type IPasswordGenerator interface {
|
||||
Generate() (string, error)
|
||||
}
|
||||
@@ -2,16 +2,24 @@ package users_service
|
||||
|
||||
import (
|
||||
"context"
|
||||
"evening_detective_server/internal/modules/password_generator"
|
||||
"evening_detective_server/internal/repos/users_repo"
|
||||
|
||||
"golang.org/x/crypto/bcrypt"
|
||||
)
|
||||
|
||||
type UsersService struct {
|
||||
usersRepo *users_repo.UsersRepo
|
||||
usersRepo *users_repo.UsersRepo
|
||||
passwordGenerator password_generator.IPasswordGenerator
|
||||
}
|
||||
|
||||
func NewUsersService(usersRepo *users_repo.UsersRepo) *UsersService {
|
||||
func NewUsersService(
|
||||
usersRepo *users_repo.UsersRepo,
|
||||
passwordGenerator password_generator.IPasswordGenerator,
|
||||
) *UsersService {
|
||||
return &UsersService{
|
||||
usersRepo: usersRepo,
|
||||
usersRepo: usersRepo,
|
||||
passwordGenerator: passwordGenerator,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,11 +28,19 @@ func (s *UsersService) AddUser(
|
||||
username string,
|
||||
email string,
|
||||
) error {
|
||||
err := s.usersRepo.AddUser(
|
||||
password, err := s.passwordGenerator.Generate()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
hashedPassword, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
err = s.usersRepo.AddUser(
|
||||
ctx,
|
||||
username,
|
||||
email,
|
||||
"hello", // TODO: generate password and send email
|
||||
string(hashedPassword),
|
||||
"user",
|
||||
)
|
||||
return err
|
||||
|
||||
Reference in New Issue
Block a user