feat(data): add in-memory user repository implementation

This commit is contained in:
EmirHanMamak 2026-01-18 23:15:57 +03:00
parent b0197489b1
commit e7703970b1
17 changed files with 192 additions and 3 deletions

View file

@ -0,0 +1,13 @@
using System.Linq;
namespace Playvoi.Server.Data.Interface;
public interface IRepository<T> where T : class
{
void Add(T entity);
void Delete(string id);
T Get(string id);
void Update(T entity);
IQueryable<T> GetQuery();
ushort GetTotalCount();
}

View file

@ -0,0 +1,9 @@
using Playvoi.Server.Data.Model;
namespace Playvoi.Server.Data.Interface;
public interface IUserRepository : IRepository<User>
{
public void SetOnline(string id);
public void SetOffline(string id);
}

View file

@ -0,0 +1,9 @@
namespace Playvoi.Server.Data.Model;
public class User
{
public string Id { get; set; }
public string Password { get; set; }
public ushort Score { get; set; }
public bool IsOnline { get; set; }
}

View file

@ -0,0 +1,75 @@
using System.Collections.Generic;
using System.Linq;
using Playvoi.Server.Data.Interface;
using Playvoi.Server.Data.Model;
namespace Playvoi.Server.Data.Repository;
public class InMemoryUserRepository : IUserRepository
{
private readonly List<User> _entities;
public InMemoryUserRepository()
{
_entities = new List<User>()
{
new User()
{
Id = "ehm",
Password = "test",
IsOnline = true,
Score = 100
},
new User()
{
Id = "hme",
Password = "test123",
IsOnline = false,
Score = 230
}
};
}
// Ogrenmek için ileride Database ile değişimi yapilacak.
public void Add(User entity)
{
_entities.Add(entity);
}
public void Delete(string id)
{
var entity = _entities.FirstOrDefault(x => x.Id == id);
_entities.Remove(entity);
}
public User Get(string id)
{
return _entities.FirstOrDefault(x => x.Id == id);
}
public void Update(User entity)
{
var dbIndex = _entities.FindIndex(e => e.Id == entity.Id);
_entities[dbIndex] = entity;
}
public IQueryable<User> GetQuery()
{
return _entities.AsQueryable();
}
public ushort GetTotalCount()
{
return (ushort)_entities.Count(x => x.IsOnline);
}
public void SetOnline(string id)
{
_entities.FirstOrDefault(e => e.Id == id).IsOnline = true;
}
public void SetOffline(string id)
{
_entities.FirstOrDefault(e => e.Id == id).IsOnline = false;
}
}

View file

@ -0,0 +1,13 @@
using System;
using LiteNetLib;
using Playvoi.Server.Data.Model;
namespace Playvoi.Server.Games;
public class ServerConnection
{
public int ConnectionId { get; set; }
public User User { get; set; }
public NetPeer Peer { get; set; }
public Guid? GameId { get; set; }
}

View file

@ -0,0 +1,48 @@
using System.Collections.Generic;
using Playvoi.Server.Data.Interface;
using Playvoi.Server.Data.Model;
namespace Playvoi.Server.Games;
public class UsersManager
{
private Dictionary<int, ServerConnection> _connections;
private readonly IUserRepository _userRepository;
public UsersManager(IUserRepository userRepository)
{
_userRepository = userRepository;
}
public bool LoginOrRegister(int connectionId, string username, string password)
{
var dbUser = _userRepository.Get(username);
if (username != null)
{
//Login
if (dbUser.Password != password)
{
return false;
}
}
// Register
if (dbUser == null)
{
var newUser = new User()
{
Id = username,
Password = password,
IsOnline = true,
Score = 0
};
_userRepository.Add(newUser);
dbUser = newUser;
}
// Login and set online
if (_connections.ContainsKey(connectionId))
{
dbUser.IsOnline = true;
_connections[connectionId].User = dbUser;
}
return true;
}
}

View file

@ -1,6 +1,8 @@
using System; using System;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Playvoi.Server.Data.Interface;
using Playvoi.Server.Data.Repository;
using Playvoi.Server.Extensions; using Playvoi.Server.Extensions;
using Playvoi.Server.Shared.Registry; using Playvoi.Server.Shared.Registry;
@ -22,6 +24,7 @@ public static class Container
services.AddSingleton<NetworkServer>(); services.AddSingleton<NetworkServer>();
services.AddSingleton<PacketRegistry>(); services.AddSingleton<PacketRegistry>();
services.AddSingleton<HandlerRegistry>(); services.AddSingleton<HandlerRegistry>();
services.AddSingleton<IUserRepository, InMemoryUserRepository>();
services.AddPacketHandlers(); services.AddPacketHandlers();
} }
} }

View file

@ -1,5 +1,8 @@
using _Network.Shared; using _Network.Shared;
using _Network.Shared.Interface; using _Network.Shared.Interface;
using _Network.Shared.Packets.ClientServer;
using Microsoft.Extensions.Logging;
using Playvoi.Server.Games;
using Playvoi.Server.Shared.Attributes; using Playvoi.Server.Shared.Attributes;
using Playvoi.Server.Shared.Interface; using Playvoi.Server.Shared.Interface;
@ -7,8 +10,24 @@ namespace Playvoi.Server.PacketHandlers;
[HandlerRegister(PacketType.AuthRequest)] [HandlerRegister(PacketType.AuthRequest)]
public class AuthRequestHandler : IPacketHandler public class AuthRequestHandler : IPacketHandler
{ {
private readonly ILogger<AuthRequestHandler> _logger;
private readonly UsersManager _userManager;
public AuthRequestHandler(ILogger<AuthRequestHandler> logger, UsersManager userManager)
{
_logger = logger;
_userManager = userManager;
}
public void Handle(INetPacket packet, int connectionId) public void Handle(INetPacket packet, int connectionId)
{ {
var message = (NetAuthRequest)packet;
_logger.LogInformation($"Received login request for user with pass: {message.Username}:{message.Password}");
// log
// login or register
var loginSuccess = _userManager.LoginOrRegister(connectionId, message.Username, message.Password);
// if success -> send back N_OAuth
// else send back Net_OAuthFail meessage
} }
} }

View file

@ -3,7 +3,7 @@ using LiteNetLib.Utils;
namespace _Network.Shared.Packets.ClientServer namespace _Network.Shared.Packets.ClientServer
{ {
public class NetAuthRequest : INetPacket public struct NetAuthRequest : INetPacket
{ {
public PacketType Type => PacketType.AuthRequest; public PacketType Type => PacketType.AuthRequest;
public string Username { get; set; } public string Username { get; set; }

View file

@ -13,7 +13,7 @@ using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("Playvoi.Server")] [assembly: System.Reflection.AssemblyCompanyAttribute("Playvoi.Server")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Release")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+be00b3542e14d49b00f7373a13e89fcb423c17b8")] [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+b0197489b16432dc1deafec8d7ad46fc335f2e41")]
[assembly: System.Reflection.AssemblyProductAttribute("Playvoi.Server")] [assembly: System.Reflection.AssemblyProductAttribute("Playvoi.Server")]
[assembly: System.Reflection.AssemblyTitleAttribute("Playvoi.Server")] [assembly: System.Reflection.AssemblyTitleAttribute("Playvoi.Server")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]

View file

@ -1 +1 @@
54014dd7ac4359d492a4b0ddbbccc8d1396884df8feab61e3beddc83d95508b9 57beb62731dfeffdc95d0f7c3f52acf0b72edd970c67dadd581310b517f12af2