add generate and hash password

This commit is contained in:
2026-06-29 13:26:57 +07:00
parent 18fad25b27
commit 7806061313
5 changed files with 66 additions and 10 deletions
+3 -1
View File
@@ -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")
+5 -4
View File
@@ -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)
}
+19 -3
View File
@@ -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