Files
rmser/internal/infrastructure/repository/account/postgres.go
SERTY 542beafe0e Перевел на multi-tenant
Добавил поставщиков
Накладные успешно создаются из фронта
2025-12-18 03:56:21 +03:00

118 lines
3.4 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
}
func (r *pgRepository) GetAllServers(userID uuid.UUID) ([]account.RMSServer, error) {
var servers []account.RMSServer
err := r.db.Where("user_id = ? AND is_active = ?", userID, true).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
}