From 7a9c9260af60f07627b5d270f58966096cb87e2c Mon Sep 17 00:00:00 2001 From: Mateusz Skoczek Date: Wed, 28 Jan 2026 23:28:31 +0100 Subject: [PATCH] initial commit --- .github/config/gitversion.yml | 9 + .github/workflows/pull_request_dev.yml | 22 ++ .github/workflows/pull_request_main.yml | 22 ++ .github/workflows/push_dev.yml | 22 ++ .github/workflows/push_main.yml | 72 +++++ .gitignore | 289 ++++++++++++++++++ ...Designer.Backend.Events.OutboxPattern.slnx | 3 + .../Event.cs | 19 ++ .../EventConfiguration.cs | 30 ++ .../EventOutboxSender.cs | 50 +++ .../IEventOutboxDbContext.cs | 8 + ...signer.Backend.Events.OutboxPattern.csproj | 21 ++ .../icon.png | Bin 0 -> 30933 bytes 13 files changed, 567 insertions(+) create mode 100644 .github/config/gitversion.yml create mode 100644 .github/workflows/pull_request_dev.yml create mode 100644 .github/workflows/pull_request_main.yml create mode 100644 .github/workflows/push_dev.yml create mode 100644 .github/workflows/push_main.yml create mode 100644 .gitignore create mode 100644 TimetableDesigner.Backend.Events.OutboxPattern.slnx create mode 100644 TimetableDesigner.Backend.Events.OutboxPattern/Event.cs create mode 100644 TimetableDesigner.Backend.Events.OutboxPattern/EventConfiguration.cs create mode 100644 TimetableDesigner.Backend.Events.OutboxPattern/EventOutboxSender.cs create mode 100644 TimetableDesigner.Backend.Events.OutboxPattern/IEventOutboxDbContext.cs create mode 100644 TimetableDesigner.Backend.Events.OutboxPattern/TimetableDesigner.Backend.Events.OutboxPattern.csproj create mode 100644 TimetableDesigner.Backend.Events.OutboxPattern/icon.png diff --git a/.github/config/gitversion.yml b/.github/config/gitversion.yml new file mode 100644 index 0000000..27761ed --- /dev/null +++ b/.github/config/gitversion.yml @@ -0,0 +1,9 @@ +next-version: 1.1.0 +mode: ContinuousDeployment +assembly-versioning-scheme: MajorMinorPatch +assembly-file-versioning-scheme: MajorMinorPatch + +branches: + main: + regex: ^main$ + increment: Patch diff --git a/.github/workflows/pull_request_dev.yml b/.github/workflows/pull_request_dev.yml new file mode 100644 index 0000000..df6f213 --- /dev/null +++ b/.github/workflows/pull_request_dev.yml @@ -0,0 +1,22 @@ +name: Build NuGet package on dev branch pull request + +on: + pull_request: + branches: + - "dev" + paths: + - "TimetableDesigner.Backend.Events.OutboxPattern**" + +jobs: + build: + name: Build + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v6.0.2 + - name: Setup .NET + uses: actions/setup-dotnet@v3 + with: + dotnet-version: 10.0.x + - name: Build + run: dotnet build \ No newline at end of file diff --git a/.github/workflows/pull_request_main.yml b/.github/workflows/pull_request_main.yml new file mode 100644 index 0000000..0b9e5bf --- /dev/null +++ b/.github/workflows/pull_request_main.yml @@ -0,0 +1,22 @@ +name: Build NuGet package on main branch pull request + +on: + pull_request: + branches: + - "main" + paths: + - "TimetableDesigner.Backend.Events.OutboxPattern**" + +jobs: + build: + name: Build + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v6.0.2 + - name: Setup .NET + uses: actions/setup-dotnet@v3 + with: + dotnet-version: 10.0.x + - name: Build + run: dotnet build diff --git a/.github/workflows/push_dev.yml b/.github/workflows/push_dev.yml new file mode 100644 index 0000000..9571242 --- /dev/null +++ b/.github/workflows/push_dev.yml @@ -0,0 +1,22 @@ +name: Build NuGet package on dev branch push + +on: + push: + branches: + - "dev" + paths: + - "TimetableDesigner.Backend.Events.OutboxPattern**" + +jobs: + build: + name: Build + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v6.0.2 + - name: Setup .NET + uses: actions/setup-dotnet@v3 + with: + dotnet-version: 10.0.x + - name: Build + run: dotnet build \ No newline at end of file diff --git a/.github/workflows/push_main.yml b/.github/workflows/push_main.yml new file mode 100644 index 0000000..a672a79 --- /dev/null +++ b/.github/workflows/push_main.yml @@ -0,0 +1,72 @@ +name: Build NuGet package on main branch push + +on: + push: + branches: + - "main" + paths: + - "TimetableDesigner.Backend.Events.OutboxPattern**" + +jobs: + build: + name: Build and pack + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v6.0.2 + with: + fetch-depth: 0 + - name: Setup .NET + uses: actions/setup-dotnet@v3 + with: + dotnet-version: 10.0.x + - name: Build + run: dotnet build + - name: Setup GitVersion + uses: gittools/actions/gitversion/setup@v4.2.0 + with: + versionSpec: 6.4.x + - name: Determine version + uses: gittools/actions/gitversion/execute@v4.2.0 + id: gitversion + with: + configFilePath: ./.github/config/gitversion.yml + - name: Create NuGet package + run: dotnet pack -c Release -p:Version=${{steps.gitversion.outputs.SemVer}} -p:PackageVersion=${{steps.gitversion.outputs.SemVer}} --output ${{ github.workspace}}/nuget + - name: Upload artifact + uses: actions/upload-artifact@v6 + with: + name: nuget + path: ${{ github.workspace}}/nuget/*.nupkg + outputs: + version: ${{ steps.gitversion.outputs.SemVer }} + publish: + name: Publish + permissions: write-all + runs-on: ubuntu-latest + needs: build + steps: + - name: Download artifact + uses: actions/download-artifact@v6 + with: + name: nuget + path: ${{ github.workspace}}/nuget + - name: Setup .NET + uses: actions/setup-dotnet@v3 + with: + dotnet-version: 10.0.x + - name: Add source + run: dotnet nuget add source --username TimetableDesigner --password ${{secrets.GITHUB_TOKEN }} --store-password-in-clear-text --name github "https://nuget.pkg.github.com/TimetableDesigner/index.json" + - name: Publish + run: dotnet nuget push ${{ github.workspace}}/nuget/*.nupkg --source "github" --api-key ${{ secrets.NUGET_REGISTRY_API_KEY }} --skip-duplicate + - name: Create Release + uses: actions/create-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag_name: ${{needs.build.outputs.version}} + release_name: ${{needs.build.outputs.version}} + draft: false + prerelease: false + + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b5d7fe6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,289 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +x64/ +x86/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ + +# Visual Studio 2015 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ +**/Properties/launchSettings.json + +# VS Code +.vscode/ + +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# TODO: Comment the next line if you want to checkin your web deploy settings +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/packages/* +# except build/, which is used as an MSBuild target. +!**/packages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/packages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +*.mdf +*.ldf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Typescript v1 declaration files +typings/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# JetBrains Rider +.idea/ +*.sln.iml + +# CodeRush +.cr/ + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs diff --git a/TimetableDesigner.Backend.Events.OutboxPattern.slnx b/TimetableDesigner.Backend.Events.OutboxPattern.slnx new file mode 100644 index 0000000..6ea9c22 --- /dev/null +++ b/TimetableDesigner.Backend.Events.OutboxPattern.slnx @@ -0,0 +1,3 @@ + + + diff --git a/TimetableDesigner.Backend.Events.OutboxPattern/Event.cs b/TimetableDesigner.Backend.Events.OutboxPattern/Event.cs new file mode 100644 index 0000000..f4ea843 --- /dev/null +++ b/TimetableDesigner.Backend.Events.OutboxPattern/Event.cs @@ -0,0 +1,19 @@ +using System.Text.Json; + +namespace TimetableDesigner.Backend.Events.OutboxPattern; + +public class Event +{ + public Guid Id { get; set; } + public required string Payload { get; set; } + public required string PayloadType { get; set; } + public DateTimeOffset OccuredOn { get; set; } = DateTimeOffset.UtcNow; + public DateTimeOffset? LastRetryOn { get; set; } + public uint RetryCount { get; set; } + + public Event(object payload) + { + Payload = JsonSerializer.Serialize(payload); + PayloadType = payload.GetType().FullName!; + } +} \ No newline at end of file diff --git a/TimetableDesigner.Backend.Events.OutboxPattern/EventConfiguration.cs b/TimetableDesigner.Backend.Events.OutboxPattern/EventConfiguration.cs new file mode 100644 index 0000000..0bcd183 --- /dev/null +++ b/TimetableDesigner.Backend.Events.OutboxPattern/EventConfiguration.cs @@ -0,0 +1,30 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; + +namespace TimetableDesigner.Backend.Events.OutboxPattern; + +public class EventConfiguration : IEntityTypeConfiguration +{ + public void Configure(EntityTypeBuilder builder) + { + builder.HasKey(x => x.Id); + builder.HasIndex(x => x.Id) + .IsUnique(); + builder.Property(x => x.Id) + .IsRequired(); + + builder.Property(x => x.Payload) + .IsRequired(); + + builder.Property(x => x.PayloadType) + .IsRequired(); + + builder.Property(x => x.OccuredOn) + .IsRequired(); + + builder.Property(x => x.LastRetryOn); + + builder.Property(x => x.RetryCount) + .IsRequired(); + } +} \ No newline at end of file diff --git a/TimetableDesigner.Backend.Events.OutboxPattern/EventOutboxSender.cs b/TimetableDesigner.Backend.Events.OutboxPattern/EventOutboxSender.cs new file mode 100644 index 0000000..2cdb9cf --- /dev/null +++ b/TimetableDesigner.Backend.Events.OutboxPattern/EventOutboxSender.cs @@ -0,0 +1,50 @@ +using System.Text.Json; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Hosting; + +namespace TimetableDesigner.Backend.Events.OutboxPattern; + +public class EventOutboxSender : BackgroundService where TDbContext : DbContext, IEventOutboxDbContext +{ + private readonly TDbContext _databaseContext; + private readonly IEventQueuePublisher _eventQueuePublisher; + + public EventOutboxSender(TDbContext databaseContext, IEventQueuePublisher eventQueuePublisher) + { + _databaseContext = databaseContext; + _eventQueuePublisher = eventQueuePublisher; + } + + protected override async Task ExecuteAsync(CancellationToken stoppingToken) + { + while (!stoppingToken.IsCancellationRequested) + { + Event? eventData = await _databaseContext.Events.FirstOrDefaultAsync(x => x.LastRetryOn == null, stoppingToken) + ?? await _databaseContext.Events.OrderBy(x => x.LastRetryOn).FirstOrDefaultAsync(stoppingToken); + + if (eventData is null) + { + continue; + } + + Type payloadType = Type.GetType(eventData.PayloadType)!; + JsonSerializer.Deserialize(eventData.Payload, payloadType); + + try + { + await _eventQueuePublisher.PublishAsync(eventData.Payload, payloadType); + + _databaseContext.Events.Remove(eventData); + } + catch + { + eventData.LastRetryOn = DateTimeOffset.UtcNow; + eventData.RetryCount++; + } + finally + { + await _databaseContext.SaveChangesAsync(stoppingToken); + } + } + } +} \ No newline at end of file diff --git a/TimetableDesigner.Backend.Events.OutboxPattern/IEventOutboxDbContext.cs b/TimetableDesigner.Backend.Events.OutboxPattern/IEventOutboxDbContext.cs new file mode 100644 index 0000000..47b7fe6 --- /dev/null +++ b/TimetableDesigner.Backend.Events.OutboxPattern/IEventOutboxDbContext.cs @@ -0,0 +1,8 @@ +using Microsoft.EntityFrameworkCore; + +namespace TimetableDesigner.Backend.Events.OutboxPattern; + +public interface IEventOutboxDbContext +{ + DbSet Events { get; } +} \ No newline at end of file diff --git a/TimetableDesigner.Backend.Events.OutboxPattern/TimetableDesigner.Backend.Events.OutboxPattern.csproj b/TimetableDesigner.Backend.Events.OutboxPattern/TimetableDesigner.Backend.Events.OutboxPattern.csproj new file mode 100644 index 0000000..c54ee55 --- /dev/null +++ b/TimetableDesigner.Backend.Events.OutboxPattern/TimetableDesigner.Backend.Events.OutboxPattern.csproj @@ -0,0 +1,21 @@ + + + + net10.0 + enable + enable + + TimetableDesigner.Backend.Events.OutboxPattern + Mateusz Skoczek + https://github.com/TimetableDesigner + icon.png + https://github.com/TimetableDesigner/TimetableDesigner.Backend.Events.OutboxPattern + + + + + + + + + diff --git a/TimetableDesigner.Backend.Events.OutboxPattern/icon.png b/TimetableDesigner.Backend.Events.OutboxPattern/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..98f0c54267e5a18876f310d9b59675674b0abbf9 GIT binary patch literal 30933 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