Swagger: Cleaning up alternative routes and sort order

This commit is contained in:
Zoe Roux 2021-09-19 22:25:07 +02:00
parent 4ce462f88f
commit ced12c2fe6
5 changed files with 16 additions and 47 deletions

View File

@ -11,7 +11,6 @@
<PackageReference Include="Autofac" Version="6.2.0" /> <PackageReference Include="Autofac" Version="6.2.0" />
<PackageReference Include="JetBrains.Annotations" Version="2021.2.0" /> <PackageReference Include="JetBrains.Annotations" Version="2021.2.0" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Abstractions" Version="2.2.0" /> <PackageReference Include="Microsoft.AspNetCore.Mvc.Abstractions" Version="2.2.0" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Core" Version="2.2.2" />
<PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="5.0.0" /> <PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="5.0.0" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="5.0.0" /> <PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="5.0.0" />
<PackageReference Include="System.ComponentModel.Composition" Version="5.0.0" /> <PackageReference Include="System.ComponentModel.Composition" Version="5.0.0" />

View File

@ -1,19 +0,0 @@
using JetBrains.Annotations;
using Microsoft.AspNetCore.Mvc;
namespace Kyoo.Abstractions.Models.Attributes
{
/// <summary>
/// A custom <see cref="HttpGetAttribute"/> that indicate an alternatives, hidden route.
/// </summary>
public class AltHttpGetAttribute : HttpGetAttribute
{
/// <summary>
/// Create a new <see cref="AltHttpGetAttribute"/>.
/// </summary>
/// <param name="template">The route template, see <see cref="RouteAttribute.Template"/>.</param>
public AltHttpGetAttribute([NotNull] [RouteTemplateAttribute] string template)
: base(template)
{ }
}
}

View File

@ -16,24 +16,17 @@
// You should have received a copy of the GNU General Public License // You should have received a copy of the GNU General Public License
// along with Kyoo. If not, see <https://www.gnu.org/licenses/>. // along with Kyoo. If not, see <https://www.gnu.org/licenses/>.
using System; namespace Kyoo.Abstractions.Models.Utils
using JetBrains.Annotations;
using Microsoft.AspNetCore.Mvc;
namespace Kyoo.Abstractions.Models.Attributes
{ {
/// <summary> /// <summary>
/// A custom <see cref="RouteAttribute"/> that indicate an alternatives, hidden route. /// A class containing constant numbers.
/// </summary> /// </summary>
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true)] public static class Constants
public class AltRouteAttribute : RouteAttribute
{ {
/// <summary> /// <summary>
/// Create a new <see cref="AltRouteAttribute"/>. /// A property to use on a Microsoft.AspNet.MVC.Route.Order property to mark it as an alternative route
/// that won't be included on the swagger.
/// </summary> /// </summary>
/// <param name="template">The route template, see <see cref="RouteAttribute.Template"/>.</param> public const int AlternativeRoute = 1;
public AltRouteAttribute([NotNull] [RouteTemplateAttribute] string template)
: base(template)
{ }
} }
} }

View File

@ -22,17 +22,17 @@ using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using Kyoo.Abstractions.Controllers; using Kyoo.Abstractions.Controllers;
using Kyoo.Abstractions.Models; using Kyoo.Abstractions.Models;
using Kyoo.Abstractions.Models.Attributes;
using Kyoo.Abstractions.Models.Exceptions; using Kyoo.Abstractions.Models.Exceptions;
using Kyoo.Abstractions.Models.Permissions; using Kyoo.Abstractions.Models.Permissions;
using Kyoo.Core.Models.Options; using Kyoo.Core.Models.Options;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using static Kyoo.Abstractions.Models.Utils.Constants;
namespace Kyoo.Core.Api namespace Kyoo.Core.Api
{ {
[Route("api/collections")] [Route("api/collections")]
[AltRoute("api/collection")] [Route("api/collection", Order = AlternativeRoute)]
[ApiController] [ApiController]
[PartialPermission(nameof(CollectionApi))] [PartialPermission(nameof(CollectionApi))]
public class CollectionApi : CrudApi<Collection> public class CollectionApi : CrudApi<Collection>
@ -53,7 +53,7 @@ namespace Kyoo.Core.Api
} }
[HttpGet("{id:int}/shows")] [HttpGet("{id:int}/shows")]
[AltHttpGet("{id:int}/show")] [HttpGet("{id:int}/show", Order = AlternativeRoute)]
[PartialPermission(Kind.Read)] [PartialPermission(Kind.Read)]
public async Task<ActionResult<Page<Show>>> GetShows(int id, public async Task<ActionResult<Page<Show>>> GetShows(int id,
[FromQuery] string sortBy, [FromQuery] string sortBy,
@ -79,7 +79,7 @@ namespace Kyoo.Core.Api
} }
[HttpGet("{slug}/shows")] [HttpGet("{slug}/shows")]
[AltHttpGet("{slug}/show")] [HttpGet("{slug}/show", Order = AlternativeRoute)]
[PartialPermission(Kind.Read)] [PartialPermission(Kind.Read)]
public async Task<ActionResult<Page<Show>>> GetShows(string slug, public async Task<ActionResult<Page<Show>>> GetShows(string slug,
[FromQuery] string sortBy, [FromQuery] string sortBy,
@ -105,7 +105,7 @@ namespace Kyoo.Core.Api
} }
[HttpGet("{id:int}/libraries")] [HttpGet("{id:int}/libraries")]
[AltHttpGet("{id:int}/library")] [HttpGet("{id:int}/library", Order = AlternativeRoute)]
[PartialPermission(Kind.Read)] [PartialPermission(Kind.Read)]
public async Task<ActionResult<Page<Library>>> GetLibraries(int id, public async Task<ActionResult<Page<Library>>> GetLibraries(int id,
[FromQuery] string sortBy, [FromQuery] string sortBy,
@ -131,7 +131,7 @@ namespace Kyoo.Core.Api
} }
[HttpGet("{slug}/libraries")] [HttpGet("{slug}/libraries")]
[AltHttpGet("{slug}/library")] [HttpGet("{slug}/library", Order = AlternativeRoute)]
[PartialPermission(Kind.Read)] [PartialPermission(Kind.Read)]
public async Task<ActionResult<Page<Library>>> GetLibraries(string slug, public async Task<ActionResult<Page<Library>>> GetLibraries(string slug,
[FromQuery] string sortBy, [FromQuery] string sortBy,

View File

@ -19,12 +19,11 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq;
using Kyoo.Abstractions.Controllers; using Kyoo.Abstractions.Controllers;
using Kyoo.Abstractions.Models.Attributes;
using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Models;
using static Kyoo.Abstractions.Models.Utils.Constants;
namespace Kyoo.Swagger namespace Kyoo.Swagger
{ {
@ -71,12 +70,9 @@ namespace Kyoo.Swagger
options.IncludeXmlComments(documentation); options.IncludeXmlComments(documentation);
options.UseAllOfForInheritance(); options.UseAllOfForInheritance();
options.SwaggerGeneratorOptions.SortKeySelector = x => x.RelativePath;
options.DocInclusionPredicate((_, apiDescription) => options.DocInclusionPredicate((_, apiDescription)
{ => apiDescription.ActionDescriptor.AttributeRouteInfo?.Order != AlternativeRoute);
return apiDescription.ActionDescriptor.EndpointMetadata
.All(x => x is not AltRouteAttribute && x is not AltHttpGetAttribute);
});
}); });
} }