Voeg leesbare slug toe aan Offering naast het GUID-ID
Continuous Integration / config (pull_request) Successful in 12s
Continuous Integration / changes (pull_request) Successful in 21s
Continuous Integration / frontend-prepare (pull_request) Skipped
Continuous Integration / frontend-build (pull_request) Skipped
Continuous Integration / frontend-test (pull_request) Skipped
Continuous Integration / frontend-lint (pull_request) Skipped
Continuous Integration / backend-build (pull_request) Successful in 4m31s
Continuous Integration / vulnerability-scan (pull_request) Successful in 3m57s
Continuous Integration / backend-test (pull_request) Successful in 6m11s
Continuous Integration / publish-production (pull_request) Skipped
Continuous Integration / deploy-production (pull_request) Skipped
Continuous Integration / publish-test (pull_request) Successful in 5m51s
Continuous Integration / deploy-test (pull_request) Skipped
Continuous Integration / config (pull_request) Successful in 12s
Continuous Integration / changes (pull_request) Successful in 21s
Continuous Integration / frontend-prepare (pull_request) Skipped
Continuous Integration / frontend-build (pull_request) Skipped
Continuous Integration / frontend-test (pull_request) Skipped
Continuous Integration / frontend-lint (pull_request) Skipped
Continuous Integration / backend-build (pull_request) Successful in 4m31s
Continuous Integration / vulnerability-scan (pull_request) Successful in 3m57s
Continuous Integration / backend-test (pull_request) Successful in 6m11s
Continuous Integration / publish-production (pull_request) Skipped
Continuous Integration / deploy-production (pull_request) Skipped
Continuous Integration / publish-test (pull_request) Successful in 5m51s
Continuous Integration / deploy-test (pull_request) Skipped
Het Offering-ID is een GUID en niet geschikt om aan gebruikers te tonen. Voeg een op de titel gebaseerde, unieke slug toe die via de public en admin API wordt meegegeven, zodat de frontend iets leesbaars kan tonen in plaats van het ruwe ID. Het ID blijft ongewijzigd de echte identifier. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -25,6 +25,7 @@ public class OfferingsService(IOfferingRepository repository, ILogger<OfferingsS
|
||||
var offering = new Offering
|
||||
{
|
||||
Id = Guid.NewGuid(),
|
||||
Slug = await GenerateUniqueSlugAsync(request.Title),
|
||||
Title = request.Title,
|
||||
Description = request.Description,
|
||||
Price = request.Price,
|
||||
@@ -69,6 +70,9 @@ public class OfferingsService(IOfferingRepository repository, ILogger<OfferingsS
|
||||
if (offering is null)
|
||||
return null;
|
||||
|
||||
if (!string.Equals(offering.Title, request.Title, StringComparison.Ordinal))
|
||||
offering.Slug = await GenerateUniqueSlugAsync(request.Title, excludeId: offering.Id);
|
||||
|
||||
offering.Title = request.Title;
|
||||
offering.Description = request.Description;
|
||||
offering.Price = request.Price;
|
||||
@@ -202,8 +206,24 @@ public class OfferingsService(IOfferingRepository repository, ILogger<OfferingsS
|
||||
repository.Update(current);
|
||||
}
|
||||
|
||||
private async Task<string> GenerateUniqueSlugAsync(string title, Guid? excludeId = null)
|
||||
{
|
||||
var baseSlug = Slugifier.Slugify(title);
|
||||
var slug = baseSlug;
|
||||
var suffix = 2;
|
||||
|
||||
while (await repository.ExistsBySlugAsync(slug, excludeId))
|
||||
{
|
||||
slug = $"{baseSlug}-{suffix}";
|
||||
suffix++;
|
||||
}
|
||||
|
||||
return slug;
|
||||
}
|
||||
|
||||
private static OfferingDto ToPublicDto(Offering o) => new(
|
||||
o.Id.ToString(),
|
||||
o.Slug,
|
||||
o.Title,
|
||||
o.Description,
|
||||
o.Price,
|
||||
@@ -215,6 +235,7 @@ public class OfferingsService(IOfferingRepository repository, ILogger<OfferingsS
|
||||
|
||||
private static OfferingAdminDto ToAdminDto(Offering o) => new(
|
||||
o.Id.ToString(),
|
||||
o.Slug,
|
||||
o.Title,
|
||||
o.Description,
|
||||
o.Price,
|
||||
|
||||
Reference in New Issue
Block a user