using WebDrop.Core; namespace WebDrop.Storage; public sealed partial class SqliteAccountStore { public AccountProfile Profile(string username) { lock (_gate) { using var cmd = _connection.CreateCommand(); cmd.CommandText = "SELECT display_name,avatar,modified_at,avatar_thumb FROM account_profiles WHERE username=$u"; cmd.Parameters.AddWithValue("$u", username); using var reader = cmd.ExecuteReader(); return reader.Read() ? new AccountProfile { Username = username, DisplayName = reader.GetString(0), Avatar = reader.IsDBNull(1) ? null : reader.GetString(1), HasAvatar = !reader.IsDBNull(1), ModifiedAt = reader.GetInt64(2), AvatarThumb = reader.IsDBNull(3) ? null : reader.GetString(3) } : new AccountProfile { Username = username, DisplayName = username, ModifiedAt = 0 }; } } public AccountProfile UpdateProfile(string username, string displayName, string? avatar, string? avatarThumb = null, bool keepAvatar = false) { if (displayName is null || displayName.Trim().Length > 48 || displayName.Any(char.IsControl)) throw new WebDropException(ErrorCode.BadRequest); if (keepAvatar) { var current = Profile(username); avatar = current.Avatar; avatarThumb = current.AvatarThumb; } else if (avatar is not null) AvatarData.Validate(avatar, AvatarData.MaxAccountGifChars); if (!keepAvatar && avatarThumb is not null) { if (avatar is null) throw new WebDropException(ErrorCode.BadRequest); AvatarData.ValidateThumb(avatarThumb); } lock (_gate) { using var cmd = _connection.CreateCommand(); cmd.CommandText = "INSERT INTO account_profiles(username,display_name,avatar,avatar_thumb,modified_at) VALUES($u,$n,$a,$b,$t) ON CONFLICT(username) DO UPDATE SET display_name=excluded.display_name,avatar=excluded.avatar,avatar_thumb=excluded.avatar_thumb,modified_at=MAX(account_profiles.modified_at+1,excluded.modified_at)"; cmd.Parameters.AddWithValue("$u", username); cmd.Parameters.AddWithValue("$n", displayName.Trim()); cmd.Parameters.AddWithValue("$a", (object?)avatar ?? DBNull.Value); cmd.Parameters.AddWithValue("$b", (object?)avatarThumb ?? DBNull.Value); cmd.Parameters.AddWithValue("$t", DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()); cmd.ExecuteNonQuery(); return Profile(username); } } }