feat: add referral qrcode generation provider

This commit is contained in:
xiong
2026-07-26 20:45:14 +08:00
parent 4279795d46
commit 7c1fe7688b
11 changed files with 490 additions and 8 deletions

View File

@@ -12,7 +12,9 @@ using Tiku.Infrastructure.Persistence;
namespace Tiku.Infrastructure.Growth;
public sealed class ReferralService(TikuDbContext dbContext) : IReferralService
public sealed class ReferralService(
TikuDbContext dbContext,
IReferralQrcodeGenerator qrcodeGenerator) : IReferralService
{
private static readonly HashSet<string> AllowedEventTypes = new(StringComparer.OrdinalIgnoreCase)
{
@@ -227,13 +229,21 @@ public sealed class ReferralService(TikuDbContext dbContext) : IReferralService
var page = NormalizeOptional(command.Page) ?? "pages/index/index";
var provider = NormalizeOptional(command.Provider) ?? "wechat-miniapp";
var scene = NormalizeOptional(command.Scene) ?? $"ref={refCode}";
var qrcodeUrl = NormalizeOptional(command.QrcodeUrl) ?? $"miniapp://{page}?scene={Uri.EscapeDataString(scene)}";
var metadata = command.Metadata ?? JsonSerializer.SerializeToElement(new { generatedBy = "local-placeholder" });
var providedQrcodeUrl = NormalizeOptional(command.QrcodeUrl);
var generated = providedQrcodeUrl is null
? await qrcodeGenerator.GenerateAsync(
new ReferralQrcodeGenerateRequest(actor.TenantId, userId, refCode, provider, page, scene),
cancellationToken)
: new ReferralQrcodeGenerateResult(
providedQrcodeUrl,
provider,
JsonSerializer.SerializeToElement(new { generatedBy = "external_url" }));
var metadata = command.Metadata ?? generated.Metadata;
var item = await dbContext.ReferralQrcodes
.FirstOrDefaultAsync(entry =>
entry.TenantId == actor.TenantId &&
entry.Provider == provider &&
entry.Provider == generated.Provider &&
entry.Scene == scene &&
entry.Page == page,
cancellationToken);
@@ -246,14 +256,14 @@ public sealed class ReferralService(TikuDbContext dbContext) : IReferralService
RefCode = refCode,
Scene = scene,
Page = page,
Provider = provider
Provider = generated.Provider
};
dbContext.ReferralQrcodes.Add(item);
}
item.UserId = userId;
item.RefCode = refCode;
item.QrcodeUrl ??= qrcodeUrl;
item.QrcodeUrl = generated.QrcodeUrl;
item.Status = ReferralQrcodeStatus.Ready;
item.ErrorMessage = null;
item.Metadata = metadata;