generated from VLADIMIR/template
add generate and hash password
This commit is contained in:
@@ -4,6 +4,7 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
_ "embed"
|
_ "embed"
|
||||||
"evening_detective_server/internal/app"
|
"evening_detective_server/internal/app"
|
||||||
|
"evening_detective_server/internal/modules/password_generator"
|
||||||
"evening_detective_server/internal/repos/users_repo"
|
"evening_detective_server/internal/repos/users_repo"
|
||||||
"evening_detective_server/internal/services/users_service"
|
"evening_detective_server/internal/services/users_service"
|
||||||
proto "evening_detective_server/proto"
|
proto "evening_detective_server/proto"
|
||||||
@@ -41,7 +42,8 @@ func main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
usersRepo := users_repo.NewUserRepo(dbpool)
|
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
|
// Create a listener on TCP port
|
||||||
lis, err := net.Listen("tcp", ":8080")
|
lis, err := net.Listen("tcp", ":8080")
|
||||||
|
|||||||
@@ -18,9 +18,10 @@ require (
|
|||||||
github.com/jackc/puddle/v2 v2.2.2 // indirect
|
github.com/jackc/puddle/v2 v2.2.2 // indirect
|
||||||
github.com/joho/godotenv v1.5.1
|
github.com/joho/godotenv v1.5.1
|
||||||
github.com/swaggest/swgui v1.8.8
|
github.com/swaggest/swgui v1.8.8
|
||||||
golang.org/x/net v0.23.0 // indirect
|
golang.org/x/crypto v0.53.0
|
||||||
golang.org/x/sync v0.17.0 // indirect
|
golang.org/x/net v0.55.0 // indirect
|
||||||
golang.org/x/sys v0.18.0 // indirect
|
golang.org/x/sync v0.21.0 // indirect
|
||||||
golang.org/x/text v0.29.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
|
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 (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"evening_detective_server/internal/modules/password_generator"
|
||||||
"evening_detective_server/internal/repos/users_repo"
|
"evening_detective_server/internal/repos/users_repo"
|
||||||
|
|
||||||
|
"golang.org/x/crypto/bcrypt"
|
||||||
)
|
)
|
||||||
|
|
||||||
type UsersService struct {
|
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{
|
return &UsersService{
|
||||||
usersRepo: usersRepo,
|
usersRepo: usersRepo,
|
||||||
|
passwordGenerator: passwordGenerator,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -20,11 +28,19 @@ func (s *UsersService) AddUser(
|
|||||||
username string,
|
username string,
|
||||||
email string,
|
email string,
|
||||||
) error {
|
) 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,
|
ctx,
|
||||||
username,
|
username,
|
||||||
email,
|
email,
|
||||||
"hello", // TODO: generate password and send email
|
string(hashedPassword),
|
||||||
"user",
|
"user",
|
||||||
)
|
)
|
||||||
return err
|
return err
|
||||||
|
|||||||
Reference in New Issue
Block a user