using JetBrains.Annotations;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.ApiExplorer;
using Microsoft.AspNetCore.Mvc.Routing;
namespace yawaflua.WebSockets.Attributes;
///
/// Attribute that marks WebSocket endpoint handlers.
/// Applied to classes or methods to define WebSocket route templates.
///
/// Usage examples:
/// [WebSocket("/chat")] - basic route
/// [WebSocket("/notifications/{userId}")] - route with parameter
/// [WebSocket("/game/{roomId}/players")] - complex route
///
///
/// Inherits from ASP.NET Core's RouteAttribute to leverage standard routing syntax.
/// When applied to a class, defines the base path for all WebSocket endpoints in controller.
/// When applied to methods, defines specific sub-routes (requires class-level base path).
///
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class)]
[ApiExplorerSettings(IgnoreApi = true)]
public class WebSocketAttribute : Attribute, IApiDescriptionVisibilityProvider
{
///
/// Original route template specified in attribute
///
public new string Template { get; }
public new int? Order { get; } = 0;
public new string? Name { get; }
///
/// Creates WebSocket route definition
///
/// Route template using ASP.NET Core syntax:
/// - Static: "/status"
/// - Parameters: "/user/{id}"
/// - Constraints: "/file/{name:alpha}"
/// - Optional: "/feed/{category?}"
public WebSocketAttribute(string path)
{
Template = path;
Name = path;
}
public bool IgnoreApi => true;
}