From 000d7bac92a686e1e4ecadeb328c0a5602a96e10 Mon Sep 17 00:00:00 2001 From: Kieran Date: Sat, 5 Mar 2022 20:10:56 +0000 Subject: [PATCH] Migrate email mapping keys --- VoidCat/Services/Migrations/IMigration.cs | 1 + .../Migrations/UserLookupKeyHashMigration.cs | 44 +++++++++++++++++++ 2 files changed, 45 insertions(+) create mode 100644 VoidCat/Services/Migrations/UserLookupKeyHashMigration.cs diff --git a/VoidCat/Services/Migrations/IMigration.cs b/VoidCat/Services/Migrations/IMigration.cs index a97c497..4368af2 100644 --- a/VoidCat/Services/Migrations/IMigration.cs +++ b/VoidCat/Services/Migrations/IMigration.cs @@ -9,5 +9,6 @@ public static class Migrations { public static void AddVoidMigrations(this IServiceCollection svc) { + svc.AddTransient(); } } \ No newline at end of file diff --git a/VoidCat/Services/Migrations/UserLookupKeyHashMigration.cs b/VoidCat/Services/Migrations/UserLookupKeyHashMigration.cs new file mode 100644 index 0000000..495242c --- /dev/null +++ b/VoidCat/Services/Migrations/UserLookupKeyHashMigration.cs @@ -0,0 +1,44 @@ +using Newtonsoft.Json; +using StackExchange.Redis; +using VoidCat.Model; + +namespace VoidCat.Services.Migrations; + +public class UserLookupKeyHashMigration : IMigration +{ + private readonly IDatabase _database; + + public UserLookupKeyHashMigration(IDatabase database) + { + _database = database; + } + + public async ValueTask Migrate() + { + var users = await _database.SetMembersAsync("users"); + foreach (var userId in users) + { + if (!Guid.TryParse(userId, out var gid)) continue; + + var userJson = await _database.StringGetAsync($"user:{gid}"); + var user = JsonConvert.DeserializeObject(userJson); + if (user == default) continue; + + if (await _database.KeyExistsAsync(MapOld(user.Email))) + { + await _database.KeyDeleteAsync(MapOld(user.Email)); + await _database.StringSetAsync(MapNew(user.Email), $"\"{userId}\""); + } + } + } + + private static RedisKey MapOld(string email) => $"user:email:{email}"; + private static RedisKey MapNew(string email) => $"user:email:{email.Hash("md5")}"; + + internal class UserEmail + { + public UserEmail(string email) => Email = email; + + public string Email { get; init; } + } +}