generated from VLADIMIR/template
add add user method
This commit is contained in:
+17
-4
@@ -2,15 +2,22 @@ package app
|
||||
|
||||
import (
|
||||
"context"
|
||||
"evening_detective_server/internal/services/users_service"
|
||||
proto "evening_detective_server/proto"
|
||||
)
|
||||
|
||||
type server struct {
|
||||
proto.UnsafeEveningDetectiveServerServer
|
||||
|
||||
usersService *users_service.UsersService
|
||||
}
|
||||
|
||||
func NewServer() proto.EveningDetectiveServerServer {
|
||||
return &server{}
|
||||
func NewServer(
|
||||
usersService *users_service.UsersService,
|
||||
) proto.EveningDetectiveServerServer {
|
||||
return &server{
|
||||
usersService: usersService,
|
||||
}
|
||||
}
|
||||
|
||||
func (s *server) Ping(_ context.Context, _ *proto.PingReq) (*proto.PingRsp, error) {
|
||||
@@ -21,6 +28,12 @@ func (s *server) Echo(_ context.Context, req *proto.EchoReq) (*proto.EchoRsp, er
|
||||
return &proto.EchoRsp{Text: req.Text}, nil
|
||||
}
|
||||
|
||||
func (s *server) Signup(context.Context, *proto.SignupReq) (*proto.SignupRsp, error) {
|
||||
panic("unimplemented")
|
||||
func (s *server) Signup(ctx context.Context, signupReq *proto.SignupReq) (*proto.SignupRsp, error) {
|
||||
err := s.usersService.AddUser(ctx, signupReq.Username, signupReq.Email)
|
||||
if err != nil {
|
||||
return &proto.SignupRsp{
|
||||
Error: err.Error(),
|
||||
}, nil
|
||||
}
|
||||
return &proto.SignupRsp{}, nil
|
||||
}
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
package users_repo
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
|
||||
"github.com/jackc/pgx/v5/pgxpool"
|
||||
)
|
||||
|
||||
type UsersRepo struct {
|
||||
pool *pgxpool.Pool
|
||||
}
|
||||
|
||||
func NewUserRepo(pool *pgxpool.Pool) *UsersRepo {
|
||||
return &UsersRepo{
|
||||
pool: pool,
|
||||
}
|
||||
}
|
||||
|
||||
func (s *UsersRepo) AddUser(
|
||||
ctx context.Context,
|
||||
username string,
|
||||
email string,
|
||||
passwoedHash string,
|
||||
role string,
|
||||
) error {
|
||||
tag, err := s.pool.Exec(
|
||||
ctx,
|
||||
`INSERT INTO users (username, email, password_hash, role)
|
||||
SELECT $1, $2, $3, $4
|
||||
WHERE NOT EXISTS (
|
||||
SELECT 1 FROM users
|
||||
WHERE username = $5 OR email = $6
|
||||
)`,
|
||||
username,
|
||||
email,
|
||||
passwoedHash,
|
||||
role,
|
||||
|
||||
username,
|
||||
email,
|
||||
)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if tag.RowsAffected() == 0 {
|
||||
return errors.New("username или email уже используется")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
package users_service
|
||||
|
||||
import (
|
||||
"context"
|
||||
"evening_detective_server/internal/repos/users_repo"
|
||||
)
|
||||
|
||||
type UsersService struct {
|
||||
usersRepo *users_repo.UsersRepo
|
||||
}
|
||||
|
||||
func NewUsersService(usersRepo *users_repo.UsersRepo) *UsersService {
|
||||
return &UsersService{
|
||||
usersRepo: usersRepo,
|
||||
}
|
||||
}
|
||||
|
||||
func (s *UsersService) AddUser(
|
||||
ctx context.Context,
|
||||
username string,
|
||||
email string,
|
||||
) error {
|
||||
err := s.usersRepo.AddUser(
|
||||
ctx,
|
||||
username,
|
||||
email,
|
||||
"hello", // TODO: generate password and send email
|
||||
"user",
|
||||
)
|
||||
return err
|
||||
}
|
||||
Reference in New Issue
Block a user