Skip to content

Commit f1649b0

Browse files
authored
initial linux support
1 parent 073cbba commit f1649b0

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

51 files changed

+839
-310
lines changed

Diff for: Directory.Packages.props

+4-4
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,12 @@
3232
<PackageVersion Include="System.Private.Uri" Version="4.3.2" />
3333
<PackageVersion Include="xunit" Version="2.9.2" />
3434
<PackageVersion Include="xunit.runner.visualstudio" Version="2.8.2" />
35-
<PackageVersion Include="AWSSDK.S3" Version="3.7.404.5" />
35+
<PackageVersion Include="AWSSDK.S3" Version="3.7.405.4" />
3636
<PackageVersion Include="ConfigureAwaitAnalyzer" Version="1.1.0" />
37-
<PackageVersion Include="Swashbuckle.AspNetCore" Version="6.8.1" />
37+
<PackageVersion Include="Swashbuckle.AspNetCore" Version="6.9.0" />
3838
<PackageVersion Include="Microsoft.AspNetCore.SpaProxy" Version="8.0.10" />
39-
<PackageVersion Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="8.0.8" />
40-
<PackageVersion Include="Markdig" Version="0.37.0" />
39+
<PackageVersion Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="8.0.10" />
40+
<PackageVersion Include="Markdig" Version="0.38.0" />
4141
<PackageVersion Include="System.Text.Json" Version="8.0.5" />
4242
</ItemGroup>
4343
</Project>

Diff for: Web.Blazor/ControllersV1/AddonsController.cs

+4
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ public AddonsController(AddonsProvider addonsProvider)
2121
[HttpGet("{GameEnum}")]
2222
public List<DownloadableAddonEntity> GetAddons(GameEnum gameEnum) => _addonsProvider.GetAddons(gameEnum);
2323

24+
[Obsolete]
25+
[HttpGet("ping")]
26+
public List<DownloadableAddonEntity> Ping() => _addonsProvider.GetAddons(GameEnum.Duke3D, true);
27+
2428

2529
[Obsolete]
2630
[HttpGet("scores")]

Diff for: Web.Blazor/ControllersV1/ReleasesController.cs

+51-7
Original file line numberDiff line numberDiff line change
@@ -12,28 +12,72 @@ public sealed class ReleasesController : ControllerBase
1212
{
1313
private readonly AppReleasesProvider _appReleasesProvider;
1414
private readonly PortsReleasesProvider _portsReleasesProvider;
15-
private readonly ToolsReleasesProvider _toolsReleasesProvider;
1615

1716
public ReleasesController(
1817
AppReleasesProvider appReleasesProvider,
19-
PortsReleasesProvider portsReleasesProvider,
20-
ToolsReleasesProvider toolsReleasesProvider
18+
PortsReleasesProvider portsReleasesProvider
2119
)
2220
{
2321
_appReleasesProvider = appReleasesProvider;
2422
_portsReleasesProvider = portsReleasesProvider;
25-
_toolsReleasesProvider = toolsReleasesProvider;
2623
}
2724

2825
[Obsolete]
2926
[HttpGet("app")]
30-
public GeneralReleaseEntity? GetLatestAppRelease() => _appReleasesProvider.AppRelease;
27+
public GeneralReleaseEntityObsolete? GetLatestAppRelease()
28+
{
29+
if (_appReleasesProvider.AppRelease?.TryGetValue(OSEnum.Windows, out var winRelease) ?? false)
30+
{
31+
return new GeneralReleaseEntityObsolete()
32+
{
33+
Description = winRelease.Description,
34+
Version = winRelease.Version,
35+
WindowsDownloadUrl = winRelease.DownloadUrl,
36+
LinuxDownloadUrl = null
37+
};
38+
}
39+
40+
return null;
41+
}
3142

3243
[Obsolete]
3344
[HttpGet("ports")]
34-
public Dictionary<PortEnum, GeneralReleaseEntity> GetLatestPortsReleases() => _portsReleasesProvider.PortsReleases;
45+
public Dictionary<PortEnum, GeneralReleaseEntityObsolete> GetLatestPortsReleases()
46+
{
47+
Dictionary<PortEnum, GeneralReleaseEntityObsolete> result = [];
48+
var releases = _portsReleasesProvider.WindowsReleases;
49+
50+
if (releases is null)
51+
{
52+
return result;
53+
}
54+
55+
foreach (var release in releases)
56+
{
57+
string version;
58+
59+
if (release.Key is PortEnum.NotBlood)
60+
{
61+
version = DateTime.Parse(release.Value.Version).ToString("dd.MM.yyyy");
62+
}
63+
else
64+
{
65+
version = release.Value.Version;
66+
}
67+
68+
result.Add(release.Key, new GeneralReleaseEntityObsolete()
69+
{
70+
Description = release.Value.Description,
71+
Version = version,
72+
WindowsDownloadUrl = release.Value.DownloadUrl,
73+
LinuxDownloadUrl = null
74+
});
75+
}
76+
77+
return result;
78+
}
3579

3680
[Obsolete]
3781
[HttpGet("tools")]
38-
public Dictionary<ToolEnum, GeneralReleaseEntity> GetLatestToolsReleases() => _toolsReleasesProvider.ToolsReleases;
82+
public Dictionary<ToolEnum, GeneralReleaseEntityObsolete> GetLatestToolsReleases() => [];
3983
}

