Files
rmser/internal/infrastructure/repository/account/postgres.go
SERTY 4e4571b3db Настройки работают
Иерархия групп работает
Полностью завязано на пользователя и серверы
2025-12-18 07:21:31 +03:00

120 lines
3.6 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package account
import (
"rmser/internal/domain/account"
"github.com/google/uuid"
"gorm.io/gorm"
"gorm.io/gorm/clause"
)
type pgRepository struct {
db *gorm.DB
}
func NewRepository(db *gorm.DB) account.Repository {
return &pgRepository{db: db}
}
// GetOrCreateUser находит пользователя или создает нового
func (r *pgRepository) GetOrCreateUser(telegramID int64, username, first, last string) (*account.User, error) {
var user account.User
err := r.db.Where("telegram_id = ?", telegramID).First(&user).Error
if err != nil {
if err == gorm.ErrRecordNotFound {
// Создаем
newUser := account.User{
TelegramID: telegramID,
Username: username,
FirstName: first,
LastName: last,
}
if err := r.db.Create(&newUser).Error; err != nil {
return nil, err
}
return &newUser, nil
}
return nil, err
}
// Обновляем инфо, если изменилось (опционально)
if user.Username != username || user.FirstName != first {
user.Username = username
user.FirstName = first
user.LastName = last
r.db.Save(&user)
}
return &user, nil
}
func (r *pgRepository) GetUserByTelegramID(telegramID int64) (*account.User, error) {
var user account.User
// Preload Servers чтобы сразу видеть подключения
err := r.db.Preload("Servers").Where("telegram_id = ?", telegramID).First(&user).Error
if err != nil {
return nil, err
}
return &user, nil
}
func (r *pgRepository) SaveServer(server *account.RMSServer) error {
return r.db.Clauses(clause.OnConflict{
Columns: []clause.Column{{Name: "id"}},
UpdateAll: true,
}).Create(server).Error
}
// SetActiveServer делает указанный сервер активным, а остальные — неактивными
func (r *pgRepository) SetActiveServer(userID, serverID uuid.UUID) error {
return r.db.Transaction(func(tx *gorm.DB) error {
// 1. Сбрасываем флаг у всех серверов пользователя
if err := tx.Model(&account.RMSServer{}).
Where("user_id = ?", userID).
Update("is_active", false).Error; err != nil {
return err
}
// 2. Ставим флаг целевому серверу
if err := tx.Model(&account.RMSServer{}).
Where("id = ? AND user_id = ?", serverID, userID).
Update("is_active", true).Error; err != nil {
return err
}
return nil
})
}
func (r *pgRepository) GetActiveServer(userID uuid.UUID) (*account.RMSServer, error) {
var server account.RMSServer
// Берем первый активный сервер. В будущем можно добавить поле IsSelected
err := r.db.Where("user_id = ? AND is_active = ?", userID, true).First(&server).Error
if err != nil {
if err == gorm.ErrRecordNotFound {
return nil, nil // Нет серверов
}
return nil, err
}
return &server, nil
}
// GetAllServers возвращает ВСЕ серверы пользователя, чтобы можно было переключаться
func (r *pgRepository) GetAllServers(userID uuid.UUID) ([]account.RMSServer, error) {
var servers []account.RMSServer
// Убрали фильтр AND is_active = true, теперь возвращает весь список
err := r.db.Where("user_id = ?", userID).Find(&servers).Error
return servers, err
}
func (r *pgRepository) DeleteServer(serverID uuid.UUID) error {
return r.db.Delete(&account.RMSServer{}, serverID).Error
}
func (r *pgRepository) IncrementInvoiceCount(serverID uuid.UUID) error {
return r.db.Model(&account.RMSServer{}).
Where("id = ?", serverID).
UpdateColumn("invoice_count", gorm.Expr("invoice_count + ?", 1)).Error
}