Skip to content

Commit 81e97bd

Browse files
committed
Added display of notifications about successful and unsuccessful database updates; improved error handling when loading files and updating data;
1 parent 40bdfaa commit 81e97bd

File tree

14 files changed

+128
-50
lines changed

14 files changed

+128
-50
lines changed

img/screen.jpg

617 Bytes
Loading

src/Components/Pages/Settings.razor

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
@inject IOptions<AppSettings> options
1010
@inject IStringLocalizer<Settings> localizer
1111
@inject IAppStateService appStateService
12+
@inject IToastService toastService
1213

1314
<FluentDesignTheme @bind-Mode="@Mode" @bind-OfficeColor="@OfficeColor" StorageName="theme" />
1415

@@ -40,7 +41,7 @@
4041
<OptionTemplate>@context!.NativeName
4142
</OptionTemplate>
4243
</FluentSelect>
43-
<div style="width: 250px;">(@localizer["LanguageAnnotation"])</div>
44+
<div style="width: 250px;">@localizer["LanguageAnnotation"]</div>
4445
</FluentStack>
4546
</FluentGridItem>
4647

@@ -113,7 +114,15 @@
113114
private async Task Update()
114115
{
115116
loading = true;
116-
await dbUpdateService.UpdateDatabaseAsync();
117+
if (await dbUpdateService.UpdateDatabaseAsync())
118+
{
119+
toastService.ShowSuccess(localizer["DataBaseUpdateSuccess"]);
120+
}
121+
else
122+
{
123+
toastService.ShowError(localizer["DataBaseUpdateFailed"]);
124+
}
125+
117126
loading = false;
118127
}
119128

src/DataAccess/DataLoader.cs

Lines changed: 43 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,12 @@ public DataLoader(ILogger<DataLoader> logger, IOptions<AppSettings> options, IDa
2020
_appSettings = options.Value;
2121
_databaseMigrator = databaseMigrator;
2222
}
23-
public async Task LoadDataAsync(ParseResult result)
23+
public async Task<bool> LoadDataAsync(ParseResult result)
2424
{
2525
_logger.LogInformation("Loading data started");
2626
var start = DateTime.Now;
2727
var favorites = Enumerable.Empty<int>();
28+
var historyRecords = Enumerable.Empty<HistoryRecord>();
2829
var success = false;
2930
var sql = string.Empty;
3031
var filePath = Path.Combine(_appSettings.AppDataPath, Database.DB_FILE_NAME);
@@ -34,22 +35,46 @@ public async Task LoadDataAsync(ParseResult result)
3435
// backup database
3536
File.Copy(filePath, bakFilePath, true);
3637

37-
// select favorites and delete database
38-
using (var db = new Database())
38+
// select favorites, history and delete database
39+
await using (var db = new Database())
3940
{
40-
favorites = db.Stations.Where(s => s.IsFavorite).Select(s => s.Id).ToList();
41-
db.Database.EnsureDeleted();
42-
}
41+
try
42+
{
43+
favorites = await db.Stations.Where(s => s.IsFavorite).Select(s => s.Id).ToListAsync();
44+
var migrationIds = await db.Database.SqlQueryRaw<string>("SELECT MigrationId FROM __EFMigrationsHistory").ToListAsync();
45+
if (migrationIds.Any(id => id.Contains("AddedHistory")))
46+
{
47+
historyRecords = await db.HistoryRecords.ToListAsync();
48+
}
4349

44-
Debug.WriteLine($"Database was backuped ({DateTime.Now - start})");
50+
Debug.WriteLine($"Database was backuped ({DateTime.Now - start})");
51+
}
52+
catch (Exception ex)
53+
{
54+
Debug.WriteLine(ex.Message);
55+
_logger.LogError(ex, "Failed to backup database");
56+
if (ex.InnerException != null)
57+
{
58+
Debug.WriteLine(ex.InnerException);
59+
_logger.LogError(ex.InnerException, ex.InnerException.Message);
60+
}
61+
62+
return false;
63+
}
64+
finally
65+
{
66+
await db.Database.EnsureDeletedAsync();
67+
await db.DisposeAsync();
68+
}
69+
}
4570
}
4671

4772
_databaseMigrator.MigrateDatabase();
4873
Debug.WriteLine($"Database migrated ({DateTime.Now - start})");
4974

