Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ You can of course, as always, ask for help at [#coderbus](irc://irc.rizon.net/co

### Development Environment

You need the .NET 8.0 SDK, node>=v20, and npm>=v5.7 (in your PATH) to compile the server. On Linux, you also need the `libgdiplus` package installed to generate icons.
You need the .NET 10.0 SDK, node>=v20, and npm>=v5.7 (in your PATH) to compile the server. On Linux, you also need the `libgdiplus` package installed to generate icons.

You need to run `corepack enable` to configure node to correctly build the webpanel.

Expand Down
55 changes: 46 additions & 9 deletions .github/workflows/ci-pipeline.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,11 @@ on:
type: string

env:
TGS_DOTNET_VERSION: 8
TGS_DOTNET_VERSION: 10
OD_MIN_COMPAT_DOTNET_VERSION: 7
OD_DOTNET_VERSION: 9
TGS_DOTNET_QUALITY: ga
TGS_DOTNET_QUALITY: preview
OD_DOTNET_QUALITY: ga
TGS_NODE_VERSION: 20.x
TGS_TEST_GITHUB_TOKEN: ${{ secrets.LIVE_TESTS_TOKEN }}
PACKAGING_PRIVATE_KEY_PASSPHRASE: ${{ secrets.PACKAGING_PRIVATE_KEY_PASSPHRASE }}
Expand Down Expand Up @@ -110,6 +111,14 @@ jobs:
dotnet-version: ${{ env.TGS_DOTNET_VERSION }}.0.x
dotnet-quality: ${{ env.TGS_DOTNET_QUALITY }}

- name: Setup dotnet (TEMP NET 10 WORKAROUND)
uses: actions/setup-dotnet@v4
with:
dotnet-version: |
${{ env.OD_DOTNET_VERSION }}.0.x
${{ env.OD_MIN_COMPAT_DOTNET_VERSION }}.0.x
dotnet-quality: ${{ env.OD_DOTNET_QUALITY }}

- name: Setup Node.JS
uses: actions/setup-node@v4
with:
Expand Down Expand Up @@ -253,14 +262,14 @@ jobs:
if: matrix.committish == 'master'
with:
dotnet-version: "${{ env.OD_DOTNET_VERSION }}.0.x"
dotnet-quality: ${{ env.TGS_DOTNET_QUALITY }}
dotnet-quality: ${{ env.OD_DOTNET_QUALITY }}

- name: Setup dotnet (min-compat)
uses: actions/setup-dotnet@v4
if: matrix.committish == 'tgs-min-compat'
with:
dotnet-version: "${{ env.OD_MIN_COMPAT_DOTNET_VERSION }}.0.x"
dotnet-quality: ${{ env.TGS_DOTNET_QUALITY }}
dotnet-quality: ${{ env.OD_DOTNET_QUALITY }}

- name: Checkout (Branch)
uses: actions/checkout@v4
Expand Down Expand Up @@ -481,6 +490,14 @@ jobs:
dotnet-version: ${{ env.TGS_DOTNET_VERSION }}.0.x
dotnet-quality: ${{ env.TGS_DOTNET_QUALITY }}

- name: Setup dotnet (TEMP NET 10 WORKAROUND)
uses: actions/setup-dotnet@v4
with:
dotnet-version: |
${{ env.OD_DOTNET_VERSION }}.0.x
${{ env.OD_MIN_COMPAT_DOTNET_VERSION }}.0.x
dotnet-quality: ${{ env.OD_DOTNET_QUALITY }}

- name: Setup Node.JS
uses: actions/setup-node@v4
with:
Expand Down Expand Up @@ -517,7 +534,7 @@ jobs:
key: byond-zips

- name: Run Unit Tests
run: sudo dotnet test --no-build --logger "GitHubActions;summary.includePassedTests=true;summary.includeSkippedTests=true" --filter TestCategory!=RequiresDatabase -c ${{ matrix.configuration }}NoWindows --collect:"XPlat Code Coverage" --settings build/ci.runsettings --results-directory ./TestResults tgstation-server.sln
run: dotnet test --no-build --logger "GitHubActions;summary.includePassedTests=true;summary.includeSkippedTests=true" --filter TestCategory!=RequiresDatabase -c ${{ matrix.configuration }}NoWindows --collect:"XPlat Code Coverage" --settings build/ci.runsettings --results-directory ./TestResults tgstation-server.sln
env:
TGS_TEST_DISCORD_TOKEN: ${{ secrets.DISCORD_TOKEN }}
TGS_TEST_IRC_CONNECTION_STRING: ${{ secrets.IRC_CONNECTION_STRING }}
Expand Down Expand Up @@ -614,14 +631,20 @@ jobs:
TGS_TELEMETRY_KEY_FILE: C:/tgs_telemetry_key.txt
runs-on: windows-latest
steps:
- name: Setup dotnet
- name: Setup dotnet (TGS)
uses: actions/setup-dotnet@v4
with:
dotnet-version: |
${{ env.TGS_DOTNET_VERSION }}.0.x
dotnet-quality: ${{ env.TGS_DOTNET_QUALITY }}

- name: Setup dotnet (OD)
uses: actions/setup-dotnet@v4
with:
dotnet-version: |
${{ env.OD_DOTNET_VERSION }}.0.x
${{ env.OD_MIN_COMPAT_DOTNET_VERSION }}.0.x
dotnet-quality: ${{ env.TGS_DOTNET_QUALITY }}
dotnet-quality: ${{ env.OD_DOTNET_QUALITY }}

- name: Wait for LocalDB Connection # Do this first because we don't want to find out it's failing later
shell: powershell
Expand Down Expand Up @@ -870,14 +893,20 @@ jobs:
TGS_TELEMETRY_KEY_FILE: /tmp/tgs_telemetry_key.txt
runs-on: ubuntu-latest
steps:
- name: Setup dotnet
- name: Setup dotnet (TGS)
uses: actions/setup-dotnet@v4
with:
dotnet-version: |
${{ env.TGS_DOTNET_VERSION }}.0.x
dotnet-quality: ${{ env.TGS_DOTNET_QUALITY }}

- name: Setup dotnet (OD)
uses: actions/setup-dotnet@v4
with:
dotnet-version: |
${{ env.OD_DOTNET_VERSION }}.0.x
${{ env.OD_MIN_COMPAT_DOTNET_VERSION }}.0.x
dotnet-quality: ${{ env.TGS_DOTNET_QUALITY }}
dotnet-quality: ${{ env.OD_DOTNET_QUALITY }}

- name: Disable ptrace_scope
run: echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
Expand Down Expand Up @@ -1324,6 +1353,14 @@ jobs:
dotnet-version: ${{ env.TGS_DOTNET_VERSION }}.0.x
dotnet-quality: ${{ env.TGS_DOTNET_QUALITY }}

- name: Setup dotnet (TEMP NET 10 WORKAROUND)
uses: actions/setup-dotnet@v4
with:
dotnet-version: |
${{ env.OD_DOTNET_VERSION }}.0.x
${{ env.OD_MIN_COMPAT_DOTNET_VERSION }}.0.x
dotnet-quality: ${{ env.OD_DOTNET_QUALITY }}

- name: Override /usr/bin/dotnet
run: |
DOTNET_PATH=$(which dotnet)
Expand Down
14 changes: 7 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ Note: The `winget` package is submitted to Microsoft for approval once TGS relea

##### Manual

If you don't have it installed already, download and install the [ASP .NET Core Runtime Hosting Bundle (>= v8.0)](https://dotnet.microsoft.com/download/dotnet/8.0). Ensure that the `dotnet` executable file is in your system's `PATH` variable (or that of the user's that will be running the server). You can test this by opening a command prompt and running `dotnet --list-runtimes`.
If you don't have it installed already, download and install the [ASP .NET Core Runtime Hosting Bundle (>= v10.0)](https://dotnet.microsoft.com/download/dotnet/10.0). Ensure that the `dotnet` executable file is in your system's `PATH` variable (or that of the user's that will be running the server). You can test this by opening a command prompt and running `dotnet --list-runtimes`.

[Download the latest release .zip](https://github.com/tgstation/tgstation-server/releases/latest). Typically, you want the `ServerService.zip` package in order to run TGS as a Windows service. Choose `ServerConsole.zip` if you prefer to use a command line daemon.

Expand Down Expand Up @@ -166,7 +166,7 @@ Refer to [tgstation-server.nix](./build/package/nix/tgstation-server.nix) for th

The following dependencies are required.

- aspnetcore-runtime-8.0 (See Prerequisites under the `Ubuntu/Debian Package` section)
- aspnetcore-runtime-10.0 (See Prerequisites under the `Ubuntu/Debian Package` section)
- libc6-i386
- libstdc++6:i386
- gcc-multilib (Only on 64-bit systems)
Expand Down Expand Up @@ -219,19 +219,19 @@ If using manual configuration, before starting your container make sure the afor

In order for TGS to use [OpenDream](https://github.com/OpenDreamProject/OpenDream), it requires the full .NET SDK to build whichever version your servers target. Whatever that is, it must be available using the `dotnet` command for whichever user runs TGS.

OpenDream currently requires [.NET SDK 8.0](https://dotnet.microsoft.com/en-us/download/dotnet/8.0) at the time of this writing. You must install this manually outside of TGS (i.e. using your package manager).
OpenDream currently requires [.NET SDK 10.0](https://dotnet.microsoft.com/en-us/download/dotnet/10.0) at the time of this writing. You must install this manually outside of TGS (i.e. using your package manager).

<details>
<summary>How to handle a different SDK version than the ASP.NET runtime of TGS.</summary>

On Linux, as long as OpenDream and TGS do not use the same .NET major version, you cannot achieve this with the package manager as they will conflict. For example, the 7.0 SDK can be added to an 8.0 runtime installation via the following steps.
On Linux, as long as OpenDream and TGS do not use the same .NET major version, you cannot achieve this with the package manager as they will conflict. For example, the 9.0 SDK can be added to an 10.0 runtime installation via the following steps.

1. Install `tgstation-server` using any of the above methods.
1. [Download the Linux SDK binaries](https://dotnet.microsoft.com/en-us/download/dotnet/7.0) for your selected architecture.
1. [Download the Linux SDK binaries](https://dotnet.microsoft.com/en-us/download/dotnet/9.0) for your selected architecture.
1. Extract everything EXCEPT the `dotnet` executable, `LICENSE.txt`, and `ThirdPartyNotices.txt` in the `.tar.gz` on top of the existing installation directory `/usr/share/dotnet/`
1. Run `sudo chown -R root /usr/share/dotnet`

You should now be able to run the `dotnet --list-sdks` command and see an entry for `7.0.XXX [/usr/share/dotnet/sdk]`.
You should now be able to run the `dotnet --list-sdks` command and see an entry for `9.0.XXX [/usr/share/dotnet/sdk]`.
</details>

### Configuring
Expand All @@ -248,7 +248,7 @@ There are 3 primary supported ways to configure TGS:
- Set environment variables in the form `Section__Subsection=value` or `Section__ArraySubsection__0=value` for arrays.
- Set command line arguments in the form `--Section:Subsection=value` or `--Section:ArraySubsection:0=value` for arrays.

The latter two are not recommended as they cannot be dynamically changed at runtime. See more on ASP.NET core configuration [here](https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?view=aspnetcore-8.0).
The latter two are not recommended as they cannot be dynamically changed at runtime. See more on ASP.NET core configuration [here](https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?view=aspnetcore-10.0).

#### Manual Configuration

Expand Down
4 changes: 2 additions & 2 deletions build/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
FROM mcr.microsoft.com/dotnet/sdk:8.0-bookworm-slim AS build
FROM mcr.microsoft.com/dotnet/sdk:10.0-preview-trixie-slim AS build

# Set in CI
ARG TGS_TELEMETRY_KEY_FILE=
Expand Down Expand Up @@ -56,7 +56,7 @@ RUN export TGS_TELEMETRY_KEY_FILE="../../${TGS_TELEMETRY_KEY_FILE}" \
&& build/RemoveUnsupportedRuntimes.sh /app/lib/Default \
&& mv /app/lib/Default/appsettings* /app

FROM mcr.microsoft.com/dotnet/aspnet:8.0-bookworm-slim
FROM mcr.microsoft.com/dotnet/aspnet:10.0-preview-trixie-slim

#needed for byond, curl for healthchecks
RUN apt-get update \
Expand Down
4 changes: 4 additions & 0 deletions build/NugetCommon.props
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,10 @@
<PropertyGroup Condition="'$(GITHUB_ACTIONS)' == 'true'">
<ContinuousIntegrationBuild>true</ContinuousIntegrationBuild>
</PropertyGroup>

<PropertyGroup Condition="'$(TgsNetPreviewBuild)' == 'true'">
<NoWarn>NU5104</NoWarn>
</PropertyGroup>

<ItemGroup>
<!-- Usage: Sourcelink -->
Expand Down
3 changes: 1 addition & 2 deletions build/TestCommon.props
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<!-- Usage: Hard to say what exactly this is for, but not including it removes the test icon and breaks vstest.console.exe for some reason -->
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.13.0" Condition="'$(TgsTestNoSdk)' != 'true'" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.0-preview-25107-01" Condition="'$(TgsTestNoSdk)' != 'true'" />
<!-- Usage: Dependency mocking for tests -->
<!-- Pinned: Be VERY careful about updating https://github.com/moq/moq/issues/1372 -->
<PackageReference Include="Moq" Version="4.20.72" />
Expand All @@ -22,5 +22,4 @@
<!-- Usage: MSTest asserts etc... -->
<PackageReference Include="MSTest.TestFramework" Version="3.8.3" />
</ItemGroup>

</Project>
5 changes: 3 additions & 2 deletions build/Version.props
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<!-- Integration tests will ensure they match across the board -->
<Import Project="WebpanelVersion.props" />
<PropertyGroup>
<TgsCoreVersion>6.16.0</TgsCoreVersion>
<TgsCoreVersion>7.0.0</TgsCoreVersion>
<TgsConfigVersion>5.7.0</TgsConfigVersion>
<TgsRestVersion>10.13.0</TgsRestVersion>
<TgsGraphQLVersion>0.6.0</TgsGraphQLVersion>
Expand All @@ -16,7 +16,8 @@
<TgsSwarmProtocolVersion>9.0.0</TgsSwarmProtocolVersion>
<TgsContainerScriptVersion>1.2.1</TgsContainerScriptVersion>
<TgsNugetNetFramework>netstandard2.0</TgsNugetNetFramework>
<TgsNetMajorVersion>8</TgsNetMajorVersion>
<TgsNetMajorVersion>10</TgsNetMajorVersion>
<TgsNetPreviewBuild>true</TgsNetPreviewBuild>
<!-- Update this frequently with dotnet runtime patches. MAJOR MUST MATCH ABOVE! -->
<TgsDotnetRedistUrl>https://download.visualstudio.microsoft.com/download/pr/751d3fcd-72db-4da2-b8d0-709c19442225/33cc492bde704bfd6d70a2b9109005a0/dotnet-hosting-8.0.6-win.exe</TgsDotnetRedistUrl>
<TgsMariaDBRedistVersion>11.4.2</TgsMariaDBRedistVersion>
Expand Down
4 changes: 3 additions & 1 deletion build/package/deb/build_package.sh
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,9 @@ curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dea
export NODE_MAJOR=20
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list
apt-get update
apt-get install nodejs dotnet-sdk-8.0 -y
apt-get install -y \
nodejs
# dotnet-sdk-10.0 # Disabled while in preview

corepack enable

Expand Down
4 changes: 2 additions & 2 deletions build/package/deb/debian/control
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ Rules-Requires-Root: no
Build-Depends:
debhelper-compat (= 13),
nodejs,
dotnet-sdk-8.0,
#dotnet-sdk-10.0, Disabled while in preview
Standards-Version: 4.6.2
Homepage: https://tgstation.github.io/tgstation-server
Vcs-Browser: https://github.com/tgstation/tgstation-server
Expand All @@ -16,7 +16,7 @@ Package: tgstation-server
Architecture: any
Depends:
${misc:Depends},
aspnetcore-runtime-8.0,
#aspnetcore-runtime-10.0, Disabled while in preview
libc6-i386,
libstdc++6:i386 [amd64],
libstdc++6 [i386],
Expand Down
4 changes: 2 additions & 2 deletions global.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"sdk": {
"version": "8.0.0",
"version": "10.0.0",
"rollForward": "latestMajor",
"allowPrerelease": false
"allowPrerelease": true
}
}
3 changes: 2 additions & 1 deletion src/Tgstation.Server.Api/Models/EngineVersion.cs
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,8 @@ public static bool TryParse(string input, out EngineVersion? engineVersion)
var splits = input.Split(DashChar, StringSplitOptions.RemoveEmptyEntries);
engineVersion = null;

if (splits.Length > 3)
var length = splits.Length;
if (length == 0 || length > 3)
return false;

EngineType engine;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

<ItemGroup>
<!-- GraphQL connector and code generator -->
<PackageReference Include="Microsoft.Bcl.AsyncInterfaces" Version="9.0.4" />
<PackageReference Include="Microsoft.Bcl.AsyncInterfaces" Version="10.0.0-preview.3.25171.5" />
<PackageReference Include="StrawberryShake.Server" Version="15.1.3" />
</ItemGroup>

Expand Down
4 changes: 2 additions & 2 deletions src/Tgstation.Server.Client/Tgstation.Server.Client.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@

<ItemGroup>
<!-- Usage: Connecting to SignalR hubs in API -->
<PackageReference Include="Microsoft.AspNetCore.SignalR.Client" Version="9.0.4" />
<PackageReference Include="Microsoft.AspNetCore.SignalR.Client" Version="10.0.0-preview.3.25172.1" />
<!-- Usage: Using target JSON serializer for API -->
<PackageReference Include="Microsoft.AspNetCore.SignalR.Protocols.NewtonsoftJson" Version="9.0.4" />
<PackageReference Include="Microsoft.AspNetCore.SignalR.Protocols.NewtonsoftJson" Version="10.0.0-preview.3.25172.1" />
</ItemGroup>

<ItemGroup>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,9 @@

<ItemGroup>
<!-- Usage: Identifying if we're running under SystemD -->
<PackageReference Include="Microsoft.Extensions.Hosting.Systemd" Version="9.0.4" />
<PackageReference Include="Microsoft.Extensions.Hosting.Systemd" Version="10.0.0-preview.3.25171.5" />
<!-- Usage: Console logging plugin -->
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="9.0.4" />
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="10.0.0-preview.3.25171.5" />
</ItemGroup>

<ItemGroup>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,21 +21,17 @@
<!-- Usage: Command line argument support -->
<PackageReference Include="McMaster.Extensions.CommandLineUtils" Version="4.1.1" />
<!-- Usage: Identifies when we are running in the context of the Windows SCM -->
<PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="9.0.4" />
<PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="10.0.0-preview.3.25171.5" />
<!-- Usage: Windows event log logging plugin -->
<PackageReference Include="Microsoft.Extensions.Logging.EventLog" Version="9.0.4" />
<PackageReference Include="Microsoft.Extensions.Logging.EventLog" Version="10.0.0-preview.3.25171.5" />
<!-- Usage: Console logging plugin -->
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="9.0.4" />
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="10.0.0-preview.3.25171.5" />
<!-- Usage: Updated transitive dependency of Core.System.ServiceProcess -->
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<!-- Usage: Updated transitive dependency of Core.System.ServiceProcess -->
<PackageReference Include="System.Drawing.Common" Version="9.0.4" />
<!-- Usage: Updated transitive dependency, unable to tell what of -->
<PackageReference Include="System.Private.Uri" Version="4.3.2" />
<!-- Usage: OS identification -->
<PackageReference Include="System.Runtime.InteropServices" Version="4.3.0" />
<PackageReference Include="System.Drawing.Common" Version="10.0.0-preview.3.25173.2" />
<!-- Usage: Windows Service Manager intergration -->
<PackageReference Include="System.ServiceProcess.ServiceController" Version="9.0.4" />
<PackageReference Include="System.ServiceProcess.ServiceController" Version="10.0.0-preview.3.25171.5" />
</ItemGroup>

<ItemGroup>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@

<ItemGroup>
<!-- Usage: Logging abstractions -->
<PackageReference Include="Microsoft.Extensions.Logging" Version="9.0.4" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="10.0.0-preview.3.25171.5" />
<!-- Usage: POSIX support for signals -->
<PackageReference Include="Mono.Posix.NETStandard" Version="1.0.0" />
</ItemGroup>
Expand Down
2 changes: 1 addition & 1 deletion src/Tgstation.Server.Host.Watchdog/Watchdog.cs
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ public async ValueTask<bool> RunAsync(bool runConfigure, string[] args, Cancella
var sourcePath = Path.GetFullPath(
Path.Combine(
rootLocation,
"../../../../Tgstation.Server.Host/bin/Debug/net8.0"));
"../../../../Tgstation.Server.Host/bin/Debug/net10.0"));
foreach (string dirPath in Directory.GetDirectories(sourcePath, "*", SearchOption.AllDirectories))
Directory.CreateDirectory(dirPath.Replace(sourcePath, defaultAssemblyPath, StringComparison.Ordinal));

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ sealed class PermissionSetAuthority : AuthorityBase, IPermissionSetAuthority

var selectedPermissionSets = await databaseContext
.PermissionSets
.AsQueryable()
.Where(dbModel => idLookups.Contains(dbModel.Id!.Value)
|| (dbModel.UserId.HasValue && userIdLookups.Contains(dbModel.UserId.Value))
|| (dbModel.GroupId.HasValue && groupIdLookups.Contains(dbModel.GroupId.Value)))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ public static Task<Dictionary<long, UserGroup>> GetUserGroups(

return databaseContext
.Groups
.AsQueryable()
.Where(group => ids.Contains(group.Id!.Value))
.ToDictionaryAsync(userGroup => userGroup.Id!.Value, cancellationToken);
}
Expand Down
Loading