From 32c92fedf2dad2c60ac9574c68a06ecea500968a Mon Sep 17 00:00:00 2001 From: Alex Bezdieniezhnykh Date: Thu, 11 Jul 2024 19:40:17 +0300 Subject: [PATCH 1/6] move Windows app to Windows folder, create folder for Web, create simplest web api service --- Web/Azaion.Web/Azaion.Web.sln | 16 +++++++ .../Azaion.WebService.csproj | 14 ++++++ .../Azaion.WebService/Azaion.WebService.http | 6 +++ Web/Azaion.Web/Azaion.WebService/Program.cs | 44 ++++++++++++++++++ .../Properties/launchSettings.json | 41 ++++++++++++++++ .../appsettings.Development.json | 8 ++++ .../Azaion.WebService/appsettings.json | 9 ++++ .../Azaion.Annotator.Test.csproj | 0 .../Azaion.Annotator.Test}/DictTest.cs | 0 .../Azaion.Annotator.sln | 0 .../Azaion.Annotator}/App.xaml | 0 .../Azaion.Annotator}/App.xaml.cs | 0 .../Azaion.Annotator}/AssemblyInfo.cs | 0 .../Azaion.Annotator}/Azaion.Annotator.csproj | 0 .../Controls/AnnotationControl.cs | 0 .../Controls/CanvasEditor.cs | 0 .../Controls/UpdatableProgressBar.cs | 0 .../DTO/AnnClassSelectedEvent.cs | 0 .../Azaion.Annotator}/DTO/AnnotationClass.cs | 0 .../Azaion.Annotator}/DTO/AnnotationInfo.cs | 0 .../Azaion.Annotator}/DTO/Config.cs | 0 .../Azaion.Annotator}/DTO/FormState.cs | 0 .../Azaion.Annotator}/DTO/MediatrEvents.cs | 0 .../DTO/PlaybackControlEnum.cs | 0 .../Azaion.Annotator}/DTO/SelectionState.cs | 0 .../Azaion.Annotator}/DTO/VideoFileInfo.cs | 0 .../Extensions/CanvasExtensions.cs | 0 .../Extensions/ColorExtensions.cs | 0 .../Extensions/DataGridExtensions.cs | 0 .../Extensions/DirectoryInfoExtensions.cs | 0 .../Extensions/SynchronizeInvokeExtensions.cs | 0 .../Azaion.Annotator}/HelpTexts.cs | 0 .../Azaion.Annotator}/HelpWindow.xaml | 0 .../Azaion.Annotator}/HelpWindow.xaml.cs | 0 .../Azaion.Annotator}/MainWindow.xaml | 0 .../Azaion.Annotator}/MainWindow.xaml.cs | 0 .../Azaion.Annotator}/PlayerControlHandler.cs | 0 .../Azaion.Annotator}/config.json | 0 .../Azaion.Annotator}/logo.ico | Bin .../Azaion.Annotator}/translations.json | 0 README.md => Windows/README.md | 0 41 files changed, 138 insertions(+) create mode 100644 Web/Azaion.Web/Azaion.Web.sln create mode 100644 Web/Azaion.Web/Azaion.WebService/Azaion.WebService.csproj create mode 100644 Web/Azaion.Web/Azaion.WebService/Azaion.WebService.http create mode 100644 Web/Azaion.Web/Azaion.WebService/Program.cs create mode 100644 Web/Azaion.Web/Azaion.WebService/Properties/launchSettings.json create mode 100644 Web/Azaion.Web/Azaion.WebService/appsettings.Development.json create mode 100644 Web/Azaion.Web/Azaion.WebService/appsettings.json rename {Azaion.Annotator.Test => Windows/Azaion.Annotator.Test}/Azaion.Annotator.Test.csproj (100%) rename {Azaion.Annotator.Test => Windows/Azaion.Annotator.Test}/DictTest.cs (100%) rename Azaion.Annotator.sln => Windows/Azaion.Annotator.sln (100%) rename {Azaion.Annotator => Windows/Azaion.Annotator}/App.xaml (100%) rename {Azaion.Annotator => Windows/Azaion.Annotator}/App.xaml.cs (100%) rename {Azaion.Annotator => Windows/Azaion.Annotator}/AssemblyInfo.cs (100%) rename {Azaion.Annotator => Windows/Azaion.Annotator}/Azaion.Annotator.csproj (100%) rename {Azaion.Annotator => Windows/Azaion.Annotator}/Controls/AnnotationControl.cs (100%) rename {Azaion.Annotator => Windows/Azaion.Annotator}/Controls/CanvasEditor.cs (100%) rename {Azaion.Annotator => Windows/Azaion.Annotator}/Controls/UpdatableProgressBar.cs (100%) rename {Azaion.Annotator => Windows/Azaion.Annotator}/DTO/AnnClassSelectedEvent.cs (100%) rename {Azaion.Annotator => Windows/Azaion.Annotator}/DTO/AnnotationClass.cs (100%) rename {Azaion.Annotator => Windows/Azaion.Annotator}/DTO/AnnotationInfo.cs (100%) rename {Azaion.Annotator => Windows/Azaion.Annotator}/DTO/Config.cs (100%) rename {Azaion.Annotator => Windows/Azaion.Annotator}/DTO/FormState.cs (100%) rename {Azaion.Annotator => Windows/Azaion.Annotator}/DTO/MediatrEvents.cs (100%) rename {Azaion.Annotator => Windows/Azaion.Annotator}/DTO/PlaybackControlEnum.cs (100%) rename {Azaion.Annotator => Windows/Azaion.Annotator}/DTO/SelectionState.cs (100%) rename {Azaion.Annotator => Windows/Azaion.Annotator}/DTO/VideoFileInfo.cs (100%) rename {Azaion.Annotator => Windows/Azaion.Annotator}/Extensions/CanvasExtensions.cs (100%) rename {Azaion.Annotator => Windows/Azaion.Annotator}/Extensions/ColorExtensions.cs (100%) rename {Azaion.Annotator => Windows/Azaion.Annotator}/Extensions/DataGridExtensions.cs (100%) rename {Azaion.Annotator => Windows/Azaion.Annotator}/Extensions/DirectoryInfoExtensions.cs (100%) rename {Azaion.Annotator => Windows/Azaion.Annotator}/Extensions/SynchronizeInvokeExtensions.cs (100%) rename {Azaion.Annotator => Windows/Azaion.Annotator}/HelpTexts.cs (100%) rename {Azaion.Annotator => Windows/Azaion.Annotator}/HelpWindow.xaml (100%) rename {Azaion.Annotator => Windows/Azaion.Annotator}/HelpWindow.xaml.cs (100%) rename {Azaion.Annotator => Windows/Azaion.Annotator}/MainWindow.xaml (100%) rename {Azaion.Annotator => Windows/Azaion.Annotator}/MainWindow.xaml.cs (100%) rename {Azaion.Annotator => Windows/Azaion.Annotator}/PlayerControlHandler.cs (100%) rename {Azaion.Annotator => Windows/Azaion.Annotator}/config.json (100%) rename {Azaion.Annotator => Windows/Azaion.Annotator}/logo.ico (100%) rename {Azaion.Annotator => Windows/Azaion.Annotator}/translations.json (100%) rename README.md => Windows/README.md (100%) diff --git a/Web/Azaion.Web/Azaion.Web.sln b/Web/Azaion.Web/Azaion.Web.sln new file mode 100644 index 0000000..29de87a --- /dev/null +++ b/Web/Azaion.Web/Azaion.Web.sln @@ -0,0 +1,16 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Azaion.WebService", "Azaion.WebService\Azaion.WebService.csproj", "{1D56907A-00A6-4D8E-88C0-929747B7FB67}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {1D56907A-00A6-4D8E-88C0-929747B7FB67}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1D56907A-00A6-4D8E-88C0-929747B7FB67}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1D56907A-00A6-4D8E-88C0-929747B7FB67}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1D56907A-00A6-4D8E-88C0-929747B7FB67}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal diff --git a/Web/Azaion.Web/Azaion.WebService/Azaion.WebService.csproj b/Web/Azaion.Web/Azaion.WebService/Azaion.WebService.csproj new file mode 100644 index 0000000..48e39a5 --- /dev/null +++ b/Web/Azaion.Web/Azaion.WebService/Azaion.WebService.csproj @@ -0,0 +1,14 @@ + + + + net8.0 + enable + enable + + + + + + + + diff --git a/Web/Azaion.Web/Azaion.WebService/Azaion.WebService.http b/Web/Azaion.Web/Azaion.WebService/Azaion.WebService.http new file mode 100644 index 0000000..bcff1d4 --- /dev/null +++ b/Web/Azaion.Web/Azaion.WebService/Azaion.WebService.http @@ -0,0 +1,6 @@ +@Azaion.WebService_HostAddress = http://localhost:5275 + +GET {{Azaion.WebService_HostAddress}}/weatherforecast/ +Accept: application/json + +### diff --git a/Web/Azaion.Web/Azaion.WebService/Program.cs b/Web/Azaion.Web/Azaion.WebService/Program.cs new file mode 100644 index 0000000..161f695 --- /dev/null +++ b/Web/Azaion.Web/Azaion.WebService/Program.cs @@ -0,0 +1,44 @@ +var builder = WebApplication.CreateBuilder(args); + +// Add services to the container. +// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle +builder.Services.AddEndpointsApiExplorer(); +builder.Services.AddSwaggerGen(); + +var app = builder.Build(); + +// Configure the HTTP request pipeline. +if (app.Environment.IsDevelopment()) +{ + app.UseSwagger(); + app.UseSwaggerUI(); +} + +app.UseHttpsRedirection(); + +var summaries = new[] +{ + "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" +}; + +app.MapGet("/weatherforecast", () => + { + var forecast = Enumerable.Range(1, 5).Select(index => + new WeatherForecast + ( + DateOnly.FromDateTime(DateTime.Now.AddDays(index)), + Random.Shared.Next(-20, 55), + summaries[Random.Shared.Next(summaries.Length)] + )) + .ToArray(); + return forecast; + }) + .WithName("GetWeatherForecast") + .WithOpenApi(); + +app.Run(); + +record WeatherForecast(DateOnly Date, int TemperatureC, string? Summary) +{ + public int TemperatureF => 32 + (int)(TemperatureC / 0.5556); +} \ No newline at end of file diff --git a/Web/Azaion.Web/Azaion.WebService/Properties/launchSettings.json b/Web/Azaion.Web/Azaion.WebService/Properties/launchSettings.json new file mode 100644 index 0000000..ff72b58 --- /dev/null +++ b/Web/Azaion.Web/Azaion.WebService/Properties/launchSettings.json @@ -0,0 +1,41 @@ +{ + "$schema": "http://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:32310", + "sslPort": 44300 + } + }, + "profiles": { + "http": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "launchUrl": "swagger", + "applicationUrl": "http://localhost:5275", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "https": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "launchUrl": "swagger", + "applicationUrl": "https://localhost:7263;http://localhost:5275", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "launchUrl": "swagger", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/Web/Azaion.Web/Azaion.WebService/appsettings.Development.json b/Web/Azaion.Web/Azaion.WebService/appsettings.Development.json new file mode 100644 index 0000000..0c208ae --- /dev/null +++ b/Web/Azaion.Web/Azaion.WebService/appsettings.Development.json @@ -0,0 +1,8 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + } +} diff --git a/Web/Azaion.Web/Azaion.WebService/appsettings.json b/Web/Azaion.Web/Azaion.WebService/appsettings.json new file mode 100644 index 0000000..10f68b8 --- /dev/null +++ b/Web/Azaion.Web/Azaion.WebService/appsettings.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*" +} diff --git a/Azaion.Annotator.Test/Azaion.Annotator.Test.csproj b/Windows/Azaion.Annotator.Test/Azaion.Annotator.Test.csproj similarity index 100% rename from Azaion.Annotator.Test/Azaion.Annotator.Test.csproj rename to Windows/Azaion.Annotator.Test/Azaion.Annotator.Test.csproj diff --git a/Azaion.Annotator.Test/DictTest.cs b/Windows/Azaion.Annotator.Test/DictTest.cs similarity index 100% rename from Azaion.Annotator.Test/DictTest.cs rename to Windows/Azaion.Annotator.Test/DictTest.cs diff --git a/Azaion.Annotator.sln b/Windows/Azaion.Annotator.sln similarity index 100% rename from Azaion.Annotator.sln rename to Windows/Azaion.Annotator.sln diff --git a/Azaion.Annotator/App.xaml b/Windows/Azaion.Annotator/App.xaml similarity index 100% rename from Azaion.Annotator/App.xaml rename to Windows/Azaion.Annotator/App.xaml diff --git a/Azaion.Annotator/App.xaml.cs b/Windows/Azaion.Annotator/App.xaml.cs similarity index 100% rename from Azaion.Annotator/App.xaml.cs rename to Windows/Azaion.Annotator/App.xaml.cs diff --git a/Azaion.Annotator/AssemblyInfo.cs b/Windows/Azaion.Annotator/AssemblyInfo.cs similarity index 100% rename from Azaion.Annotator/AssemblyInfo.cs rename to Windows/Azaion.Annotator/AssemblyInfo.cs diff --git a/Azaion.Annotator/Azaion.Annotator.csproj b/Windows/Azaion.Annotator/Azaion.Annotator.csproj similarity index 100% rename from Azaion.Annotator/Azaion.Annotator.csproj rename to Windows/Azaion.Annotator/Azaion.Annotator.csproj diff --git a/Azaion.Annotator/Controls/AnnotationControl.cs b/Windows/Azaion.Annotator/Controls/AnnotationControl.cs similarity index 100% rename from Azaion.Annotator/Controls/AnnotationControl.cs rename to Windows/Azaion.Annotator/Controls/AnnotationControl.cs diff --git a/Azaion.Annotator/Controls/CanvasEditor.cs b/Windows/Azaion.Annotator/Controls/CanvasEditor.cs similarity index 100% rename from Azaion.Annotator/Controls/CanvasEditor.cs rename to Windows/Azaion.Annotator/Controls/CanvasEditor.cs diff --git a/Azaion.Annotator/Controls/UpdatableProgressBar.cs b/Windows/Azaion.Annotator/Controls/UpdatableProgressBar.cs similarity index 100% rename from Azaion.Annotator/Controls/UpdatableProgressBar.cs rename to Windows/Azaion.Annotator/Controls/UpdatableProgressBar.cs diff --git a/Azaion.Annotator/DTO/AnnClassSelectedEvent.cs b/Windows/Azaion.Annotator/DTO/AnnClassSelectedEvent.cs similarity index 100% rename from Azaion.Annotator/DTO/AnnClassSelectedEvent.cs rename to Windows/Azaion.Annotator/DTO/AnnClassSelectedEvent.cs diff --git a/Azaion.Annotator/DTO/AnnotationClass.cs b/Windows/Azaion.Annotator/DTO/AnnotationClass.cs similarity index 100% rename from Azaion.Annotator/DTO/AnnotationClass.cs rename to Windows/Azaion.Annotator/DTO/AnnotationClass.cs diff --git a/Azaion.Annotator/DTO/AnnotationInfo.cs b/Windows/Azaion.Annotator/DTO/AnnotationInfo.cs similarity index 100% rename from Azaion.Annotator/DTO/AnnotationInfo.cs rename to Windows/Azaion.Annotator/DTO/AnnotationInfo.cs diff --git a/Azaion.Annotator/DTO/Config.cs b/Windows/Azaion.Annotator/DTO/Config.cs similarity index 100% rename from Azaion.Annotator/DTO/Config.cs rename to Windows/Azaion.Annotator/DTO/Config.cs diff --git a/Azaion.Annotator/DTO/FormState.cs b/Windows/Azaion.Annotator/DTO/FormState.cs similarity index 100% rename from Azaion.Annotator/DTO/FormState.cs rename to Windows/Azaion.Annotator/DTO/FormState.cs diff --git a/Azaion.Annotator/DTO/MediatrEvents.cs b/Windows/Azaion.Annotator/DTO/MediatrEvents.cs similarity index 100% rename from Azaion.Annotator/DTO/MediatrEvents.cs rename to Windows/Azaion.Annotator/DTO/MediatrEvents.cs diff --git a/Azaion.Annotator/DTO/PlaybackControlEnum.cs b/Windows/Azaion.Annotator/DTO/PlaybackControlEnum.cs similarity index 100% rename from Azaion.Annotator/DTO/PlaybackControlEnum.cs rename to Windows/Azaion.Annotator/DTO/PlaybackControlEnum.cs diff --git a/Azaion.Annotator/DTO/SelectionState.cs b/Windows/Azaion.Annotator/DTO/SelectionState.cs similarity index 100% rename from Azaion.Annotator/DTO/SelectionState.cs rename to Windows/Azaion.Annotator/DTO/SelectionState.cs diff --git a/Azaion.Annotator/DTO/VideoFileInfo.cs b/Windows/Azaion.Annotator/DTO/VideoFileInfo.cs similarity index 100% rename from Azaion.Annotator/DTO/VideoFileInfo.cs rename to Windows/Azaion.Annotator/DTO/VideoFileInfo.cs diff --git a/Azaion.Annotator/Extensions/CanvasExtensions.cs b/Windows/Azaion.Annotator/Extensions/CanvasExtensions.cs similarity index 100% rename from Azaion.Annotator/Extensions/CanvasExtensions.cs rename to Windows/Azaion.Annotator/Extensions/CanvasExtensions.cs diff --git a/Azaion.Annotator/Extensions/ColorExtensions.cs b/Windows/Azaion.Annotator/Extensions/ColorExtensions.cs similarity index 100% rename from Azaion.Annotator/Extensions/ColorExtensions.cs rename to Windows/Azaion.Annotator/Extensions/ColorExtensions.cs diff --git a/Azaion.Annotator/Extensions/DataGridExtensions.cs b/Windows/Azaion.Annotator/Extensions/DataGridExtensions.cs similarity index 100% rename from Azaion.Annotator/Extensions/DataGridExtensions.cs rename to Windows/Azaion.Annotator/Extensions/DataGridExtensions.cs diff --git a/Azaion.Annotator/Extensions/DirectoryInfoExtensions.cs b/Windows/Azaion.Annotator/Extensions/DirectoryInfoExtensions.cs similarity index 100% rename from Azaion.Annotator/Extensions/DirectoryInfoExtensions.cs rename to Windows/Azaion.Annotator/Extensions/DirectoryInfoExtensions.cs diff --git a/Azaion.Annotator/Extensions/SynchronizeInvokeExtensions.cs b/Windows/Azaion.Annotator/Extensions/SynchronizeInvokeExtensions.cs similarity index 100% rename from Azaion.Annotator/Extensions/SynchronizeInvokeExtensions.cs rename to Windows/Azaion.Annotator/Extensions/SynchronizeInvokeExtensions.cs diff --git a/Azaion.Annotator/HelpTexts.cs b/Windows/Azaion.Annotator/HelpTexts.cs similarity index 100% rename from Azaion.Annotator/HelpTexts.cs rename to Windows/Azaion.Annotator/HelpTexts.cs diff --git a/Azaion.Annotator/HelpWindow.xaml b/Windows/Azaion.Annotator/HelpWindow.xaml similarity index 100% rename from Azaion.Annotator/HelpWindow.xaml rename to Windows/Azaion.Annotator/HelpWindow.xaml diff --git a/Azaion.Annotator/HelpWindow.xaml.cs b/Windows/Azaion.Annotator/HelpWindow.xaml.cs similarity index 100% rename from Azaion.Annotator/HelpWindow.xaml.cs rename to Windows/Azaion.Annotator/HelpWindow.xaml.cs diff --git a/Azaion.Annotator/MainWindow.xaml b/Windows/Azaion.Annotator/MainWindow.xaml similarity index 100% rename from Azaion.Annotator/MainWindow.xaml rename to Windows/Azaion.Annotator/MainWindow.xaml diff --git a/Azaion.Annotator/MainWindow.xaml.cs b/Windows/Azaion.Annotator/MainWindow.xaml.cs similarity index 100% rename from Azaion.Annotator/MainWindow.xaml.cs rename to Windows/Azaion.Annotator/MainWindow.xaml.cs diff --git a/Azaion.Annotator/PlayerControlHandler.cs b/Windows/Azaion.Annotator/PlayerControlHandler.cs similarity index 100% rename from Azaion.Annotator/PlayerControlHandler.cs rename to Windows/Azaion.Annotator/PlayerControlHandler.cs diff --git a/Azaion.Annotator/config.json b/Windows/Azaion.Annotator/config.json similarity index 100% rename from Azaion.Annotator/config.json rename to Windows/Azaion.Annotator/config.json diff --git a/Azaion.Annotator/logo.ico b/Windows/Azaion.Annotator/logo.ico similarity index 100% rename from Azaion.Annotator/logo.ico rename to Windows/Azaion.Annotator/logo.ico diff --git a/Azaion.Annotator/translations.json b/Windows/Azaion.Annotator/translations.json similarity index 100% rename from Azaion.Annotator/translations.json rename to Windows/Azaion.Annotator/translations.json diff --git a/README.md b/Windows/README.md similarity index 100% rename from README.md rename to Windows/README.md From bfbfdf6658b1ae1102e08e9e6db59c9b5e8a4653 Mon Sep 17 00:00:00 2001 From: Oleksandr Bezdieniezhnykh Date: Tue, 16 Jul 2024 14:18:55 +0300 Subject: [PATCH 2/6] add repository with mysql and entities --- .../Azaion.Repository.csproj | 14 +++++ .../Azaion.Repository/AzaionDbSql.cs | 12 ++++ .../AzaionDbSqlSchemaHolder.cs | 26 +++++++++ .../DTO/ConnectionStrings.cs | 7 +++ .../Azaion.Repository/DTO/MediaStatusEnum.cs | 9 +++ .../Azaion.Repository/DTO/VideoDto.cs | 11 ++++ Web/Azaion.Web/Azaion.Repository/DbFactory.cs | 48 +++++++++++++++ .../Azaion.Repository/Entities/Annotation.cs | 10 ++++ .../Azaion.Repository/Entities/Media.cs | 12 ++++ .../Azaion.Repository/Entities/User.cs | 12 ++++ .../Azaion.Repository/sql/01 initial.sql | 6 ++ .../sql/02 create_tables.sql | 34 +++++++++++ .../Azaion.Video/Azaion.Video.csproj | 13 +++++ Web/Azaion.Web/Azaion.Video/IVideoManager.cs | 58 +++++++++++++++++++ Web/Azaion.Web/Azaion.Video/VideoManager.cs | 36 ++++++++++++ Web/Azaion.Web/Azaion.Web.sln | 12 ++++ .../Azaion.WebService.csproj | 4 ++ Web/Azaion.Web/Azaion.WebService/Program.cs | 10 +++- 18 files changed, 331 insertions(+), 3 deletions(-) create mode 100644 Web/Azaion.Web/Azaion.Repository/Azaion.Repository.csproj create mode 100644 Web/Azaion.Web/Azaion.Repository/AzaionDbSql.cs create mode 100644 Web/Azaion.Web/Azaion.Repository/AzaionDbSqlSchemaHolder.cs create mode 100644 Web/Azaion.Web/Azaion.Repository/DTO/ConnectionStrings.cs create mode 100644 Web/Azaion.Web/Azaion.Repository/DTO/MediaStatusEnum.cs create mode 100644 Web/Azaion.Web/Azaion.Repository/DTO/VideoDto.cs create mode 100644 Web/Azaion.Web/Azaion.Repository/DbFactory.cs create mode 100644 Web/Azaion.Web/Azaion.Repository/Entities/Annotation.cs create mode 100644 Web/Azaion.Web/Azaion.Repository/Entities/Media.cs create mode 100644 Web/Azaion.Web/Azaion.Repository/Entities/User.cs create mode 100644 Web/Azaion.Web/Azaion.Repository/sql/01 initial.sql create mode 100644 Web/Azaion.Web/Azaion.Repository/sql/02 create_tables.sql create mode 100644 Web/Azaion.Web/Azaion.Video/Azaion.Video.csproj create mode 100644 Web/Azaion.Web/Azaion.Video/IVideoManager.cs create mode 100644 Web/Azaion.Web/Azaion.Video/VideoManager.cs diff --git a/Web/Azaion.Web/Azaion.Repository/Azaion.Repository.csproj b/Web/Azaion.Web/Azaion.Repository/Azaion.Repository.csproj new file mode 100644 index 0000000..51e0b98 --- /dev/null +++ b/Web/Azaion.Web/Azaion.Repository/Azaion.Repository.csproj @@ -0,0 +1,14 @@ + + + + net8.0 + enable + enable + + + + + + + + diff --git a/Web/Azaion.Web/Azaion.Repository/AzaionDbSql.cs b/Web/Azaion.Web/Azaion.Repository/AzaionDbSql.cs new file mode 100644 index 0000000..2f19c85 --- /dev/null +++ b/Web/Azaion.Web/Azaion.Repository/AzaionDbSql.cs @@ -0,0 +1,12 @@ +using Azaion.Repository.Entities; +using LinqToDB; +using LinqToDB.Data; + +namespace Azaion.Repository; + +public class AzaionDbSql(DataOptions dataOptions) : DataConnection(dataOptions) +{ + public ITable Medias => this.GetTable(); + public ITable Users => this.GetTable(); + public ITable Annotations => this.GetTable(); +} \ No newline at end of file diff --git a/Web/Azaion.Web/Azaion.Repository/AzaionDbSqlSchemaHolder.cs b/Web/Azaion.Web/Azaion.Repository/AzaionDbSqlSchemaHolder.cs new file mode 100644 index 0000000..8e398c3 --- /dev/null +++ b/Web/Azaion.Web/Azaion.Repository/AzaionDbSqlSchemaHolder.cs @@ -0,0 +1,26 @@ +using Azaion.Repository.Entities; +using LinqToDB.Mapping; + +namespace Azaion.Repository; + +public static class AzaionDbSqlSchemaHolder +{ + public static readonly MappingSchema MappingSchema; + + static AzaionDbSqlSchemaHolder() + { + MappingSchema = new MappingSchema(); + var builder = new FluentMappingBuilder(MappingSchema); + + builder.Entity() + .HasIdentity(x => x.Id); + + builder.Entity() + .HasIdentity(x => x.Id); + + builder.Entity() + .HasIdentity(x => x.Id); + + builder.Build(); + } +} \ No newline at end of file diff --git a/Web/Azaion.Web/Azaion.Repository/DTO/ConnectionStrings.cs b/Web/Azaion.Web/Azaion.Repository/DTO/ConnectionStrings.cs new file mode 100644 index 0000000..5cb592a --- /dev/null +++ b/Web/Azaion.Web/Azaion.Repository/DTO/ConnectionStrings.cs @@ -0,0 +1,7 @@ +namespace Azaion.Repository.DTO; + +public class ConnectionStrings +{ + public string? FraudDb { get; set; } + public string? FraudDbMsSql { get; set; } +} \ No newline at end of file diff --git a/Web/Azaion.Web/Azaion.Repository/DTO/MediaStatusEnum.cs b/Web/Azaion.Web/Azaion.Repository/DTO/MediaStatusEnum.cs new file mode 100644 index 0000000..4eb1d1c --- /dev/null +++ b/Web/Azaion.Web/Azaion.Repository/DTO/MediaStatusEnum.cs @@ -0,0 +1,9 @@ +namespace Azaion.Video.DTO; + +public enum MediaStatusEnum +{ + None = 0, + Uploaded = 10, + Annotating = 20, + Annotated = 30 +} \ No newline at end of file diff --git a/Web/Azaion.Web/Azaion.Repository/DTO/VideoDto.cs b/Web/Azaion.Web/Azaion.Repository/DTO/VideoDto.cs new file mode 100644 index 0000000..bf919a3 --- /dev/null +++ b/Web/Azaion.Web/Azaion.Repository/DTO/VideoDto.cs @@ -0,0 +1,11 @@ +using Azaion.Video.DTO; + +namespace Azaion.Repository.DTO; + +public class VideoDto +{ + public Guid Id { get; set; } + public string Path { get; set; } = null!; + public MediaStatusEnum MediaStatus { get; set; } + public DateTime CreatedDate { get; set; } +} \ No newline at end of file diff --git a/Web/Azaion.Web/Azaion.Repository/DbFactory.cs b/Web/Azaion.Web/Azaion.Repository/DbFactory.cs new file mode 100644 index 0000000..55116fe --- /dev/null +++ b/Web/Azaion.Web/Azaion.Repository/DbFactory.cs @@ -0,0 +1,48 @@ +using System.Diagnostics; +using LinqToDB; + +namespace Azaion.Repository; + +public interface IDbFactory +{ + Task Run(Func> func); + Task Run(Func func); + + T Run(Func func); +} + +public class DbFactory : IDbFactory +{ + private readonly DataOptions _dataOptions; + + public DbFactory(string connectionString, bool useTracing = true) + { + if (string.IsNullOrEmpty(connectionString)) + throw new ArgumentException("Empty connectionString", nameof(connectionString)); + + _dataOptions = new DataOptions() + .UseMySqlConnector(connectionString) + .UseMappingSchema(AzaionDbSqlSchemaHolder.MappingSchema); + + if (useTracing) + _ = _dataOptions.UseTracing(TraceLevel.Info, t => Console.WriteLine(t.SqlText)); + } + + public async Task Run(Func> func) + { + await using var db = new AzaionDbSql(_dataOptions); + return await func(db); + } + + public async Task Run(Func func) + { + await using var db = new AzaionDbSql(_dataOptions); + await func(db); + } + + public T Run(Func func) + { + using var db = new AzaionDbSql(_dataOptions); + return func(db); + } +} diff --git a/Web/Azaion.Web/Azaion.Repository/Entities/Annotation.cs b/Web/Azaion.Web/Azaion.Repository/Entities/Annotation.cs new file mode 100644 index 0000000..1b83a50 --- /dev/null +++ b/Web/Azaion.Web/Azaion.Repository/Entities/Annotation.cs @@ -0,0 +1,10 @@ +namespace Azaion.Repository.Entities; + +public class Annotation +{ + public Guid Id { get; set; } + public Guid MediaId { get; set; } + public string ImagePath { get; set; } = null!; + public string LabelPath { get; set; } = null!; + public DateTime CreatedDate { get; set; } +} diff --git a/Web/Azaion.Web/Azaion.Repository/Entities/Media.cs b/Web/Azaion.Web/Azaion.Repository/Entities/Media.cs new file mode 100644 index 0000000..686d134 --- /dev/null +++ b/Web/Azaion.Web/Azaion.Repository/Entities/Media.cs @@ -0,0 +1,12 @@ +using Azaion.Video.DTO; + +namespace Azaion.Repository.Entities; + +public class Media +{ + public Guid Id { get; set; } + public string Path { get; set; } = null!; + public Guid? AnnotatorId { get; set; } + public MediaStatusEnum Status { get; set; } + public DateTime CreatedDate { get; set; } +} diff --git a/Web/Azaion.Web/Azaion.Repository/Entities/User.cs b/Web/Azaion.Web/Azaion.Repository/Entities/User.cs new file mode 100644 index 0000000..e0117d5 --- /dev/null +++ b/Web/Azaion.Web/Azaion.Repository/Entities/User.cs @@ -0,0 +1,12 @@ +namespace Azaion.Repository.Entities; + +public class User +{ + public Guid Id { get; set; } + public string Username { get; set; } = null!; + public string Email { get; set; } = null!; + public string PasswordHash { get; set; } = null!; + public string PasswordSalt { get; set; } = null!; + public DateTime CreatedDate { get; set; } + public DateTime UpdatedDate { get; set; } +} diff --git a/Web/Azaion.Web/Azaion.Repository/sql/01 initial.sql b/Web/Azaion.Web/Azaion.Repository/sql/01 initial.sql new file mode 100644 index 0000000..5f0785b --- /dev/null +++ b/Web/Azaion.Web/Azaion.Repository/sql/01 initial.sql @@ -0,0 +1,6 @@ +CREATE USER 'azaion-user' IDENTIFIED BY 'Aza1on@db123' +CREATE DATABASE azaion; +GRANT SELECT, INSERT, REFERENCES, UPDATE, DELETE, CREATE, INDEX, DROP, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES + ON azaion.* + TO 'azaion-user'; +GRANT FILE ON *.* TO 'azaion-user'; diff --git a/Web/Azaion.Web/Azaion.Repository/sql/02 create_tables.sql b/Web/Azaion.Web/Azaion.Repository/sql/02 create_tables.sql new file mode 100644 index 0000000..1a8fa81 --- /dev/null +++ b/Web/Azaion.Web/Azaion.Repository/sql/02 create_tables.sql @@ -0,0 +1,34 @@ +CREATE TABLE User ( + Id CHAR(16) NOT NULL, + Username VARCHAR(255) NOT NULL, + Email VARCHAR(255) NOT NULL, + PasswordHash VARCHAR(255) NOT NULL, + PasswordSalt VARCHAR(255) NOT NULL, + CreatedDate DATETIME NOT NULL, + UpdatedDate DATETIME NOT NULL, + PRIMARY KEY (Id), + UNIQUE KEY (Username), + UNIQUE KEY (Email) +); + +DROP TABLE Annotation; +DROP TABLE Media; +CREATE TABLE Media ( + Id CHAR(16) NOT NULL, + Path VARCHAR(255) NOT NULL, + AnnotatorId CHAR(16) NULL, + Status INT NOT NULL, -- replace with actual enum values + CreatedDate DATETIME NOT NULL, + PRIMARY KEY (Id), + FOREIGN KEY (AnnotatorId) REFERENCES User(Id) +); + +CREATE TABLE Annotation ( + Id CHAR(16) NOT NULL, + MediaId CHAR(16) NOT NULL, + ImagePath VARCHAR(255) NOT NULL, + LabelPath VARCHAR(255) NOT NULL, + CreatedDate DATETIME NOT NULL, + PRIMARY KEY (Id), + FOREIGN KEY (MediaId) REFERENCES Media(Id) +); diff --git a/Web/Azaion.Web/Azaion.Video/Azaion.Video.csproj b/Web/Azaion.Web/Azaion.Video/Azaion.Video.csproj new file mode 100644 index 0000000..4232095 --- /dev/null +++ b/Web/Azaion.Web/Azaion.Video/Azaion.Video.csproj @@ -0,0 +1,13 @@ + + + + net8.0 + enable + enable + + + + + + + diff --git a/Web/Azaion.Web/Azaion.Video/IVideoManager.cs b/Web/Azaion.Web/Azaion.Video/IVideoManager.cs new file mode 100644 index 0000000..4259dae --- /dev/null +++ b/Web/Azaion.Web/Azaion.Video/IVideoManager.cs @@ -0,0 +1,58 @@ +using Azaion.Repository.DTO; + +namespace Azaion.Video; + +public interface IVideoManager +{ + List GetVideos(); + void OpenVideo(Guid mediaId); + + void CreateAnnotation(Guid mediaId, DateTime time) + { + + } + void FinishAnnotation(Guid mediaId); + + // after video ends, refresh list of free to edit videos. + // on attempt to open video, check whether it is already taken, if yes, then businessError, else take it to user + // + // Users + // Guid Username Email PasswordHash PasswordSalt CreatedDate UpdatedDate + // + // Media + // Guid Path UserId Status CreatedDate + // + // Annotations + // Guid MediaId ImagePath LabelPath CreatedDate + // + // Sftp Changes crawler + // Google Downloader + // + // Video_path User + // + // v01 NULL + // v02 NULL + // v03 NULL + // v04 NULL + // v05 user1 + // v06 user1 + // v07 user1 + // v08 NULL + // v09 user2 + // v10 user3 + // v11 user3 + // v12 NULL + // v13 user2 + // v14 NULL + // v15 + // v16 + // v17 + // v18 + // v19 + // v20 + // v21 + // v22 + // v23 + // v24 + // v25 +} \ No newline at end of file diff --git a/Web/Azaion.Web/Azaion.Video/VideoManager.cs b/Web/Azaion.Web/Azaion.Video/VideoManager.cs new file mode 100644 index 0000000..11ac107 --- /dev/null +++ b/Web/Azaion.Web/Azaion.Video/VideoManager.cs @@ -0,0 +1,36 @@ +using Azaion.Repository; +using Azaion.Repository.DTO; + +namespace Azaion.Video; + +public class VideoManager(IDbFactory dbFactory) : IVideoManager +{ + public List GetVideos() + { + return dbFactory.Run(db => db.Medias + .Where(x => x.AnnotatorId != null) + .Select(x => new VideoDto + { + Id = x.Id, + Path = x.Path, + CreatedDate = x.CreatedDate, + MediaStatus = x.Status + }) + .ToList()); + } + + public void OpenVideo(Guid mediaId) + { + throw new NotImplementedException(); + } + + public void OpenTestVideo() + { + + } + + public void FinishAnnotation(Guid mediaId) + { + throw new NotImplementedException(); + } +} \ No newline at end of file diff --git a/Web/Azaion.Web/Azaion.Web.sln b/Web/Azaion.Web/Azaion.Web.sln index 29de87a..f234869 100644 --- a/Web/Azaion.Web/Azaion.Web.sln +++ b/Web/Azaion.Web/Azaion.Web.sln @@ -2,6 +2,10 @@ Microsoft Visual Studio Solution File, Format Version 12.00 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Azaion.WebService", "Azaion.WebService\Azaion.WebService.csproj", "{1D56907A-00A6-4D8E-88C0-929747B7FB67}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Azaion.Video", "Azaion.Video\Azaion.Video.csproj", "{0FB51B6B-2C77-4F24-B640-FEEBC5395E33}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Azaion.Repository", "Azaion.Repository\Azaion.Repository.csproj", "{9620B192-0B9F-4AA7-A6EE-64616FBE1B5F}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -12,5 +16,13 @@ Global {1D56907A-00A6-4D8E-88C0-929747B7FB67}.Debug|Any CPU.Build.0 = Debug|Any CPU {1D56907A-00A6-4D8E-88C0-929747B7FB67}.Release|Any CPU.ActiveCfg = Release|Any CPU {1D56907A-00A6-4D8E-88C0-929747B7FB67}.Release|Any CPU.Build.0 = Release|Any CPU + {0FB51B6B-2C77-4F24-B640-FEEBC5395E33}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0FB51B6B-2C77-4F24-B640-FEEBC5395E33}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0FB51B6B-2C77-4F24-B640-FEEBC5395E33}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0FB51B6B-2C77-4F24-B640-FEEBC5395E33}.Release|Any CPU.Build.0 = Release|Any CPU + {9620B192-0B9F-4AA7-A6EE-64616FBE1B5F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9620B192-0B9F-4AA7-A6EE-64616FBE1B5F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9620B192-0B9F-4AA7-A6EE-64616FBE1B5F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9620B192-0B9F-4AA7-A6EE-64616FBE1B5F}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection EndGlobal diff --git a/Web/Azaion.Web/Azaion.WebService/Azaion.WebService.csproj b/Web/Azaion.Web/Azaion.WebService/Azaion.WebService.csproj index 48e39a5..79e6b59 100644 --- a/Web/Azaion.Web/Azaion.WebService/Azaion.WebService.csproj +++ b/Web/Azaion.Web/Azaion.WebService/Azaion.WebService.csproj @@ -11,4 +11,8 @@ + + + + diff --git a/Web/Azaion.Web/Azaion.WebService/Program.cs b/Web/Azaion.Web/Azaion.WebService/Program.cs index 161f695..9962963 100644 --- a/Web/Azaion.Web/Azaion.WebService/Program.cs +++ b/Web/Azaion.Web/Azaion.WebService/Program.cs @@ -1,13 +1,17 @@ +using Azaion.Repository; +using Azaion.Repository.DTO; +using Microsoft.Extensions.Options; + var builder = WebApplication.CreateBuilder(args); -// Add services to the container. -// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); +builder.Services.Configure(builder.Configuration.GetSection(nameof(ConnectionStrings))); +builder.Services.AddSingleton(sp => new DbFactory(sp.GetService>()!.Value.FraudDb!)); + var app = builder.Build(); -// Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) { app.UseSwagger(); From cb1751ea4e6adb56a90605e7e75eaf4d449c62b6 Mon Sep 17 00:00:00 2001 From: Oleksandr Bezdieniezhnykh Date: Mon, 22 Jul 2024 12:24:55 +0300 Subject: [PATCH 3/6] add serilog log --- .gitignore | 3 ++- .../Azaion.WebService/Azaion.WebService.csproj | 3 +++ Web/Azaion.Web/Azaion.WebService/Program.cs | 17 ++++++++++++++++- 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index d55939e..8b9cbb4 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,5 @@ bin obj .vs *.DotSettings* -*.user \ No newline at end of file +*.user +log* \ No newline at end of file diff --git a/Web/Azaion.Web/Azaion.WebService/Azaion.WebService.csproj b/Web/Azaion.Web/Azaion.WebService/Azaion.WebService.csproj index 79e6b59..255526a 100644 --- a/Web/Azaion.Web/Azaion.WebService/Azaion.WebService.csproj +++ b/Web/Azaion.Web/Azaion.WebService/Azaion.WebService.csproj @@ -8,6 +8,9 @@ + + + diff --git a/Web/Azaion.Web/Azaion.WebService/Program.cs b/Web/Azaion.Web/Azaion.WebService/Program.cs index 9962963..a4da76e 100644 --- a/Web/Azaion.Web/Azaion.WebService/Program.cs +++ b/Web/Azaion.Web/Azaion.WebService/Program.cs @@ -1,15 +1,29 @@ using Azaion.Repository; using Azaion.Repository.DTO; using Microsoft.Extensions.Options; +using Serilog; +using Serilog.Events; var builder = WebApplication.CreateBuilder(args); +Log.Logger = new LoggerConfiguration() + .MinimumLevel.Override("Microsoft", LogEventLevel.Information) + .Enrich.FromLogContext() + .WriteTo.Console() + .WriteTo.File( + path: "Logs/log.txt", + rollingInterval: RollingInterval.Day) + .CreateLogger(); + +builder.Host.UseSerilog(); + builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); builder.Services.Configure(builder.Configuration.GetSection(nameof(ConnectionStrings))); builder.Services.AddSingleton(sp => new DbFactory(sp.GetService>()!.Value.FraudDb!)); + var app = builder.Build(); if (app.Environment.IsDevelopment()) @@ -25,7 +39,7 @@ var summaries = new[] "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" }; -app.MapGet("/weatherforecast", () => +app.MapGet("/weatherforecast", (ILogger logger) => { var forecast = Enumerable.Range(1, 5).Select(index => new WeatherForecast @@ -35,6 +49,7 @@ app.MapGet("/weatherforecast", () => summaries[Random.Shared.Next(summaries.Length)] )) .ToArray(); + logger.LogInformation("Show weather forecast"); return forecast; }) .WithName("GetWeatherForecast") From 6f78b880076c9a9049f6c92df5913ccd7a936045 Mon Sep 17 00:00:00 2001 From: Oleksandr Bezdieniezhnykh Date: Mon, 22 Jul 2024 16:01:28 +0300 Subject: [PATCH 4/6] add controller for video --- Web/Azaion.Web/Azaion.Repository/Constants.cs | 10 ++++++ .../Azaion.Repository/Entities/Media.cs | 20 ++++++++--- Web/Azaion.Web/Azaion.Video/IVideoManager.cs | 3 +- Web/Azaion.Web/Azaion.Video/VideoManager.cs | 33 ++++++++++++++++--- .../Azaion.WebService.csproj | 1 + .../Controllers/VideoController.cs | 19 +++++++++++ Web/Azaion.Web/Azaion.WebService/Program.cs | 29 +++------------- 7 files changed, 80 insertions(+), 35 deletions(-) create mode 100644 Web/Azaion.Web/Azaion.Repository/Constants.cs create mode 100644 Web/Azaion.Web/Azaion.WebService/Controllers/VideoController.cs diff --git a/Web/Azaion.Web/Azaion.Repository/Constants.cs b/Web/Azaion.Web/Azaion.Repository/Constants.cs new file mode 100644 index 0000000..a4a3b08 --- /dev/null +++ b/Web/Azaion.Web/Azaion.Repository/Constants.cs @@ -0,0 +1,10 @@ +namespace Azaion.Repository; + +public class Constants +{ + public const string MEDIA_HLS_FOLDER = "/azaion-media/hls"; + public const string M3_U8_EXT = "m3u8"; + public const string TS_EXT = "ts"; + public const string FFMPEG_FILE = "/opt/homebrew/bin/ffmpeg"; + +} \ No newline at end of file diff --git a/Web/Azaion.Web/Azaion.Repository/Entities/Media.cs b/Web/Azaion.Web/Azaion.Repository/Entities/Media.cs index 686d134..bb759f0 100644 --- a/Web/Azaion.Web/Azaion.Repository/Entities/Media.cs +++ b/Web/Azaion.Web/Azaion.Repository/Entities/Media.cs @@ -1,12 +1,22 @@ using Azaion.Video.DTO; +using IOPath = System.IO.Path; namespace Azaion.Repository.Entities; public class Media { - public Guid Id { get; set; } - public string Path { get; set; } = null!; - public Guid? AnnotatorId { get; set; } - public MediaStatusEnum Status { get; set; } - public DateTime CreatedDate { get; set; } + public Guid Id { get; set; } + public string Path { get; set; } = null!; + public int Resolution { get; set; } + public int Bitrate { get; set; } + public Guid? AnnotatorId { get; set; } + public MediaStatusEnum Status { get; set; } + public DateTime CreatedDate { get; set; } + + + private string MediaName => IOPath.GetFileNameWithoutExtension(Path); + private string OutDir => Directory.CreateDirectory(IOPath.Combine(Constants.MEDIA_HLS_FOLDER, MediaName)).FullName; + + public string M3U8File => IOPath.Combine(OutDir, $"{MediaName}.{Constants.M3_U8_EXT}"); + public string SegmentFile => IOPath.Combine(OutDir, $"{MediaName}%03d.{Constants.TS_EXT}"); } diff --git a/Web/Azaion.Web/Azaion.Video/IVideoManager.cs b/Web/Azaion.Web/Azaion.Video/IVideoManager.cs index 4259dae..3994605 100644 --- a/Web/Azaion.Web/Azaion.Video/IVideoManager.cs +++ b/Web/Azaion.Web/Azaion.Video/IVideoManager.cs @@ -1,11 +1,12 @@ using Azaion.Repository.DTO; +using Azaion.Repository.Entities; namespace Azaion.Video; public interface IVideoManager { List GetVideos(); - void OpenVideo(Guid mediaId); + Media Get(Guid mediaId); void CreateAnnotation(Guid mediaId, DateTime time) { diff --git a/Web/Azaion.Web/Azaion.Video/VideoManager.cs b/Web/Azaion.Web/Azaion.Video/VideoManager.cs index 11ac107..d57b1a0 100644 --- a/Web/Azaion.Web/Azaion.Video/VideoManager.cs +++ b/Web/Azaion.Web/Azaion.Video/VideoManager.cs @@ -1,5 +1,7 @@ +using System.Diagnostics; using Azaion.Repository; using Azaion.Repository.DTO; +using Azaion.Repository.Entities; namespace Azaion.Video; @@ -18,12 +20,36 @@ public class VideoManager(IDbFactory dbFactory) : IVideoManager }) .ToList()); } - - public void OpenVideo(Guid mediaId) + + public void EncodeVideo(Guid mediaId) { - throw new NotImplementedException(); + var media = dbFactory.Run(db => db.Medias.SingleOrDefault(x => x.Id == mediaId))!; + + string arguments = string.Concat($"-i \"{media.Path}\" ", + "-f hls ", + "-hls_time 2 ", + "-hls_playlist_type vod ", + "-hls_flags independent_segments ", + "-hls_segment_type mpegts ", + $"-hls_segment_filename \"{media.SegmentFile}\"", + $"\"{media.M3U8File}\""); + + var process = new Process + { + StartInfo = new() + { + FileName = Constants.FFMPEG_FILE, + Arguments = arguments, + UseShellExecute = true, + }, + EnableRaisingEvents = true, + }; + process.Start(); } + public Media Get(Guid mediaId) => + dbFactory.Run(db => db.Medias.SingleOrDefault(x => x.Id == mediaId))!; + public void OpenTestVideo() { @@ -31,6 +57,5 @@ public class VideoManager(IDbFactory dbFactory) : IVideoManager public void FinishAnnotation(Guid mediaId) { - throw new NotImplementedException(); } } \ No newline at end of file diff --git a/Web/Azaion.Web/Azaion.WebService/Azaion.WebService.csproj b/Web/Azaion.Web/Azaion.WebService/Azaion.WebService.csproj index 79e6b59..7e3a25a 100644 --- a/Web/Azaion.Web/Azaion.WebService/Azaion.WebService.csproj +++ b/Web/Azaion.Web/Azaion.WebService/Azaion.WebService.csproj @@ -13,6 +13,7 @@ + diff --git a/Web/Azaion.Web/Azaion.WebService/Controllers/VideoController.cs b/Web/Azaion.Web/Azaion.WebService/Controllers/VideoController.cs new file mode 100644 index 0000000..8ab7b73 --- /dev/null +++ b/Web/Azaion.Web/Azaion.WebService/Controllers/VideoController.cs @@ -0,0 +1,19 @@ +using Azaion.Video; +using Microsoft.AspNetCore.Mvc; + +namespace Azaion.WebService.Controllers; + +[Route("/controller")] +[ApiController] +public class VideoController(IVideoManager videoManager) : Controller +{ + [HttpGet("{guid}")] + public IActionResult GetVideo(Guid guid) + { + var media = videoManager.Get(guid); + var fileStream = new FileStream(media.M3U8File, FileMode.Open); + var fileSize = new FileInfo(media.Path).Length; + Response.ContentLength = fileSize; + return File(fileStream, "application/x-mpegURL", true); + } +} diff --git a/Web/Azaion.Web/Azaion.WebService/Program.cs b/Web/Azaion.Web/Azaion.WebService/Program.cs index 9962963..70a1c4e 100644 --- a/Web/Azaion.Web/Azaion.WebService/Program.cs +++ b/Web/Azaion.Web/Azaion.WebService/Program.cs @@ -1,14 +1,17 @@ using Azaion.Repository; using Azaion.Repository.DTO; +using Azaion.Video; using Microsoft.Extensions.Options; var builder = WebApplication.CreateBuilder(args); +builder.Services.AddControllers(); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); builder.Services.Configure(builder.Configuration.GetSection(nameof(ConnectionStrings))); builder.Services.AddSingleton(sp => new DbFactory(sp.GetService>()!.Value.FraudDb!)); +builder.Services.AddScoped(); var app = builder.Build(); @@ -20,29 +23,5 @@ if (app.Environment.IsDevelopment()) app.UseHttpsRedirection(); -var summaries = new[] -{ - "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" -}; - -app.MapGet("/weatherforecast", () => - { - var forecast = Enumerable.Range(1, 5).Select(index => - new WeatherForecast - ( - DateOnly.FromDateTime(DateTime.Now.AddDays(index)), - Random.Shared.Next(-20, 55), - summaries[Random.Shared.Next(summaries.Length)] - )) - .ToArray(); - return forecast; - }) - .WithName("GetWeatherForecast") - .WithOpenApi(); - +app.MapControllers(); app.Run(); - -record WeatherForecast(DateOnly Date, int TemperatureC, string? Summary) -{ - public int TemperatureF => 32 + (int)(TemperatureC / 0.5556); -} \ No newline at end of file From 7807f5bc90131d022e5a8175a62c7c63286c2d06 Mon Sep 17 00:00:00 2001 From: Oleksandr Bezdieniezhnykh Date: Fri, 26 Jul 2024 14:11:29 +0300 Subject: [PATCH 5/6] add quartz for jobs configure auto-scan folder and create hls files job WIP --- .../Azaion.Repository.csproj | 2 + Web/Azaion.Web/Azaion.Repository/Constants.cs | 3 -- .../DTO/Configs/ConnectionStrings.cs | 6 +++ .../DTO/Configs/FoldersConfig.cs | 8 ++++ .../DTO/ConnectionStrings.cs | 7 ---- .../Azaion.Repository/Entities/Media.cs | 12 ++++-- .../Extensions/QuartzJobConfigHelper.cs | 27 +++++++++++++ .../Azaion.Repository/Jobs/BaseJob.cs | 28 ++++++++++++++ .../Azaion.Repository/sql/01 initial.sql | 15 +++++--- .../Azaion.Video/Azaion.Video.csproj | 4 ++ Web/Azaion.Web/Azaion.Video/IFfmpegManager.cs | 38 +++++++++++++++++++ .../{IVideoManager.cs => IVideoRepository.cs} | 2 +- .../{VideoManager.cs => VideoRepository.cs} | 6 ++- .../Azaion.WebService.csproj | 2 + .../Controllers/VideoController.cs | 11 ++++-- Web/Azaion.Web/Azaion.WebService/Program.cs | 21 +++++++++- .../appsettings.Development.json | 5 +++ .../Azaion.WebService/appsettings.json | 10 ++++- 18 files changed, 179 insertions(+), 28 deletions(-) create mode 100644 Web/Azaion.Web/Azaion.Repository/DTO/Configs/ConnectionStrings.cs create mode 100644 Web/Azaion.Web/Azaion.Repository/DTO/Configs/FoldersConfig.cs delete mode 100644 Web/Azaion.Web/Azaion.Repository/DTO/ConnectionStrings.cs create mode 100644 Web/Azaion.Web/Azaion.Repository/Extensions/QuartzJobConfigHelper.cs create mode 100644 Web/Azaion.Web/Azaion.Repository/Jobs/BaseJob.cs create mode 100644 Web/Azaion.Web/Azaion.Video/IFfmpegManager.cs rename Web/Azaion.Web/Azaion.Video/{IVideoManager.cs => IVideoRepository.cs} (97%) rename Web/Azaion.Web/Azaion.Video/{VideoManager.cs => VideoRepository.cs} (86%) diff --git a/Web/Azaion.Web/Azaion.Repository/Azaion.Repository.csproj b/Web/Azaion.Web/Azaion.Repository/Azaion.Repository.csproj index 51e0b98..526d80f 100644 --- a/Web/Azaion.Web/Azaion.Repository/Azaion.Repository.csproj +++ b/Web/Azaion.Web/Azaion.Repository/Azaion.Repository.csproj @@ -8,7 +8,9 @@ + + diff --git a/Web/Azaion.Web/Azaion.Repository/Constants.cs b/Web/Azaion.Web/Azaion.Repository/Constants.cs index a4a3b08..0c89627 100644 --- a/Web/Azaion.Web/Azaion.Repository/Constants.cs +++ b/Web/Azaion.Web/Azaion.Repository/Constants.cs @@ -2,9 +2,6 @@ namespace Azaion.Repository; public class Constants { - public const string MEDIA_HLS_FOLDER = "/azaion-media/hls"; public const string M3_U8_EXT = "m3u8"; public const string TS_EXT = "ts"; - public const string FFMPEG_FILE = "/opt/homebrew/bin/ffmpeg"; - } \ No newline at end of file diff --git a/Web/Azaion.Web/Azaion.Repository/DTO/Configs/ConnectionStrings.cs b/Web/Azaion.Web/Azaion.Repository/DTO/Configs/ConnectionStrings.cs new file mode 100644 index 0000000..4ea3030 --- /dev/null +++ b/Web/Azaion.Web/Azaion.Repository/DTO/Configs/ConnectionStrings.cs @@ -0,0 +1,6 @@ +namespace Azaion.Repository.DTO.Configs; + +public class ConnectionStrings +{ + public string? AzaionDb { get; set; } +} \ No newline at end of file diff --git a/Web/Azaion.Web/Azaion.Repository/DTO/Configs/FoldersConfig.cs b/Web/Azaion.Web/Azaion.Repository/DTO/Configs/FoldersConfig.cs new file mode 100644 index 0000000..5301d80 --- /dev/null +++ b/Web/Azaion.Web/Azaion.Repository/DTO/Configs/FoldersConfig.cs @@ -0,0 +1,8 @@ +namespace Azaion.Repository.DTO.Configs; + +public class FoldersConfig +{ + public string VideosFolder { get; set; } = null!; + public string HlsFolder { get; set; } = null!; + public string FfmpegExecutable { get; set; } = null!; +} \ No newline at end of file diff --git a/Web/Azaion.Web/Azaion.Repository/DTO/ConnectionStrings.cs b/Web/Azaion.Web/Azaion.Repository/DTO/ConnectionStrings.cs deleted file mode 100644 index 5cb592a..0000000 --- a/Web/Azaion.Web/Azaion.Repository/DTO/ConnectionStrings.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Azaion.Repository.DTO; - -public class ConnectionStrings -{ - public string? FraudDb { get; set; } - public string? FraudDbMsSql { get; set; } -} \ No newline at end of file diff --git a/Web/Azaion.Web/Azaion.Repository/Entities/Media.cs b/Web/Azaion.Web/Azaion.Repository/Entities/Media.cs index bb759f0..aef5f79 100644 --- a/Web/Azaion.Web/Azaion.Repository/Entities/Media.cs +++ b/Web/Azaion.Web/Azaion.Repository/Entities/Media.cs @@ -1,4 +1,6 @@ +using Azaion.Repository.DTO.Configs; using Azaion.Video.DTO; +using Microsoft.Extensions.Options; using IOPath = System.IO.Path; namespace Azaion.Repository.Entities; @@ -15,8 +17,12 @@ public class Media private string MediaName => IOPath.GetFileNameWithoutExtension(Path); - private string OutDir => Directory.CreateDirectory(IOPath.Combine(Constants.MEDIA_HLS_FOLDER, MediaName)).FullName; + private string OutDir(IOptions config) => + Directory.CreateDirectory(IOPath.Combine(config.Value.HlsFolder, MediaName)).FullName; - public string M3U8File => IOPath.Combine(OutDir, $"{MediaName}.{Constants.M3_U8_EXT}"); - public string SegmentFile => IOPath.Combine(OutDir, $"{MediaName}%03d.{Constants.TS_EXT}"); + public string M3U8File(IOptions config) => + IOPath.Combine(OutDir(config), $"{MediaName}.{Constants.M3_U8_EXT}"); + + public string SegmentFile(IOptions config) => + IOPath.Combine(OutDir(config), $"{MediaName}%03d.{Constants.TS_EXT}"); } diff --git a/Web/Azaion.Web/Azaion.Repository/Extensions/QuartzJobConfigHelper.cs b/Web/Azaion.Web/Azaion.Repository/Extensions/QuartzJobConfigHelper.cs new file mode 100644 index 0000000..6ed687b --- /dev/null +++ b/Web/Azaion.Web/Azaion.Repository/Extensions/QuartzJobConfigHelper.cs @@ -0,0 +1,27 @@ +using Azaion.Repository.Jobs; +using Quartz; + +namespace Azaion.Repository.Extensions +{ + public static class QuartzJobConfigHelper + { + public static IServiceCollectionQuartzConfigurator RegisterJob(this IServiceCollectionQuartzConfigurator q, + string cron, TimeSpan? startForDebug = null) where T: BaseJob + { + var jobName = typeof(T).Name; + var jobKey = new JobKey(jobName); + q.AddJob(jobKey); + q.AddTrigger(t => t.WithIdentity($"{jobName}_TRIGGER") + .ForJob(jobKey) +#if DEBUG + .StartAt(DateTimeOffset.Now.Add(startForDebug ?? TimeSpan.FromHours(10))) + .WithSimpleSchedule(b => b.WithIntervalInHours(5)) +#else + .StartAt(DateTimeOffset.Now.AddMinutes(1)) + .WithCronSchedule(cron, builder => builder.InTimeZone(TimeZoneInfo.Utc)) +#endif + ); + return q; + } + } +} \ No newline at end of file diff --git a/Web/Azaion.Web/Azaion.Repository/Jobs/BaseJob.cs b/Web/Azaion.Web/Azaion.Repository/Jobs/BaseJob.cs new file mode 100644 index 0000000..96258c4 --- /dev/null +++ b/Web/Azaion.Web/Azaion.Repository/Jobs/BaseJob.cs @@ -0,0 +1,28 @@ +using Microsoft.Extensions.Logging; +using Quartz; + +namespace Azaion.Repository.Jobs +{ + [DisallowConcurrentExecution] + public abstract class BaseJob(ILogger logger) : IJob + { + protected abstract Task ExecuteInner(IJobExecutionContext context); + + public async Task Execute(IJobExecutionContext context) + { + logger.LogDebug($"Start {GetType().Name}"); + + try + { + await ExecuteInner(context); + } + catch (Exception e) + { + logger.LogError(e, e.Message); + throw; + } + + logger.LogDebug($"{GetType().Name} Finished"); + } + } +} \ No newline at end of file diff --git a/Web/Azaion.Web/Azaion.Repository/sql/01 initial.sql b/Web/Azaion.Web/Azaion.Repository/sql/01 initial.sql index 5f0785b..8d30292 100644 --- a/Web/Azaion.Web/Azaion.Repository/sql/01 initial.sql +++ b/Web/Azaion.Web/Azaion.Repository/sql/01 initial.sql @@ -1,6 +1,11 @@ -CREATE USER 'azaion-user' IDENTIFIED BY 'Aza1on@db123' CREATE DATABASE azaion; -GRANT SELECT, INSERT, REFERENCES, UPDATE, DELETE, CREATE, INDEX, DROP, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES - ON azaion.* - TO 'azaion-user'; -GRANT FILE ON *.* TO 'azaion-user'; + +CREATE USER 'azaion-admin' IDENTIFIED BY 'Aza1on@db-admin123'; +GRANT ALL ON azaion.* TO 'azaion-admin'; +GRANT FILE ON *.* TO 'azaion-admin'; + +CREATE USER 'azaion-user' IDENTIFIED BY 'Aza1on@db123'; +GRANT SELECT, INSERT, UPDATE, DELETE ON azaion.* TO 'azaion-user'; + +CREATE USER 'azaion-user-read' IDENTIFIED BY 'Az@10n-ro'; +GRANT SELECT ON azaion.* TO 'azaion-user'; \ No newline at end of file diff --git a/Web/Azaion.Web/Azaion.Video/Azaion.Video.csproj b/Web/Azaion.Web/Azaion.Video/Azaion.Video.csproj index 4232095..3524887 100644 --- a/Web/Azaion.Web/Azaion.Video/Azaion.Video.csproj +++ b/Web/Azaion.Web/Azaion.Video/Azaion.Video.csproj @@ -10,4 +10,8 @@ + + + + diff --git a/Web/Azaion.Web/Azaion.Video/IFfmpegManager.cs b/Web/Azaion.Web/Azaion.Video/IFfmpegManager.cs new file mode 100644 index 0000000..8d2c47c --- /dev/null +++ b/Web/Azaion.Web/Azaion.Video/IFfmpegManager.cs @@ -0,0 +1,38 @@ +using System.Diagnostics; +using Azaion.Repository; +using Azaion.Repository.DTO.Configs; +using Microsoft.Extensions.Options; + +namespace Azaion.Video; + +public interface IFfmpegManager +{ + void ConvertToHls(string video, string segmentFile, string outFile); +} + +public class FfmpegManager(IOptions config) : IFfmpegManager +{ + public void ConvertToHls(string video, string segmentFile, string outFile) + { + string arguments = string.Concat($"-i \"{video}\" ", + "-f hls ", + "-hls_time 2 ", + "-hls_playlist_type vod ", + "-hls_flags independent_segments ", + "-hls_segment_type mpegts ", + $"-hls_segment_filename \"{segmentFile}\"", + $"\"{outFile}\""); + + var process = new Process + { + StartInfo = new() + { + FileName = config.Value.FfmpegExecutable, + Arguments = arguments, + UseShellExecute = true, + }, + EnableRaisingEvents = true, + }; + process.Start(); + } +} \ No newline at end of file diff --git a/Web/Azaion.Web/Azaion.Video/IVideoManager.cs b/Web/Azaion.Web/Azaion.Video/IVideoRepository.cs similarity index 97% rename from Web/Azaion.Web/Azaion.Video/IVideoManager.cs rename to Web/Azaion.Web/Azaion.Video/IVideoRepository.cs index 3994605..b86180e 100644 --- a/Web/Azaion.Web/Azaion.Video/IVideoManager.cs +++ b/Web/Azaion.Web/Azaion.Video/IVideoRepository.cs @@ -3,7 +3,7 @@ using Azaion.Repository.Entities; namespace Azaion.Video; -public interface IVideoManager +public interface IVideoRepository { List GetVideos(); Media Get(Guid mediaId); diff --git a/Web/Azaion.Web/Azaion.Video/VideoManager.cs b/Web/Azaion.Web/Azaion.Video/VideoRepository.cs similarity index 86% rename from Web/Azaion.Web/Azaion.Video/VideoManager.cs rename to Web/Azaion.Web/Azaion.Video/VideoRepository.cs index d57b1a0..52fd0dc 100644 --- a/Web/Azaion.Web/Azaion.Video/VideoManager.cs +++ b/Web/Azaion.Web/Azaion.Video/VideoRepository.cs @@ -1,11 +1,13 @@ using System.Diagnostics; using Azaion.Repository; using Azaion.Repository.DTO; +using Azaion.Repository.DTO.Configs; using Azaion.Repository.Entities; +using Microsoft.Extensions.Options; namespace Azaion.Video; -public class VideoManager(IDbFactory dbFactory) : IVideoManager +public class VideoRepository(IDbFactory dbFactory, IOptions foldersConfig) : IVideoRepository { public List GetVideos() { @@ -38,7 +40,7 @@ public class VideoManager(IDbFactory dbFactory) : IVideoManager { StartInfo = new() { - FileName = Constants.FFMPEG_FILE, + FileName = foldersConfig.Value.FfmpegExecutable, Arguments = arguments, UseShellExecute = true, }, diff --git a/Web/Azaion.Web/Azaion.WebService/Azaion.WebService.csproj b/Web/Azaion.Web/Azaion.WebService/Azaion.WebService.csproj index e66d464..7f4ac3e 100644 --- a/Web/Azaion.Web/Azaion.WebService/Azaion.WebService.csproj +++ b/Web/Azaion.Web/Azaion.WebService/Azaion.WebService.csproj @@ -8,6 +8,8 @@ + + diff --git a/Web/Azaion.Web/Azaion.WebService/Controllers/VideoController.cs b/Web/Azaion.Web/Azaion.WebService/Controllers/VideoController.cs index 8ab7b73..8376f34 100644 --- a/Web/Azaion.Web/Azaion.WebService/Controllers/VideoController.cs +++ b/Web/Azaion.Web/Azaion.WebService/Controllers/VideoController.cs @@ -1,19 +1,22 @@ +using Azaion.Repository.DTO.Configs; using Azaion.Video; using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Options; namespace Azaion.WebService.Controllers; -[Route("/controller")] +[Route("/{controller}")] [ApiController] -public class VideoController(IVideoManager videoManager) : Controller +public class VideoController(IVideoRepository videoRepository, IOptions config) : Controller { [HttpGet("{guid}")] public IActionResult GetVideo(Guid guid) { - var media = videoManager.Get(guid); - var fileStream = new FileStream(media.M3U8File, FileMode.Open); + var media = videoRepository.Get(guid); + var fileStream = new FileStream(media.M3U8File(config), FileMode.Open); var fileSize = new FileInfo(media.Path).Length; Response.ContentLength = fileSize; return File(fileStream, "application/x-mpegURL", true); } + } diff --git a/Web/Azaion.Web/Azaion.WebService/Program.cs b/Web/Azaion.Web/Azaion.WebService/Program.cs index 31718ae..f26f857 100644 --- a/Web/Azaion.Web/Azaion.WebService/Program.cs +++ b/Web/Azaion.Web/Azaion.WebService/Program.cs @@ -1,7 +1,10 @@ +using System.Collections.Specialized; using Azaion.Repository; using Azaion.Repository.DTO; +using Azaion.Repository.DTO.Configs; using Azaion.Video; using Microsoft.Extensions.Options; +using Quartz; using Serilog; using Serilog.Events; @@ -22,9 +25,23 @@ builder.Services.AddControllers(); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); +builder.Services.Configure(builder.Configuration.GetSection(nameof(FoldersConfig))); builder.Services.Configure(builder.Configuration.GetSection(nameof(ConnectionStrings))); builder.Services.AddSingleton(sp => new DbFactory(sp.GetService>()!.Value.FraudDb!)); -builder.Services.AddScoped(); +builder.Services.AddScoped(); + +var connStr = builder.Configuration.Get(); + +builder.Services.AddQuartz(q => +{ + q.SchedulerId = "AzaionScheduler"; + q.SchedulerName = "Azaion Scheduler"; + q.UsePersistentStore(c => + { + c.UseNewtonsoftJsonSerializer(); + c.UseMySql(connStr.FraudDbMsSql); + }); +}); var app = builder.Build(); @@ -37,4 +54,4 @@ if (app.Environment.IsDevelopment()) app.UseHttpsRedirection(); app.MapControllers(); -app.Run(); +app.Run(); \ No newline at end of file diff --git a/Web/Azaion.Web/Azaion.WebService/appsettings.Development.json b/Web/Azaion.Web/Azaion.WebService/appsettings.Development.json index 0c208ae..9119b1f 100644 --- a/Web/Azaion.Web/Azaion.WebService/appsettings.Development.json +++ b/Web/Azaion.Web/Azaion.WebService/appsettings.Development.json @@ -4,5 +4,10 @@ "Default": "Information", "Microsoft.AspNetCore": "Warning" } + }, + "FoldersConfig": { + "VideosFolder": "E:\\Azaion3\\Videos", + "HlsFolder": "/azaion-media/hls", + "FFMPEG_EXECUTABLE": "/opt/homebrew/bin/ffmpeg" } } diff --git a/Web/Azaion.Web/Azaion.WebService/appsettings.json b/Web/Azaion.Web/Azaion.WebService/appsettings.json index 10f68b8..d77c327 100644 --- a/Web/Azaion.Web/Azaion.WebService/appsettings.json +++ b/Web/Azaion.Web/Azaion.WebService/appsettings.json @@ -5,5 +5,13 @@ "Microsoft.AspNetCore": "Warning" } }, - "AllowedHosts": "*" + "AllowedHosts": "*", + "ConnectionStrings": { + "AzaionDb": "" + }, + "FoldersConfig": { + "VideosFolder": "/azaion-media", + "HlsFolder": "/azaion-media/hls", + "FFMPEG_EXECUTABLE": "/opt/homebrew/bin/ffmpeg" + } } From f5bad95cd52ce3d67ce4ba4ac5dbd8633428003a Mon Sep 17 00:00:00 2001 From: Oleksandr Bezdieniezhnykh Date: Wed, 31 Jul 2024 18:09:28 +0300 Subject: [PATCH 6/6] small refactor --- Web/Azaion.Web/Azaion.WebService/Program.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Web/Azaion.Web/Azaion.WebService/Program.cs b/Web/Azaion.Web/Azaion.WebService/Program.cs index f26f857..8d6850a 100644 --- a/Web/Azaion.Web/Azaion.WebService/Program.cs +++ b/Web/Azaion.Web/Azaion.WebService/Program.cs @@ -27,10 +27,10 @@ builder.Services.AddSwaggerGen(); builder.Services.Configure(builder.Configuration.GetSection(nameof(FoldersConfig))); builder.Services.Configure(builder.Configuration.GetSection(nameof(ConnectionStrings))); -builder.Services.AddSingleton(sp => new DbFactory(sp.GetService>()!.Value.FraudDb!)); +builder.Services.AddSingleton(sp => new DbFactory(sp.GetService>()!.Value.AzaionDb!)); builder.Services.AddScoped(); -var connStr = builder.Configuration.Get(); +var azaionDbConnStr = builder.Configuration.Get()!.AzaionDb!; builder.Services.AddQuartz(q => { @@ -39,7 +39,7 @@ builder.Services.AddQuartz(q => q.UsePersistentStore(c => { c.UseNewtonsoftJsonSerializer(); - c.UseMySql(connStr.FraudDbMsSql); + c.UseMySql(azaionDbConnStr); }); });