Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Enhancement: XMLDOC generation features #189

Open
rkttu opened this issue Apr 7, 2024 · 1 comment
Open

Enhancement: XMLDOC generation features #189

rkttu opened this issue Apr 7, 2024 · 1 comment
Labels
enhancement New feature or request

Comments

@rkttu
Copy link

rkttu commented Apr 7, 2024

I've been playing around with the ASP.NET Core runtime capabilities added to NetPad. It's been a very pleasant update and I'm happy to be using it. :-D

Personally, I thought it would be great to be able to render ASP.NET Web APIs using NetPad, so I wrote the following code using Swashbuckle and Swagger.

However, the XMLDOC wasn't being processed as I expected, so I couldn't complete the scenario configuration because I didn't have the XMLDOC file needed to configure Swashbuckle. I couldn't find any options related to XMLDOC generation, so I'm wondering if there is a workaround or if you could add an option in the next version.

Since I am currently using Monaco and Roslyn, which are grammatically capable of recognizing and autocompleting XMLDOCs, I feel this suggestion is appropriate and I am opening an additional issue.

using Microsoft.OpenApi.Models;

var builder = WebApplication.CreateBuilder();
builder.Services.AddDbContext<TodoDb>(opt => opt.UseInMemoryDatabase("TodoList"));
builder.Services.AddDatabaseDeveloperPageExceptionFilter();
builder.Services.AddEndpointsApiExplorer();

builder.Services.AddSwaggerGen(options =>
{
    options.SwaggerDoc("v1", new OpenApiInfo
    {
        Version = "v1",
        Title = "ToDo API",
        Description = "An ASP.NET Core Web API for managing ToDo items",
        TermsOfService = new Uri("https://example.com/terms"),
        Contact = new OpenApiContact
        {
            Name = "Example Contact",
            Url = new Uri("https://example.com/contact")
        },
        License = new OpenApiLicense
        {
            Name = "Example License",
            Url = new Uri("https://example.com/license")
        }
    });

    // using System.Reflection;
    var xmlFilename = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
    options.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, xmlFilename));
});

var app = builder.Build();
app.UseSwagger();
app.UseSwaggerUI(options =>
{
    options.SwaggerEndpoint("/swagger/v1/swagger.json", "v1");
    options.RoutePrefix = string.Empty;
});

app.MapGet("/todoitems", async (TodoDb db) =>
    await db.Todos.ToListAsync());

app.MapGet("/todoitems/complete", async (TodoDb db) =>
    await db.Todos.Where(t => t.Done).ToListAsync());

app.MapGet("/todoitems/{id}", async (int id, TodoDb db) =>
    await db.Todos.FindAsync(id)
        is Todo todo
            ? Results.Ok(todo)
            : Results.NotFound());

app.MapPost("/todoitems", async (Todo todo, TodoDb db) =>
{
    db.Todos.Add(todo);
    await db.SaveChangesAsync();

    return Results.Created($"/todoitems/{todo.Id}", todo);
});

app.MapPut("/todoitems/{id}", async (int id, Todo inputTodo, TodoDb db) =>
{
    var todo = await db.Todos.FindAsync(id);

    if (todo is null) return Results.NotFound();

    todo.Name = inputTodo.Name;
    todo.Done = inputTodo.Done;

    await db.SaveChangesAsync();

    return Results.NoContent();
});

app.MapDelete("/todoitems/{id}", async (int id, TodoDb db) =>
{
    if (await db.Todos.FindAsync(id) is Todo todo)
    {
        db.Todos.Remove(todo);
        await db.SaveChangesAsync();
        return Results.NoContent();
    }

    return Results.NotFound();
});

await app.RunAsync("http://localhost:5678");

/* Database Model */

/// <summary>
/// To Do Item
/// </summary>
public class Todo
{
    /// <summary>
    /// Unique ID
    /// </summary>
    public int Id { get; set; }

    /// <summary>
    /// Item Title
    /// </summary>
    public string? Name { get; set; }

    /// <summary>
    /// Done?
    /// </summary>
    public bool Done { get; set; }
}

public class TodoDb : DbContext
{
    public TodoDb(DbContextOptions<TodoDb> options)
        : base(options) { }

    public DbSet<Todo> Todos => Set<Todo>();
}
@tareqimbasher
Copy link
Owner

Good suggestion. Will add it to a future release.

@tareqimbasher tareqimbasher added the enhancement New feature or request label Apr 29, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

2 participants