forked from gongxuegit/tiku-backend.net
feat: add referral qrcode generation provider
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user