Skip to content

Commit 17daced

Browse files
committed
feat(versioning): bump to v2.2.0, enhance changelog automation, and improve ArtistSearch initialization
- Updated to version 2.2.0 across all projects and documentation. - Adjusted changelog logic to prevent relocation of the `[Unreleased]` section above Jekyll front matter. - Enhanced ArtistSearch initialization to support relational migrations and schema creation for non-relational providers.
1 parent 2701902 commit 17daced

9 files changed

Lines changed: 75 additions & 15 deletions

File tree

docs/VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2.1.4
1+
2.2.0

docs/pages/changelog.md

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
2323

2424
## [Unreleased]
2525

26+
## [2.2.0] - 2026-07-11
27+
2628
### Added
2729

2830
- Admin health checks now recognize DecentDB error 8 and automatically open a
@@ -46,6 +48,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
4648
stores them as `BLOB`, and `ALTER COLUMN TYPE` to `UUID` is unsupported by DecentDB
4749
(only `INT64`, `FLOAT64`, `TEXT`, `BOOL`). The no-op migration records itself as applied
4850
without attempting the unsupported `ALTER`, keeping `MigrateAsync` stable.
51+
- Updated the DecentDB providers to `2.16.1`, SkiaSharp managed and Linux native
52+
assets to `4.150.0`, Radzen to `11.1.3`, and related runtime, UI, test, and
53+
tooling dependencies.
54+
- Chart editing, user, user-group, and podcast detail routes now bind public
55+
GUID API keys directly instead of internal numeric IDs or custom string
56+
parsing.
57+
- Enabled solution-wide XML documentation output so build-time unused-using
58+
analysis runs consistently, and corrected malformed API documentation and
59+
formatter configuration.
4960

5061
### Fixed
5162

@@ -57,6 +68,27 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
5768
- ArtistSearch database is now auto-created on first use when the `.ddb` file is absent,
5869
eliminating the "database is empty or not initialized" error that previously required
5970
manual intervention.
71+
- Paged ArtistSearch queries now retrieve the requested page before counting
72+
results, preventing DecentDB positional parameters from carrying across
73+
commands and causing missing-parameter failures.
74+
- Chart edit navigation now uses the chart API key, and missing chart album
75+
matching is accent-insensitive.
76+
- Aligned the SkiaSharp managed and Linux native packages and moved image
77+
drawing to the supported sampling API, preventing native `119.0` and managed
78+
`150.0` incompatibility failures during image processing.
79+
- Solution Debug and CI analyzer builds now complete without dependency,
80+
obsolete API, or XML documentation warnings.
81+
- Version bump automation now promotes release notes without moving the fresh
82+
Unreleased heading above the changelog's Jekyll front matter.
83+
- ArtistSearch initialization now uses migrations for relational databases and
84+
schema creation for non-relational providers, preventing OpenSubsonic
85+
`getTopSongs` failures in in-memory hosts.
86+
87+
### Security
88+
89+
- Pinned `Microsoft.OpenApi` to patched version `2.7.5`, preventing crafted
90+
circular schema references from terminating the process during OpenAPI
91+
document parsing.
6092

6193
## [2.1.4] - 2026-06-16
6294

scripts/bump_version.sh

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -149,13 +149,9 @@ if [[ -f "$CHANGELOG" ]]; then
149149

150150
# Check if [Unreleased] section exists
151151
if grep -q "^## \[Unreleased\]" "$CHANGELOG"; then
152-
# Replace [Unreleased] header with versioned header + date
153-
sed -i "s|^## \[Unreleased\]|## [${VERSION}] - ${today}|" "$CHANGELOG"
154-
155-
# Insert a fresh [Unreleased] section before the new version header
156-
sed -i "1i\\
157-
## [Unreleased]\\
158-
" "$CHANGELOG"
152+
# Keep the fresh Unreleased section at the existing content location so
153+
# Jekyll front matter remains the first block in the document.
154+
sed -i "s|^## \[Unreleased\]|## [Unreleased]\\n\\n## [${VERSION}] - ${today}|" "$CHANGELOG"
159155

160156
log_update "$CHANGELOG" "promoted [Unreleased] → [$VERSION] - $today"
161157
else

src/Melodee.Blazor/Melodee.Blazor.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
<!-- Auto-incrementing version -->
1818

19-
<VersionPrefix>2.1.4</VersionPrefix>
19+
<VersionPrefix>2.2.0</VersionPrefix>
2020

2121
<VersionSuffix>build$([System.DateTime]::UtcNow.ToString("yyyyMMddHHmmss"))</VersionSuffix>
2222
<AssemblyVersion>$(VersionPrefix).0</AssemblyVersion>

src/Melodee.Cli/Melodee.Cli.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
<Deterministic>false</Deterministic>
1010
<NoWarn>$(NoWarn);NU1507</NoWarn>
1111

12-
<VersionPrefix>2.1.4</VersionPrefix>
12+
<VersionPrefix>2.2.0</VersionPrefix>
1313

1414
<VersionSuffix>build$([System.DateTime]::UtcNow.ToString("yyyyMMddHHmmss"))</VersionSuffix>
1515
<AssemblyVersion>$(VersionPrefix).0</AssemblyVersion>

