Sharable rewind point

This commit is contained in:
2025-12-27 14:24:35 +08:00
parent b51a086031
commit bb5d70eddb
3 changed files with 94 additions and 0 deletions

View File

@@ -1,3 +1,4 @@
using System.Security.Cryptography;
using DysonNetwork.Shared.Models;
using DysonNetwork.Shared.Proto;
using Grpc.Net.Client;
@@ -75,4 +76,55 @@ public class AccountRewindService(
return await CreateRewindPoint(accountId);
}
public async Task<SnRewindPoint?> GetPublicRewindPoint(string code)
{
var point = await db.RewindPoints
.Where(p => p.SharableCode == code)
.OrderBy(p => p.CreatedAt)
.FirstOrDefaultAsync();
return point;
}
public async Task<SnRewindPoint> SetRewindPointPublic(Guid accountId, int year)
{
var point = await db.RewindPoints
.Where(p => p.AccountId == accountId && p.Year == year)
.OrderBy(p => p.CreatedAt)
.FirstOrDefaultAsync();
if (point is null) throw new InvalidOperationException("No rewind point was found.");
point.SharableCode = _GenerateRandomString(16);
db.RewindPoints.Update(point);
await db.SaveChangesAsync();
return point;
}
public async Task<SnRewindPoint> SetRewindPointPrivate(Guid accountId, int year)
{
var point = await db.RewindPoints
.Where(p => p.AccountId == accountId && p.Year == year)
.OrderBy(p => p.CreatedAt)
.FirstOrDefaultAsync();
if (point is null) throw new InvalidOperationException("No rewind point was found.");
point.SharableCode = null;
db.RewindPoints.Update(point);
await db.SaveChangesAsync();
return point;
}
private static string _GenerateRandomString(int length)
{
const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
var result = new char[length];
using var rng = RandomNumberGenerator.Create();
for (var i = 0; i < length; i++)
{
var bytes = new byte[1];
rng.GetBytes(bytes);
result[i] = chars[bytes[0] % chars.Length];
}
return new string(result);
}
}