1
This commit is contained in:
130
internal/database/postgres/profile.go
Normal file
130
internal/database/postgres/profile.go
Normal file
@@ -0,0 +1,130 @@
|
||||
package pgdb
|
||||
|
||||
import (
|
||||
"context"
|
||||
"database/sql"
|
||||
"errors"
|
||||
"fmt"
|
||||
|
||||
dberrors "git-molva.ru/Molva/molva-backend/services/api_gateway/internal/database/errors"
|
||||
dbtypes "git-molva.ru/Molva/molva-backend/services/api_gateway/internal/database/types"
|
||||
"github.com/Masterminds/squirrel"
|
||||
"github.com/lib/pq"
|
||||
)
|
||||
|
||||
func (c *client) GetProfileById(
|
||||
ctx context.Context,
|
||||
request *dbtypes.ProfileGetRequest,
|
||||
) (*dbtypes.ProfileGetResponse, error) {
|
||||
if request == nil {
|
||||
return nil, fmt.Errorf("%w: request is nil", dberrors.ErrBadRequest)
|
||||
}
|
||||
|
||||
var (
|
||||
psql = squirrel.StatementBuilder.PlaceholderFormat(squirrel.Dollar)
|
||||
|
||||
usersTable = fmt.Sprintf("%s.%s", c.config.Schema, UsersTableName)
|
||||
)
|
||||
|
||||
getProfile := psql.Select(
|
||||
"uid", "name", "phone", "email",
|
||||
).From(usersTable).
|
||||
Where(squirrel.Eq{"uid": request.Id})
|
||||
|
||||
query, args, err := getProfile.ToSql()
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("%w: error building get profile query: %v", dberrors.ErrInternal, err)
|
||||
}
|
||||
|
||||
row := c.db.QueryRowContext(ctx, query, args...)
|
||||
|
||||
var (
|
||||
name, phoneNumber, email sql.NullString
|
||||
profile dbtypes.Profile
|
||||
)
|
||||
|
||||
if err := row.Scan(&profile.Id, &name, &phoneNumber, &email); err != nil {
|
||||
if errors.Is(err, sql.ErrNoRows) {
|
||||
return nil, dberrors.ErrNotFound
|
||||
}
|
||||
|
||||
return nil, fmt.Errorf("%w: error scanning row: %v", dberrors.ErrInternal, err)
|
||||
}
|
||||
|
||||
if name.Valid {
|
||||
profile.Name = name.String
|
||||
}
|
||||
|
||||
if phoneNumber.Valid {
|
||||
profile.PhoneNumber = phoneNumber.String
|
||||
}
|
||||
|
||||
if email.Valid {
|
||||
profile.Email = email.String
|
||||
}
|
||||
|
||||
return &dbtypes.ProfileGetResponse{
|
||||
Profile: &profile,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (c *client) UpdateProfile(
|
||||
ctx context.Context,
|
||||
request *dbtypes.ProfileUpdateRequest,
|
||||
) (*dbtypes.ProfileUpdateResponse, error) {
|
||||
if request == nil {
|
||||
return nil, fmt.Errorf("%w: request is nil", dberrors.ErrBadRequest)
|
||||
}
|
||||
|
||||
if request.Name == nil && request.PhoneNumber == nil && request.Email == nil {
|
||||
return nil, fmt.Errorf("%w: nothing to update", dberrors.ErrBadRequest)
|
||||
}
|
||||
|
||||
var (
|
||||
psql = squirrel.StatementBuilder.PlaceholderFormat(squirrel.Dollar)
|
||||
|
||||
usersTable = fmt.Sprintf("%s.%s", c.config.Schema, UsersTableName)
|
||||
)
|
||||
|
||||
updateProfile := psql.Update(usersTable).
|
||||
Where(squirrel.Eq{"uid": request.Id})
|
||||
|
||||
if request.Name != nil {
|
||||
updateProfile = updateProfile.Set("name", *request.Name)
|
||||
}
|
||||
|
||||
if request.PhoneNumber != nil {
|
||||
updateProfile = updateProfile.Set("phone", *request.PhoneNumber)
|
||||
}
|
||||
|
||||
if request.Email != nil {
|
||||
updateProfile = updateProfile.Set("email", *request.Email)
|
||||
}
|
||||
|
||||
query, args, err := updateProfile.ToSql()
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("%w: error building update profile query: %v", dberrors.ErrInternal, err)
|
||||
}
|
||||
|
||||
res, err := c.db.ExecContext(ctx, query, args...)
|
||||
if err != nil {
|
||||
if pqErr, ok := err.(*pq.Error); ok {
|
||||
if pqErr.Code == PGErrUniqueViolation {
|
||||
return nil, dberrors.ErrConflict
|
||||
}
|
||||
}
|
||||
|
||||
return nil, fmt.Errorf("%w: error executing update profile query: %v", dberrors.ErrInternal, err)
|
||||
}
|
||||
|
||||
rowsAffected, err := res.RowsAffected()
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("%w: error getting rows affected for update profile query: %v", dberrors.ErrInternal, err)
|
||||
}
|
||||
|
||||
if rowsAffected == 0 {
|
||||
return nil, dberrors.ErrInternal
|
||||
}
|
||||
|
||||
return &dbtypes.ProfileUpdateResponse{}, nil
|
||||
}
|
Reference in New Issue
Block a user