131 lines
3.2 KiB
Go
131 lines
3.2 KiB
Go
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
|
|
}
|