From 39b89fc404e1a6b715bf363ff788a2036cda4efa Mon Sep 17 00:00:00 2001 From: yash Date: Wed, 25 Feb 2026 20:55:10 +0300 Subject: [PATCH] user usecases & repository methods --- internal/entities/user.go | 9 +++++ internal/repository/postgresql/user.go | 46 ++++++++++++++++++++++++++ internal/repository/repository.go | 13 ++++++++ internal/usecase/usecase.go | 19 +++++++++++ internal/usecase/user.go | 38 +++++++++++++++++++++ 5 files changed, 125 insertions(+) create mode 100644 internal/entities/user.go create mode 100644 internal/repository/repository.go create mode 100644 internal/usecase/usecase.go create mode 100644 internal/usecase/user.go diff --git a/internal/entities/user.go b/internal/entities/user.go new file mode 100644 index 0000000..0d91e98 --- /dev/null +++ b/internal/entities/user.go @@ -0,0 +1,9 @@ +package entities + +type UserID string +type TelegramID int64 + +type User struct { + ID UserID + TelegramID TelegramID +} diff --git a/internal/repository/postgresql/user.go b/internal/repository/postgresql/user.go index 4e9a54a..d548d4c 100644 --- a/internal/repository/postgresql/user.go +++ b/internal/repository/postgresql/user.go @@ -1 +1,47 @@ package postgresql + +import ( + "context" + "fmt" + + "gitea.computernetthings.ru/yash/crypto_alert_bot/internal/entities" +) + +const saveUserQuery = "insert into users(telegram_id) values ($1) returning id" + +func (p *Postgresql) SaveUser(ctx context.Context, user *entities.User) (entities.UserID, error) { + var id entities.UserID + + err := p.db.QueryRow(ctx, saveUserQuery, user.TelegramID).Scan(&id) + if err != nil { + return "", fmt.Errorf("failed to exec saveUserQuery: %w", err) + } + + return id, nil +} + +const getUserByIDQuery = "select id, telegram_id from users where id = $1" + +func (p *Postgresql) UserByID(ctx context.Context, id entities.UserID) (*entities.User, error) { + var user entities.User + + err := p.db.QueryRow(ctx, getUserByIDQuery, id).Scan(&user.ID, &user.TelegramID) + if err != nil { + return nil, fmt.Errorf("failed to exec getUserByIDQuery: %w", err) + } + + return &user, nil +} + +const getUserByTelegramIDQuery = "select id, telegram_id from users where telegram_id = $1" + +func (p *Postgresql) UserByTelegramID(ctx context.Context, tgID entities.TelegramID) (*entities.User, error) { + var user entities.User + + err := p.db.QueryRow(ctx, getUserByTelegramIDQuery, tgID).Scan(&user.ID, &user.TelegramID) + if err != nil { + return nil, fmt.Errorf("failed to exec getUserByTelegramIDQuery: %w", err) + } + + return &user, nil +} diff --git a/internal/repository/repository.go b/internal/repository/repository.go new file mode 100644 index 0000000..dd8d9c5 --- /dev/null +++ b/internal/repository/repository.go @@ -0,0 +1,13 @@ +package repository + +import ( + "context" + + "gitea.computernetthings.ru/yash/crypto_alert_bot/internal/entities" +) + +type Storage interface { + SaveUser(ctx context.Context, user *entities.User) (entities.UserID, error) + UserByID(ctx context.Context, id entities.UserID) (*entities.User, error) + UserByTelegramID(ctx context.Context, tgID entities.TelegramID) (*entities.User, error) +} diff --git a/internal/usecase/usecase.go b/internal/usecase/usecase.go new file mode 100644 index 0000000..dd03a22 --- /dev/null +++ b/internal/usecase/usecase.go @@ -0,0 +1,19 @@ +package usecase + +import ( + "log/slog" + + "gitea.computernetthings.ru/yash/crypto_alert_bot/internal/repository" +) + +type Usecase struct { + log *slog.Logger + storage repository.Storage +} + +func New(log *slog.Logger, storage repository.Storage) *Usecase { + return &Usecase{ + log: log, + storage: storage, + } +} diff --git a/internal/usecase/user.go b/internal/usecase/user.go new file mode 100644 index 0000000..a48d12f --- /dev/null +++ b/internal/usecase/user.go @@ -0,0 +1,38 @@ +package usecase + +import ( + "context" + "fmt" + + "gitea.computernetthings.ru/yash/crypto_alert_bot/internal/entities" +) + +func (uc *Usecase) RegisterNewUser(ctx context.Context, user *entities.User) error { + _, err := uc.storage.SaveUser(ctx, user) + if err != nil { + uc.log.Error("failed to register new user", "user", user, "err", err) + return fmt.Errorf("failed to register new user: %w", err) + } + + return nil +} + +func (uc *Usecase) UserByID(ctx context.Context, userID entities.UserID) (*entities.User, error) { + user, err := uc.storage.UserByID(ctx, userID) + if err != nil { + uc.log.Error("failed to get user by id", "user_id", userID, "err", err) + return nil, fmt.Errorf("failed to get user by id: %w", err) + } + + return user, nil +} + +func (uc *Usecase) UserByTgID(ctx context.Context, telegramID entities.TelegramID) (*entities.User, error) { + user, err := uc.storage.UserByTelegramID(ctx, telegramID) + if err != nil { + uc.log.Error("failed to get user by telegram id", "tg_id", telegramID, "err", err) + return nil, fmt.Errorf("failed to get user by telegram id: %w", err) + } + + return user, nil +}