50-
using (var db = new Database())
75+
await using (var db = new Database())
5176
{
52-
using (var transaction = db.Database.BeginTransaction())
77+
await using (var transaction = await db.Database.BeginTransactionAsync())
5378
{
5479
try
5580
{
@@ -130,6 +155,13 @@ public async Task LoadDataAsync(ParseResult result)
130155
await db.SaveChangesAsync();
131156
Debug.WriteLine($"Added station subgenres ({DateTime.Now - start})");
132157

158+
if (historyRecords.Any())
159+
{
160+
await db.HistoryRecords.AddRangeAsync(historyRecords);
161+
await db.SaveChangesAsync();
162+
Debug.WriteLine($"Restored history records ({DateTime.Now - start})");
163+
}
164+
133165
await transaction.CommitAsync();
134166
success = true;
135167
_logger.LogInformation("Loading data completed");
@@ -152,5 +184,7 @@ public async Task LoadDataAsync(ParseResult result)
152184
{
153185
File.Copy(bakFilePath, filePath, true);
154186
}
187+
188+
return success;
155189
}
156190
}

src/DataAccess/Interfaces/IDataLoader.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,5 @@ namespace PCRadio.DataAccess.Interfaces;
44

55
public interface IDataLoader
66
{
7-
Task LoadDataAsync(ParseResult result);
7+
Task<bool> LoadDataAsync(ParseResult result);
88
}

src/Program.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -82,10 +82,10 @@ public static void Main(string[] args)
8282
{
8383
var stopwatch = new Stopwatch();
8484
stopwatch.Start();
85-
app.Services.GetRequiredService<IDbUpdateService>().UpdateDatabaseAsync().Wait();
85+
var success = app.Services.GetRequiredService<IDbUpdateService>().UpdateDatabaseAsync().GetAwaiter().GetResult();
8686
stopwatch.Stop();
87-
Debug.WriteLine($"Database update took {stopwatch.ElapsedMilliseconds} ms");
88-
settings.NeedsDatabaseUpdate = false;
87+
Debug.WriteLine($"Database update was {(success ? "successful" : "not successful")} and took {stopwatch.ElapsedMilliseconds} ms");
88+
settings.NeedsDatabaseUpdate = !success;
8989
settings.Save();
9090
}
9191

src/Resources/Components/Pages/Settings.resx

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
<value>Color</value>
1111
</data>
1212
<data name="Language" xml:space="preserve">
13-
<value>Language</value>
13+
<value>Language *</value>
1414
</data>
1515
<data name="Quality" xml:space="preserve">
1616
<value>Stream quality</value>
@@ -28,6 +28,12 @@
2828
<value>Update stations list</value>
2929
</data>
3030
<data name="LanguageAnnotation" xml:space="preserve">
31-
<value>changes will take effect after restart program</value>
32-
</data>
31+
<value>* changes will take effect after restart program</value>
32+
</data>
33+
<data name="DataBaseUpdateSuccess" xml:space="preserve">
34+
<value>Database update completed successfully.</value>
35+
</data>
36+
<data name="DataBaseUpdateFailed" xml:space="preserve">
37+
<value>Database update failed. Details in the log. Please try again later.</value>
38+
</data>
3339
</root>

src/Resources/Components/Pages/Settings.ru-RU.resx

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
<value>Цвет</value>
1111
</data>
1212
<data name="Language" xml:space="preserve">
13-
<value>Язык</value>
13+
<value>Язык *</value>
1414
</data>
1515
<data name="Quality" xml:space="preserve">
1616
<value>Качество потока</value>
@@ -28,6 +28,12 @@
2828
<value>Обновить список станций</value>
2929
</data>
3030
<data name="LanguageAnnotation" xml:space="preserve">
31-
<value>изменения вступят вступят силу после перезапуска программы</value>
32-
</data>
31+
<value>* изменения вступят вступят силу после перезапуска программы</value>
32+
</data>
33+
<data name="DataBaseUpdateSuccess" xml:space="preserve">
34+
<value>Обновление базы данных успешно завершено.</value>
35+
</data>
36+
<data name="DataBaseUpdateFailed" xml:space="preserve">
37+
<value>Ошибка обновления базы данных. Подробности в логе. Повторите попытку позже.</value>
38+
</data>
3339
</root>

src/Services/ArchiveExtractService.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,15 @@ public async Task<string> ExtractArchiveAsync(string archivePath, string archive
2424

2525
var outputPath = fi.FullName.Replace(fi.Extension, ".json");
2626

27-
using (ZipInputStream s = new ZipInputStream(fi.OpenRead()))
27+
await using (ZipInputStream s = new ZipInputStream(fi.OpenRead()))
2828
{
2929
s.Password = archivePassword;
3030
ZipEntry theEntry;
3131
while ((theEntry = s.GetNextEntry()) != null)
3232
{
3333
if (!string.IsNullOrEmpty(theEntry.Name) && theEntry.Name.EndsWith(".json"))
3434
{
35-
using (FileStream streamWriter = File.Create(outputPath))
35+
await using (FileStream streamWriter = File.Create(outputPath))
3636
{
3737
int size = 2048;
3838
byte[] data = new byte[2048];

src/Services/DbUpdateService.cs

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -26,18 +26,18 @@ public DbUpdateService(IOptions<AppSettings> options, ILogger<DbUpdateService> l
2626
_dataLoader = dataLoader;
2727
}
2828

29-
public async Task UpdateDatabaseAsync()
29+
public async Task<bool> UpdateDatabaseAsync()
3030
{
3131
if (string.IsNullOrEmpty(_settings.ArchiveUrl))
3232
{
3333
_logger.LogWarning("ArchiveUrl is not set.");
34-
return;
34+
return false;
3535
}
3636

3737
if (string.IsNullOrEmpty(_settings.ArchivePassword))
3838
{
3939
_logger.LogWarning("ArchivePassword is not set.");
40-
return;
40+
return false;
4141
}
4242

4343
var filePath = Path.Combine(_settings.AppDataPath, FILE_NAME);
@@ -48,16 +48,28 @@ public async Task UpdateDatabaseAsync()
4848
}
4949

5050
//download file
51-
await _fileDownloadService.DownloadFileAsync(string.Format(_settings.ArchiveUrl, culture.TwoLetterISOLanguageName), filePath);
51+
if (!await _fileDownloadService.DownloadFileAsync(string.Format(_settings.ArchiveUrl, culture.TwoLetterISOLanguageName), filePath))
52+
{
53+
_logger.LogError("Failed to download archive file.");
54+
return false;
55+
}
5256

53-
//extract file
54-
var jsonFilePath = await _archiveExtractService.ExtractArchiveAsync(filePath, _settings.ArchivePassword);
57+
try
58+
{
59+
//extract file
60+
var jsonFilePath = await _archiveExtractService.ExtractArchiveAsync(filePath, _settings.ArchivePassword);
5561

56-
///parse json
57-
var parseResult = _parseJsonService.Parse(jsonFilePath);
62+
///parse json
63+
var parseResult = await _parseJsonService.ParseAsync(jsonFilePath);
5864

59-
//load data
60-
await _dataLoader.LoadDataAsync(parseResult);
65+
//load data
66+
return await _dataLoader.LoadDataAsync(parseResult);
67+
}
68+
catch (Exception ex)
69+
{
70+
_logger.LogError(ex, "Failed to update database.");
71+
return false;
72+
}
6173
}
6274

6375
}

src/Services/FileDownloadService.cs

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,22 +16,33 @@ public FileDownloadService(ILogger<FileDownloadService> logger, HttpClient httpC
1616
_httpClient = httpClient;
1717
}
1818

19-
public async Task DownloadFileAsync(string url, string filePath)
19+
public async Task<bool> DownloadFileAsync(string url, string filePath)
2020
{
2121
_httpClient.DefaultRequestHeaders.Clear();
2222
_httpClient.DefaultRequestHeaders.Add(USER_AGENT_HEADER_NAME, USER_AGENT);
23-
HttpResponseMessage response = await _httpClient.GetAsync(url);
24-
if (response.IsSuccessStatusCode)
23+
try
2524
{
26-
using (Stream stream = await response.Content.ReadAsStreamAsync())
25+
HttpResponseMessage response = await _httpClient.GetAsync(url);
26+
if (response.IsSuccessStatusCode)
2727
{
28-
using (FileStream fileStream = new FileStream(filePath, FileMode.Create))
28+
using (Stream stream = await response.Content.ReadAsStreamAsync())
2929
{
30-
await stream.CopyToAsync(fileStream);
30+
using (FileStream fileStream = new FileStream(filePath, FileMode.Create))
31+
{
32+
await stream.CopyToAsync(fileStream);
33+
}
34+
_logger.LogInformation("File downloaded successfully.");
35+
Debug.WriteLine("File downloaded successfully.");
36+
return true;
3137
}
32-
_logger.LogInformation("File downloaded successfully.");
33-
Debug.WriteLine("File downloaded successfully.");
3438
}
3539
}
40+
catch (Exception ex)
41+
{
42+
_logger.LogError(ex, "Error downloading file.");
43+
Debug.WriteLine($"Error downloading file: {ex.Message}");
44+
}
45+
46+
return false;
3647
}
3748
}

0 commit comments

Comments
 (0)