Compare commits

...

2 Commits

Author SHA1 Message Date
a23338c263 🐛 Fix afdian oauth 2025-06-22 22:02:14 +08:00
c5ef9b065b 🐛 Bug fixes 2025-06-22 21:42:28 +08:00
4 changed files with 39 additions and 19 deletions

View File

@ -101,20 +101,22 @@ public class AfdianOidcService(
var client = HttpClientFactory.CreateClient(); var client = HttpClientFactory.CreateClient();
var request = new HttpRequestMessage(HttpMethod.Post, "https://afdian.com/api/oauth2/access_token"); var request = new HttpRequestMessage(HttpMethod.Post, "https://afdian.com/api/oauth2/access_token");
request.Content = content;
var response = await client.SendAsync(request); var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode(); response.EnsureSuccessStatusCode();
var json = await response.Content.ReadAsStringAsync(); var json = await response.Content.ReadAsStringAsync();
var afdianUser = JsonDocument.Parse(json).RootElement; var afdianResponse = JsonDocument.Parse(json).RootElement;
var userId = afdianUser.GetProperty("user_id").GetString() ?? ""; var user = afdianResponse.GetProperty("data");
var avatar = afdianUser.TryGetProperty("avatar", out var avatarElement) ? avatarElement.GetString() : null; var userId = user.GetProperty("user_id").GetString() ?? "";
var avatar = user.TryGetProperty("avatar", out var avatarElement) ? avatarElement.GetString() : null;
return new OidcUserInfo return new OidcUserInfo
{ {
UserId = userId, UserId = userId,
DisplayName = (afdianUser.TryGetProperty("name", out var nameElement) DisplayName = (user.TryGetProperty("name", out var nameElement)
? nameElement.GetString() ? nameElement.GetString()
: null) ?? "", : null) ?? "",
ProfilePictureUrl = avatar, ProfilePictureUrl = avatar,

View File

@ -10,7 +10,7 @@ public record class SubscriptionTypeData(
decimal BasePrice decimal BasePrice
) )
{ {
public static Dictionary<string, SubscriptionTypeData> SubscriptionDict = public static readonly Dictionary<string, SubscriptionTypeData> SubscriptionDict =
new() new()
{ {
[SubscriptionType.Twinkle] = new SubscriptionTypeData(SubscriptionType.Twinkle, 0), [SubscriptionType.Twinkle] = new SubscriptionTypeData(SubscriptionType.Twinkle, 0),
@ -145,8 +145,7 @@ public class Subscription : ModelBase
return new SubscriptionReferenceObject return new SubscriptionReferenceObject
{ {
Id = Id, Id = Id,
BegunAt = BegunAt, Status = Status,
EndedAt = EndedAt,
Identifier = Identifier, Identifier = Identifier,
IsActive = IsActive, IsActive = IsActive,
AccountId = AccountId, AccountId = AccountId,
@ -166,9 +165,8 @@ public class PaymentDetails
public class SubscriptionReferenceObject : ModelBase public class SubscriptionReferenceObject : ModelBase
{ {
public Guid Id { get; set; } = Guid.NewGuid(); public Guid Id { get; set; } = Guid.NewGuid();
public Instant BegunAt { get; set; } public SubscriptionStatus Status { get; set; }
public Instant? EndedAt { get; set; } public string Identifier { get; set; } = null!;
[MaxLength(4096)] public string Identifier { get; set; } = null!;
public bool IsActive { get; set; } = true; public bool IsActive { get; set; } = true;
public Guid AccountId { get; set; } public Guid AccountId { get; set; }
} }

View File

@ -36,6 +36,24 @@ public class SubscriptionController(SubscriptionService subscriptions, AppDataba
return subscriptionsList; return subscriptionsList;
} }
[HttpGet("fuzzy/{prefix}")]
[Authorize]
public async Task<ActionResult<Subscription>> GetSubscriptionFuzzy(string prefix)
{
if (HttpContext.Items["CurrentUser"] is not Account.Account currentUser) return Unauthorized();
var subs = await db.WalletSubscriptions
.Where(s => s.AccountId == currentUser.Id && s.IsActive)
.Where(s => EF.Functions.ILike(s.Identifier, prefix + "%"))
.OrderByDescending(s => s.BegunAt)
.ToListAsync();
if (subs.Count == 0) return NotFound();
var subscription = subs.FirstOrDefault(s => s.IsAvailable);
if (subscription is null) return NotFound();
return Ok(subscription);
}
[HttpGet("{identifier}")] [HttpGet("{identifier}")]
[Authorize] [Authorize]
public async Task<ActionResult<Subscription>> GetSubscription(string identifier) public async Task<ActionResult<Subscription>> GetSubscription(string identifier)
@ -70,9 +88,7 @@ public class SubscriptionController(SubscriptionService subscriptions, AppDataba
Duration? cycleDuration = null; Duration? cycleDuration = null;
if (request.CycleDurationDays.HasValue) if (request.CycleDurationDays.HasValue)
{
cycleDuration = Duration.FromDays(request.CycleDurationDays.Value); cycleDuration = Duration.FromDays(request.CycleDurationDays.Value);
}
try try
{ {

View File

@ -155,15 +155,19 @@ public class SubscriptionService(AppDatabase db, PaymentService payment, ICacheS
if (subscription is null) if (subscription is null)
throw new InvalidOperationException("Invalid order."); throw new InvalidOperationException("Invalid order.");
var now = SystemClock.Instance.GetCurrentInstant(); if (subscription.Status == SubscriptionStatus.Expired)
var cycle = subscription.BegunAt.Minus(subscription.RenewalAt ?? now); {
var now = SystemClock.Instance.GetCurrentInstant();
var cycle = subscription.BegunAt.Minus(subscription.RenewalAt ?? subscription.EndedAt ?? now);
var nextRenewalAt = subscription.RenewalAt?.Plus(cycle); var nextRenewalAt = subscription.RenewalAt?.Plus(cycle);
var nextEndedAt = subscription.RenewalAt?.Plus(cycle); var nextEndedAt = subscription.EndedAt?.Plus(cycle);
subscription.RenewalAt = nextRenewalAt;
subscription.EndedAt = nextEndedAt;
}
subscription.Status = SubscriptionStatus.Paid; subscription.Status = SubscriptionStatus.Paid;
subscription.RenewalAt = nextRenewalAt;
subscription.EndedAt = nextEndedAt;
db.Update(subscription); db.Update(subscription);
await db.SaveChangesAsync(); await db.SaveChangesAsync();