Diff for: Web.Blazor/ControllersV2/AddonsController.cs

+4-6
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@ namespace Web.Blazor.ControllersV2;
77

88
[ApiController]
99
[Route("api2/addons")]
10-
public sealed class AddonsController : ControllerBase
10+
public sealed class ReleasesController : ControllerBase
1111
{
1212
private readonly IMediator _mediator;
1313

14-
public AddonsController(IMediator mediator)
14+
public ReleasesController(IMediator mediator)
1515
{
1616
_mediator = mediator;
1717
}
@@ -21,15 +21,13 @@ public AddonsController(IMediator mediator)
2121
[ProducesResponseType(StatusCodes.Status500InternalServerError)]
2222
public async Task<ActionResult<GetAddonsResponse>> GetAddonsMediator(GetAddonsRequest request)
2323
{
24-
var result = await _mediator.Send(request);
24+
var response = await _mediator.Send(request);
2525

26-
if (result is null)
26+
if (response is null)
2727
{
2828
return StatusCode(500);
2929
}
3030

31-
GetAddonsResponse response = new() { AddonsList = result.AddonsList };
32-
3331
return Ok(response);
3432
}
3533
}

Diff for: Web.Blazor/ControllersV2/ReleasesController.cs

+48
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
using Api.Common.Requests;
2+
using Api.Common.Responses;
3+
using MediatR;
4+
using Microsoft.AspNetCore.Mvc;
5+
6+
namespace Web.Blazor.ControllersV2;
7+
8+
[ApiController]
9+
[Route("api2/releases")]
10+
public sealed class AddonsController : ControllerBase
11+
{
12+
private readonly IMediator _mediator;
13+
14+
public AddonsController(IMediator mediator)
15+
{
16+
_mediator = mediator;
17+
}
18+
19+
[HttpGet("ports")]
20+
[ProducesResponseType(StatusCodes.Status200OK)]
21+
[ProducesResponseType(StatusCodes.Status500InternalServerError)]
22+
public async Task<ActionResult<GetPortsReleasesResponse>> GetPortsReleasesMediator(GetPortsReleasesRequest request)
23+
{
24+
var response = await _mediator.Send(request);
25+
26+
if (response is null)
27+
{
28+
return StatusCode(500);
29+
}
30+
31+
return Ok(response);
32+
}
33+
34+
[HttpGet("app")]
35+
[ProducesResponseType(StatusCodes.Status200OK)]
36+
[ProducesResponseType(StatusCodes.Status500InternalServerError)]
37+
public async Task<ActionResult<GetAppReleaseResponse>> GetAppReleaseMediator(GetAppReleaseRequest request)
38+
{
39+
var response = await _mediator.Send(request);
40+
41+
if (response is null)
42+
{
43+
return StatusCode(500);
44+
}
45+
46+
return Ok(response);
47+
}
48+
}

