mirror of
https://github.com/serty2005/rmser.git
synced 2026-02-04 19:02:33 -06:00
Перевел на multi-tenant
Добавил поставщиков Накладные успешно создаются из фронта
This commit is contained in:
117
internal/infrastructure/repository/account/postgres.go
Normal file
117
internal/infrastructure/repository/account/postgres.go
Normal file
@@ -0,0 +1,117 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user