Files
Alex Shevchuk d84487d238 1
2025-08-18 17:12:04 +03:00

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
}