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 }