diff --git a/.github/workflows/deploy.prod-env.yml b/.github/workflows/deploy.prod-env.yml index 60f8dae..5033a53 100644 --- a/.github/workflows/deploy.prod-env.yml +++ b/.github/workflows/deploy.prod-env.yml @@ -15,22 +15,16 @@ jobs: with: registry: git.wohlleben.dev username: ${{ gitea.actor }} - password: ${{ secrets.REGISTRY_TOKEN }} + password: ${{ vars.REGISTRY_TOKEN }} - name: Restart all Docker Container on Production uses: appleboy/ssh-action@v1.0.3 with: - host: ${{ secrets.STRATO_VPS_HOST_ADDRESS }} - username: ${{ secrets.STRATO_VPS_USER_NAME }} - key: ${{ secrets.STRATO_VPS_ROOT_USER_SSH_KEY }} + host: ${{ vars.STRATO_VPS_HOST_ADDRESS }} + username: ${{ vars.STRATO_VPS_USER_NAME }} + key: ${{ vars.STRATO_VPS_ROOT_USER_SSH_KEY }} script: | - docker pull git.wohlleben.dev/itob/rbl-feeder-app:latest - docker pull git.wohlleben.dev/itob/rbl-feeder-api:latest - docker pull git.wohlleben.dev/itob/rbl-feeder-worker:latest - docker pull git.wohlleben.dev/itob/rbl-feeder-monitoring:latest - docker stop rbl-feeder-app rbl-feeder-api rbl-feeder-worker rbl-feeder-monitoring - docker rm rbl-feeder-app rbl-feeder-api rbl-feeder-worker rbl-feeder-monitoring - docker run --init -d --name rbl-feeder-app -p 8000:80 --restart=always git.wohlleben.dev/itob/rbl-feeder-app:latest - docker run --init -d --name rbl-feeder-api -p 8001:8080 -e DatabaseName=rblfeeder -e ConnectionUri=${{ secrets.DB_CONNECTION_URI_PROD_ENV }} --restart=always git.wohlleben.dev/itob/rbl-feeder-api:latest - docker run --init -d --name rbl-feeder-monitoring -p 8002:8080 -e HostAddress=https://rbl.wohlleben.dev -e DatabaseName=rblfeeder -e ConnectionUri=${{ secrets.DB_CONNECTION_URI_PROD_ENV }} git.wohlleben.dev/itob/rbl-feeder-monitoring:latest - docker run --init -d --name rbl-feeder-worker -e HostAddress=https://rblnews.de -e DatabaseName=rblfeeder -e ConnectionUri=${{ secrets.DB_CONNECTION_URI_PROD_ENV }} --restart=always git.wohlleben.dev/itob/rbl-feeder-worker:latest + docker pull git.wohlleben.dev/itob/rbl-news-webapp:latest + docker stop rbl-news-webapp + docker rm rbl-news-webapp + docker run --init -d --name rbl-news-webapp -p 8000:8080 -e ASPNETCORE_ENVIRONMENT=Production --restart=always git.wohlleben.dev/itob/rbl-news-webapp:latest docker system prune -af \ No newline at end of file diff --git a/.github/workflows/deploy.test-env.yml b/.github/workflows/deploy.test-env.yml index 85fe710..4e4327b 100644 --- a/.github/workflows/deploy.test-env.yml +++ b/.github/workflows/deploy.test-env.yml @@ -22,7 +22,7 @@ jobs: with: registry: git.wohlleben.dev username: ${{ gitea.actor }} - password: ${{ secrets.REGISTRY_TOKEN }} + password: ${{ vars.REGISTRY_TOKEN }} - name: Build and push WebApp container image run: | TODAY=$(date +'%Y-%m-%d') @@ -32,12 +32,12 @@ jobs: - name: Restart all Docker Container on Test Environment uses: appleboy/ssh-action@v1.0.3 with: - host: ${{ secrets.DOCKER_VM_HOST_ADDRESS }} - username: ${{ secrets.DOCKER_VM_HOST_ROOT_USERNAME }} - key: ${{ secrets.DOCKER_VM_SSH_USER_ROOT }} + host: ${{ vars.SRV02_DOCKER_VM_HOST_ADDRESS }} + username: ${{ vars.SRV02_DOCKER_VM_USER_NAME }} + key: ${{ vars.SRV02_DOCKER_VM_ROOT_USER_SSH_KEY }} script: | docker pull git.wohlleben.dev/itob/rbl-news-webapp:latest docker stop rbl-news-webapp docker rm rbl-news-webapp - docker run --init -d --name rbl-news-webapp -p 8000:80 --restart=always git.wohlleben.dev/itob/rbl-news-webapp:latest + docker run --init -d --name rbl-news-webapp -p 8000:8080 -e ASPNETCORE_ENVIRONMENT=Test --restart=always git.wohlleben.dev/itob/rbl-news-webapp:latest docker system prune -af \ No newline at end of file diff --git a/.idea/.idea.RBLNews/.idea/deploymentTargetSelector.xml b/.idea/.idea.RBLNews/.idea/deploymentTargetSelector.xml index ae67e8f..214e5b9 100644 --- a/.idea/.idea.RBLNews/.idea/deploymentTargetSelector.xml +++ b/.idea/.idea.RBLNews/.idea/deploymentTargetSelector.xml @@ -4,6 +4,14 @@ diff --git a/IaC/RBLNews.Web/Dockerfile b/IaC/RBLNews.Web/Dockerfile index 0220130..d8f7f22 100644 --- a/IaC/RBLNews.Web/Dockerfile +++ b/IaC/RBLNews.Web/Dockerfile @@ -3,12 +3,13 @@ WORKDIR /app EXPOSE 80 EXPOSE 8080 EXPOSE 443 - FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build ARG BUILD_CONFIGURATION=Release WORKDIR /src -COPY ["../../RBLNews.Web/RBLNews.Shared.csproj", "RBLNews.Shared/"] -RUN dotnet restore "RBLFeeder/RBLNews.Web.csproj" +COPY ["../../RBLNews.Web/RBLNews.Web.csproj", "RBLNews.Web/"] +COPY ["../../RBLNews.Shared/RBLNews.Shared.csproj", "RBLNews.Shared/"] +RUN dotnet nuget add source --name itob https://git.wohlleben.dev/api/packages/itob/nuget/index.json +RUN dotnet restore "RBLNews.Web/RBLNews.Web.csproj" COPY . . WORKDIR "/src/RBLNews.Web" RUN dotnet build "RBLNews.Web.csproj" -c $BUILD_CONFIGURATION -o /app/build diff --git a/IaC/build-android.ps1 b/IaC/build-android.ps1 index 55d74be..e5b6f45 100644 --- a/IaC/build-android.ps1 +++ b/IaC/build-android.ps1 @@ -1,2 +1,7 @@ -cd.. +$location = Get-Location +if(!$location.Path.Contains("RBLNews.Web")) +{ + cd ../RBLNews.Maui +} + dotnet publish -c Release -r android-arm64 -p:PackageFormat=Apk -f net8.0-android34.0 --sc true \ No newline at end of file diff --git a/RBLNews.Maui/App.xaml.cs b/RBLNews.Maui/App.xaml.cs index 90e3f64..7ea2a02 100644 --- a/RBLNews.Maui/App.xaml.cs +++ b/RBLNews.Maui/App.xaml.cs @@ -1,4 +1,6 @@ -using Microsoft.Maui.Controls.PlatformConfiguration; +using Microsoft.Maui; +using Microsoft.Maui.Controls; + using RBLNews.Shared.Services; namespace RBLNews.Maui diff --git a/RBLNews.Maui/MainPage.xaml.cs b/RBLNews.Maui/MainPage.xaml.cs index 0e4e1ba..c8d7337 100644 --- a/RBLNews.Maui/MainPage.xaml.cs +++ b/RBLNews.Maui/MainPage.xaml.cs @@ -1,4 +1,8 @@ -using RBLNews.Shared.Components.Pages; +using System; + +using Microsoft.Maui.Controls; + +using RBLNews.Shared.Components.Pages; namespace RBLNews.Maui { diff --git a/RBLNews.Maui/MauiProgram.cs b/RBLNews.Maui/MauiProgram.cs index 3eea644..f3b70e9 100644 --- a/RBLNews.Maui/MauiProgram.cs +++ b/RBLNews.Maui/MauiProgram.cs @@ -1,7 +1,17 @@ -using CommunityToolkit.Maui; +using System.Reflection; +using CommunityToolkit.Maui; using CommunityToolkit.Maui.Markup; + +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; +using Microsoft.Maui.Controls.Hosting; +using Microsoft.Maui.Hosting; + +using RBLNews.Maui.Services; +using RBLNews.Shared.Models; using RBLNews.Shared.Services; +using RBLNews.Shared.Services.Contracts; namespace RBLNews.Maui { @@ -12,8 +22,8 @@ namespace RBLNews.Maui var builder = MauiApp.CreateBuilder(); builder .UseMauiApp() - .UseMauiCommunityToolkit() - .UseMauiCommunityToolkitMarkup() + .UseMauiCommunityToolkit() + .UseMauiCommunityToolkitMarkup() .ConfigureFonts(fonts => { //fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular"); @@ -22,16 +32,32 @@ namespace RBLNews.Maui builder.Services.AddMauiBlazorWebView(); builder.Services.AddBlazorBootstrap(); - + builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); #if DEBUG - builder.Services.AddBlazorWebViewDeveloperTools(); + builder.Services.AddBlazorWebViewDeveloperTools(); builder.Logging.AddDebug(); #endif - return builder.Build(); + Stream? appSettingFile = Assembly.GetExecutingAssembly().GetManifestResourceStream($"appsettings.json"); + if (appSettingFile != null) + { + IConfiguration configuration = new ConfigurationManager().AddJsonStream(appSettingFile).Build(); + builder.Configuration.AddConfiguration(configuration); + } + + MauiApp app = builder.Build(); + + AppSettingsModel? appSettings = app.Configuration.GetSection("App").Get(); + + if (string.IsNullOrEmpty(appSettings?.BackendApiUrl)) + { + throw new Exception($"can't instantiate services, due to parameters are null. backendApiUrl: '{appSettings?.BackendApiUrl}'"); + } + + return app; } } } diff --git a/RBLNews.Maui/MauiProgram.cs.orig b/RBLNews.Maui/MauiProgram.cs.orig deleted file mode 100644 index 04667d8..0000000 --- a/RBLNews.Maui/MauiProgram.cs.orig +++ /dev/null @@ -1,44 +0,0 @@ -using CommunityToolkit.Maui; -using CommunityToolkit.Maui.Markup; -using Microsoft.Extensions.Logging; -using RBLNews.Shared.Services; - -namespace RBLNews.Maui -{ - public static class MauiProgram - { - public static MauiApp CreateMauiApp() - { - var builder = MauiApp.CreateBuilder(); - builder - .UseMauiApp() - .UseMauiCommunityToolkit() - .UseMauiCommunityToolkitMarkup() - .ConfigureFonts(fonts => - { - //fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular"); - fonts.AddFont("NanumMyeongjo-Regular.ttf", "NanumMyeongjoRegular"); - }); - - builder.Services.AddMauiBlazorWebView(); -<<<<<<< HEAD - -#if DEBUG - builder.Services.AddBlazorWebViewDeveloperTools(); - builder.Logging.AddDebug(); -======= - builder.Services.AddBlazorBootstrap(); - - builder.Services.AddSingleton(); - builder.Services.AddSingleton(); - -#if DEBUG - builder.Services.AddBlazorWebViewDeveloperTools(); - builder.Logging.AddDebug(); ->>>>>>> css_bootstrap_blazor -#endif - - return builder.Build(); - } - } -} diff --git a/RBLNews.Maui/Properties/launchSettings.json b/RBLNews.Maui/Properties/launchSettings.json index edf8aad..84a49a4 100644 --- a/RBLNews.Maui/Properties/launchSettings.json +++ b/RBLNews.Maui/Properties/launchSettings.json @@ -2,7 +2,10 @@ "profiles": { "Windows Machine": { "commandName": "MsixPackage", - "nativeDebugging": false + "nativeDebugging": false, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } } } } \ No newline at end of file diff --git a/RBLNews.Maui/RBLNews.Maui.csproj b/RBLNews.Maui/RBLNews.Maui.csproj index bdcb172..eb6db69 100644 --- a/RBLNews.Maui/RBLNews.Maui.csproj +++ b/RBLNews.Maui/RBLNews.Maui.csproj @@ -1,7 +1,6 @@  - net8.0-maccatalyst;net8.0-android34.0 @@ -31,7 +30,6 @@ 1 14.2 - 14.0 31.0 10.0.17763.0 10.0.17763.0 @@ -68,17 +66,39 @@ + + + + + + + + + + PreserveNewest + + + PreserveNewest + + + + PreserveNewest + + + - - - + + + + + @@ -87,7 +107,7 @@ - + diff --git a/RBLNews.Maui/Services/ConfigService.cs b/RBLNews.Maui/Services/ConfigService.cs new file mode 100644 index 0000000..09571c9 --- /dev/null +++ b/RBLNews.Maui/Services/ConfigService.cs @@ -0,0 +1,20 @@ +using Microsoft.Extensions.Configuration; + +using RBLNews.Shared.Models; +using RBLNews.Shared.Services.Contracts; + +namespace RBLNews.Maui.Services; + +public class ConfigService : IConfigService +{ + public AppSettingsModel? AppSettings { get; } + + public ConfigService(IConfiguration configuration) + { + this.AppSettings = configuration.GetSection("App").Get(); + if(this.AppSettings == null) + { + throw new NullReferenceException("App settings not found"); + } + } +} \ No newline at end of file diff --git a/RBLNews.Maui/appsettings.Development.json b/RBLNews.Maui/appsettings.Development.json new file mode 100644 index 0000000..7a608cd --- /dev/null +++ b/RBLNews.Maui/appsettings.Development.json @@ -0,0 +1,11 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "App": { + "BackendApiUrl": "https://localhost:5147" + } +} diff --git a/RBLNews.Maui/appsettings.Production.json b/RBLNews.Maui/appsettings.Production.json new file mode 100644 index 0000000..0c2c7dc --- /dev/null +++ b/RBLNews.Maui/appsettings.Production.json @@ -0,0 +1,12 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*", + "App": { + "BackendApiUrl": "https://rblnews.de" + } +} diff --git a/RBLNews.Maui/appsettings.Test.json b/RBLNews.Maui/appsettings.Test.json new file mode 100644 index 0000000..8ceaf0e --- /dev/null +++ b/RBLNews.Maui/appsettings.Test.json @@ -0,0 +1,12 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*", + "App": { + "BackendApiUrl": "https://rbl.wohlleben.dev" + } +} diff --git a/RBLNews.Maui/appsettings.json b/RBLNews.Maui/appsettings.json new file mode 100644 index 0000000..10f68b8 --- /dev/null +++ b/RBLNews.Maui/appsettings.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*" +} diff --git a/RBLNews.Shared/Component1.razor b/RBLNews.Shared/Component1.razor deleted file mode 100644 index eb0ab3d..0000000 --- a/RBLNews.Shared/Component1.razor +++ /dev/null @@ -1,3 +0,0 @@ -
- This component is defined in the RBLNews.Shared library. -
diff --git a/RBLNews.Shared/Component1.razor.css b/RBLNews.Shared/Component1.razor.css deleted file mode 100644 index c6afca4..0000000 --- a/RBLNews.Shared/Component1.razor.css +++ /dev/null @@ -1,6 +0,0 @@ -.my-component { - border: 2px dashed red; - padding: 1em; - margin: 1em 0; - background-image: url('background.png'); -} diff --git a/RBLNews.Shared/Components/Controls/SwitchWithBadge.razor b/RBLNews.Shared/Components/Controls/SwitchWithBadge.razor index 6fd9366..ab48048 100644 --- a/RBLNews.Shared/Components/Controls/SwitchWithBadge.razor +++ b/RBLNews.Shared/Components/Controls/SwitchWithBadge.razor @@ -1,39 +1,40 @@ @using RBLFeederCommon.Enums @using RBLNews.Shared.Models - +
+ + @(this.Count) +
@code { private bool _filter = true; - - [Parameter] - public RssFeedSources Source { get; set; } - - [Parameter] - public string Text { get; set; } = ""; - - [Parameter] - public bool ShowCount { get; set; } - - [Parameter] - public int Count { get; set; } - - [Parameter] - public EventCallback OnFilterChanged { get; set; } - + + [Parameter] public RssFeedSources Source { get; set; } + + [Parameter] public string Text { get; set; } = ""; + + [Parameter] public bool ShowCount { get; set; } + + [Parameter] public int Count { get; set; } + + [Parameter] public EventCallback OnFilterChanged { get; set; } + + Task SwitchChanged(bool value) { this._filter = value; - - OnFilterChanged.InvokeAsync(new FilterFeedEventArg - { - Source = this.Source, - Value = value - }); - + + OnFilterChanged.InvokeAsync( + new FilterFeedEventArg + { + Source = this.Source, + Value = value + }); + return Task.CompletedTask; } + } \ No newline at end of file diff --git a/RBLNews.Shared/Components/Controls/SwitchWithBadge.razor.css b/RBLNews.Shared/Components/Controls/SwitchWithBadge.razor.css new file mode 100644 index 0000000..5f28270 --- /dev/null +++ b/RBLNews.Shared/Components/Controls/SwitchWithBadge.razor.css @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/RBLNews.Shared/Components/Pages/Feeds.razor b/RBLNews.Shared/Components/Pages/Feeds.razor index 21fb863..2e763dc 100644 --- a/RBLNews.Shared/Components/Pages/Feeds.razor +++ b/RBLNews.Shared/Components/Pages/Feeds.razor @@ -37,9 +37,9 @@ else
@foreach (FeedGroupVM feedGrp in FeedGroups) { -

+

@feedGrp.PublishDate.ToLocalTime().ToString("dd.MM.yyyy") -

+ @foreach (FeedVM feed in feedGrp.Feeds) {
@@ -60,7 +60,7 @@ else @* *@ - @GetRssSourceName((RssFeedSources)@feed.Source) | @feed.PubDate?.ToLocalTime() + @GetRssSourceName((RssFeedSources)@feed.Source) | @feed.PubDate?.ToLocalTime().ToString("dd.MM.yyyy HH:mm") diff --git a/RBLNews.Shared/Models/AppSettingsModel.cs b/RBLNews.Shared/Models/AppSettingsModel.cs new file mode 100644 index 0000000..24d434a --- /dev/null +++ b/RBLNews.Shared/Models/AppSettingsModel.cs @@ -0,0 +1,6 @@ +namespace RBLNews.Shared.Models; + +public class AppSettingsModel +{ + public string BackendApiUrl { get; set; } +} \ No newline at end of file diff --git a/RBLNews.Shared/RBLNews.Shared.csproj b/RBLNews.Shared/RBLNews.Shared.csproj index b6d1027..15359dd 100644 --- a/RBLNews.Shared/RBLNews.Shared.csproj +++ b/RBLNews.Shared/RBLNews.Shared.csproj @@ -6,6 +6,22 @@ enable + + + + + + + + + + PreserveNewest + + + PreserveNewest + + + @@ -20,4 +36,20 @@ + + + + + + + PreserveNewest + + + + + + PreserveNewest + + + diff --git a/RBLNews.Shared/RBLNews.Shared.csproj.orig b/RBLNews.Shared/RBLNews.Shared.csproj.orig deleted file mode 100644 index 751c394..0000000 --- a/RBLNews.Shared/RBLNews.Shared.csproj.orig +++ /dev/null @@ -1,26 +0,0 @@ - - - - net8.0 - enable - enable - - - - - - - - -<<<<<<< HEAD -======= - - - ->>>>>>> css_bootstrap_blazor - - - - - - diff --git a/RBLNews.Shared/Services/Contracts/IConfigService.cs b/RBLNews.Shared/Services/Contracts/IConfigService.cs new file mode 100644 index 0000000..b92b96c --- /dev/null +++ b/RBLNews.Shared/Services/Contracts/IConfigService.cs @@ -0,0 +1,8 @@ +using RBLNews.Shared.Models; + +namespace RBLNews.Shared.Services.Contracts; + +public interface IConfigService +{ + AppSettingsModel? AppSettings { get; } +} \ No newline at end of file diff --git a/RBLNews.Shared/Services/EnvironmentVariablesService.cs b/RBLNews.Shared/Services/EnvironmentVariablesService.cs new file mode 100644 index 0000000..ccd8048 --- /dev/null +++ b/RBLNews.Shared/Services/EnvironmentVariablesService.cs @@ -0,0 +1,6 @@ +namespace RBLNews.Shared.Services; + +public class EnvironmentVariablesService +{ + public string? RblApiUrl => Environment.GetEnvironmentVariable("RblApiUrl"); +} \ No newline at end of file diff --git a/RBLNews.Shared/Services/FeedDataService.cs b/RBLNews.Shared/Services/FeedDataService.cs index 6a13540..a7746e4 100644 --- a/RBLNews.Shared/Services/FeedDataService.cs +++ b/RBLNews.Shared/Services/FeedDataService.cs @@ -2,6 +2,8 @@ using System.Net.Http.Json; using RBLFeederCommon.Models.RssFeed; +using RBLNews.Shared.Services.Contracts; + namespace RBLNews.Shared.Services { public interface IFeedDataService @@ -15,15 +17,22 @@ namespace RBLNews.Shared.Services public class FeedDataService : IFeedDataService { + private readonly IConfigService _configService; + private static readonly HttpClient httpClient = new(); public RssVM Feeds { get; private set; } public Action DataChanged { get; set; } + public FeedDataService(IConfigService configService) + { + this._configService = configService; + } + public async Task LoadFeeds() { - Feeds = await httpClient.GetFromJsonAsync("https://rblnews.de/api/feeds") ?? new RssVM(); + Feeds = await httpClient.GetFromJsonAsync($"{this._configService.AppSettings.BackendApiUrl}/feeds") ?? new RssVM(); DataChanged.Invoke(); } } diff --git a/RBLNews.Shared/_Imports.razor.BASE b/RBLNews.Shared/_Imports.razor.BASE deleted file mode 100644 index 954960d..0000000 --- a/RBLNews.Shared/_Imports.razor.BASE +++ /dev/null @@ -1,4 +0,0 @@ -@* ANT CSS DESIGN IMPORT -------------------- *@ -@using AntDesign - -@using Microsoft.AspNetCore.Components.Web diff --git a/RBLNews.Shared/_Imports.razor.LOCAL b/RBLNews.Shared/_Imports.razor.LOCAL deleted file mode 100644 index 7728512..0000000 --- a/RBLNews.Shared/_Imports.razor.LOCAL +++ /dev/null @@ -1 +0,0 @@ -@using Microsoft.AspNetCore.Components.Web diff --git a/RBLNews.Shared/_Imports.razor.REMOTE b/RBLNews.Shared/_Imports.razor.REMOTE deleted file mode 100644 index f1f2ce8..0000000 --- a/RBLNews.Shared/_Imports.razor.REMOTE +++ /dev/null @@ -1,4 +0,0 @@ -@* ANT CSS DESIGN IMPORT -------------------- *@ -@using BlazorBootstrap; - -@using Microsoft.AspNetCore.Components.Web diff --git a/RBLNews.Shared/_Imports.razor.orig b/RBLNews.Shared/_Imports.razor.orig deleted file mode 100644 index dc53ee4..0000000 --- a/RBLNews.Shared/_Imports.razor.orig +++ /dev/null @@ -1,8 +0,0 @@ -<<<<<<< HEAD -@using Microsoft.AspNetCore.Components.Web -======= -@* ANT CSS DESIGN IMPORT -------------------- *@ -@using BlazorBootstrap; - -@using Microsoft.AspNetCore.Components.Web ->>>>>>> css_bootstrap_blazor diff --git a/RBLNews.Shared/wwwroot/appsettings.Development.json b/RBLNews.Shared/wwwroot/appsettings.Development.json new file mode 100644 index 0000000..7a608cd --- /dev/null +++ b/RBLNews.Shared/wwwroot/appsettings.Development.json @@ -0,0 +1,11 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "App": { + "BackendApiUrl": "https://localhost:5147" + } +} diff --git a/RBLNews.Shared/wwwroot/appsettings.Production.json b/RBLNews.Shared/wwwroot/appsettings.Production.json new file mode 100644 index 0000000..0c2c7dc --- /dev/null +++ b/RBLNews.Shared/wwwroot/appsettings.Production.json @@ -0,0 +1,12 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*", + "App": { + "BackendApiUrl": "https://rblnews.de" + } +} diff --git a/RBLNews.Shared/wwwroot/appsettings.Test.json b/RBLNews.Shared/wwwroot/appsettings.Test.json new file mode 100644 index 0000000..8ceaf0e --- /dev/null +++ b/RBLNews.Shared/wwwroot/appsettings.Test.json @@ -0,0 +1,12 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*", + "App": { + "BackendApiUrl": "https://rbl.wohlleben.dev" + } +} diff --git a/RBLNews.Shared/wwwroot/appsettings.json b/RBLNews.Shared/wwwroot/appsettings.json new file mode 100644 index 0000000..10f68b8 --- /dev/null +++ b/RBLNews.Shared/wwwroot/appsettings.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*" +} diff --git a/RBLNews.Shared/wwwroot/css/app.css b/RBLNews.Shared/wwwroot/css/app.css index 472d329..dbed1f9 100644 --- a/RBLNews.Shared/wwwroot/css/app.css +++ b/RBLNews.Shared/wwwroot/css/app.css @@ -3,6 +3,10 @@ rot: #DD0741 schrift: #4b4b4b */ +body { + color: #4b4b4b; +} + @font-face { font-family: "Nanum Myeongjo", serif !important; font-weight: 400; @@ -13,6 +17,13 @@ schrift: #4b4b4b #feeds-page { color: #4b4b4b; } +#feeds-list { + margin-top: 15px; +} + +#filter { + margin-top: 15px; +} .card { color: #4b4b4b; @@ -31,20 +42,21 @@ schrift: #4b4b4b font-size: 0.8em; } -nav .container-fluid { +.container-fluid { padding-right: 0 !important; padding-left: 0 !important; } + nav .top-row { height: 1.8rem; background-color: rgb(221, 7, 65); color: #eee; } - /*nav .top-row h1, h2, h3, h4, h5 {*/ - /* color: #eee;*/ - /*}*/ +/*nav .top-row h1, h2, h3, h4, h5 {*/ +/* color: #eee;*/ +/*}*/ #filter button { @@ -59,21 +71,20 @@ nav .top-row { /*}*/ .btn-primary { - color: #fff; + color: #eee; background-color: #f75581; border-color: #DD0741; } .btn-primary:hover { - color: inherit; background-color: inherit; - border-color: inherit; + border-color: #4b4b4b; } .btn-outline-primary { - color: #f75581; + color: #4b4b4b; background-color: #fff; - border-color: #DD0741; + border-color: #4b4b4b; } .btn-outline-primary:hover { @@ -102,10 +113,9 @@ nav .top-row { background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e") no-repeat center/1.75rem rgba(255, 255, 255, 0.1); } - .navbar-toggler:checked { - background-color: rgba(255, 255, 255, 0.5); - } - +.navbar-toggler:checked { + background-color: rgba(255, 255, 255, 0.5); +} .navbar-brand { @@ -139,32 +149,32 @@ nav .top-row { padding-bottom: 0.6rem; } - .nav-item:first-of-type { - padding-top: 1rem; - } +.nav-item:first-of-type { + padding-top: 1rem; +} - .nav-item:last-of-type { - padding-bottom: 1rem; - } +.nav-item:last-of-type { + padding-bottom: 1rem; +} - .nav-item ::deep a { - color: #d7d7d7; - border-radius: 4px; - height: 3rem; - display: flex; - align-items: center; - line-height: 3rem; - } +.nav-item ::deep a { + color: #d7d7d7; + border-radius: 4px; + height: 3rem; + display: flex; + align-items: center; + line-height: 3rem; +} - .nav-item ::deep a.active { - background-color: rgba(255,255,255,0.37); - color: white; - } +.nav-item ::deep a.active { + background-color: rgba(255, 255, 255, 0.37); + color: white; +} - .nav-item ::deep a:hover { - background-color: rgba(255,255,255,0.1); - color: white; - } +.nav-item ::deep a:hover { + background-color: rgba(255, 255, 255, 0.1); + color: white; +} .nav-scrollable { display: none; @@ -189,8 +199,6 @@ nav .top-row { } - - .loading { position: absolute; top: 45%; @@ -226,12 +234,12 @@ nav .top-row { z-index: 1000; } - #blazor-error-ui .dismiss { - cursor: pointer; - position: absolute; - right: 0.75rem; - top: 0.5rem; - } +#blazor-error-ui .dismiss { + cursor: pointer; + position: absolute; + right: 0.75rem; + top: 0.5rem; +} .blazor-error-boundary { background: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIG92ZXJmbG93PSJoaWRkZW4iPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDAiPjxyZWN0IHg9IjIzNSIgeT0iNTEiIHdpZHRoPSI1NiIgaGVpZ2h0PSI0OSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMzUgLTUxKSI+PHBhdGggZD0iTTI2My41MDYgNTFDMjY0LjcxNyA1MSAyNjUuODEzIDUxLjQ4MzcgMjY2LjYwNiA1Mi4yNjU4TDI2Ny4wNTIgNTIuNzk4NyAyNjcuNTM5IDUzLjYyODMgMjkwLjE4NSA5Mi4xODMxIDI5MC41NDUgOTIuNzk1IDI5MC42NTYgOTIuOTk2QzI5MC44NzcgOTMuNTEzIDI5MSA5NC4wODE1IDI5MSA5NC42NzgyIDI5MSA5Ny4wNjUxIDI4OS4wMzggOTkgMjg2LjYxNyA5OUwyNDAuMzgzIDk5QzIzNy45NjMgOTkgMjM2IDk3LjA2NTEgMjM2IDk0LjY3ODIgMjM2IDk0LjM3OTkgMjM2LjAzMSA5NC4wODg2IDIzNi4wODkgOTMuODA3MkwyMzYuMzM4IDkzLjAxNjIgMjM2Ljg1OCA5Mi4xMzE0IDI1OS40NzMgNTMuNjI5NCAyNTkuOTYxIDUyLjc5ODUgMjYwLjQwNyA1Mi4yNjU4QzI2MS4yIDUxLjQ4MzcgMjYyLjI5NiA1MSAyNjMuNTA2IDUxWk0yNjMuNTg2IDY2LjAxODNDMjYwLjczNyA2Ni4wMTgzIDI1OS4zMTMgNjcuMTI0NSAyNTkuMzEzIDY5LjMzNyAyNTkuMzEzIDY5LjYxMDIgMjU5LjMzMiA2OS44NjA4IDI1OS4zNzEgNzAuMDg4N0wyNjEuNzk1IDg0LjAxNjEgMjY1LjM4IDg0LjAxNjEgMjY3LjgyMSA2OS43NDc1QzI2Ny44NiA2OS43MzA5IDI2Ny44NzkgNjkuNTg3NyAyNjcuODc5IDY5LjMxNzkgMjY3Ljg3OSA2Ny4xMTgyIDI2Ni40NDggNjYuMDE4MyAyNjMuNTg2IDY2LjAxODNaTTI2My41NzYgODYuMDU0N0MyNjEuMDQ5IDg2LjA1NDcgMjU5Ljc4NiA4Ny4zMDA1IDI1OS43ODYgODkuNzkyMSAyNTkuNzg2IDkyLjI4MzcgMjYxLjA0OSA5My41Mjk1IDI2My41NzYgOTMuNTI5NSAyNjYuMTE2IDkzLjUyOTUgMjY3LjM4NyA5Mi4yODM3IDI2Ny4zODcgODkuNzkyMSAyNjcuMzg3IDg3LjMwMDUgMjY2LjExNiA4Ni4wNTQ3IDI2My41NzYgODYuMDU0N1oiIGZpbGw9IiNGRkU1MDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4=) no-repeat 1rem/1.8rem, #b32121; @@ -239,9 +247,9 @@ nav .top-row { color: white; } - .blazor-error-boundary::after { - content: "An error has occurred." - } +.blazor-error-boundary::after { + content: "An error has occurred." +} .status-bar-safe-area { display: none; @@ -263,6 +271,26 @@ nav .top-row { } } +.swb-container { + position: relative; + padding-top: 10px; +} + +.swb-badge { + position: absolute; + top: -5px; + /*height:20px;*/ + min-width: 20px; + z-index: 999; + background-color: #DD0741; + display: inline-block; + margin: 8px 2px; + border-radius: 18px; + text-align: center; + font-size: 0.7em; + color: #eee; +} + /*html, body { font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; diff --git a/RBLNews.Web/Components/App.razor.orig b/RBLNews.Web/Components/App.razor.orig deleted file mode 100644 index 76ed369..0000000 --- a/RBLNews.Web/Components/App.razor.orig +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - @* *@ - - @* *@ - @* *@ - - - - - - -<<<<<<< HEAD -======= - - - - - - - ->>>>>>> css_bootstrap_blazor - - - - diff --git a/RBLNews.Web/Program.cs b/RBLNews.Web/Program.cs index 9ca2574..38aa526 100644 --- a/RBLNews.Web/Program.cs +++ b/RBLNews.Web/Program.cs @@ -1,24 +1,39 @@ +using RBLNews.Shared.Models; using RBLNews.Shared.Services; +using RBLNews.Shared.Services.Contracts; using RBLNews.Web.Components; +using RBLNews.Web.Services; var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddRazorComponents() - .AddInteractiveServerComponents(); + .AddInteractiveServerComponents(); builder.Services.AddBlazorBootstrap(); +builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); +// required for production +builder.WebHost.UseStaticWebAssets(); + var app = builder.Build(); // Configure the HTTP request pipeline. if (!app.Environment.IsDevelopment()) { - app.UseExceptionHandler("/Error", createScopeForErrors: true); - // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. - app.UseHsts(); + app.UseExceptionHandler("/Error", createScopeForErrors: true); + + // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. + app.UseHsts(); +} + +AppSettingsModel? appSettings = app.Configuration.GetSection("App").Get(); + +if (string.IsNullOrEmpty(appSettings?.BackendApiUrl)) +{ + throw new Exception($"can't instantiate services, due to paramters are null. backendApiUrl: '{appSettings?.BackendApiUrl}'"); } app.UseHttpsRedirection(); @@ -27,7 +42,7 @@ app.UseStaticFiles(); app.UseAntiforgery(); app.MapRazorComponents() - .AddInteractiveServerRenderMode() - .AddAdditionalAssemblies(typeof(RBLNews.Shared._Imports).Assembly); + .AddInteractiveServerRenderMode() + .AddAdditionalAssemblies(typeof( RBLNews.Shared._Imports ).Assembly); -app.Run(); +app.Run(); \ No newline at end of file diff --git a/RBLNews.Web/Program.cs.orig b/RBLNews.Web/Program.cs.orig deleted file mode 100644 index 761c4fa..0000000 --- a/RBLNews.Web/Program.cs.orig +++ /dev/null @@ -1,36 +0,0 @@ -using RBLNews.Shared.Services; -using RBLNews.Web.Components; - -var builder = WebApplication.CreateBuilder(args); - -// Add services to the container. -builder.Services.AddRazorComponents() - .AddInteractiveServerComponents(); -<<<<<<< HEAD -======= -builder.Services.AddBlazorBootstrap(); - -builder.Services.AddSingleton(); -builder.Services.AddSingleton(); ->>>>>>> css_bootstrap_blazor - -var app = builder.Build(); - -// Configure the HTTP request pipeline. -if (!app.Environment.IsDevelopment()) -{ - app.UseExceptionHandler("/Error", createScopeForErrors: true); - // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. - app.UseHsts(); -} - -app.UseHttpsRedirection(); - -app.UseStaticFiles(); -app.UseAntiforgery(); - -app.MapRazorComponents() - .AddInteractiveServerRenderMode() - .AddAdditionalAssemblies(typeof(RBLNews.Shared._Imports).Assembly); - -app.Run(); diff --git a/RBLNews.Web/Properties/launchSettings.json b/RBLNews.Web/Properties/launchSettings.json index d0779f2..42b81b2 100644 --- a/RBLNews.Web/Properties/launchSettings.json +++ b/RBLNews.Web/Properties/launchSettings.json @@ -18,15 +18,33 @@ "ASPNETCORE_ENVIRONMENT": "Development" } }, - "https": { + "https (DEV)": { "commandName": "Project", "dotnetRunMessages": true, - "launchBrowser": true, + "launchBrowser": false, "applicationUrl": "https://localhost:7158;http://localhost:5289", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } }, + "https (TEST)": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": false, + "applicationUrl": "https://localhost:7158;http://localhost:5289", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Test" + } + }, + "https (PROD)": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": false, + "applicationUrl": "https://localhost:7158;http://localhost:5289", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Production" + } + }, "IIS Express": { "commandName": "IISExpress", "launchBrowser": true, diff --git a/RBLNews.Web/RBLNews.Web.csproj b/RBLNews.Web/RBLNews.Web.csproj index a259a0c..3963f4a 100644 --- a/RBLNews.Web/RBLNews.Web.csproj +++ b/RBLNews.Web/RBLNews.Web.csproj @@ -7,6 +7,28 @@ Linux + + + + + + + + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + @@ -21,4 +43,8 @@ + + + + diff --git a/RBLNews.Web/Services/ConfigService.cs b/RBLNews.Web/Services/ConfigService.cs new file mode 100644 index 0000000..bff176c --- /dev/null +++ b/RBLNews.Web/Services/ConfigService.cs @@ -0,0 +1,16 @@ +using RBLNews.Shared.Models; +using RBLNews.Shared.Services.Contracts; + +namespace RBLNews.Web.Services; + +public class ConfigService : IConfigService +{ + public AppSettingsModel? AppSettings { get; } + + public ConfigService(IConfiguration configuration) + { + AppSettings = configuration.GetSection("App").Get(); + if(this.AppSettings == null) + throw new NullReferenceException("App settings not found"); + } +} \ No newline at end of file diff --git a/RBLNews.Web/appsettings.Development.json b/RBLNews.Web/appsettings.Development.json index 0c208ae..54323f7 100644 --- a/RBLNews.Web/appsettings.Development.json +++ b/RBLNews.Web/appsettings.Development.json @@ -4,5 +4,8 @@ "Default": "Information", "Microsoft.AspNetCore": "Warning" } + }, + "App": { + "BackendApiUrl": "https://localhost:7127" } } diff --git a/RBLNews.Web/appsettings.Production.json b/RBLNews.Web/appsettings.Production.json new file mode 100644 index 0000000..484d0cf --- /dev/null +++ b/RBLNews.Web/appsettings.Production.json @@ -0,0 +1,12 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*", + "App": { + "BackendApiUrl": "https://rblnews.de/api" + } +} diff --git a/RBLNews.Web/appsettings.Test.json b/RBLNews.Web/appsettings.Test.json new file mode 100644 index 0000000..9d1adf2 --- /dev/null +++ b/RBLNews.Web/appsettings.Test.json @@ -0,0 +1,12 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*", + "App": { + "BackendApiUrl": "https://rbl.wohlleben.dev/api" + } +}