Compare commits

..

No commits in common. "218c756a7075902bc3d6a4a762639ce9013b2ddd" and "64ea25e89e4bdcafd7209fc1300cb7a46a34ffdb" have entirely different histories.

12 changed files with 366 additions and 355 deletions

View file

@ -99,11 +99,6 @@ public class Config
{ {
public int MaxMemberCount { get; init; } = 1000; public int MaxMemberCount { get; init; } = 1000;
public int MaxFields { get; init; } = 25;
public int MaxFieldNameLength { get; init; } = 100;
public int MaxFieldEntryTextLength { get; init; } = 100;
public int MaxFieldEntries { get; init; } = 100;
public int MaxUsernameLength { get; init; } = 40; public int MaxUsernameLength { get; init; } = 40;
public int MaxMemberNameLength { get; init; } = 100; public int MaxMemberNameLength { get; init; } = 100;
public int MaxDisplayNameLength { get; init; } = 100; public int MaxDisplayNameLength { get; init; } = 100;

View file

@ -81,13 +81,13 @@ public class MembersController(
("display_name", validationService.ValidateDisplayName(req.DisplayName)), ("display_name", validationService.ValidateDisplayName(req.DisplayName)),
("bio", validationService.ValidateBio(req.Bio)), ("bio", validationService.ValidateBio(req.Bio)),
("avatar", validationService.ValidateAvatar(req.Avatar)), ("avatar", validationService.ValidateAvatar(req.Avatar)),
.. validationService.ValidateFields(req.Fields, CurrentUser!.CustomPreferences), .. ValidationUtils.ValidateFields(req.Fields, CurrentUser!.CustomPreferences),
.. validationService.ValidateFieldEntries( .. ValidationUtils.ValidateFieldEntries(
req.Names?.ToArray(), req.Names?.ToArray(),
CurrentUser!.CustomPreferences, CurrentUser!.CustomPreferences,
"names" "names"
), ),
.. validationService.ValidatePronouns( .. ValidationUtils.ValidatePronouns(
req.Pronouns?.ToArray(), req.Pronouns?.ToArray(),
CurrentUser!.CustomPreferences CurrentUser!.CustomPreferences
), ),
@ -191,7 +191,7 @@ public class MembersController(
if (req.Names != null) if (req.Names != null)
{ {
errors.AddRange( errors.AddRange(
validationService.ValidateFieldEntries( ValidationUtils.ValidateFieldEntries(
req.Names, req.Names,
CurrentUser!.CustomPreferences, CurrentUser!.CustomPreferences,
"names" "names"
@ -203,7 +203,7 @@ public class MembersController(
if (req.Pronouns != null) if (req.Pronouns != null)
{ {
errors.AddRange( errors.AddRange(
validationService.ValidatePronouns(req.Pronouns, CurrentUser!.CustomPreferences) ValidationUtils.ValidatePronouns(req.Pronouns, CurrentUser!.CustomPreferences)
); );
member.Pronouns = req.Pronouns.ToList(); member.Pronouns = req.Pronouns.ToList();
} }
@ -211,10 +211,7 @@ public class MembersController(
if (req.Fields != null) if (req.Fields != null)
{ {
errors.AddRange( errors.AddRange(
validationService.ValidateFields( ValidationUtils.ValidateFields(req.Fields.ToList(), CurrentUser!.CustomPreferences)
req.Fields.ToList(),
CurrentUser!.CustomPreferences
)
); );
member.Fields = req.Fields.ToList(); member.Fields = req.Fields.ToList();
} }

View file

@ -91,7 +91,7 @@ public class UsersController(
if (req.Names != null) if (req.Names != null)
{ {
errors.AddRange( errors.AddRange(
validationService.ValidateFieldEntries( ValidationUtils.ValidateFieldEntries(
req.Names, req.Names,
CurrentUser!.CustomPreferences, CurrentUser!.CustomPreferences,
"names" "names"
@ -103,7 +103,7 @@ public class UsersController(
if (req.Pronouns != null) if (req.Pronouns != null)
{ {
errors.AddRange( errors.AddRange(
validationService.ValidatePronouns(req.Pronouns, CurrentUser!.CustomPreferences) ValidationUtils.ValidatePronouns(req.Pronouns, CurrentUser!.CustomPreferences)
); );
user.Pronouns = req.Pronouns.ToList(); user.Pronouns = req.Pronouns.ToList();
} }
@ -111,10 +111,7 @@ public class UsersController(
if (req.Fields != null) if (req.Fields != null)
{ {
errors.AddRange( errors.AddRange(
validationService.ValidateFields( ValidationUtils.ValidateFields(req.Fields.ToList(), CurrentUser!.CustomPreferences)
req.Fields.ToList(),
CurrentUser!.CustomPreferences
)
); );
user.Fields = req.Fields.ToList(); user.Fields = req.Fields.ToList();
} }

View file

@ -8,41 +8,41 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Coravel" Version="6.0.2"/> <PackageReference Include="Coravel" Version="6.0.0"/>
<PackageReference Include="Coravel.Mailer" Version="7.1.0"/> <PackageReference Include="Coravel.Mailer" Version="7.0.0"/>
<PackageReference Include="EFCore.NamingConventions" Version="9.0.0"/> <PackageReference Include="EFCore.NamingConventions" Version="9.0.0"/>
<PackageReference Include="EntityFrameworkCore.Exceptions.PostgreSQL" Version="8.1.3"/> <PackageReference Include="EntityFrameworkCore.Exceptions.PostgreSQL" Version="8.1.3"/>
<PackageReference Include="Humanizer.Core" Version="2.14.1"/> <PackageReference Include="Humanizer.Core" Version="2.14.1"/>
<PackageReference Include="JetBrains.Annotations" Version="2024.3.0"/> <PackageReference Include="JetBrains.Annotations" Version="2024.3.0"/>
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="9.0.2"/> <PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="9.0.0"/>
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="9.0.2"/> <PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="9.0.0"/>
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="9.0.2"/> <PackageReference Include="Microsoft.EntityFrameworkCore" Version="9.0.0"/>
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="9.0.2"> <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="9.0.0">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
</PackageReference> </PackageReference>
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="9.0.2"/> <PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="9.0.0"/>
<PackageReference Include="MimeKit" Version="4.10.0"/> <PackageReference Include="MimeKit" Version="4.9.0"/>
<PackageReference Include="Minio" Version="6.0.4"/> <PackageReference Include="Minio" Version="6.0.3"/>
<PackageReference Include="Newtonsoft.Json" Version="13.0.3"/> <PackageReference Include="Newtonsoft.Json" Version="13.0.3"/>
<PackageReference Include="NodaTime" Version="3.2.1"/> <PackageReference Include="NodaTime" Version="3.2.0"/>
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="9.0.3"/> <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="9.0.2"/>
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL.NodaTime" Version="9.0.3"/> <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL.NodaTime" Version="9.0.2"/>
<PackageReference Include="Npgsql.Json.NET" Version="9.0.3"/> <PackageReference Include="Npgsql.Json.NET" Version="9.0.2"/>
<PackageReference Include="prometheus-net" Version="8.2.1"/> <PackageReference Include="prometheus-net" Version="8.2.1"/>
<PackageReference Include="prometheus-net.AspNetCore" Version="8.2.1"/> <PackageReference Include="prometheus-net.AspNetCore" Version="8.2.1"/>
<PackageReference Include="Roslynator.Analyzers" Version="4.13.1"> <PackageReference Include="Roslynator.Analyzers" Version="4.12.9">
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference> </PackageReference>
<PackageReference Include="Scalar.AspNetCore" Version="2.0.18"/> <PackageReference Include="Scalar.AspNetCore" Version="1.2.55"/>
<PackageReference Include="Sentry.AspNetCore" Version="5.2.0"/> <PackageReference Include="Sentry.AspNetCore" Version="4.13.0"/>
<PackageReference Include="Serilog" Version="4.2.0"/> <PackageReference Include="Serilog" Version="4.2.0"/>
<PackageReference Include="Serilog.AspNetCore" Version="9.0.0"/> <PackageReference Include="Serilog.AspNetCore" Version="9.0.0"/>
<PackageReference Include="Serilog.Sinks.Console" Version="6.0.0"/> <PackageReference Include="Serilog.Sinks.Console" Version="6.0.0"/>
<PackageReference Include="Serilog.Sinks.Seq" Version="9.0.0"/> <PackageReference Include="Serilog.Sinks.Seq" Version="8.0.0"/>
<PackageReference Include="SixLabors.ImageSharp" Version="3.1.6"/> <PackageReference Include="SixLabors.ImageSharp" Version="3.1.6"/>
<PackageReference Include="System.Text.Json" Version="9.0.2"/> <PackageReference Include="System.Text.Json" Version="9.0.0"/>
<PackageReference Include="System.Text.RegularExpressions" Version="4.3.1"/> <PackageReference Include="System.Text.RegularExpressions" Version="4.3.1"/>
<PackageReference Include="Yort.Xid.Net" Version="2.0.1"/> <PackageReference Include="Yort.Xid.Net" Version="2.0.1"/>
</ItemGroup> </ItemGroup>

View file

@ -23,6 +23,7 @@ using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json; using Newtonsoft.Json;
using Newtonsoft.Json.Serialization; using Newtonsoft.Json.Serialization;
using Prometheus; using Prometheus;
using Scalar.AspNetCore;
using Sentry.Extensibility; using Sentry.Extensibility;
using Serilog; using Serilog;
@ -45,8 +46,7 @@ builder
// No valid request body will ever come close to this limit, // No valid request body will ever come close to this limit,
// but the limit is slightly higher to prevent valid requests from being rejected. // but the limit is slightly higher to prevent valid requests from being rejected.
opts.Limits.MaxRequestBodySize = 2 * 1024 * 1024; opts.Limits.MaxRequestBodySize = 2 * 1024 * 1024;
}) });
.UseUrls(config.Address);
builder builder
.Services.AddControllers() .Services.AddControllers()
@ -109,18 +109,16 @@ if (config.Logging.SentryTracing)
app.UseCors(); app.UseCors();
app.UseCustomMiddleware(); app.UseCustomMiddleware();
app.MapControllers(); app.MapControllers();
app.MapOpenApi("/api-docs/openapi/{documentName}.json");
app.MapScalarApiReference(options =>
{
options.Title = "pronouns.cc API";
options.OpenApiRoutePattern = "/api-docs/openapi/{documentName}.json";
options.EndpointPathPrefix = "/api-docs/{documentName}";
});
// TODO: I can't figure out why this doesn't work yet app.Urls.Clear();
// TODO: Manually write API docs in the meantime app.Urls.Add(config.Address);
// app.MapOpenApi("/api-docs/openapi/{documentName}.json");
// app.MapScalarApiReference(
// "/api-docs/",
// options =>
// {
// options.Title = "pronouns.cc API";
// options.OpenApiRoutePattern = "/api-docs/openapi/{documentName}.json";
// }
// );
// Make sure metrics are updated whenever Prometheus scrapes them // Make sure metrics are updated whenever Prometheus scrapes them
Metrics.DefaultRegistry.AddBeforeCollectCallback(async ct => Metrics.DefaultRegistry.AddBeforeCollectCallback(async ct =>

View file

@ -0,0 +1,23 @@
// Copyright (C) 2023-present sam/u1f320 (vulpine.solutions)
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published
// by the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
namespace Foxnouns.Backend.Utils;
public static class Limits
{
public const int FieldLimit = 25;
public const int FieldNameLimit = 100;
public const int FieldEntryTextLimit = 100;
public const int FieldEntriesLimit = 100;
}

View file

@ -22,10 +22,8 @@ namespace Foxnouns.Backend.Utils.OpenApi;
public class PropertyKeySchemaTransformer : IOpenApiSchemaTransformer public class PropertyKeySchemaTransformer : IOpenApiSchemaTransformer
{ {
private static readonly DefaultContractResolver SnakeCaseConverter = new() private static readonly DefaultContractResolver SnakeCaseConverter =
{ new() { NamingStrategy = new SnakeCaseNamingStrategy() };
NamingStrategy = new SnakeCaseNamingStrategy(),
};
public Task TransformAsync( public Task TransformAsync(
OpenApiSchema schema, OpenApiSchema schema,

View file

@ -15,9 +15,9 @@
using Foxnouns.Backend.Database; using Foxnouns.Backend.Database;
using Foxnouns.Backend.Database.Models; using Foxnouns.Backend.Database.Models;
namespace Foxnouns.Backend.Services; namespace Foxnouns.Backend.Utils;
public partial class ValidationService public static partial class ValidationUtils
{ {
public static readonly string[] DefaultStatusOptions = public static readonly string[] DefaultStatusOptions =
[ [
@ -28,7 +28,7 @@ public partial class ValidationService
"avoid", "avoid",
]; ];
public IEnumerable<(string, ValidationError?)> ValidateFields( public static IEnumerable<(string, ValidationError?)> ValidateFields(
List<Field>? fields, List<Field>? fields,
IReadOnlyDictionary<Snowflake, User.CustomPreference> customPreferences IReadOnlyDictionary<Snowflake, User.CustomPreference> customPreferences
) )
@ -37,7 +37,7 @@ public partial class ValidationService
return []; return [];
var errors = new List<(string, ValidationError?)>(); var errors = new List<(string, ValidationError?)>();
if (fields.Count > _limits.MaxFields) if (fields.Count > 25)
{ {
errors.Add( errors.Add(
( (
@ -45,7 +45,7 @@ public partial class ValidationService
ValidationError.LengthError( ValidationError.LengthError(
"Too many fields", "Too many fields",
0, 0,
_limits.MaxFields, Limits.FieldLimit,
fields.Count fields.Count
) )
) )
@ -53,38 +53,39 @@ public partial class ValidationService
} }
// No overwhelming this function, thank you // No overwhelming this function, thank you
if (fields.Count > _limits.MaxFields + 50) if (fields.Count > 100)
return errors; return errors;
foreach ((Field? field, int index) in fields.Select((field, index) => (field, index))) foreach ((Field? field, int index) in fields.Select((field, index) => (field, index)))
{ {
if (field.Name.Length > _limits.MaxFieldNameLength) switch (field.Name.Length)
{ {
errors.Add( case > Limits.FieldNameLimit:
( errors.Add(
$"fields.{index}.name", (
ValidationError.LengthError( $"fields.{index}.name",
"Field name is too long", ValidationError.LengthError(
1, "Field name is too long",
_limits.MaxFieldNameLength, 1,
field.Name.Length Limits.FieldNameLimit,
field.Name.Length
)
) )
) );
); break;
} case < 1:
else if (field.Name.Length < 1) errors.Add(
{ (
errors.Add( $"fields.{index}.name",
( ValidationError.LengthError(
$"fields.{index}.name", "Field name is too short",
ValidationError.LengthError( 1,
"Field name is too short", Limits.FieldNameLimit,
1, field.Name.Length
_limits.MaxFieldNameLength, )
field.Name.Length
) )
) );
); break;
} }
errors = errors errors = errors
@ -101,7 +102,7 @@ public partial class ValidationService
return errors; return errors;
} }
public IEnumerable<(string, ValidationError?)> ValidateFieldEntries( public static IEnumerable<(string, ValidationError?)> ValidateFieldEntries(
FieldEntry[]? entries, FieldEntry[]? entries,
IReadOnlyDictionary<Snowflake, User.CustomPreference> customPreferences, IReadOnlyDictionary<Snowflake, User.CustomPreference> customPreferences,
string errorPrefix = "fields" string errorPrefix = "fields"
@ -111,7 +112,7 @@ public partial class ValidationService
return []; return [];
var errors = new List<(string, ValidationError?)>(); var errors = new List<(string, ValidationError?)>();
if (entries.Length > _limits.MaxFieldEntries) if (entries.Length > Limits.FieldEntriesLimit)
{ {
errors.Add( errors.Add(
( (
@ -119,7 +120,7 @@ public partial class ValidationService
ValidationError.LengthError( ValidationError.LengthError(
"Field has too many entries", "Field has too many entries",
0, 0,
_limits.MaxFieldEntries, Limits.FieldEntriesLimit,
entries.Length entries.Length
) )
) )
@ -127,7 +128,7 @@ public partial class ValidationService
} }
// Same as above, no overwhelming this function with a ridiculous amount of entries // Same as above, no overwhelming this function with a ridiculous amount of entries
if (entries.Length > _limits.MaxFieldEntries + 50) if (entries.Length > Limits.FieldEntriesLimit + 50)
return errors; return errors;
string[] customPreferenceIds = customPreferences.Keys.Select(id => id.ToString()).ToArray(); string[] customPreferenceIds = customPreferences.Keys.Select(id => id.ToString()).ToArray();
@ -138,33 +139,34 @@ public partial class ValidationService
) )
) )
{ {
if (entry.Value.Length > _limits.MaxFieldEntryTextLength) switch (entry.Value.Length)
{ {
errors.Add( case > Limits.FieldEntryTextLimit:
( errors.Add(
$"{errorPrefix}.{entryIdx}.value", (
ValidationError.LengthError( $"{errorPrefix}.{entryIdx}.value",
"Field value is too long", ValidationError.LengthError(
1, "Field value is too long",
_limits.MaxFieldEntryTextLength, 1,
entry.Value.Length Limits.FieldEntryTextLimit,
entry.Value.Length
)
) )
) );
); break;
} case < 1:
else if (entry.Value.Length < 1) errors.Add(
{ (
errors.Add( $"{errorPrefix}.{entryIdx}.value",
( ValidationError.LengthError(
$"{errorPrefix}.{entryIdx}.value", "Field value is too short",
ValidationError.LengthError( 1,
"Field value is too short", Limits.FieldEntryTextLimit,
1, entry.Value.Length
_limits.MaxFieldEntryTextLength, )
entry.Value.Length
) )
) );
); break;
} }
if ( if (
@ -184,7 +186,7 @@ public partial class ValidationService
return errors; return errors;
} }
public IEnumerable<(string, ValidationError?)> ValidatePronouns( public static IEnumerable<(string, ValidationError?)> ValidatePronouns(
Pronoun[]? entries, Pronoun[]? entries,
IReadOnlyDictionary<Snowflake, User.CustomPreference> customPreferences, IReadOnlyDictionary<Snowflake, User.CustomPreference> customPreferences,
string errorPrefix = "pronouns" string errorPrefix = "pronouns"
@ -194,7 +196,7 @@ public partial class ValidationService
return []; return [];
var errors = new List<(string, ValidationError?)>(); var errors = new List<(string, ValidationError?)>();
if (entries.Length > _limits.MaxFieldEntries) if (entries.Length > Limits.FieldEntriesLimit)
{ {
errors.Add( errors.Add(
( (
@ -202,7 +204,7 @@ public partial class ValidationService
ValidationError.LengthError( ValidationError.LengthError(
"Too many pronouns", "Too many pronouns",
0, 0,
_limits.MaxFieldEntries, Limits.FieldEntriesLimit,
entries.Length entries.Length
) )
) )
@ -210,7 +212,7 @@ public partial class ValidationService
} }
// Same as above, no overwhelming this function with a ridiculous amount of entries // Same as above, no overwhelming this function with a ridiculous amount of entries
if (entries.Length > _limits.MaxFieldEntries + 50) if (entries.Length > Limits.FieldEntriesLimit + 50)
return errors; return errors;
string[] customPreferenceIds = customPreferences.Keys.Select(id => id.ToString()).ToArray(); string[] customPreferenceIds = customPreferences.Keys.Select(id => id.ToString()).ToArray();
@ -219,64 +221,66 @@ public partial class ValidationService
(Pronoun? entry, int entryIdx) in entries.Select((entry, entryIdx) => (entry, entryIdx)) (Pronoun? entry, int entryIdx) in entries.Select((entry, entryIdx) => (entry, entryIdx))
) )
{ {
if (entry.Value.Length > _limits.MaxFieldEntryTextLength) switch (entry.Value.Length)
{ {
errors.Add( case > Limits.FieldEntryTextLimit:
( errors.Add(
$"{errorPrefix}.{entryIdx}.value", (
ValidationError.LengthError( $"{errorPrefix}.{entryIdx}.value",
"Pronoun value is too long", ValidationError.LengthError(
1, "Pronoun value is too long",
_limits.MaxFieldEntryTextLength, 1,
entry.Value.Length Limits.FieldEntryTextLimit,
entry.Value.Length
)
) )
) );
); break;
} case < 1:
else if (entry.Value.Length < 1) errors.Add(
{ (
errors.Add( $"{errorPrefix}.{entryIdx}.value",
( ValidationError.LengthError(
$"{errorPrefix}.{entryIdx}.value", "Pronoun value is too short",
ValidationError.LengthError( 1,
"Pronoun value is too short", Limits.FieldEntryTextLimit,
1, entry.Value.Length
_limits.MaxFieldEntryTextLength, )
entry.Value.Length
) )
) );
); break;
} }
if (entry.DisplayText != null) if (entry.DisplayText != null)
{ {
if (entry.DisplayText.Length > _limits.MaxFieldEntryTextLength) switch (entry.DisplayText.Length)
{ {
errors.Add( case > Limits.FieldEntryTextLimit:
( errors.Add(
$"{errorPrefix}.{entryIdx}.display_text", (
ValidationError.LengthError( $"{errorPrefix}.{entryIdx}.display_text",
"Pronoun display text is too long", ValidationError.LengthError(
1, "Pronoun display text is too long",
_limits.MaxFieldEntryTextLength, 1,
entry.Value.Length Limits.FieldEntryTextLimit,
entry.Value.Length
)
) )
) );
); break;
} case < 1:
else if (entry.DisplayText.Length < 1) errors.Add(
{ (
errors.Add( $"{errorPrefix}.{entryIdx}.display_text",
( ValidationError.LengthError(
$"{errorPrefix}.{entryIdx}.display_text", "Pronoun display text is too short",
ValidationError.LengthError( 1,
"Pronoun display text is too short", Limits.FieldEntryTextLimit,
1, entry.Value.Length
_limits.MaxFieldEntryTextLength, )
entry.Value.Length
) )
) );
); break;
} }
} }

View file

@ -20,7 +20,7 @@ public static partial class ValidationUtils
public static ValidationError? ValidateReportContext(string? context) => public static ValidationError? ValidateReportContext(string? context) =>
context?.Length > MaximumReportContextLength context?.Length > MaximumReportContextLength
? ValidationError.GenericValidationError("Report context is too long", null) ? ValidationError.GenericValidationError("Avatar is too large", null)
: null; : null;
public const int MinimumPasswordLength = 12; public const int MinimumPasswordLength = 12;

View file

@ -4,9 +4,9 @@
"net9.0": { "net9.0": {
"Coravel": { "Coravel": {
"type": "Direct", "type": "Direct",
"requested": "[6.0.2, )", "requested": "[6.0.0, )",
"resolved": "6.0.2", "resolved": "6.0.0",
"contentHash": "/XZiRId4Ilar/OqjGKdxkZWfW97ekeT0wgiWNjGdqf8pPxiK508//Zkc0xrKMDOqchFT7B/oqAoQ+Vrx1txpPQ==", "contentHash": "U16V/IxGL2TcpU9sT1gUA3pqoVIlz+WthC4idn8OTPiEtLElTcmNF6sHt+gOx8DRU8TBgN5vjfL4AHetjacOWQ==",
"dependencies": { "dependencies": {
"Microsoft.Extensions.Caching.Memory": "3.1.0", "Microsoft.Extensions.Caching.Memory": "3.1.0",
"Microsoft.Extensions.Configuration.Binder": "6.0.0", "Microsoft.Extensions.Configuration.Binder": "6.0.0",
@ -17,12 +17,12 @@
}, },
"Coravel.Mailer": { "Coravel.Mailer": {
"type": "Direct", "type": "Direct",
"requested": "[7.1.0, )", "requested": "[7.0.0, )",
"resolved": "7.1.0", "resolved": "7.0.0",
"contentHash": "yMbUrwKl5/HbJeX8JkHa8Q3CPTJ3OmPyDSG7sULbXGEhzc2GiYIh7pmVhI1FFeL3VUtFavMDkS8PTwEeCpiwlg==", "contentHash": "mxSlOOBxPjCAZruOpgXtubnZA9lD0DRgutApQmAsts7DoRfe0wTzqWrYjeZTiIzgVJZKZxJglN8duTvbPrw3jQ==",
"dependencies": { "dependencies": {
"MailKit": "4.8.0", "MailKit": "4.3.0",
"Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation": "6.0.36" "Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation": "6.0.27"
} }
}, },
"EFCore.NamingConventions": { "EFCore.NamingConventions": {
@ -60,41 +60,41 @@
}, },
"Microsoft.AspNetCore.Mvc.NewtonsoftJson": { "Microsoft.AspNetCore.Mvc.NewtonsoftJson": {
"type": "Direct", "type": "Direct",
"requested": "[9.0.2, )", "requested": "[9.0.0, )",
"resolved": "9.0.2", "resolved": "9.0.0",
"contentHash": "cCnaxji6nqIHHLAEhZ6QirXCvwJNi0Q/qCPLkRW5SqMYNuOwoQdGk1KAhW65phBq1VHGt7wLbadpuGPGqfiZuA==", "contentHash": "pTFDEmZi3GheCSPrBxzyE63+d5unln2vYldo/nOm1xet/4rpEk2oJYcwpclPQ13E+LZBF9XixkgwYTUwqznlWg==",
"dependencies": { "dependencies": {
"Microsoft.AspNetCore.JsonPatch": "9.0.2", "Microsoft.AspNetCore.JsonPatch": "9.0.0",
"Newtonsoft.Json": "13.0.3", "Newtonsoft.Json": "13.0.3",
"Newtonsoft.Json.Bson": "1.0.2" "Newtonsoft.Json.Bson": "1.0.2"
} }
}, },
"Microsoft.AspNetCore.OpenApi": { "Microsoft.AspNetCore.OpenApi": {
"type": "Direct", "type": "Direct",
"requested": "[9.0.2, )", "requested": "[9.0.0, )",
"resolved": "9.0.2", "resolved": "9.0.0",
"contentHash": "JUndpjRNdG8GvzBLH/J4hen4ehWaPcshtiQ6+sUs1Bcj3a7dOsmWpDloDlpPeMOVSlhHwUJ3Xld0ClZjsFLgFQ==", "contentHash": "FqUK5j1EOPNuFT7IafltZQ3cakqhSwVzH5ZW1MhZDe4pPXs9sJ2M5jom1Omsu+mwF2tNKKlRAzLRHQTZzbd+6Q==",
"dependencies": { "dependencies": {
"Microsoft.OpenApi": "1.6.17" "Microsoft.OpenApi": "1.6.17"
} }
}, },
"Microsoft.EntityFrameworkCore": { "Microsoft.EntityFrameworkCore": {
"type": "Direct", "type": "Direct",
"requested": "[9.0.2, )", "requested": "[9.0.0, )",
"resolved": "9.0.2", "resolved": "9.0.0",
"contentHash": "P90ZuybgcpW32y985eOYxSoZ9IiL0UTYQlY0y1Pt1iHAnpZj/dQHREpSpry1RNvk8YjAeoAkWFdem5conqB9zQ==", "contentHash": "wpG+nfnfDAw87R3ovAsUmjr3MZ4tYXf6bFqEPVAIKE6IfPml3DS//iX0DBnf8kWn5ZHSO5oi1m4d/Jf+1LifJQ==",
"dependencies": { "dependencies": {
"Microsoft.EntityFrameworkCore.Abstractions": "9.0.2", "Microsoft.EntityFrameworkCore.Abstractions": "9.0.0",
"Microsoft.EntityFrameworkCore.Analyzers": "9.0.2", "Microsoft.EntityFrameworkCore.Analyzers": "9.0.0",
"Microsoft.Extensions.Caching.Memory": "9.0.2", "Microsoft.Extensions.Caching.Memory": "9.0.0",
"Microsoft.Extensions.Logging": "9.0.2" "Microsoft.Extensions.Logging": "9.0.0"
} }
}, },
"Microsoft.EntityFrameworkCore.Design": { "Microsoft.EntityFrameworkCore.Design": {
"type": "Direct", "type": "Direct",
"requested": "[9.0.2, )", "requested": "[9.0.0, )",
"resolved": "9.0.2", "resolved": "9.0.0",
"contentHash": "WWRmTxb/yd05cTW+k32lLvIhffxilgYvwKHDxiqe7GRLKeceyMspuf5BRpW65sFF7S2G+Be9JgjUe1ypGqt9tg==", "contentHash": "Pqo8I+yHJ3VQrAoY0hiSncf+5P7gN/RkNilK5e+/K/yKh+yAWxdUAI6t0TG26a9VPlCa9FhyklzyFvRyj3YG9A==",
"dependencies": { "dependencies": {
"Humanizer.Core": "2.14.1", "Humanizer.Core": "2.14.1",
"Microsoft.Build.Framework": "17.8.3", "Microsoft.Build.Framework": "17.8.3",
@ -102,33 +102,33 @@
"Microsoft.CodeAnalysis.CSharp": "4.8.0", "Microsoft.CodeAnalysis.CSharp": "4.8.0",
"Microsoft.CodeAnalysis.CSharp.Workspaces": "4.8.0", "Microsoft.CodeAnalysis.CSharp.Workspaces": "4.8.0",
"Microsoft.CodeAnalysis.Workspaces.MSBuild": "4.8.0", "Microsoft.CodeAnalysis.Workspaces.MSBuild": "4.8.0",
"Microsoft.EntityFrameworkCore.Relational": "9.0.2", "Microsoft.EntityFrameworkCore.Relational": "9.0.0",
"Microsoft.Extensions.Caching.Memory": "9.0.2", "Microsoft.Extensions.Caching.Memory": "9.0.0",
"Microsoft.Extensions.Configuration.Abstractions": "9.0.2", "Microsoft.Extensions.Configuration.Abstractions": "9.0.0",
"Microsoft.Extensions.DependencyModel": "9.0.2", "Microsoft.Extensions.DependencyModel": "9.0.0",
"Microsoft.Extensions.Logging": "9.0.2", "Microsoft.Extensions.Logging": "9.0.0",
"Mono.TextTemplating": "3.0.0", "Mono.TextTemplating": "3.0.0",
"System.Text.Json": "9.0.2" "System.Text.Json": "9.0.0"
} }
}, },
"Microsoft.Extensions.Caching.Memory": { "Microsoft.Extensions.Caching.Memory": {
"type": "Direct", "type": "Direct",
"requested": "[9.0.2, )", "requested": "[9.0.0, )",
"resolved": "9.0.2", "resolved": "9.0.0",
"contentHash": "AlEfp0DMz8E1h1Exi8LBrUCNmCYcGDfSM4F/uK1D1cYx/R3w0LVvlmjICqxqXTsy7BEZaCf5leRZY2FuPEiFaw==", "contentHash": "zbnPX/JQ0pETRSUG9fNPBvpIq42Aufvs15gGYyNIMhCun9yhmWihz0WgsI7bSDPjxWTKBf8oX/zv6v2uZ3W9OQ==",
"dependencies": { "dependencies": {
"Microsoft.Extensions.Caching.Abstractions": "9.0.2", "Microsoft.Extensions.Caching.Abstractions": "9.0.0",
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.2", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.0",
"Microsoft.Extensions.Logging.Abstractions": "9.0.2", "Microsoft.Extensions.Logging.Abstractions": "9.0.0",
"Microsoft.Extensions.Options": "9.0.2", "Microsoft.Extensions.Options": "9.0.0",
"Microsoft.Extensions.Primitives": "9.0.2" "Microsoft.Extensions.Primitives": "9.0.0"
} }
}, },
"MimeKit": { "MimeKit": {
"type": "Direct", "type": "Direct",
"requested": "[4.10.0, )", "requested": "[4.9.0, )",
"resolved": "4.10.0", "resolved": "4.9.0",
"contentHash": "GQofI17cH55XSh109hJmHaYMtSFqTX/eUek3UcV7hTnYayAIXZ6eHlv345tfdc+bQ/BrEnYOSZVzx9I3wpvvpg==", "contentHash": "DZXXMZzmAABDxFhOSMb6SE8KKxcRd/sk1E6aJTUE5ys2FWOQhznYV2Gl3klaaSfqKn27hQ32haqquH1J8Z6kJw==",
"dependencies": { "dependencies": {
"BouncyCastle.Cryptography": "2.5.0", "BouncyCastle.Cryptography": "2.5.0",
"System.Formats.Asn1": "8.0.1", "System.Formats.Asn1": "8.0.1",
@ -137,11 +137,11 @@
}, },
"Minio": { "Minio": {
"type": "Direct", "type": "Direct",
"requested": "[6.0.4, )", "requested": "[6.0.3, )",
"resolved": "6.0.4", "resolved": "6.0.3",
"contentHash": "JckRL95hQ/eDHTQZ/BB7jeR0JyF+bOctMW6uriXHY5YPjCX61hiJGsswGjuDSEViKJEPxtPi3e4IwD/1TJ7PIw==", "contentHash": "WHlkouclHtiK/pIXPHcjVmbeELHPtElj2qRSopFVpSmsFhZXeM10sPvczrkSPePsmwuvZdFryJ/hJzKu3XeLVg==",
"dependencies": { "dependencies": {
"CommunityToolkit.HighPerformance": "8.3.0", "CommunityToolkit.HighPerformance": "8.2.2",
"Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.1", "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.1",
"Microsoft.Extensions.Logging": "8.0.0", "Microsoft.Extensions.Logging": "8.0.0",
"System.IO.Hashing": "8.0.0", "System.IO.Hashing": "8.0.0",
@ -156,39 +156,39 @@
}, },
"NodaTime": { "NodaTime": {
"type": "Direct", "type": "Direct",
"requested": "[3.2.1, )", "requested": "[3.2.0, )",
"resolved": "3.2.1", "resolved": "3.2.0",
"contentHash": "D1aHhUfPQUxU2nfDCVuSLahpp0xCYZTmj/KNH3mSK/tStJYcx9HO9aJ0qbOP3hzjGPV/DXOqY2AHe27Nt4xs4g==" "contentHash": "yoRA3jEJn8NM0/rQm78zuDNPA3DonNSZdsorMUj+dltc1D+/Lc5h9YXGqbEEZozMGr37lAoYkcSM/KjTVqD0ow=="
}, },
"Npgsql.EntityFrameworkCore.PostgreSQL": { "Npgsql.EntityFrameworkCore.PostgreSQL": {
"type": "Direct", "type": "Direct",
"requested": "[9.0.3, )", "requested": "[9.0.2, )",
"resolved": "9.0.3", "resolved": "9.0.2",
"contentHash": "1A6HpMPbzK+quxdtug1aDHI4BSRTgpi7OaDt8WQh7SFJd2sSQ0nNTZ7sYrwyxVf4AdKdN7XJL9tpiiJjRUaa4g==", "contentHash": "cYdOGplIvr9KgsG8nJ8xnzBTImeircbgetlzS1OmepS5dAQW6PuGpVrLOKBNEwEvGYZPsV8037X5vZ/Dmpwz7Q==",
"dependencies": { "dependencies": {
"Microsoft.EntityFrameworkCore": "[9.0.1, 10.0.0)", "Microsoft.EntityFrameworkCore": "[9.0.0, 10.0.0)",
"Microsoft.EntityFrameworkCore.Relational": "[9.0.1, 10.0.0)", "Microsoft.EntityFrameworkCore.Relational": "[9.0.0, 10.0.0)",
"Npgsql": "9.0.2" "Npgsql": "9.0.2"
} }
}, },
"Npgsql.EntityFrameworkCore.PostgreSQL.NodaTime": { "Npgsql.EntityFrameworkCore.PostgreSQL.NodaTime": {
"type": "Direct", "type": "Direct",
"requested": "[9.0.3, )", "requested": "[9.0.2, )",
"resolved": "9.0.3", "resolved": "9.0.2",
"contentHash": "Eks1o3NfIbS3EHhrXC0QABrQab7CJ64C2+kF0YJWLwlH/tu3ExrgrSLpLI6INdeMYcLr2PXu71LjJsrQNVciYg==", "contentHash": "+mfwiRCK+CAKTkeBZCuQuMaOwM/yMX8B65515PS1le9TUjlG8DobuAmb48MSR/Pr/YMvU1tV8FFEFlyQviQzrg==",
"dependencies": { "dependencies": {
"Npgsql.EntityFrameworkCore.PostgreSQL": "9.0.3", "Npgsql.EntityFrameworkCore.PostgreSQL": "9.0.2",
"Npgsql.NodaTime": "9.0.2" "Npgsql.NodaTime": "9.0.2"
} }
}, },
"Npgsql.Json.NET": { "Npgsql.Json.NET": {
"type": "Direct", "type": "Direct",
"requested": "[9.0.3, )", "requested": "[9.0.2, )",
"resolved": "9.0.3", "resolved": "9.0.2",
"contentHash": "lN8p9UKkoXaGUhX3DHg/1W6YeEfbjQiQ7XrJSGREUoDHXOLxDQHJnZ49P/9P2s/pH6HTVgTgT5dijpKoRLN0vQ==", "contentHash": "E81dvvpNtS4WigxZu16OAFxVvPvbEkXI7vJXZzEp7GQ03MArF5V4HBb7KXDzTaE5ZQ0bhCUFoMTODC6Z8mu27g==",
"dependencies": { "dependencies": {
"Newtonsoft.Json": "13.0.3", "Newtonsoft.Json": "13.0.3",
"Npgsql": "9.0.3" "Npgsql": "9.0.2"
} }
}, },
"prometheus-net": { "prometheus-net": {
@ -212,24 +212,24 @@
}, },
"Roslynator.Analyzers": { "Roslynator.Analyzers": {
"type": "Direct", "type": "Direct",
"requested": "[4.13.1, )", "requested": "[4.12.9, )",
"resolved": "4.13.1", "resolved": "4.12.9",
"contentHash": "KZpLy6ZlCebMk+d/3I5KU2R7AOb4LNJ6tPJqPtvFXmO8bEBHQvCIAvJOnY2tu4C9/aVOROTDYUFADxFqw1gh/g==" "contentHash": "X6lDpN/D5wuinq37KIx+l3GSUe9No+8bCjGBTI5sEEtxapLztkHg6gzNVhMXpXw8P+/5gFYxTXJ5Pf8O4iNz/w=="
}, },
"Scalar.AspNetCore": { "Scalar.AspNetCore": {
"type": "Direct", "type": "Direct",
"requested": "[2.0.18, )", "requested": "[1.2.55, )",
"resolved": "2.0.18", "resolved": "1.2.55",
"contentHash": "nS8Sw6wRO1A/dARn3q9R6znIBfddJcmAczI5uMROBGWkO2KG/ad/Ld+UeUePTxGr1+6humJSOxI7An+q4q3oGA==" "contentHash": "zArlr6nfPQMRwyia0WFirsyczQby51GhNgWITiEIRkot+CVGZSGQ4oWGqExO11/6x26G+mcQo9Oft1mGpN0/ZQ=="
}, },
"Sentry.AspNetCore": { "Sentry.AspNetCore": {
"type": "Direct", "type": "Direct",
"requested": "[5.2.0, )", "requested": "[4.13.0, )",
"resolved": "5.2.0", "resolved": "4.13.0",
"contentHash": "vEKanBDOxCnEQrcMq3j47z8HOblRfiyJotdm9Fyc24cmLrLsTYZnWWprCYstt++M9bGSXYf4jrM2aaWxgJ8aww==", "contentHash": "1cH9hSvjRbTkcpjUejFTrTC3jMIiOrcZ0DIvt16+AYqXhuxPEnI56npR1nhv+7WUGyhyp5cHFIZqrKnyrrGP0w==",
"dependencies": { "dependencies": {
"Microsoft.Extensions.Configuration.Binder": "9.0.0", "Microsoft.Extensions.Configuration.Binder": "8.0.0",
"Sentry.Extensions.Logging": "5.2.0" "Sentry.Extensions.Logging": "4.13.0"
} }
}, },
"Serilog": { "Serilog": {
@ -264,12 +264,12 @@
}, },
"Serilog.Sinks.Seq": { "Serilog.Sinks.Seq": {
"type": "Direct", "type": "Direct",
"requested": "[9.0.0, )", "requested": "[8.0.0, )",
"resolved": "9.0.0", "resolved": "8.0.0",
"contentHash": "aNU8A0K322q7+voPNmp1/qNPH+9QK8xvM1p72sMmCG0wGlshFzmtDW9QnVSoSYCj0MgQKcMOlgooovtBhRlNHw==", "contentHash": "z5ig56/qzjkX6Fj4U/9m1g8HQaQiYPMZS4Uevtjg1I+WWzoGSf5t/E+6JbMP/jbZYhU63bA5NJN5y0x+qqx2Bw==",
"dependencies": { "dependencies": {
"Serilog": "4.2.0", "Serilog": "4.0.0",
"Serilog.Sinks.File": "6.0.0" "Serilog.Sinks.File": "5.0.0"
} }
}, },
"SixLabors.ImageSharp": { "SixLabors.ImageSharp": {
@ -280,9 +280,9 @@
}, },
"System.Text.Json": { "System.Text.Json": {
"type": "Direct", "type": "Direct",
"requested": "[9.0.2, )", "requested": "[9.0.0, )",
"resolved": "9.0.2", "resolved": "9.0.0",
"contentHash": "4TY2Yokh5Xp8XHFhsY9y84yokS7B0rhkaZCXuRiKppIiKwPVH4lVSFD9EEFzRpXdBM5ZeZXD43tc2vB6njEwwQ==" "contentHash": "js7+qAu/9mQvnhA4EfGMZNEzXtJCDxgkgj8ohuxq/Qxv+R56G+ljefhiJHOxTNiw54q8vmABCWUwkMulNdlZ4A=="
}, },
"System.Text.RegularExpressions": { "System.Text.RegularExpressions": {
"type": "Direct", "type": "Direct",
@ -306,8 +306,8 @@
}, },
"CommunityToolkit.HighPerformance": { "CommunityToolkit.HighPerformance": {
"type": "Transitive", "type": "Transitive",
"resolved": "8.3.0", "resolved": "8.2.2",
"contentHash": "2zc0Wfr9OtEbLqm6J1Jycim/nKmYv+v12CytJ3tZGNzw7n3yjh1vNCMX0kIBaFBk3sw8g0pMR86QJGXGlArC+A==" "contentHash": "+zIp8d3sbtYaRbM6hqDs4Ui/z34j7DcUmleruZlYLE4CVxXq+MO8XJyIs42vzeTYFX+k0Iq1dEbBUnQ4z/Gnrw=="
}, },
"EntityFrameworkCore.Exceptions.Common": { "EntityFrameworkCore.Exceptions.Common": {
"type": "Transitive", "type": "Transitive",
@ -319,17 +319,16 @@
}, },
"MailKit": { "MailKit": {
"type": "Transitive", "type": "Transitive",
"resolved": "4.8.0", "resolved": "4.3.0",
"contentHash": "zZ1UoM4FUnSFUJ9fTl5CEEaejR0DNP6+FDt1OfXnjg4igZntcir1tg/8Ufd6WY5vrpmvToAjluYqjVM24A+5lA==", "contentHash": "jVmB3Nr0JpqhyMiXOGWMin+QvRKpucGpSFBCav9dG6jEJPdBV+yp1RHVpKzxZPfT+0adaBuZlMFdbIciZo1EWA==",
"dependencies": { "dependencies": {
"MimeKit": "4.8.0", "MimeKit": "4.3.0"
"System.Formats.Asn1": "8.0.1"
} }
}, },
"Microsoft.AspNetCore.JsonPatch": { "Microsoft.AspNetCore.JsonPatch": {
"type": "Transitive", "type": "Transitive",
"resolved": "9.0.2", "resolved": "9.0.0",
"contentHash": "bZMRhazEBgw9aZ5EBGYt0017CSd+aecsUCnppVjSa1SzWH6C1ieTSQZRAe+H0DzAVzWAoK7HLwKnQUPioopPrA==", "contentHash": "/4UONYoAIeexPoAmbzBPkVGA6KAY7t0BM+1sr0fKss2V1ERCdcM+Llub4X5Ma+LJ60oPp6KzM0e3j+Pp/JHCNw==",
"dependencies": { "dependencies": {
"Microsoft.CSharp": "4.7.0", "Microsoft.CSharp": "4.7.0",
"Newtonsoft.Json": "13.0.3" "Newtonsoft.Json": "13.0.3"
@ -337,27 +336,27 @@
}, },
"Microsoft.AspNetCore.Mvc.Razor.Extensions": { "Microsoft.AspNetCore.Mvc.Razor.Extensions": {
"type": "Transitive", "type": "Transitive",
"resolved": "6.0.36", "resolved": "6.0.27",
"contentHash": "KFHRhrGAnd80310lpuWzI7Cf+GidS/h3JaPDFFnSmSGjCxB5vkBv5E+TXclJCJhqPtgNxg+keTC5SF1T9ieG5w==", "contentHash": "trwJhFrTQuJTImmixMsDnDgRE8zuTzAUAot7WqiUlmjNzlJWLOaXXBpeA/xfNJvZuOsyGjC7RIzEyNyDGhDTLg==",
"dependencies": { "dependencies": {
"Microsoft.AspNetCore.Razor.Language": "6.0.36", "Microsoft.AspNetCore.Razor.Language": "6.0.27",
"Microsoft.CodeAnalysis.Razor": "6.0.36" "Microsoft.CodeAnalysis.Razor": "6.0.27"
} }
}, },
"Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation": { "Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation": {
"type": "Transitive", "type": "Transitive",
"resolved": "6.0.36", "resolved": "6.0.27",
"contentHash": "0OG/wNedsQ9kTMrFuvrUDoJvp6Fxj6BzWgi7AUCluOENxu/0PzbjY9AC5w6mZJ22/AFxn2gFc2m0yOBTfQbiPg==", "contentHash": "C6Gh/sAuUACxNtllcH4ZniWtPcGbixJuB1L5RXwoUe1a1wM6rpQ2TVMWpX2+cgeBj8U/izJyWY+nJ4Lz8mmMKA==",
"dependencies": { "dependencies": {
"Microsoft.AspNetCore.Mvc.Razor.Extensions": "6.0.36", "Microsoft.AspNetCore.Mvc.Razor.Extensions": "6.0.27",
"Microsoft.CodeAnalysis.Razor": "6.0.36", "Microsoft.CodeAnalysis.Razor": "6.0.27",
"Microsoft.Extensions.DependencyModel": "6.0.2" "Microsoft.Extensions.DependencyModel": "6.0.0"
} }
}, },
"Microsoft.AspNetCore.Razor.Language": { "Microsoft.AspNetCore.Razor.Language": {
"type": "Transitive", "type": "Transitive",
"resolved": "6.0.36", "resolved": "6.0.27",
"contentHash": "n5Mg5D0aRrhHJJ6bJcwKqQydIFcgUq0jTlvuynoJjwA2IvAzh8Aqf9cpYagofQbIlIXILkCP6q6FgbngyVtpYA==" "contentHash": "bI1kIZBgx7oJIB7utPrw4xIgcj7Pdx1jnHMTdsG54U602OcGpBzbfAuKaWs+LVdj+zZVuZsCSoRIZNJKTDP7Hw=="
}, },
"Microsoft.Bcl.AsyncInterfaces": { "Microsoft.Bcl.AsyncInterfaces": {
"type": "Transitive", "type": "Transitive",
@ -411,10 +410,10 @@
}, },
"Microsoft.CodeAnalysis.Razor": { "Microsoft.CodeAnalysis.Razor": {
"type": "Transitive", "type": "Transitive",
"resolved": "6.0.36", "resolved": "6.0.27",
"contentHash": "RTLNJglWezr/1IkiWdtDpPYW7X7lwa4ow8E35cHt+sWdWxOnl+ayQqMy1RfbaLp7CLmRmgXSzMMZZU3D4vZi9Q==", "contentHash": "NAUvSjH8QY8gPp/fXjHhi3MnQEGtSJA0iRT/dT3RKO3AdGACPJyGmKEKxLag9+Kf2On51yGHT9DEPPnK3hyezg==",
"dependencies": { "dependencies": {
"Microsoft.AspNetCore.Razor.Language": "6.0.36", "Microsoft.AspNetCore.Razor.Language": "6.0.27",
"Microsoft.CodeAnalysis.CSharp": "4.0.0", "Microsoft.CodeAnalysis.CSharp": "4.0.0",
"Microsoft.CodeAnalysis.Common": "4.0.0" "Microsoft.CodeAnalysis.Common": "4.0.0"
} }
@ -450,48 +449,48 @@
}, },
"Microsoft.EntityFrameworkCore.Abstractions": { "Microsoft.EntityFrameworkCore.Abstractions": {
"type": "Transitive", "type": "Transitive",
"resolved": "9.0.2", "resolved": "9.0.0",
"contentHash": "oVSjNSIYHsk0N66eqAWgDcyo9etEFbUswbz7SmlYR6nGp05byHrJAYM5N8U2aGWJWJI6WvIC2e4TXJgH6GZ6HQ==" "contentHash": "fnmifFL8KaA4ZNLCVgfjCWhZUFxkrDInx5hR4qG7Q8IEaSiy/6VOSRFyx55oH7MV4y7wM3J3EE90nSpcVBI44Q=="
}, },
"Microsoft.EntityFrameworkCore.Analyzers": { "Microsoft.EntityFrameworkCore.Analyzers": {
"type": "Transitive", "type": "Transitive",
"resolved": "9.0.2", "resolved": "9.0.0",
"contentHash": "w4jzX7XI+L3erVGzbHXpx64A3QaLXxqG3f1vPpGYYZGpxOIHkh7e4iLLD7cq4Ng1vjkwzWl5ZJp0Kj/nHsgFYg==" "contentHash": "Qje+DzXJOKiXF72SL0XxNlDtTkvWWvmwknuZtFahY5hIQpRKO59qnGuERIQ3qlzuq5x4bAJ8WMbgU5DLhBgeOQ=="
}, },
"Microsoft.EntityFrameworkCore.Relational": { "Microsoft.EntityFrameworkCore.Relational": {
"type": "Transitive", "type": "Transitive",
"resolved": "9.0.2", "resolved": "9.0.0",
"contentHash": "r7O4N5uaM95InVSGUj7SMOQWN0f1PBF2Y30ow7Jg+pGX5GJCRVd/1fq83lQ50YMyq+EzyHac5o4CDQA2RsjKJQ==", "contentHash": "j+msw6fWgAE9M3Q/5B9Uhv7pdAdAQUvFPJAiBJmoy+OXvehVbfbCE8ftMAa51Uo2ZeiqVnHShhnv4Y4UJJmUzA==",
"dependencies": { "dependencies": {
"Microsoft.EntityFrameworkCore": "9.0.2", "Microsoft.EntityFrameworkCore": "9.0.0",
"Microsoft.Extensions.Caching.Memory": "9.0.2", "Microsoft.Extensions.Caching.Memory": "9.0.0",
"Microsoft.Extensions.Configuration.Abstractions": "9.0.2", "Microsoft.Extensions.Configuration.Abstractions": "9.0.0",
"Microsoft.Extensions.Logging": "9.0.2" "Microsoft.Extensions.Logging": "9.0.0"
} }
}, },
"Microsoft.Extensions.Caching.Abstractions": { "Microsoft.Extensions.Caching.Abstractions": {
"type": "Transitive", "type": "Transitive",
"resolved": "9.0.2", "resolved": "9.0.0",
"contentHash": "a7QhA25n+BzSM5r5d7JznfyluMBGI7z3qyLlFviZ1Eiqv6DdiK27sLZdP/rpYirBM6UYAKxu5TbmfhIy13GN9A==", "contentHash": "FPWZAa9c0H4dvOj351iR1jkUIs4u9ykL4Bm592yhjDyO5lCoWd+TMAHx2EMbarzUvCvgjWjJIoC6//Q9kH6YhA==",
"dependencies": { "dependencies": {
"Microsoft.Extensions.Primitives": "9.0.2" "Microsoft.Extensions.Primitives": "9.0.0"
} }
}, },
"Microsoft.Extensions.Configuration": { "Microsoft.Extensions.Configuration": {
"type": "Transitive", "type": "Transitive",
"resolved": "9.0.0", "resolved": "8.0.0",
"contentHash": "YIMO9T3JL8MeEXgVozKt2v79hquo/EFtnY0vgxmLnUvk1Rei/halI7kOWZL2RBeV9FMGzgM9LZA8CVaNwFMaNA==", "contentHash": "0J/9YNXTMWSZP2p2+nvl8p71zpSwokZXZuJW+VjdErkegAnFdO1XlqtA62SJtgVYHdKu3uPxJHcMR/r35HwFBA==",
"dependencies": { "dependencies": {
"Microsoft.Extensions.Configuration.Abstractions": "9.0.0", "Microsoft.Extensions.Configuration.Abstractions": "8.0.0",
"Microsoft.Extensions.Primitives": "9.0.0" "Microsoft.Extensions.Primitives": "8.0.0"
} }
}, },
"Microsoft.Extensions.Configuration.Abstractions": { "Microsoft.Extensions.Configuration.Abstractions": {
"type": "Transitive", "type": "Transitive",
"resolved": "9.0.2", "resolved": "9.0.0",
"contentHash": "I0O/270E/lUNqbBxlRVjxKOMZyYjP88dpEgQTveml+h2lTzAP4vbawLVwjS9SC7lKaU893bwyyNz0IVJYsm9EA==", "contentHash": "lqvd7W3FGKUO1+ZoUEMaZ5XDJeWvjpy2/M/ptCGz3tXLD4HWVaSzjufsAsjemasBEg+2SxXVtYVvGt5r2nKDlg==",
"dependencies": { "dependencies": {
"Microsoft.Extensions.Primitives": "9.0.2" "Microsoft.Extensions.Primitives": "9.0.0"
} }
}, },
"Microsoft.Extensions.Configuration.Binder": { "Microsoft.Extensions.Configuration.Binder": {
@ -504,30 +503,30 @@
}, },
"Microsoft.Extensions.DependencyInjection": { "Microsoft.Extensions.DependencyInjection": {
"type": "Transitive", "type": "Transitive",
"resolved": "9.0.2", "resolved": "9.0.0",
"contentHash": "ZffbJrskOZ40JTzcTyKwFHS5eACSWp2bUQBBApIgGV+es8RaTD4OxUG7XxFr3RIPLXtYQ1jQzF2DjKB5fZn7Qg==", "contentHash": "MCPrg7v3QgNMr0vX4vzRXvkNGgLg8vKWX0nKCWUxu2uPyMsaRgiRc1tHBnbTcfJMhMKj2slE/j2M9oGkd25DNw==",
"dependencies": { "dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.2" "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.0"
} }
}, },
"Microsoft.Extensions.DependencyInjection.Abstractions": { "Microsoft.Extensions.DependencyInjection.Abstractions": {
"type": "Transitive", "type": "Transitive",
"resolved": "9.0.2", "resolved": "9.0.0",
"contentHash": "MNe7GSTBf3jQx5vYrXF0NZvn6l7hUKF6J54ENfAgCO8y6xjN1XUmKKWG464LP2ye6QqDiA1dkaWEZBYnhoZzjg==" "contentHash": "+6f2qv2a3dLwd5w6JanPIPs47CxRbnk+ZocMJUhv9NxP88VlOcJYZs9jY+MYSjxvady08bUZn6qgiNh7DadGgg=="
}, },
"Microsoft.Extensions.DependencyModel": { "Microsoft.Extensions.DependencyModel": {
"type": "Transitive", "type": "Transitive",
"resolved": "9.0.2", "resolved": "9.0.0",
"contentHash": "3ImbcbS68jy9sKr9Z9ToRbEEX0bvIRdb8zyf5ebtL9Av2CUCGHvaO5wsSXfRfAjr60Vrq0tlmNji9IzAxW6EOw==" "contentHash": "saxr2XzwgDU77LaQfYFXmddEDRUKHF4DaGMZkNB3qjdVSZlax3//dGJagJkKrGMIPNZs2jVFXITyCCR6UHJNdA=="
}, },
"Microsoft.Extensions.Diagnostics": { "Microsoft.Extensions.Diagnostics": {
"type": "Transitive", "type": "Transitive",
"resolved": "9.0.0", "resolved": "8.0.0",
"contentHash": "0CF9ZrNw5RAlRfbZuVIvzzhP8QeWqHiUmMBU/2H7Nmit8/vwP3/SbHeEctth7D4Gz2fBnEbokPc1NU8/j/1ZLw==", "contentHash": "3PZp/YSkIXrF7QK7PfC1bkyRYwqOHpWFad8Qx+4wkuumAeXo1NHaxpS9LboNA9OvNSAu+QOVlXbMyoY+pHSqcw==",
"dependencies": { "dependencies": {
"Microsoft.Extensions.Configuration": "9.0.0", "Microsoft.Extensions.Configuration": "8.0.0",
"Microsoft.Extensions.Diagnostics.Abstractions": "9.0.0", "Microsoft.Extensions.Diagnostics.Abstractions": "8.0.0",
"Microsoft.Extensions.Options.ConfigurationExtensions": "9.0.0" "Microsoft.Extensions.Options.ConfigurationExtensions": "8.0.0"
} }
}, },
"Microsoft.Extensions.Diagnostics.Abstractions": { "Microsoft.Extensions.Diagnostics.Abstractions": {
@ -561,48 +560,48 @@
}, },
"Microsoft.Extensions.Http": { "Microsoft.Extensions.Http": {
"type": "Transitive", "type": "Transitive",
"resolved": "9.0.0", "resolved": "8.0.0",
"contentHash": "DqI4q54U4hH7bIAq9M5a/hl5Odr/KBAoaZ0dcT4OgutD8dook34CbkvAfAIzkMVjYXiL+E5ul9etwwqiX4PHGw==", "contentHash": "cWz4caHwvx0emoYe7NkHPxII/KkTI8R/LC9qdqJqnKv2poTJ4e2qqPGQqvRoQ5kaSA4FU5IV3qFAuLuOhoqULQ==",
"dependencies": { "dependencies": {
"Microsoft.Extensions.Configuration.Abstractions": "9.0.0", "Microsoft.Extensions.Configuration.Abstractions": "8.0.0",
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.0", "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0",
"Microsoft.Extensions.Diagnostics": "9.0.0", "Microsoft.Extensions.Diagnostics": "8.0.0",
"Microsoft.Extensions.Logging": "9.0.0", "Microsoft.Extensions.Logging": "8.0.0",
"Microsoft.Extensions.Logging.Abstractions": "9.0.0", "Microsoft.Extensions.Logging.Abstractions": "8.0.0",
"Microsoft.Extensions.Options": "9.0.0" "Microsoft.Extensions.Options": "8.0.0"
} }
}, },
"Microsoft.Extensions.Logging": { "Microsoft.Extensions.Logging": {
"type": "Transitive", "type": "Transitive",
"resolved": "9.0.2", "resolved": "9.0.0",
"contentHash": "loV/0UNpt2bD+6kCDzFALVE63CDtqzPeC0LAetkdhiEr/tTNbvOlQ7CBResH7BQBd3cikrwiBfaHdyHMFUlc2g==", "contentHash": "crjWyORoug0kK7RSNJBTeSE6VX8IQgLf3nUpTB9m62bPXp/tzbnOsnbe8TXEG0AASNaKZddnpHKw7fET8E++Pg==",
"dependencies": { "dependencies": {
"Microsoft.Extensions.DependencyInjection": "9.0.2", "Microsoft.Extensions.DependencyInjection": "9.0.0",
"Microsoft.Extensions.Logging.Abstractions": "9.0.2", "Microsoft.Extensions.Logging.Abstractions": "9.0.0",
"Microsoft.Extensions.Options": "9.0.2" "Microsoft.Extensions.Options": "9.0.0"
} }
}, },
"Microsoft.Extensions.Logging.Abstractions": { "Microsoft.Extensions.Logging.Abstractions": {
"type": "Transitive", "type": "Transitive",
"resolved": "9.0.2", "resolved": "9.0.0",
"contentHash": "dV9s2Lamc8jSaqhl2BQSPn/AryDIH2sSbQUyLitLXV0ROmsb+SROnn2cH939JFbsNrnf3mIM3GNRKT7P0ldwLg==", "contentHash": "g0UfujELzlLbHoVG8kPKVBaW470Ewi+jnptGS9KUi6jcb+k2StujtK3m26DFSGGwQ/+bVgZfsWqNzlP6YOejvw==",
"dependencies": { "dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.2" "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.0"
} }
}, },
"Microsoft.Extensions.Logging.Configuration": { "Microsoft.Extensions.Logging.Configuration": {
"type": "Transitive", "type": "Transitive",
"resolved": "9.0.0", "resolved": "8.0.0",
"contentHash": "H05HiqaNmg6GjH34ocYE9Wm1twm3Oz2aXZko8GTwGBzM7op2brpAA8pJ5yyD1OpS1mXUtModBYOlcZ/wXeWsSg==", "contentHash": "ixXXV0G/12g6MXK65TLngYN9V5hQQRuV+fZi882WIoVJT7h5JvoYoxTEwCgdqwLjSneqh1O+66gM8sMr9z/rsQ==",
"dependencies": { "dependencies": {
"Microsoft.Extensions.Configuration": "9.0.0", "Microsoft.Extensions.Configuration": "8.0.0",
"Microsoft.Extensions.Configuration.Abstractions": "9.0.0", "Microsoft.Extensions.Configuration.Abstractions": "8.0.0",
"Microsoft.Extensions.Configuration.Binder": "9.0.0", "Microsoft.Extensions.Configuration.Binder": "8.0.0",
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.0", "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0",
"Microsoft.Extensions.Logging": "9.0.0", "Microsoft.Extensions.Logging": "8.0.0",
"Microsoft.Extensions.Logging.Abstractions": "9.0.0", "Microsoft.Extensions.Logging.Abstractions": "8.0.0",
"Microsoft.Extensions.Options": "9.0.0", "Microsoft.Extensions.Options": "8.0.0",
"Microsoft.Extensions.Options.ConfigurationExtensions": "9.0.0" "Microsoft.Extensions.Options.ConfigurationExtensions": "8.0.0"
} }
}, },
"Microsoft.Extensions.ObjectPool": { "Microsoft.Extensions.ObjectPool": {
@ -612,29 +611,29 @@
}, },
"Microsoft.Extensions.Options": { "Microsoft.Extensions.Options": {
"type": "Transitive", "type": "Transitive",
"resolved": "9.0.2", "resolved": "9.0.0",
"contentHash": "zr98z+AN8+isdmDmQRuEJ/DAKZGUTHmdv3t0ZzjHvNqvA44nAgkXE9kYtfoN6581iALChhVaSw2Owt+Z2lVbkQ==", "contentHash": "y2146b3jrPI3Q0lokKXdKLpmXqakYbDIPDV6r3M8SqvSf45WwOTzkyfDpxnZXJsJQEpAsAqjUq5Pu8RCJMjubg==",
"dependencies": { "dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.2", "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.0",
"Microsoft.Extensions.Primitives": "9.0.2" "Microsoft.Extensions.Primitives": "9.0.0"
} }
}, },
"Microsoft.Extensions.Options.ConfigurationExtensions": { "Microsoft.Extensions.Options.ConfigurationExtensions": {
"type": "Transitive", "type": "Transitive",
"resolved": "9.0.0", "resolved": "8.0.0",
"contentHash": "Ob3FXsXkcSMQmGZi7qP07EQ39kZpSBlTcAZLbJLdI4FIf0Jug8biv2HTavWmnTirchctPlq9bl/26CXtQRguzA==", "contentHash": "0f4DMRqEd50zQh+UyJc+/HiBsZ3vhAQALgdkcQEalSH1L2isdC7Yj54M3cyo5e+BeO5fcBQ7Dxly8XiBBcvRgw==",
"dependencies": { "dependencies": {
"Microsoft.Extensions.Configuration.Abstractions": "9.0.0", "Microsoft.Extensions.Configuration.Abstractions": "8.0.0",
"Microsoft.Extensions.Configuration.Binder": "9.0.0", "Microsoft.Extensions.Configuration.Binder": "8.0.0",
"Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.0", "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0",
"Microsoft.Extensions.Options": "9.0.0", "Microsoft.Extensions.Options": "8.0.0",
"Microsoft.Extensions.Primitives": "9.0.0" "Microsoft.Extensions.Primitives": "8.0.0"
} }
}, },
"Microsoft.Extensions.Primitives": { "Microsoft.Extensions.Primitives": {
"type": "Transitive", "type": "Transitive",
"resolved": "9.0.2", "resolved": "9.0.0",
"contentHash": "puBMtKe/wLuYa7H6docBkLlfec+h8L35DXqsDKKJgW0WY5oCwJ3cBJKcDaZchv6knAyqOMfsl6VUbaR++E5LXA==" "contentHash": "N3qEBzmLMYiASUlKxxFIISP4AiwuPTHF5uCh+2CWSwwzAJiIYx0kBJsS30cp1nvhSySFAVi30jecD307jV+8Kg=="
}, },
"Microsoft.NETCore.Platforms": { "Microsoft.NETCore.Platforms": {
"type": "Transitive", "type": "Transitive",
@ -669,8 +668,8 @@
}, },
"Npgsql": { "Npgsql": {
"type": "Transitive", "type": "Transitive",
"resolved": "9.0.3", "resolved": "9.0.2",
"contentHash": "tPvY61CxOAWxNsKLEBg+oR646X4Bc8UmyQ/tJszL/7mEmIXQnnBhVJZrZEEUv0Bstu0mEsHZD5At3EO8zQRAYw==", "contentHash": "hCbO8box7i/XXiTFqCJ3GoowyLqx3JXxyrbOJ6om7dr+eAknvBNhhUHeJVGAQo44sySZTfdVffp4BrtPeLZOAA==",
"dependencies": { "dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "8.0.2" "Microsoft.Extensions.Logging.Abstractions": "8.0.2"
} }
@ -686,18 +685,18 @@
}, },
"Sentry": { "Sentry": {
"type": "Transitive", "type": "Transitive",
"resolved": "5.2.0", "resolved": "4.13.0",
"contentHash": "b3aZSOU2CjlIIFRtPRbXParKQ+9PF+JOqkSD7Gxq6PiR07t1rnK+crPtdrWMXfW6PVo/s67trCJ+fuLsgTeADw==" "contentHash": "Wfw3M1WpFcrYaGzPm7QyUTfIOYkVXQ1ry6p4WYjhbLz9fPwV23SGQZTFDpdox67NHM0V0g1aoQ4YKLm4ANtEEg=="
}, },
"Sentry.Extensions.Logging": { "Sentry.Extensions.Logging": {
"type": "Transitive", "type": "Transitive",
"resolved": "5.2.0", "resolved": "4.13.0",
"contentHash": "546bHsERKY7/pG5T4mVIp6WbHnQPMst6VDuxSaeU5DhQHLfh7KhgMmkdZ4Xvdlr95fvWk5/bX2xbipy6qoh/1A==", "contentHash": "yZ5+TtJKWcss6cG17YjnovImx4X56T8O6Qy6bsMC8tMDttYy8J7HJ2F+WdaZNyjOCo0Rfi6N2gc+Clv/5pf+TQ==",
"dependencies": { "dependencies": {
"Microsoft.Extensions.Configuration.Binder": "9.0.0", "Microsoft.Extensions.Configuration.Binder": "8.0.0",
"Microsoft.Extensions.Http": "9.0.0", "Microsoft.Extensions.Http": "8.0.0",
"Microsoft.Extensions.Logging.Configuration": "9.0.0", "Microsoft.Extensions.Logging.Configuration": "8.0.0",
"Sentry": "5.2.0" "Sentry": "4.13.0"
} }
}, },
"Serilog.Extensions.Hosting": { "Serilog.Extensions.Hosting": {

View file

@ -12,9 +12,9 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Dapper" Version="2.1.66"/> <PackageReference Include="Dapper" Version="2.1.35"/>
<PackageReference Include="Npgsql" Version="9.0.3"/> <PackageReference Include="Npgsql" Version="9.0.2"/>
<PackageReference Include="Npgsql.NodaTime" Version="9.0.3"/> <PackageReference Include="Npgsql.NodaTime" Version="9.0.2"/>
</ItemGroup> </ItemGroup>
</Project> </Project>

View file

@ -2,7 +2,7 @@ using System.Diagnostics.CodeAnalysis;
using Dapper; using Dapper;
using Foxnouns.Backend.Database; using Foxnouns.Backend.Database;
using Foxnouns.Backend.Database.Models; using Foxnouns.Backend.Database.Models;
using Foxnouns.Backend.Services; using Foxnouns.Backend.Utils;
using Foxnouns.DataMigrator.Models; using Foxnouns.DataMigrator.Models;
using NodaTime.Extensions; using NodaTime.Extensions;
using Npgsql; using Npgsql;
@ -260,6 +260,6 @@ public class UserMigrator(
{ {
if (_preferenceIds.TryGetValue(id, out Snowflake preferenceId)) if (_preferenceIds.TryGetValue(id, out Snowflake preferenceId))
return preferenceId.ToString(); return preferenceId.ToString();
return ValidationService.DefaultStatusOptions.Contains(id) ? id : "okay"; return ValidationUtils.DefaultStatusOptions.Contains(id) ? id : "okay";
} }
} }