add triggers for users table

This commit is contained in:
Sergey Chubaryan 2025-02-21 12:08:50 +03:00
parent abf0ff77f0
commit cdd9627af3
5 changed files with 63 additions and 33 deletions

View File

@ -16,9 +16,9 @@ type createUserInput struct {
} }
type createUserOutput struct { type createUserOutput struct {
Id string `json:"id"` Id string `json:"id"`
Email string `json:"email"` Email string `json:"email"`
Name string `json:"name"` FullName string `json:"fullName"`
} }
func NewUserCreateHandler(log logger.Logger, userService services.UserService) gin.HandlerFunc { func NewUserCreateHandler(log logger.Logger, userService services.UserService) gin.HandlerFunc {
@ -37,9 +37,9 @@ func NewUserCreateHandler(log logger.Logger, userService services.UserService) g
} }
return createUserOutput{ return createUserOutput{
Id: user.Id, Id: user.Id,
Email: user.Email, Email: user.Email,
Name: user.Name, FullName: user.FullName,
}, nil }, nil
}, },
) )

View File

@ -5,10 +5,10 @@ type UserDTO struct {
Email string Email string
EmailVerified bool EmailVerified bool
Secret string Secret string
Name string FullName string
} }
type UserUpdateDTO struct { type UserUpdateDTO struct {
Secret string Secret string
Name string FullName string
} }

View File

@ -38,8 +38,8 @@ func (u *userRepo) CreateUser(ctx context.Context, dto models.UserDTO) (*models.
_, span := u.tracer.Start(ctx, "postgres::CreateUser") _, span := u.tracer.Start(ctx, "postgres::CreateUser")
defer span.End() defer span.End()
query := `insert into users (email, secret, name) values ($1, $2, $3) returning id;` query := `insert into users (email, secret, full_name) values ($1, $2, $3) returning id;`
row := u.db.QueryRowContext(ctx, query, dto.Email, dto.Secret, dto.Name) row := u.db.QueryRowContext(ctx, query, dto.Email, dto.Secret, dto.FullName)
id := "" id := ""
if err := row.Scan(&id); err != nil { if err := row.Scan(&id); err != nil {
@ -47,10 +47,10 @@ func (u *userRepo) CreateUser(ctx context.Context, dto models.UserDTO) (*models.
} }
return &models.UserDTO{ return &models.UserDTO{
Id: id, Id: id,
Email: dto.Email, Email: dto.Email,
Secret: dto.Secret, Secret: dto.Secret,
Name: dto.Name, FullName: dto.FullName,
}, nil }, nil
} }
@ -58,8 +58,8 @@ func (u *userRepo) UpdateUser(ctx context.Context, userId string, dto models.Use
_, span := u.tracer.Start(ctx, "postgres::UpdateUser") _, span := u.tracer.Start(ctx, "postgres::UpdateUser")
defer span.End() defer span.End()
query := `update users set secret=$1, name=$2 where id = $3;` query := `update users set secret=$1, full_name=$2 where id = $3;`
_, err := u.db.ExecContext(ctx, query, dto.Secret, dto.Name, userId) _, err := u.db.ExecContext(ctx, query, dto.Secret, dto.FullName, userId)
if err != nil { if err != nil {
return err return err
} }
@ -84,11 +84,11 @@ func (u *userRepo) GetUserById(ctx context.Context, id string) (*models.UserDTO,
_, span := u.tracer.Start(ctx, "postgres::GetUserById") _, span := u.tracer.Start(ctx, "postgres::GetUserById")
defer span.End() defer span.End()
query := `select id, email, secret, name, email_verified from users where id = $1;` query := `select id, email, secret, full_name, email_verified from users where id = $1;`
row := u.db.QueryRowContext(ctx, query, id) row := u.db.QueryRowContext(ctx, query, id)
dto := &models.UserDTO{} dto := &models.UserDTO{}
err := row.Scan(&dto.Id, &dto.Email, &dto.Secret, &dto.Name, &dto.EmailVerified) err := row.Scan(&dto.Id, &dto.Email, &dto.Secret, &dto.FullName, &dto.EmailVerified)
if err == nil { if err == nil {
return dto, nil return dto, nil
} }
@ -103,11 +103,11 @@ func (u *userRepo) GetUserByEmail(ctx context.Context, login string) (*models.Us
_, span := u.tracer.Start(ctx, "postgres::GetUserByEmail") _, span := u.tracer.Start(ctx, "postgres::GetUserByEmail")
defer span.End() defer span.End()
query := `select id, email, secret, name, email_verified from users where email = $1;` query := `select id, email, secret, full_name, email_verified from users where email = $1;`
row := u.db.QueryRowContext(ctx, query, login) row := u.db.QueryRowContext(ctx, query, login)
dto := &models.UserDTO{} dto := &models.UserDTO{}
err := row.Scan(&dto.Id, &dto.Email, &dto.Secret, &dto.Name, &dto.EmailVerified) err := row.Scan(&dto.Id, &dto.Email, &dto.Secret, &dto.FullName, &dto.EmailVerified)
if err == nil { if err == nil {
return dto, nil return dto, nil
} }

View File

@ -84,9 +84,9 @@ func (u *userService) CreateUser(ctx context.Context, params UserCreateParams) (
} }
user := models.UserDTO{ user := models.UserDTO{
Email: params.Email, Email: params.Email,
Secret: string(secret), Secret: string(secret),
Name: params.Name, FullName: params.Name,
} }
result, err := u.deps.UserRepo.CreateUser(ctx, user) result, err := u.deps.UserRepo.CreateUser(ctx, user)
@ -257,8 +257,8 @@ func (u *userService) updatePassword(ctx context.Context, user models.UserDTO, n
} }
if err = u.deps.UserRepo.UpdateUser(ctx, user.Id, models.UserUpdateDTO{ if err = u.deps.UserRepo.UpdateUser(ctx, user.Id, models.UserUpdateDTO{
Secret: newSecret, Secret: newSecret,
Name: user.Name, FullName: user.FullName,
}); err != nil { }); err != nil {
return err return err
} }

View File

@ -1,11 +1,41 @@
create table if not exists users ( create table if not exists users (
id int generated always as identity, id integer primary key generated always as identity,
email text unique not null, email varchar(256) unique not null,
secret text not null, secret varchar(256) not null,
name text not null, full_name varchar(256) not null,
email_verified boolean not null default false, email_verified boolean not null default false,
created_at timestamp,
primary key (id) updated_at timestamp
); );
create index if not exists users_email_idx on users(email); create index if not exists users_email_idx on users(email);
create or replace function set_created_at()
returns trigger as $$
begin
new.created_at = now();
new.updated_at = now();
return new;
end;
$$ language plpgsql;
create or replace trigger on_user_created
before insert on users
for each row
execute function set_created_at();
create or replace function set_updated_at()
returns trigger as $$
begin
if new is distinct from old then
new.updated_at = now();
end if;
return new;
end;
$$ language plpgsql;
create or replace trigger on_user_updated
before update on users
for each row
when(new is distinct from old)
execute function set_updated_at();