feat: add modpack update functionality
This commit is contained in:
@@ -126,3 +126,85 @@ func (r *ModpackRepository) GetModpacksSummary(ctx context.Context) ([]models.Mo
|
||||
|
||||
return summaries, nil
|
||||
}
|
||||
|
||||
// GetAllModpacks возвращает список всех модпаков для админки.
|
||||
func (r *ModpackRepository) GetAllModpacks(ctx context.Context) ([]models.Modpack, error) {
|
||||
query := `
|
||||
SELECT id, name, display_name, minecraft_version, is_active, created_at, updated_at
|
||||
FROM modpacks
|
||||
ORDER BY name`
|
||||
|
||||
rows, err := r.DB.Query(ctx, query)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer rows.Close()
|
||||
|
||||
var modpacks []models.Modpack
|
||||
for rows.Next() {
|
||||
var m models.Modpack
|
||||
if err := rows.Scan(&m.ID, &m.Name, &m.DisplayName, &m.MinecraftVersion, &m.IsActive, &m.CreatedAt, &m.UpdatedAt); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
modpacks = append(modpacks, m)
|
||||
}
|
||||
|
||||
return modpacks, nil
|
||||
}
|
||||
|
||||
// UpdateModpackTx обновляет файлы модпака в транзакции: удаляет старые, добавляет новые.
|
||||
func (r *ModpackRepository) UpdateModpackTx(ctx context.Context, modpackID int, mcVersion string, files []models.ModpackFile) error {
|
||||
tx, err := r.DB.Begin(ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer tx.Rollback(ctx)
|
||||
|
||||
// Обновляем версию Minecraft и updated_at
|
||||
_, err = tx.Exec(ctx,
|
||||
"UPDATE modpacks SET minecraft_version = $1, updated_at = NOW() WHERE id = $2",
|
||||
mcVersion, modpackID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Удаляем старые файлы
|
||||
_, err = tx.Exec(ctx, "DELETE FROM modpack_files WHERE modpack_id = $1", modpackID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Добавляем новые файлы
|
||||
rows := make([][]interface{}, len(files))
|
||||
for i, f := range files {
|
||||
rows[i] = []interface{}{modpackID, f.RelativePath, f.FileHash, f.FileSize, f.DownloadURL}
|
||||
}
|
||||
|
||||
_, err = tx.CopyFrom(
|
||||
ctx,
|
||||
pgx.Identifier{"modpack_files"},
|
||||
[]string{"modpack_id", "relative_path", "file_hash", "file_size", "download_url"},
|
||||
pgx.CopyFromRows(rows),
|
||||
)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return tx.Commit(ctx)
|
||||
}
|
||||
|
||||
// GetModpackByName возвращает модпак по имени.
|
||||
func (r *ModpackRepository) GetModpackByName(ctx context.Context, name string) (*models.Modpack, error) {
|
||||
query := `
|
||||
SELECT id, name, display_name, minecraft_version, is_active, created_at, updated_at
|
||||
FROM modpacks
|
||||
WHERE name = $1`
|
||||
|
||||
var m models.Modpack
|
||||
err := r.DB.QueryRow(ctx, query, name).Scan(&m.ID, &m.Name, &m.DisplayName, &m.MinecraftVersion, &m.IsActive, &m.CreatedAt, &m.UpdatedAt)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &m, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user