103 lines
2.5 KiB
Go
103 lines
2.5 KiB
Go
package repository
|
|
|
|
import (
|
|
"acc-server-manager/local/model"
|
|
"context"
|
|
"errors"
|
|
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type ServerRepository struct {
|
|
*BaseRepository[model.Server, model.ServerFilter]
|
|
}
|
|
|
|
func NewServerRepository(db *gorm.DB) *ServerRepository {
|
|
repo := &ServerRepository{
|
|
BaseRepository: NewBaseRepository[model.Server, model.ServerFilter](db, model.Server{}),
|
|
}
|
|
|
|
// Run migrations
|
|
if err := repo.migrateServerTable(); err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
return repo
|
|
}
|
|
|
|
// migrateServerTable ensures all required columns exist with proper defaults
|
|
func (r *ServerRepository) migrateServerTable() error {
|
|
// Create a temporary table with all required columns
|
|
if err := r.db.Exec(`
|
|
CREATE TABLE IF NOT EXISTS servers_new (
|
|
id INTEGER PRIMARY KEY,
|
|
name TEXT NOT NULL,
|
|
ip TEXT NOT NULL,
|
|
port INTEGER NOT NULL DEFAULT 9600,
|
|
path TEXT NOT NULL,
|
|
service_name TEXT NOT NULL,
|
|
date_created DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
from_steam_cmd BOOLEAN NOT NULL DEFAULT 1
|
|
)
|
|
`).Error; err != nil {
|
|
return err
|
|
}
|
|
|
|
// Copy data from old table, setting defaults for new columns
|
|
if err := r.db.Exec(`
|
|
INSERT INTO servers_new (
|
|
id,
|
|
name,
|
|
ip,
|
|
port,
|
|
path,
|
|
service_name,
|
|
date_created,
|
|
from_steam_cmd
|
|
)
|
|
SELECT
|
|
id,
|
|
COALESCE(name, 'Server ' || id) as name,
|
|
COALESCE(ip, '127.0.0.1') as ip,
|
|
COALESCE(port, 9600) as port,
|
|
path,
|
|
COALESCE(service_name, 'ACC-Server-' || id) as service_name,
|
|
COALESCE(date_created, CURRENT_TIMESTAMP) as date_created,
|
|
COALESCE(from_steam_cmd, 1) as from_steam_cmd
|
|
FROM servers
|
|
`).Error; err != nil {
|
|
// If the old table doesn't exist, this is a fresh install
|
|
if err := r.db.Exec(`DROP TABLE IF EXISTS servers_new`).Error; err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// Replace old table with new one
|
|
if err := r.db.Exec(`DROP TABLE IF EXISTS servers`).Error; err != nil {
|
|
return err
|
|
}
|
|
if err := r.db.Exec(`ALTER TABLE servers_new RENAME TO servers`).Error; err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// GetFirstByServiceName
|
|
// Gets first row from Server table.
|
|
//
|
|
// Args:
|
|
// context.Context: Application context
|
|
// Returns:
|
|
// model.ServerModel: Server object from database.
|
|
func (r *ServerRepository) GetFirstByServiceName(ctx context.Context, serviceName string) (*model.Server, error) {
|
|
result := new(model.Server)
|
|
if err := r.db.WithContext(ctx).Where("service_name = ?", serviceName).First(result).Error; err != nil {
|
|
if errors.Is(err, gorm.ErrRecordNotFound) {
|
|
return nil, err
|
|
}
|
|
return nil, err
|
|
}
|
|
return result, nil
|
|
} |