src/Melodee.Common/Melodee.Common.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
<NoWarn>$(NoWarn);NU1507</NoWarn>
1010

1111
<!-- Auto-incrementing version -->
12-
<VersionPrefix>2.1.4</VersionPrefix>
12+
<VersionPrefix>2.2.0</VersionPrefix>
1313
<VersionSuffix>build$([System.DateTime]::UtcNow.ToString("yyyyMMddHHmmss"))</VersionSuffix>
1414
<AssemblyVersion>$(VersionPrefix).0</AssemblyVersion>
1515
<FileVersion>$(VersionPrefix).0</FileVersion>

src/Melodee.Common/Services/SearchEngines/ArtistSearchEngineService.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,15 @@ public async Task InitializeAsync(IMelodeeConfiguration? configuration = null,
8787

8888
await using (var scopedContext = await artistSearchEngineServiceDbContextFactory.CreateDbContextAsync(cancellationToken).ConfigureAwait(false))
8989
{
90-
await scopedContext.Database.MigrateAsync(cancellationToken);
90+
if (scopedContext.Database.IsRelational())
91+
{
92+
await scopedContext.Database.MigrateAsync(cancellationToken).ConfigureAwait(false);
93+
}
94+
else
95+
{
96+
await scopedContext.Database.EnsureCreatedAsync(cancellationToken).ConfigureAwait(false);
97+
}
98+
9199
await BackfillLocalArtistAliasLookupAsync(scopedContext, cancellationToken).ConfigureAwait(false);
92100
}
93101

src/Melodee.Mql/Melodee.Mql.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<GenerateAssemblyInfo>true</GenerateAssemblyInfo>
88
<NoWarn>$(NoWarn);NU1507</NoWarn>
99

10-
<VersionPrefix>2.1.4</VersionPrefix>
10+
<VersionPrefix>2.2.0</VersionPrefix>
1111
<VersionSuffix>build$([System.DateTime]::UtcNow.ToString("yyyyMMddHHmmss"))</VersionSuffix>
1212
<AssemblyVersion>$(VersionPrefix).0</AssemblyVersion>
1313
<FileVersion>$(VersionPrefix).0</FileVersion>

tests/Melodee.Tests.Common/Services/SearchEngines/ArtistSearchEngineServiceTests.cs

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
using Melodee.Common.Filtering;
88
using Melodee.Common.Models;
99
using Melodee.Common.Models.SearchEngines;
10+
using Melodee.Common.Models.SearchEngines.ArtistSearchEngineServiceData;
1011
using Melodee.Common.Services.SearchEngines;
1112
using Microsoft.EntityFrameworkCore;
1213
using Moq;
@@ -32,6 +33,28 @@ public async Task InitializeAsync_WhenCalled_InitializesService()
3233
Assert.True(true);
3334
}
3435

36+
[Fact]
37+
public async Task InitializeAsync_WithNonRelationalProvider_CreatesDatabaseWithoutMigrations()
38+
{
39+
var databaseName = $"artist-search-{Guid.NewGuid():N}";
40+
var options = new DbContextOptionsBuilder<ArtistSearchEngineServiceDbContext>()
41+
.UseInMemoryDatabase(databaseName)
42+
.Options;
43+
var contextFactory = new Mock<IDbContextFactory<ArtistSearchEngineServiceDbContext>>();
44+
contextFactory
45+
.Setup(x => x.CreateDbContextAsync(It.IsAny<CancellationToken>()))
46+
.ReturnsAsync(() => new ArtistSearchEngineServiceDbContext(options));
47+
var service = CreateArtistSearchEngineService(
48+
MockConfigurationFactory(),
49+
MockHttpClientFactory(),
50+
contextFactory.Object);
51+
52+
await service.InitializeAsync();
53+
54+
await using var context = new ArtistSearchEngineServiceDbContext(options);
55+
Assert.True(await context.Database.CanConnectAsync());
56+
}
57+
3558
[Fact]
3659
public async Task InitializeAsync_WhenCalledMultipleTimes_OnlyInitializesOnce()
3760
{
@@ -603,7 +626,8 @@ private static Album NewAlbum(Artist artist, string name, int year)
603626

604627
private ArtistSearchEngineService CreateArtistSearchEngineService(
605628
IMelodeeConfigurationFactory configFactory,
606-
IHttpClientFactory httpClientFactory)
629+
IHttpClientFactory httpClientFactory,
630+
IDbContextFactory<ArtistSearchEngineServiceDbContext>? artistSearchEngineContextFactory = null)
607631
{
608632
return new ArtistSearchEngineService(
609633
Logger,
@@ -612,7 +636,7 @@ private ArtistSearchEngineService CreateArtistSearchEngineService(
612636
MockSpotifyClientBuilder(),
613637
configFactory,
614638
MockFactory(),
615-
MockArtistSearchEngineFactory(),
639+
artistSearchEngineContextFactory ?? MockArtistSearchEngineFactory(),
616640
GetMusicBrainzRepository(),
617641
Serializer,
618642
httpClientFactory);

0 commit comments

Comments
 (0)