Add GameVersion domain and login validation
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
namespace API.Configurations;
|
namespace API.Configuration;
|
||||||
|
|
||||||
public class RecNetOptions
|
public class RecNetOptions
|
||||||
{
|
{
|
||||||
public bool UseForwardedHeaders { get; set; } = true;
|
public bool UseForwardedHeaders { get; set; }
|
||||||
}
|
}
|
||||||
@@ -34,12 +34,12 @@ public class ProfilesController(IProfileService profileService) : ControllerBase
|
|||||||
{
|
{
|
||||||
var result = await profileService.LoginAsync(
|
var result = await profileService.LoginAsync(
|
||||||
new LoginProfileCommand(
|
new LoginProfileCommand(
|
||||||
|
request.AppVersion,
|
||||||
request.DeviceId,
|
request.DeviceId,
|
||||||
request.PlatformType,
|
request.PlatformType,
|
||||||
request.PlatformId,
|
request.PlatformId,
|
||||||
request.PlatformAuthentication),
|
request.PlatformAuthentication
|
||||||
ct);
|
), ct);
|
||||||
|
|
||||||
if (!result.Succeeded)
|
if (!result.Succeeded)
|
||||||
return BadRequest(result.Message);
|
return BadRequest(result.Message);
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using API.Configurations;
|
using API.Configuration;
|
||||||
using Microsoft.AspNetCore.Authentication.JwtBearer;
|
using Microsoft.AspNetCore.Authentication.JwtBearer;
|
||||||
using Microsoft.AspNetCore.HttpOverrides;
|
using Microsoft.AspNetCore.HttpOverrides;
|
||||||
using Microsoft.IdentityModel.Tokens;
|
using Microsoft.IdentityModel.Tokens;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
using RecNet.Application.Common.Tokens;
|
using RecNet.Application.Common.Tokens;
|
||||||
using RecNet.Domain.Entities.Profiles;
|
using RecNet.Domain.Profiles;
|
||||||
|
|
||||||
namespace RecNet.Application.Common.Interfaces;
|
namespace RecNet.Application.Common.Interfaces;
|
||||||
|
|
||||||
|
|||||||
@@ -7,6 +7,6 @@ public class ApplicationMappingProfile : Profile
|
|||||||
{
|
{
|
||||||
public ApplicationMappingProfile()
|
public ApplicationMappingProfile()
|
||||||
{
|
{
|
||||||
CreateMap<Domain.Entities.Profiles.Profile, ProfileDTO>();
|
CreateMap<Domain.Profiles.Profile, ProfileDTO>();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
using RecNet.Application.Common.Interfaces;
|
using RecNet.Application.Common.Interfaces;
|
||||||
using RecNet.Domain.Repositories;
|
using RecNet.Domain.Profiles;
|
||||||
|
|
||||||
namespace RecNet.Application.Neutrino;
|
namespace RecNet.Application.Neutrino;
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ using RecNet.Domain.Common;
|
|||||||
namespace RecNet.Application.Profiles;
|
namespace RecNet.Application.Profiles;
|
||||||
|
|
||||||
public sealed record LoginProfileCommand(
|
public sealed record LoginProfileCommand(
|
||||||
|
string AppVersion,
|
||||||
string DeviceId,
|
string DeviceId,
|
||||||
PlatformType PlatformType,
|
PlatformType PlatformType,
|
||||||
string PlatformId,
|
string PlatformId,
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
using RecNet.Application.Common.Interfaces;
|
using RecNet.Application.Common.Interfaces;
|
||||||
using RecNet.Domain.Entities.Profiles.Names;
|
using RecNet.Domain.Profiles.Names;
|
||||||
|
|
||||||
namespace RecNet.Application.Profiles;
|
namespace RecNet.Application.Profiles;
|
||||||
|
|
||||||
|
|||||||
@@ -1,16 +1,18 @@
|
|||||||
using AutoMapper;
|
using AutoMapper;
|
||||||
using RecNet.Application.Common.Interfaces;
|
using RecNet.Application.Common.Interfaces;
|
||||||
using RecNet.Domain.Repositories;
|
using RecNet.Domain.GameVersions;
|
||||||
using ProfileEntity = RecNet.Domain.Entities.Profiles.Profile;
|
using RecNet.Domain.Profiles;
|
||||||
|
using ProfileEntity = RecNet.Domain.Profiles.Profile;
|
||||||
|
|
||||||
namespace RecNet.Application.Profiles;
|
namespace RecNet.Application.Profiles;
|
||||||
|
|
||||||
public class ProfileService(
|
public class ProfileService(
|
||||||
NameGenerator nameGenerator,
|
|
||||||
IProfileRepository profileRepository,
|
|
||||||
ITokenService tokenService,
|
|
||||||
IConfigService configService,
|
|
||||||
IEnumerable<IPlatformAuthValidator> validators,
|
IEnumerable<IPlatformAuthValidator> validators,
|
||||||
|
IGameVersionRepository gameVersionRepository,
|
||||||
|
IProfileRepository profileRepository,
|
||||||
|
IConfigService configService,
|
||||||
|
NameGenerator nameGenerator,
|
||||||
|
ITokenService tokenService,
|
||||||
IMapper mapper) : IProfileService
|
IMapper mapper) : IProfileService
|
||||||
{
|
{
|
||||||
public async Task<ProfileDTO?> GetProfileAsync(Guid profileId, CancellationToken ct = default)
|
public async Task<ProfileDTO?> GetProfileAsync(Guid profileId, CancellationToken ct = default)
|
||||||
@@ -35,6 +37,15 @@ public class ProfileService(
|
|||||||
LoginProfileCommand command,
|
LoginProfileCommand command,
|
||||||
CancellationToken ct = default)
|
CancellationToken ct = default)
|
||||||
{
|
{
|
||||||
|
// 1. Validate Game Version
|
||||||
|
if (string.IsNullOrWhiteSpace(command.AppVersion))
|
||||||
|
return LoginProfileResult.Fail("App version is required.");
|
||||||
|
|
||||||
|
var isValidGameVersion = await gameVersionRepository.IsValidAsync(command.AppVersion, ct);
|
||||||
|
if (!isValidGameVersion)
|
||||||
|
return LoginProfileResult.Fail("Invalid app version.");
|
||||||
|
|
||||||
|
// 2. Validate Platform Authentication
|
||||||
var validator = validators.FirstOrDefault(x => x.PlatformType == command.PlatformType);
|
var validator = validators.FirstOrDefault(x => x.PlatformType == command.PlatformType);
|
||||||
if (validator is null)
|
if (validator is null)
|
||||||
return LoginProfileResult.Fail("Invalid platform type");
|
return LoginProfileResult.Fail("Invalid platform type");
|
||||||
@@ -48,6 +59,7 @@ public class ProfileService(
|
|||||||
if (!auth.Succeeded && !ignoreAuthValidation)
|
if (!auth.Succeeded && !ignoreAuthValidation)
|
||||||
return LoginProfileResult.Fail($"Platform Auth Failed: {auth.Message}");
|
return LoginProfileResult.Fail($"Platform Auth Failed: {auth.Message}");
|
||||||
|
|
||||||
|
// 3. Get or Create Profile
|
||||||
var profile = await profileRepository.GetByPlatform(
|
var profile = await profileRepository.GetByPlatform(
|
||||||
command.PlatformType,
|
command.PlatformType,
|
||||||
command.PlatformId,
|
command.PlatformId,
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
using RecNet.Domain.Entities.Configuration;
|
namespace RecNet.Domain.Configuration;
|
||||||
|
|
||||||
namespace RecNet.Domain.Repositories;
|
|
||||||
|
|
||||||
public interface IServerConfigRepository
|
public interface IServerConfigRepository
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
using RecNet.Domain.Exceptions;
|
using RecNet.Domain.Exceptions;
|
||||||
|
|
||||||
namespace RecNet.Domain.Entities.Configuration;
|
namespace RecNet.Domain.Configuration;
|
||||||
|
|
||||||
public class ServerConfig
|
public class ServerConfig
|
||||||
{
|
{
|
||||||
|
|||||||
31
RecNet.Domain/GameVersions/GameVersion.cs
Normal file
31
RecNet.Domain/GameVersions/GameVersion.cs
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
using RecNet.Domain.Exceptions;
|
||||||
|
|
||||||
|
namespace RecNet.Domain.GameVersions;
|
||||||
|
|
||||||
|
public class GameVersion
|
||||||
|
{
|
||||||
|
private GameVersion()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
private GameVersion(string version, bool isValid)
|
||||||
|
{
|
||||||
|
Version = RequireValue(version, nameof(version));
|
||||||
|
IsValid = isValid;
|
||||||
|
}
|
||||||
|
|
||||||
|
public string Version { get; private set; } = string.Empty;
|
||||||
|
public bool IsValid { get; private set; }
|
||||||
|
|
||||||
|
public static GameVersion Create(string version, bool isValid)
|
||||||
|
=> new(version, isValid);
|
||||||
|
|
||||||
|
public void MarkValid()
|
||||||
|
=> IsValid = true;
|
||||||
|
|
||||||
|
public void MarkInvalid()
|
||||||
|
=> IsValid = false;
|
||||||
|
|
||||||
|
private static string RequireValue(string value, string parameterName)
|
||||||
|
=> !string.IsNullOrWhiteSpace(value) ? value : throw new DomainException($"{parameterName} is required.");
|
||||||
|
}
|
||||||
12
RecNet.Domain/GameVersions/IGameVersionRepository.cs
Normal file
12
RecNet.Domain/GameVersions/IGameVersionRepository.cs
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
namespace RecNet.Domain.GameVersions;
|
||||||
|
|
||||||
|
public interface IGameVersionRepository
|
||||||
|
{
|
||||||
|
Task<GameVersion?> GetAsync(string version, CancellationToken ct = default);
|
||||||
|
|
||||||
|
async Task<bool> IsValidAsync(string version, CancellationToken ct = default)
|
||||||
|
{
|
||||||
|
var gameVersion = await GetAsync(version, ct);
|
||||||
|
return gameVersion?.IsValid == true;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
using RecNet.Domain.Common;
|
using RecNet.Domain.Common;
|
||||||
using RecNet.Domain.Entities.Profiles;
|
|
||||||
|
|
||||||
namespace RecNet.Domain.Repositories;
|
namespace RecNet.Domain.Profiles;
|
||||||
|
|
||||||
public interface IProfileRepository
|
public interface IProfileRepository
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
namespace RecNet.Domain.Entities.Profiles.Names;
|
namespace RecNet.Domain.Profiles.Names;
|
||||||
|
|
||||||
public static class DefaultNameGenConfig
|
public static class DefaultNameGenConfig
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
namespace RecNet.Domain.Entities.Profiles.Names;
|
namespace RecNet.Domain.Profiles.Names;
|
||||||
|
|
||||||
public class NameGenConfig
|
public class NameGenConfig
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
using RecNet.Domain.Common;
|
using RecNet.Domain.Common;
|
||||||
using RecNet.Domain.Exceptions;
|
using RecNet.Domain.Exceptions;
|
||||||
|
|
||||||
namespace RecNet.Domain.Entities.Profiles;
|
namespace RecNet.Domain.Profiles;
|
||||||
|
|
||||||
public class Profile
|
public class Profile
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,10 +1,13 @@
|
|||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using Microsoft.Extensions.Hosting;
|
using Microsoft.Extensions.Hosting;
|
||||||
using RecNet.Application.Common.Interfaces;
|
using RecNet.Application.Common.Interfaces;
|
||||||
using RecNet.Domain.Repositories;
|
using RecNet.Domain.Configuration;
|
||||||
|
using RecNet.Domain.GameVersions;
|
||||||
|
using RecNet.Domain.Profiles;
|
||||||
using RecNet.Infrastructure.Persistence;
|
using RecNet.Infrastructure.Persistence;
|
||||||
using RecNet.Infrastructure.Persistence.Repositories;
|
using RecNet.Infrastructure.Persistence.Repositories;
|
||||||
using RecNet.Infrastructure.Services.Configuration;
|
using RecNet.Infrastructure.Services.Configuration;
|
||||||
|
using RecNet.Infrastructure.Services.Meta;
|
||||||
using RecNet.Infrastructure.Services.Steam;
|
using RecNet.Infrastructure.Services.Steam;
|
||||||
using RecNet.Infrastructure.Services.Tokens;
|
using RecNet.Infrastructure.Services.Tokens;
|
||||||
|
|
||||||
@@ -33,7 +36,9 @@ public static class DependencyInjection
|
|||||||
});
|
});
|
||||||
|
|
||||||
builder.Services.AddScoped<IPlatformAuthValidator, SteamAuthValidator>();
|
builder.Services.AddScoped<IPlatformAuthValidator, SteamAuthValidator>();
|
||||||
|
builder.Services.AddScoped<IPlatformAuthValidator, MetaAuthValidator>();
|
||||||
|
|
||||||
|
builder.Services.AddScoped<IGameVersionRepository, IGameVersionRepository>();
|
||||||
builder.Services.AddScoped<IProfileRepository, ProfileRepository>();
|
builder.Services.AddScoped<IProfileRepository, ProfileRepository>();
|
||||||
builder.Services.AddScoped<IServerConfigRepository, ServerConfigRepository>();
|
builder.Services.AddScoped<IServerConfigRepository, ServerConfigRepository>();
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,20 @@
|
|||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using Microsoft.EntityFrameworkCore.Metadata.Builders;
|
||||||
|
using RecNet.Domain.GameVersions;
|
||||||
|
|
||||||
|
namespace RecNet.Infrastructure.Persistence.Configurations;
|
||||||
|
|
||||||
|
public class GameVersionConfiguration : IEntityTypeConfiguration<GameVersion>
|
||||||
|
{
|
||||||
|
public void Configure(EntityTypeBuilder<GameVersion> builder)
|
||||||
|
{
|
||||||
|
builder.HasKey(x => x.Version);
|
||||||
|
|
||||||
|
builder.Property(x => x.Version)
|
||||||
|
.HasMaxLength(32)
|
||||||
|
.IsRequired();
|
||||||
|
|
||||||
|
builder.Property(x => x.IsValid)
|
||||||
|
.IsRequired();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using Microsoft.EntityFrameworkCore.Metadata.Builders;
|
using Microsoft.EntityFrameworkCore.Metadata.Builders;
|
||||||
using RecNet.Domain.Entities.Profiles;
|
using RecNet.Domain.Profiles;
|
||||||
|
|
||||||
namespace RecNet.Infrastructure.Persistence.Configurations;
|
namespace RecNet.Infrastructure.Persistence.Configurations;
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using Microsoft.EntityFrameworkCore.Metadata.Builders;
|
using Microsoft.EntityFrameworkCore.Metadata.Builders;
|
||||||
using RecNet.Domain.Entities.Configuration;
|
using RecNet.Domain.Configuration;
|
||||||
|
|
||||||
namespace RecNet.Infrastructure.Persistence.Configurations;
|
namespace RecNet.Infrastructure.Persistence.Configurations;
|
||||||
|
|
||||||
|
|||||||
@@ -1,12 +1,14 @@
|
|||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using RecNet.Domain.Entities.Configuration;
|
using RecNet.Domain.Configuration;
|
||||||
using RecNet.Domain.Entities.Profiles;
|
using RecNet.Domain.GameVersions;
|
||||||
|
using RecNet.Domain.Profiles;
|
||||||
|
|
||||||
namespace RecNet.Infrastructure.Persistence;
|
namespace RecNet.Infrastructure.Persistence;
|
||||||
|
|
||||||
public class DatabaseContext(DbContextOptions<DatabaseContext> options) : DbContext(options)
|
public class DatabaseContext(DbContextOptions<DatabaseContext> options) : DbContext(options)
|
||||||
{
|
{
|
||||||
public DbSet<Profile> Profiles => Set<Profile>();
|
public DbSet<Profile> Profiles => Set<Profile>();
|
||||||
|
public DbSet<GameVersion> GameVersions => Set<GameVersion>();
|
||||||
public DbSet<ServerConfig> ServerConfigs => Set<ServerConfig>();
|
public DbSet<ServerConfig> ServerConfigs => Set<ServerConfig>();
|
||||||
|
|
||||||
protected override void OnModelCreating(ModelBuilder modelBuilder)
|
protected override void OnModelCreating(ModelBuilder modelBuilder)
|
||||||
|
|||||||
101
RecNet.Infrastructure/Persistence/Migrations/20260619201140_GameVersion.Designer.cs
generated
Normal file
101
RecNet.Infrastructure/Persistence/Migrations/20260619201140_GameVersion.Designer.cs
generated
Normal file
@@ -0,0 +1,101 @@
|
|||||||
|
// <auto-generated />
|
||||||
|
using System;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using Microsoft.EntityFrameworkCore.Infrastructure;
|
||||||
|
using Microsoft.EntityFrameworkCore.Migrations;
|
||||||
|
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
|
||||||
|
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
|
||||||
|
using RecNet.Infrastructure.Persistence;
|
||||||
|
|
||||||
|
#nullable disable
|
||||||
|
|
||||||
|
namespace RecNet.Infrastructure.Persistence.Migrations
|
||||||
|
{
|
||||||
|
[DbContext(typeof(DatabaseContext))]
|
||||||
|
[Migration("20260619201140_GameVersion")]
|
||||||
|
partial class GameVersion
|
||||||
|
{
|
||||||
|
/// <inheritdoc />
|
||||||
|
protected override void BuildTargetModel(ModelBuilder modelBuilder)
|
||||||
|
{
|
||||||
|
#pragma warning disable 612, 618
|
||||||
|
modelBuilder
|
||||||
|
.HasAnnotation("ProductVersion", "10.0.8")
|
||||||
|
.HasAnnotation("Relational:MaxIdentifierLength", 63);
|
||||||
|
|
||||||
|
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
|
||||||
|
|
||||||
|
modelBuilder.Entity("RecNet.Domain.Configuration.ServerConfig", b =>
|
||||||
|
{
|
||||||
|
b.Property<string>("Key")
|
||||||
|
.HasMaxLength(128)
|
||||||
|
.HasColumnType("character varying(128)");
|
||||||
|
|
||||||
|
b.Property<string>("Value")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("jsonb");
|
||||||
|
|
||||||
|
b.HasKey("Key");
|
||||||
|
|
||||||
|
b.ToTable("ServerConfigs");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("RecNet.Domain.GameVersions.GameVersion", b =>
|
||||||
|
{
|
||||||
|
b.Property<string>("Version")
|
||||||
|
.HasMaxLength(32)
|
||||||
|
.HasColumnType("character varying(32)");
|
||||||
|
|
||||||
|
b.Property<bool>("IsValid")
|
||||||
|
.HasColumnType("boolean");
|
||||||
|
|
||||||
|
b.HasKey("Version");
|
||||||
|
|
||||||
|
b.ToTable("GameVersions");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("RecNet.Domain.Profiles.Profile", b =>
|
||||||
|
{
|
||||||
|
b.Property<Guid>("ProfileId")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("uuid");
|
||||||
|
|
||||||
|
b.Property<DateTimeOffset>("CreatedAt")
|
||||||
|
.HasColumnType("timestamp with time zone");
|
||||||
|
|
||||||
|
b.PrimitiveCollection<string>("DeviceIds")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("jsonb");
|
||||||
|
|
||||||
|
b.Property<bool>("IsBanned")
|
||||||
|
.HasColumnType("boolean");
|
||||||
|
|
||||||
|
b.Property<bool>("IsModerator")
|
||||||
|
.HasColumnType("boolean");
|
||||||
|
|
||||||
|
b.Property<string>("Name")
|
||||||
|
.IsRequired()
|
||||||
|
.HasMaxLength(32)
|
||||||
|
.HasColumnType("character varying(32)");
|
||||||
|
|
||||||
|
b.Property<string>("Platform")
|
||||||
|
.IsRequired()
|
||||||
|
.HasMaxLength(50)
|
||||||
|
.HasColumnType("character varying(50)");
|
||||||
|
|
||||||
|
b.Property<string>("PlatformId")
|
||||||
|
.IsRequired()
|
||||||
|
.HasMaxLength(50)
|
||||||
|
.HasColumnType("character varying(50)");
|
||||||
|
|
||||||
|
b.HasKey("ProfileId");
|
||||||
|
|
||||||
|
b.HasIndex("Platform", "PlatformId")
|
||||||
|
.IsUnique();
|
||||||
|
|
||||||
|
b.ToTable("Profiles");
|
||||||
|
});
|
||||||
|
#pragma warning restore 612, 618
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
using Microsoft.EntityFrameworkCore.Migrations;
|
||||||
|
|
||||||
|
#nullable disable
|
||||||
|
|
||||||
|
namespace RecNet.Infrastructure.Persistence.Migrations
|
||||||
|
{
|
||||||
|
/// <inheritdoc />
|
||||||
|
public partial class GameVersion : Migration
|
||||||
|
{
|
||||||
|
/// <inheritdoc />
|
||||||
|
protected override void Up(MigrationBuilder migrationBuilder)
|
||||||
|
{
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "GameVersions",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
Version = table.Column<string>(type: "character varying(32)", maxLength: 32, nullable: false),
|
||||||
|
IsValid = table.Column<bool>(type: "boolean", nullable: false)
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_GameVersions", x => x.Version);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
protected override void Down(MigrationBuilder migrationBuilder)
|
||||||
|
{
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "GameVersions");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -22,7 +22,7 @@ namespace RecNet.Infrastructure.Persistence.Migrations
|
|||||||
|
|
||||||
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
|
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
|
||||||
|
|
||||||
modelBuilder.Entity("RecNet.Domain.Entities.Configuration.ServerConfig", b =>
|
modelBuilder.Entity("RecNet.Domain.Configuration.ServerConfig", b =>
|
||||||
{
|
{
|
||||||
b.Property<string>("Key")
|
b.Property<string>("Key")
|
||||||
.HasMaxLength(128)
|
.HasMaxLength(128)
|
||||||
@@ -37,7 +37,21 @@ namespace RecNet.Infrastructure.Persistence.Migrations
|
|||||||
b.ToTable("ServerConfigs");
|
b.ToTable("ServerConfigs");
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("RecNet.Domain.Entities.Profiles.Profile", b =>
|
modelBuilder.Entity("RecNet.Domain.GameVersions.GameVersion", b =>
|
||||||
|
{
|
||||||
|
b.Property<string>("Version")
|
||||||
|
.HasMaxLength(32)
|
||||||
|
.HasColumnType("character varying(32)");
|
||||||
|
|
||||||
|
b.Property<bool>("IsValid")
|
||||||
|
.HasColumnType("boolean");
|
||||||
|
|
||||||
|
b.HasKey("Version");
|
||||||
|
|
||||||
|
b.ToTable("GameVersions");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("RecNet.Domain.Profiles.Profile", b =>
|
||||||
{
|
{
|
||||||
b.Property<Guid>("ProfileId")
|
b.Property<Guid>("ProfileId")
|
||||||
.ValueGeneratedOnAdd()
|
.ValueGeneratedOnAdd()
|
||||||
|
|||||||
@@ -0,0 +1,11 @@
|
|||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using RecNet.Domain.GameVersions;
|
||||||
|
|
||||||
|
namespace RecNet.Infrastructure.Persistence.Repositories;
|
||||||
|
|
||||||
|
public class GameVersionRepository(DatabaseContext dbContext) : IGameVersionRepository
|
||||||
|
{
|
||||||
|
public Task<GameVersion?> GetAsync(string version, CancellationToken ct = default)
|
||||||
|
=> dbContext.GameVersions
|
||||||
|
.FirstOrDefaultAsync(x => x.Version == version, ct);
|
||||||
|
}
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using RecNet.Domain.Common;
|
using RecNet.Domain.Common;
|
||||||
using RecNet.Domain.Entities.Profiles;
|
using RecNet.Domain.Profiles;
|
||||||
using RecNet.Domain.Repositories;
|
|
||||||
|
|
||||||
namespace RecNet.Infrastructure.Persistence.Repositories;
|
namespace RecNet.Infrastructure.Persistence.Repositories;
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using Microsoft.EntityFrameworkCore.Storage;
|
using Microsoft.EntityFrameworkCore.Storage;
|
||||||
using RecNet.Domain.Entities.Configuration;
|
using RecNet.Domain.Configuration;
|
||||||
using RecNet.Domain.Repositories;
|
|
||||||
|
|
||||||
namespace RecNet.Infrastructure.Persistence.Repositories;
|
namespace RecNet.Infrastructure.Persistence.Repositories;
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
using System.Text.Json;
|
using System.Text.Json;
|
||||||
using RecNet.Application.Common.Interfaces;
|
using RecNet.Application.Common.Interfaces;
|
||||||
using RecNet.Domain.Repositories;
|
using RecNet.Domain.Configuration;
|
||||||
|
|
||||||
namespace RecNet.Infrastructure.Services.Configuration;
|
namespace RecNet.Infrastructure.Services.Configuration;
|
||||||
|
|
||||||
|
|||||||
15
RecNet.Infrastructure/Services/Meta/MetaAuthValidator.cs
Normal file
15
RecNet.Infrastructure/Services/Meta/MetaAuthValidator.cs
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
using RecNet.Application.Common.Interfaces;
|
||||||
|
using RecNet.Application.Common.PlatformAuth;
|
||||||
|
using RecNet.Domain.Common;
|
||||||
|
|
||||||
|
namespace RecNet.Infrastructure.Services.Meta;
|
||||||
|
|
||||||
|
public class MetaAuthValidator : IPlatformAuthValidator
|
||||||
|
{
|
||||||
|
public PlatformType PlatformType
|
||||||
|
=> PlatformType.Meta;
|
||||||
|
|
||||||
|
public Task<PlatformAuthResult> ValidateAsync(string platformAuthentication, string platformId,
|
||||||
|
CancellationToken ct = default)
|
||||||
|
=> Task.FromResult(PlatformAuthResult.Success(null)); // TODO: Implement
|
||||||
|
}
|
||||||
@@ -5,7 +5,7 @@ using Microsoft.Extensions.Options;
|
|||||||
using Microsoft.IdentityModel.Tokens;
|
using Microsoft.IdentityModel.Tokens;
|
||||||
using RecNet.Application.Common.Interfaces;
|
using RecNet.Application.Common.Interfaces;
|
||||||
using RecNet.Application.Common.Tokens;
|
using RecNet.Application.Common.Tokens;
|
||||||
using RecNet.Domain.Entities.Profiles;
|
using RecNet.Domain.Profiles;
|
||||||
|
|
||||||
namespace RecNet.Infrastructure.Services.Tokens;
|
namespace RecNet.Infrastructure.Services.Tokens;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user