From cdd9627af379bd96df3bbbba6a761741deea7c78 Mon Sep 17 00:00:00 2001 From: Sergey Chubaryan Date: Fri, 21 Feb 2025 12:08:50 +0300 Subject: [PATCH] add triggers for users table --- cmd/backend/server/handlers/user_create.go | 12 +++--- internal/core/models/user.go | 6 +-- internal/core/repos/user_repo.go | 24 ++++++------ internal/core/services/user_service.go | 10 ++--- sql/01_user.sql | 44 ++++++++++++++++++---- 5 files changed, 63 insertions(+), 33 deletions(-) diff --git a/cmd/backend/server/handlers/user_create.go b/cmd/backend/server/handlers/user_create.go index a65b78f..fed1762 100644 --- a/cmd/backend/server/handlers/user_create.go +++ b/cmd/backend/server/handlers/user_create.go @@ -16,9 +16,9 @@ type createUserInput struct { } type createUserOutput struct { - Id string `json:"id"` - Email string `json:"email"` - Name string `json:"name"` + Id string `json:"id"` + Email string `json:"email"` + FullName string `json:"fullName"` } 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{ - Id: user.Id, - Email: user.Email, - Name: user.Name, + Id: user.Id, + Email: user.Email, + FullName: user.FullName, }, nil }, ) diff --git a/internal/core/models/user.go b/internal/core/models/user.go index dbd6e65..505198f 100644 --- a/internal/core/models/user.go +++ b/internal/core/models/user.go @@ -5,10 +5,10 @@ type UserDTO struct { Email string EmailVerified bool Secret string - Name string + FullName string } type UserUpdateDTO struct { - Secret string - Name string + Secret string + FullName string } diff --git a/internal/core/repos/user_repo.go b/internal/core/repos/user_repo.go index fe4936e..b98af47 100644 --- a/internal/core/repos/user_repo.go +++ b/internal/core/repos/user_repo.go @@ -38,8 +38,8 @@ func (u *userRepo) CreateUser(ctx context.Context, dto models.UserDTO) (*models. _, span := u.tracer.Start(ctx, "postgres::CreateUser") defer span.End() - query := `insert into users (email, secret, name) values ($1, $2, $3) returning id;` - row := u.db.QueryRowContext(ctx, query, dto.Email, dto.Secret, dto.Name) + 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.FullName) id := "" 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{ - Id: id, - Email: dto.Email, - Secret: dto.Secret, - Name: dto.Name, + Id: id, + Email: dto.Email, + Secret: dto.Secret, + FullName: dto.FullName, }, nil } @@ -58,8 +58,8 @@ func (u *userRepo) UpdateUser(ctx context.Context, userId string, dto models.Use _, span := u.tracer.Start(ctx, "postgres::UpdateUser") defer span.End() - query := `update users set secret=$1, name=$2 where id = $3;` - _, err := u.db.ExecContext(ctx, query, dto.Secret, dto.Name, userId) + query := `update users set secret=$1, full_name=$2 where id = $3;` + _, err := u.db.ExecContext(ctx, query, dto.Secret, dto.FullName, userId) if err != nil { return err } @@ -84,11 +84,11 @@ func (u *userRepo) GetUserById(ctx context.Context, id string) (*models.UserDTO, _, span := u.tracer.Start(ctx, "postgres::GetUserById") 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) 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 { 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") 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) 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 { return dto, nil } diff --git a/internal/core/services/user_service.go b/internal/core/services/user_service.go index 6a47cf3..2305726 100644 --- a/internal/core/services/user_service.go +++ b/internal/core/services/user_service.go @@ -84,9 +84,9 @@ func (u *userService) CreateUser(ctx context.Context, params UserCreateParams) ( } user := models.UserDTO{ - Email: params.Email, - Secret: string(secret), - Name: params.Name, + Email: params.Email, + Secret: string(secret), + FullName: params.Name, } 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{ - Secret: newSecret, - Name: user.Name, + Secret: newSecret, + FullName: user.FullName, }); err != nil { return err } diff --git a/sql/01_user.sql b/sql/01_user.sql index 740201d..6d3d73b 100644 --- a/sql/01_user.sql +++ b/sql/01_user.sql @@ -1,11 +1,41 @@ create table if not exists users ( - id int generated always as identity, - email text unique not null, - secret text not null, - name text not null, + id integer primary key generated always as identity, + email varchar(256) unique not null, + secret varchar(256) not null, + full_name varchar(256) not null, email_verified boolean not null default false, - - primary key (id) + created_at timestamp, + updated_at timestamp ); -create index if not exists users_email_idx on users(email); \ No newline at end of file +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(); \ No newline at end of file