update to .net 9 and add new OpenAPI packages
This commit is contained in:
parent
80b7f192f1
commit
7e6698c3fb
17 changed files with 451 additions and 1001 deletions
|
@ -26,6 +26,7 @@ using Microsoft.EntityFrameworkCore;
|
||||||
namespace Foxnouns.Backend.Controllers.Authentication;
|
namespace Foxnouns.Backend.Controllers.Authentication;
|
||||||
|
|
||||||
[Route("/api/internal/auth")]
|
[Route("/api/internal/auth")]
|
||||||
|
[ApiExplorerSettings(IgnoreApi = true)]
|
||||||
public class AuthController(
|
public class AuthController(
|
||||||
Config config,
|
Config config,
|
||||||
DatabaseContext db,
|
DatabaseContext db,
|
||||||
|
|
|
@ -31,6 +31,7 @@ using NodaTime;
|
||||||
namespace Foxnouns.Backend.Controllers.Authentication;
|
namespace Foxnouns.Backend.Controllers.Authentication;
|
||||||
|
|
||||||
[Route("/api/internal/auth/discord")]
|
[Route("/api/internal/auth/discord")]
|
||||||
|
[ApiExplorerSettings(IgnoreApi = true)]
|
||||||
public class DiscordAuthController(
|
public class DiscordAuthController(
|
||||||
[UsedImplicitly] Config config,
|
[UsedImplicitly] Config config,
|
||||||
ILogger logger,
|
ILogger logger,
|
||||||
|
|
|
@ -30,6 +30,7 @@ using NodaTime;
|
||||||
namespace Foxnouns.Backend.Controllers.Authentication;
|
namespace Foxnouns.Backend.Controllers.Authentication;
|
||||||
|
|
||||||
[Route("/api/internal/auth/email")]
|
[Route("/api/internal/auth/email")]
|
||||||
|
[ApiExplorerSettings(IgnoreApi = true)]
|
||||||
public class EmailAuthController(
|
public class EmailAuthController(
|
||||||
[UsedImplicitly] Config config,
|
[UsedImplicitly] Config config,
|
||||||
DatabaseContext db,
|
DatabaseContext db,
|
||||||
|
|
|
@ -28,6 +28,7 @@ using NodaTime;
|
||||||
namespace Foxnouns.Backend.Controllers.Authentication;
|
namespace Foxnouns.Backend.Controllers.Authentication;
|
||||||
|
|
||||||
[Route("/api/internal/auth/fediverse")]
|
[Route("/api/internal/auth/fediverse")]
|
||||||
|
[ApiExplorerSettings(IgnoreApi = true)]
|
||||||
public class FediverseAuthController(
|
public class FediverseAuthController(
|
||||||
ILogger logger,
|
ILogger logger,
|
||||||
DatabaseContext db,
|
DatabaseContext db,
|
||||||
|
|
|
@ -31,6 +31,7 @@ using NodaTime;
|
||||||
namespace Foxnouns.Backend.Controllers.Authentication;
|
namespace Foxnouns.Backend.Controllers.Authentication;
|
||||||
|
|
||||||
[Route("/api/internal/auth/google")]
|
[Route("/api/internal/auth/google")]
|
||||||
|
[ApiExplorerSettings(IgnoreApi = true)]
|
||||||
public class GoogleAuthController(
|
public class GoogleAuthController(
|
||||||
[UsedImplicitly] Config config,
|
[UsedImplicitly] Config config,
|
||||||
ILogger logger,
|
ILogger logger,
|
||||||
|
|
|
@ -17,6 +17,7 @@ using NodaTime;
|
||||||
namespace Foxnouns.Backend.Controllers.Authentication;
|
namespace Foxnouns.Backend.Controllers.Authentication;
|
||||||
|
|
||||||
[Route("/api/internal/auth/tumblr")]
|
[Route("/api/internal/auth/tumblr")]
|
||||||
|
[ApiExplorerSettings(IgnoreApi = true)]
|
||||||
public class TumblrAuthController(
|
public class TumblrAuthController(
|
||||||
[UsedImplicitly] Config config,
|
[UsedImplicitly] Config config,
|
||||||
ILogger logger,
|
ILogger logger,
|
||||||
|
|
|
@ -26,6 +26,7 @@ namespace Foxnouns.Backend.Controllers;
|
||||||
|
|
||||||
[Route("/api/internal/data-exports")]
|
[Route("/api/internal/data-exports")]
|
||||||
[Authorize("identify")]
|
[Authorize("identify")]
|
||||||
|
[ApiExplorerSettings(IgnoreApi = true)]
|
||||||
public class ExportsController(
|
public class ExportsController(
|
||||||
ILogger logger,
|
ILogger logger,
|
||||||
Config config,
|
Config config,
|
||||||
|
|
|
@ -80,6 +80,7 @@ public class FlagsController(
|
||||||
|
|
||||||
[HttpPatch("{id}")]
|
[HttpPatch("{id}")]
|
||||||
[Authorize("user.update")]
|
[Authorize("user.update")]
|
||||||
|
[ProducesResponseType<PrideFlagResponse>(statusCode: StatusCodes.Status200OK)]
|
||||||
public async Task<IActionResult> UpdateFlagAsync(Snowflake id, [FromBody] UpdateFlagRequest req)
|
public async Task<IActionResult> UpdateFlagAsync(Snowflake id, [FromBody] UpdateFlagRequest req)
|
||||||
{
|
{
|
||||||
ValidationUtils.Validate(ValidateFlag(req.Name, req.Description, null));
|
ValidationUtils.Validate(ValidateFlag(req.Name, req.Description, null));
|
||||||
|
|
|
@ -25,6 +25,7 @@ namespace Foxnouns.Backend.Controllers;
|
||||||
|
|
||||||
[ApiController]
|
[ApiController]
|
||||||
[Route("/api/internal")]
|
[Route("/api/internal")]
|
||||||
|
[ApiExplorerSettings(IgnoreApi = true)]
|
||||||
public partial class InternalController(DatabaseContext db) : ControllerBase
|
public partial class InternalController(DatabaseContext db) : ControllerBase
|
||||||
{
|
{
|
||||||
[GeneratedRegex(@"(\{\w+\})")]
|
[GeneratedRegex(@"(\{\w+\})")]
|
||||||
|
|
|
@ -144,6 +144,7 @@ public class MembersController(
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpPatch("/api/v2/users/@me/members/{memberRef}")]
|
[HttpPatch("/api/v2/users/@me/members/{memberRef}")]
|
||||||
|
[ProducesResponseType<MemberResponse>(statusCode: StatusCodes.Status200OK)]
|
||||||
[Authorize("member.update")]
|
[Authorize("member.update")]
|
||||||
public async Task<IActionResult> UpdateMemberAsync(
|
public async Task<IActionResult> UpdateMemberAsync(
|
||||||
string memberRef,
|
string memberRef,
|
||||||
|
|
|
@ -25,6 +25,7 @@ namespace Foxnouns.Backend.Controllers;
|
||||||
"CA1862:Use the \'StringComparison\' method overloads to perform case-insensitive string comparisons",
|
"CA1862:Use the \'StringComparison\' method overloads to perform case-insensitive string comparisons",
|
||||||
Justification = "Not usable with EFCore"
|
Justification = "Not usable with EFCore"
|
||||||
)]
|
)]
|
||||||
|
[ApiExplorerSettings(IgnoreApi = true)]
|
||||||
public class SidController(Config config, DatabaseContext db) : ApiControllerBase
|
public class SidController(Config config, DatabaseContext db) : ApiControllerBase
|
||||||
{
|
{
|
||||||
[HttpGet("{**id}")]
|
[HttpGet("{**id}")]
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
using System.ComponentModel;
|
using System.ComponentModel;
|
||||||
using System.Diagnostics.CodeAnalysis;
|
using System.Diagnostics.CodeAnalysis;
|
||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
|
using System.Text.Json;
|
||||||
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
|
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using NodaTime;
|
using NodaTime;
|
||||||
|
@ -23,6 +24,7 @@ using JsonSerializer = Newtonsoft.Json.JsonSerializer;
|
||||||
namespace Foxnouns.Backend.Database;
|
namespace Foxnouns.Backend.Database;
|
||||||
|
|
||||||
[JsonConverter(typeof(JsonConverter))]
|
[JsonConverter(typeof(JsonConverter))]
|
||||||
|
[System.Text.Json.Serialization.JsonConverter(typeof(SystemJsonConverter))]
|
||||||
[TypeConverter(typeof(TypeConverter))]
|
[TypeConverter(typeof(TypeConverter))]
|
||||||
public readonly struct Snowflake(ulong value) : IEquatable<Snowflake>
|
public readonly struct Snowflake(ulong value) : IEquatable<Snowflake>
|
||||||
{
|
{
|
||||||
|
@ -96,6 +98,21 @@ public readonly struct Snowflake(ulong value) : IEquatable<Snowflake>
|
||||||
// ReSharper disable once ClassNeverInstantiated.Global
|
// ReSharper disable once ClassNeverInstantiated.Global
|
||||||
public class ValueConverter() : ValueConverter<Snowflake, long>(x => x, x => x);
|
public class ValueConverter() : ValueConverter<Snowflake, long>(x => x, x => x);
|
||||||
|
|
||||||
|
private class SystemJsonConverter : System.Text.Json.Serialization.JsonConverter<Snowflake>
|
||||||
|
{
|
||||||
|
public override Snowflake Read(
|
||||||
|
ref Utf8JsonReader reader,
|
||||||
|
Type typeToConvert,
|
||||||
|
JsonSerializerOptions options
|
||||||
|
) => ulong.Parse(reader.GetString()!);
|
||||||
|
|
||||||
|
public override void Write(
|
||||||
|
Utf8JsonWriter writer,
|
||||||
|
Snowflake value,
|
||||||
|
JsonSerializerOptions options
|
||||||
|
) => writer.WriteStringValue(value.Value.ToString());
|
||||||
|
}
|
||||||
|
|
||||||
private class JsonConverter : JsonConverter<Snowflake>
|
private class JsonConverter : JsonConverter<Snowflake>
|
||||||
{
|
{
|
||||||
public override void WriteJson(
|
public override void WriteJson(
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
<Project Sdk="Microsoft.NET.Sdk.Web">
|
<Project Sdk="Microsoft.NET.Sdk.Web">
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
<TargetFramework>net9.0</TargetFramework>
|
||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
<RestorePackagesWithLockFile>true</RestorePackagesWithLockFile>
|
<RestorePackagesWithLockFile>true</RestorePackagesWithLockFile>
|
||||||
|
@ -8,39 +8,39 @@
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Coravel" Version="5.0.4"/>
|
<PackageReference Include="Coravel" Version="6.0.0"/>
|
||||||
<PackageReference Include="Coravel.Mailer" Version="5.0.1"/>
|
<PackageReference Include="Coravel.Mailer" Version="7.0.0"/>
|
||||||
<PackageReference Include="EFCore.NamingConventions" Version="8.0.3"/>
|
<PackageReference Include="EFCore.NamingConventions" Version="9.0.0"/>
|
||||||
<PackageReference Include="EntityFrameworkCore.Exceptions.PostgreSQL" Version="8.1.2"/>
|
<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.2.0"/>
|
<PackageReference Include="JetBrains.Annotations" Version="2024.3.0"/>
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="8.0.7"/>
|
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="9.0.0"/>
|
||||||
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="8.0.7"/>
|
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="9.0.0"/>
|
||||||
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="8.0.7"/>
|
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="9.0.0"/>
|
||||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="8.0.7">
|
<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.0"/>
|
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="9.0.0"/>
|
||||||
<PackageReference Include="Minio" Version="6.0.3"/>
|
<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.1.11"/>
|
<PackageReference Include="NodaTime" Version="3.2.0"/>
|
||||||
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="8.0.4"/>
|
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="9.0.2"/>
|
||||||
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL.NodaTime" Version="8.0.4"/>
|
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL.NodaTime" Version="9.0.2"/>
|
||||||
<PackageReference Include="Npgsql.Json.NET" Version="8.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.12.9">
|
<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="Sentry.AspNetCore" Version="4.9.0"/>
|
<PackageReference Include="Scalar.AspNetCore" Version="1.2.51"/>
|
||||||
<PackageReference Include="Serilog" Version="4.0.1"/>
|
<PackageReference Include="Sentry.AspNetCore" Version="4.13.0"/>
|
||||||
<PackageReference Include="Serilog.AspNetCore" Version="8.0.1"/>
|
<PackageReference Include="Serilog" Version="4.2.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="8.0.0"/>
|
<PackageReference Include="Serilog.Sinks.Seq" Version="8.0.0"/>
|
||||||
<PackageReference Include="SixLabors.ImageSharp" Version="3.1.5"/>
|
<PackageReference Include="SixLabors.ImageSharp" Version="3.1.6"/>
|
||||||
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.6.2"/>
|
|
||||||
<PackageReference Include="System.Text.Json" Version="9.0.0"/>
|
<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"/>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
|
@ -12,14 +12,18 @@
|
||||||
//
|
//
|
||||||
// You should have received a copy of the GNU Affero General Public License
|
// 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/>.
|
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
using System.Text.Json;
|
||||||
|
using System.Text.Json.Serialization;
|
||||||
using Foxnouns.Backend;
|
using Foxnouns.Backend;
|
||||||
using Foxnouns.Backend.Extensions;
|
using Foxnouns.Backend.Extensions;
|
||||||
using Foxnouns.Backend.Services;
|
using Foxnouns.Backend.Services;
|
||||||
using Foxnouns.Backend.Utils;
|
using Foxnouns.Backend.Utils;
|
||||||
|
using Foxnouns.Backend.Utils.OpenApi;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
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;
|
||||||
|
|
||||||
|
@ -46,6 +50,13 @@ builder
|
||||||
|
|
||||||
builder
|
builder
|
||||||
.Services.AddControllers()
|
.Services.AddControllers()
|
||||||
|
.AddJsonOptions(options =>
|
||||||
|
{
|
||||||
|
options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.SnakeCaseLower;
|
||||||
|
options.JsonSerializerOptions.Converters.Add(
|
||||||
|
new JsonStringEnumConverter(JsonNamingPolicy.SnakeCaseUpper)
|
||||||
|
);
|
||||||
|
})
|
||||||
.AddNewtonsoftJson(options =>
|
.AddNewtonsoftJson(options =>
|
||||||
{
|
{
|
||||||
options.SerializerSettings.ContractResolver = new PatchRequestContractResolver
|
options.SerializerSettings.ContractResolver = new PatchRequestContractResolver
|
||||||
|
@ -60,6 +71,16 @@ builder
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
builder.Services.AddOpenApi(
|
||||||
|
"v2",
|
||||||
|
options =>
|
||||||
|
{
|
||||||
|
options.AddSchemaTransformer<PropertyKeySchemaTransformer>();
|
||||||
|
options.AddSchemaTransformer<ExampleFixingSchemaTransformer>();
|
||||||
|
options.AddDocumentTransformer(new DocumentTransformer(config));
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
// Set the default converter to snake case as we use it in a couple places.
|
// Set the default converter to snake case as we use it in a couple places.
|
||||||
JsonConvert.DefaultSettings = () =>
|
JsonConvert.DefaultSettings = () =>
|
||||||
new JsonSerializerSettings
|
new JsonSerializerSettings
|
||||||
|
@ -70,7 +91,7 @@ JsonConvert.DefaultSettings = () =>
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
builder.AddServices(config).AddCustomMiddleware().AddEndpointsApiExplorer().AddSwaggerGen();
|
builder.AddServices(config).AddCustomMiddleware();
|
||||||
|
|
||||||
WebApplication app = builder.Build();
|
WebApplication app = builder.Build();
|
||||||
|
|
||||||
|
@ -83,11 +104,16 @@ app.UseRouting();
|
||||||
// so it's locked behind a config option.
|
// so it's locked behind a config option.
|
||||||
if (config.Logging.SentryTracing)
|
if (config.Logging.SentryTracing)
|
||||||
app.UseSentryTracing();
|
app.UseSentryTracing();
|
||||||
app.UseSwagger();
|
|
||||||
app.UseSwaggerUI();
|
|
||||||
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}";
|
||||||
|
});
|
||||||
|
|
||||||
app.Urls.Clear();
|
app.Urls.Clear();
|
||||||
app.Urls.Add(config.Address);
|
app.Urls.Add(config.Address);
|
||||||
|
|
|
@ -0,0 +1,69 @@
|
||||||
|
using Foxnouns.Backend.Database;
|
||||||
|
using Microsoft.AspNetCore.OpenApi;
|
||||||
|
using Microsoft.OpenApi.Any;
|
||||||
|
using Microsoft.OpenApi.Models;
|
||||||
|
using Newtonsoft.Json.Serialization;
|
||||||
|
|
||||||
|
namespace Foxnouns.Backend.Utils.OpenApi;
|
||||||
|
|
||||||
|
public class PropertyKeySchemaTransformer : IOpenApiSchemaTransformer
|
||||||
|
{
|
||||||
|
private static readonly DefaultContractResolver SnakeCaseConverter =
|
||||||
|
new() { NamingStrategy = new SnakeCaseNamingStrategy() };
|
||||||
|
|
||||||
|
public Task TransformAsync(
|
||||||
|
OpenApiSchema schema,
|
||||||
|
OpenApiSchemaTransformerContext context,
|
||||||
|
CancellationToken cancellationToken
|
||||||
|
)
|
||||||
|
{
|
||||||
|
Dictionary<string, OpenApiSchema> newProperties = new();
|
||||||
|
foreach (KeyValuePair<string, OpenApiSchema> property in schema.Properties)
|
||||||
|
{
|
||||||
|
newProperties[SnakeCaseConverter.GetResolvedPropertyName(property.Key)] =
|
||||||
|
property.Value;
|
||||||
|
}
|
||||||
|
|
||||||
|
schema.Properties = newProperties;
|
||||||
|
schema.Required = schema
|
||||||
|
.Required.Select(SnakeCaseConverter.GetResolvedPropertyName)
|
||||||
|
.ToHashSet();
|
||||||
|
|
||||||
|
return Task.CompletedTask;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class ExampleFixingSchemaTransformer : IOpenApiSchemaTransformer
|
||||||
|
{
|
||||||
|
public Task TransformAsync(
|
||||||
|
OpenApiSchema schema,
|
||||||
|
OpenApiSchemaTransformerContext context,
|
||||||
|
CancellationToken cancellationToken
|
||||||
|
)
|
||||||
|
{
|
||||||
|
if (context.JsonTypeInfo.Type == typeof(Snowflake))
|
||||||
|
{
|
||||||
|
schema.Type = "string";
|
||||||
|
schema.Example = new OpenApiString("999999999999999999");
|
||||||
|
}
|
||||||
|
|
||||||
|
return Task.CompletedTask;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class DocumentTransformer(Config config) : IOpenApiDocumentTransformer
|
||||||
|
{
|
||||||
|
public Task TransformAsync(
|
||||||
|
OpenApiDocument document,
|
||||||
|
OpenApiDocumentTransformerContext context,
|
||||||
|
CancellationToken cancellationToken
|
||||||
|
)
|
||||||
|
{
|
||||||
|
document.Info.Title = "pronouns.cc API";
|
||||||
|
document.Info.Version = "2.0.0";
|
||||||
|
|
||||||
|
document.Servers.Clear();
|
||||||
|
document.Servers.Add(new OpenApiServer { Url = config.BaseUrl });
|
||||||
|
return Task.CompletedTask;
|
||||||
|
}
|
||||||
|
}
|
File diff suppressed because it is too large
Load diff
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<OutputType>Exe</OutputType>
|
<OutputType>Exe</OutputType>
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
<TargetFramework>net9.0</TargetFramework>
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
@ -14,13 +14,13 @@
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Humanizer.Core" Version="2.14.1"/>
|
<PackageReference Include="Humanizer.Core" Version="2.14.1"/>
|
||||||
<PackageReference Include="NodaTime.Serialization.JsonNet" Version="3.1.0"/>
|
<PackageReference Include="NodaTime.Serialization.JsonNet" Version="3.1.0"/>
|
||||||
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="8.0.7"/>
|
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="9.0.0"/>
|
||||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="8.0.7">
|
<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="Npgsql.EntityFrameworkCore.PostgreSQL" Version="8.0.4"/>
|
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="9.0.2"/>
|
||||||
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL.NodaTime" Version="8.0.4"/>
|
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL.NodaTime" Version="9.0.2"/>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|
Loading…
Reference in a new issue