diff --git a/DysonNetwork.Pass/Account/AccountCurrentController.cs b/DysonNetwork.Pass/Account/AccountCurrentController.cs index a7ab814..ae27229 100644 --- a/DysonNetwork.Pass/Account/AccountCurrentController.cs +++ b/DysonNetwork.Pass/Account/AccountCurrentController.cs @@ -24,7 +24,8 @@ public class AccountCurrentController( AccountEventService events, AuthService auth, FileService.FileServiceClient files, - FileReferenceService.FileReferenceServiceClient fileRefs + FileReferenceService.FileReferenceServiceClient fileRefs, + Credit.SocialCreditService creditService ) : ControllerBase { [HttpGet] @@ -268,7 +269,9 @@ public class AccountCurrentController( .OrderByDescending(x => x.CreatedAt) .FirstOrDefaultAsync(); - return result is null ? NotFound(ApiError.NotFound("check-in", traceId: HttpContext.TraceIdentifier)) : Ok(result); + return result is null + ? NotFound(ApiError.NotFound("check-in", traceId: HttpContext.TraceIdentifier)) + : Ok(result); } [HttpPost("check-in")] @@ -323,10 +326,11 @@ public class AccountCurrentController( TraceId = HttpContext.TraceIdentifier } ), - true when !await auth.ValidateCaptcha(captchaToken!) => BadRequest(ApiError.Validation(new Dictionary - { - ["captchaToken"] = new[] { "Invalid captcha token." } - }, traceId: HttpContext.TraceIdentifier)), + true when !await auth.ValidateCaptcha(captchaToken!) => BadRequest(ApiError.Validation( + new Dictionary + { + ["captchaToken"] = new[] { "Invalid captcha token." } + }, traceId: HttpContext.TraceIdentifier)), _ => await events.CheckInDaily(currentUser, backdated) }; } @@ -823,4 +827,60 @@ public class AccountCurrentController( return BadRequest(ex.Message); } } -} + + [HttpGet("leveling")] + [Authorize] + public async Task> GetLevelingHistory( + [FromQuery] int take = 20, + [FromQuery] int offset = 0 + ) + { + if (HttpContext.Items["CurrentUser"] is not Account currentUser) return Unauthorized(); + + var queryable = db.ExperienceRecords + .Where(r => r.AccountId == currentUser.Id) + .OrderByDescending(r => r.CreatedAt) + .AsQueryable(); + + var totalCount = await queryable.CountAsync(); + Response.Headers["X-Total"] = totalCount.ToString(); + + var records = await queryable + .Skip(offset) + .Take(take) + .ToListAsync(); + return Ok(records); + } + + [HttpGet("credits")] + public async Task> GetSocialCredit() + { + if (HttpContext.Items["CurrentUser"] is not Account currentUser) return Unauthorized(); + + var credit = await creditService.GetSocialCredit(currentUser.Id); + return Ok(credit); + } + + [HttpGet("credits/history")] + public async Task> GetCreditHistory( + [FromQuery] int take = 20, + [FromQuery] int offset = 0 + ) + { + if (HttpContext.Items["CurrentUser"] is not Account currentUser) return Unauthorized(); + + var queryable = db.SocialCreditRecords + .Where(r => r.AccountId == currentUser.Id) + .OrderByDescending(r => r.CreatedAt) + .AsQueryable(); + + var totalCount = await queryable.CountAsync(); + Response.Headers["X-Total"] = totalCount.ToString(); + + var records = await queryable + .Skip(offset) + .Take(take) + .ToListAsync(); + return Ok(records); + } +} \ No newline at end of file diff --git a/DysonNetwork.Pass/Credit/SocialCreditRecord.cs b/DysonNetwork.Pass/Credit/SocialCreditRecord.cs index de56891..ba309d7 100644 --- a/DysonNetwork.Pass/Credit/SocialCreditRecord.cs +++ b/DysonNetwork.Pass/Credit/SocialCreditRecord.cs @@ -1,11 +1,10 @@ using System.ComponentModel.DataAnnotations; using DysonNetwork.Shared.Data; using NodaTime; +using NodaTime.Serialization.Protobuf; namespace DysonNetwork.Pass.Credit; -using Google.Protobuf.WellKnownTypes; - public class SocialCreditRecord : ModelBase { public Guid Id { get; set; } @@ -26,8 +25,8 @@ public class SocialCreditRecord : ModelBase Reason = Reason, Delta = Delta, AccountId = AccountId.ToString(), - CreatedAt = Timestamp.FromDateTimeOffset(CreatedAt.ToDateTimeOffset()), - UpdatedAt = Timestamp.FromDateTimeOffset(UpdatedAt.ToDateTimeOffset()) + CreatedAt = CreatedAt.ToTimestamp(), + UpdatedAt = UpdatedAt.ToTimestamp() }; return proto; diff --git a/DysonNetwork.Pass/Leveling/ExperienceRecord.cs b/DysonNetwork.Pass/Leveling/ExperienceRecord.cs index 267a6b4..21ecc30 100644 --- a/DysonNetwork.Pass/Leveling/ExperienceRecord.cs +++ b/DysonNetwork.Pass/Leveling/ExperienceRecord.cs @@ -1,10 +1,9 @@ using System.ComponentModel.DataAnnotations; using DysonNetwork.Shared.Data; +using NodaTime.Serialization.Protobuf; namespace DysonNetwork.Pass.Leveling; -using Google.Protobuf.WellKnownTypes; - public class ExperienceRecord : ModelBase { public Guid Id { get; set; } = Guid.NewGuid(); @@ -26,8 +25,8 @@ public class ExperienceRecord : ModelBase Delta = Delta, BonusMultiplier = BonusMultiplier, AccountId = AccountId.ToString(), - CreatedAt = Timestamp.FromDateTimeOffset(CreatedAt.ToDateTimeOffset()), - UpdatedAt = Timestamp.FromDateTimeOffset(UpdatedAt.ToDateTimeOffset()) + CreatedAt = CreatedAt.ToTimestamp(), + UpdatedAt = UpdatedAt.ToTimestamp() }; return proto;