Diff for: Web.Blazor/Handlers/GetAddonsHandler.cs

+5-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,11 @@ public GetAddonsHandler(AddonsProvider addonsProvider)
1717
public Task<GetAddonsResponse> Handle(GetAddonsRequest request, CancellationToken cancellationToken)
1818
{
1919
var addons = _addonsProvider.GetAddons(request.GameEnum);
20-
GetAddonsResponse response = new() { AddonsList = addons };
20+
21+
GetAddonsResponse response = new()
22+
{
23+
AddonsList = addons
24+
};
2125

2226
return Task.FromResult(response);
2327
}

Diff for: Web.Blazor/Handlers/GetAppReleaseHandler.cs

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
using Api.Common.Requests;
2+
using Api.Common.Responses;
3+
using MediatR;
4+
using Web.Blazor.Providers;
5+
6+
namespace Web.Blazor.Handlers;
7+
8+
public sealed class GetAppReleaseHandler : IRequestHandler<GetAppReleaseRequest, GetAppReleaseResponse?>
9+
{
10+
private readonly AppReleasesProvider _appReleasesProvider;
11+
12+
public GetAppReleaseHandler(AppReleasesProvider appReleasesProvider)
13+
{
14+
_appReleasesProvider = appReleasesProvider;
15+
}
16+
17+
public Task<GetAppReleaseResponse?> Handle(GetAppReleaseRequest request, CancellationToken cancellationToken)
18+
{
19+
_ = _appReleasesProvider.AppRelease.TryGetValue(request.OSEnum, out var release);
20+
21+
if (release is null)
22+
{
23+
return Task.FromResult<GetAppReleaseResponse?>(null);
24+
}
25+
26+
GetAppReleaseResponse response = new()
27+
{
28+
AppRelease = release
29+
};
30+
31+
return Task.FromResult<GetAppReleaseResponse?>(response);
32+
}
33+
}

Diff for: Web.Blazor/Handlers/GetPortsReleasesHandler.cs

+44
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
using Api.Common.Requests;
2+
using Api.Common.Responses;
3+
using Common.Entities;
4+
using Common.Enums;
5+
using MediatR;
6+
using Web.Blazor.Providers;
7+
8+
namespace Web.Blazor.Handlers;
9+
10+
public sealed class GetPortsReleasesHandler : IRequestHandler<GetPortsReleasesRequest, GetPortsReleasesResponse?>
11+
{
12+
private readonly PortsReleasesProvider _portsReleasesProvider;
13+
14+
public GetPortsReleasesHandler(PortsReleasesProvider portsReleasesProvider)
15+
{
16+
_portsReleasesProvider = portsReleasesProvider;
17+
}
18+
19+
public Task<GetPortsReleasesResponse?> Handle(GetPortsReleasesRequest request, CancellationToken cancellationToken)
20+
{
21+
Dictionary<PortEnum, GeneralReleaseEntity>? releases = [];
22+
23+
if (request.OSEnum is OSEnum.Windows)
24+
{
25+
releases = _portsReleasesProvider.WindowsReleases;
26+
}
27+
else if (request.OSEnum is OSEnum.Linux)
28+
{
29+
releases = _portsReleasesProvider.LinuxReleases;
30+
}
31+
32+
if (releases is null)
33+
{
34+
return Task.FromResult<GetPortsReleasesResponse?>(null);
35+
}
36+
37+
GetPortsReleasesResponse response = new()
38+
{
39+
PortsReleases = releases
40+
};
41+
42+
return Task.FromResult<GetPortsReleasesResponse?>(response);
43+
}
44+
}

