mirror of
https://github.com/serty2005/rmser.git
synced 2026-02-04 19:02:33 -06:00
120 lines
3.6 KiB
Go
120 lines
3.6 KiB
Go
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
|
||
}
|