Newer
Older
ReservationPattern / ReserveSync / UsernameReservationSync.cs
@Derek Comartin Derek Comartin on 16 Feb 2022 1 KB Init
using Reservation;

namespace ReservationSync;

public class UsernameReservationSync
{
    private TimeSpan Timeout => TimeSpan.FromSeconds(5);
    private readonly FakeDatabase _db;

    public UsernameReservationSync(FakeDatabase db)
    {
        _db = db;
    }

    public bool Reserve(string username)
    {
        if (_db.RegisteredUsernames.Any(x => x == username))
        {
            return false;
        }
        if (_db.ReservedUsernames.Any(x => x == username))
        {
            return false;
        }

        _db.ReservedUsernames.Add(username);

        Task.Run(async () =>
        {
            await Task.Delay(Timeout);
            Expire(username);
        });

        return true;
    }

    private void Expire(string username)
    {
        _db.ReservedUsernames.Remove(username);
    }

    public bool Complete(string username)
    {
        if (_db.ReservedUsernames.Any(x => x == username) == false)
        {
            return false;
        }
        if (_db.RegisteredUsernames.Any(x => x == username))
        {
            return false;
        }

        _db.ReservedUsernames.Remove(username);
        _db.RegisteredUsernames.Add(username);

        return true;
    }
}