Diff for: Web.Blazor/Program.cs

+18-2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
using Common.Entities;
2+
using Common.Serializable.Addon;
3+
using Common.Server.Entities;
14
using Common.Server.Providers;
25
using Database.Server;
36
using Web.Blazor.Helpers;
@@ -20,15 +23,28 @@ public static void Main(string[] args)
2023
{
2124
jsonOptions.JsonSerializerOptions.PropertyNameCaseInsensitive = true;
2225
jsonOptions.JsonSerializerOptions.PropertyNamingPolicy = null;
26+
27+
jsonOptions.JsonSerializerOptions.TypeInfoResolverChain.Add(AddonsJsonEntityListContext.Default);
28+
jsonOptions.JsonSerializerOptions.TypeInfoResolverChain.Add(DownloadableAddonEntityListContext.Default);
29+
jsonOptions.JsonSerializerOptions.TypeInfoResolverChain.Add(GeneralReleaseEntityContext.Default);
30+
jsonOptions.JsonSerializerOptions.TypeInfoResolverChain.Add(GeneralReleaseEntityObsoleteContext.Default);
31+
jsonOptions.JsonSerializerOptions.TypeInfoResolverChain.Add(AddonManifestContext.Default);
32+
jsonOptions.JsonSerializerOptions.TypeInfoResolverChain.Add(DependencyDtoContext.Default);
33+
jsonOptions.JsonSerializerOptions.TypeInfoResolverChain.Add(DependantAddonDtoContext.Default);
34+
jsonOptions.JsonSerializerOptions.TypeInfoResolverChain.Add(MapFileDtoContext.Default);
35+
jsonOptions.JsonSerializerOptions.TypeInfoResolverChain.Add(MapSlotDtoContext.Default);
36+
jsonOptions.JsonSerializerOptions.TypeInfoResolverChain.Add(SupportedGameDtoContext.Default);
37+
jsonOptions.JsonSerializerOptions.TypeInfoResolverChain.Add(GitHubReleaseEntityContext.Default);
38+
jsonOptions.JsonSerializerOptions.TypeInfoResolverChain.Add(GitHubReleaseAssetContext.Default);
2339
});
2440

2541
// Don't run tasks in dev mode
2642
if (!builder.Environment.IsDevelopment())
2743
{
28-
_ = builder.Services.AddHostedService<AppReleasesTask>();
44+
_ = builder.Services.AddHostedService<FileCheckTask>();
2945
_ = builder.Services.AddHostedService<PortsReleasesTask>();
46+
_ = builder.Services.AddHostedService<AppReleasesTask>();
3047
//_ = builder.Services.AddHostedService<ToolsReleasesTask>();
31-
_ = builder.Services.AddHostedService<FileCheckTask>();
3248
}
3349

3450
if (builder.Environment.IsDevelopment())

Diff for: Web.Blazor/Providers/AddonsProvider.cs

+7-2
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@ public AddonsProvider(
2727
/// Return addons list for a game
2828
/// </summary>
2929
/// <param name="gameEnum">Game enum</param>
30-
internal List<DownloadableAddonEntity> GetAddons(GameEnum gameEnum)
30+
/// <param name="dontLog">Don't log statistics</param>
31+
internal List<DownloadableAddonEntity> GetAddons(GameEnum gameEnum, bool dontLog = false)
3132
{
3233
using var dbContext = _dbContextFactory.Get();
3334

@@ -93,7 +94,11 @@ internal List<DownloadableAddonEntity> GetAddons(GameEnum gameEnum)
9394
}
9495

9596
sw.Stop();
96-
_logger.LogInformation($"Got addons for {gameEnum} in {sw.ElapsedMilliseconds} ms.");
97+
98+
if (!dontLog)
99+
{
100+
_logger.LogInformation($"Got {result.Count} addons for {gameEnum} in {sw.ElapsedMilliseconds} ms.");
101+
}
97102

98103
return result;
99104
}

0 commit comments

Comments
 (0)