From 91e55f925bfeabca35ab1c3994ca8e72f7d49b62 Mon Sep 17 00:00:00 2001 From: Bangara Raju Kottedi Date: Mon, 19 Jan 2026 16:52:54 +0530 Subject: [PATCH] added swagger ui and implemented save, get, and stats api. --- .../Controllers/ShapeController.cs | 34 +++++++++++++++---- SampleApplication/Entities/ShapeInput.cs | 2 +- SampleApplication/Program.cs | 20 ++++++++++- .../Properties/launchSettings.json | 23 ++++++------- SampleApplication/SampleApplication.csproj | 1 + SampleApplication/SampleDbContext.cs | 19 ++++++++++- 6 files changed, 78 insertions(+), 21 deletions(-) diff --git a/SampleApplication/Controllers/ShapeController.cs b/SampleApplication/Controllers/ShapeController.cs index 27b5f30..30723c7 100644 --- a/SampleApplication/Controllers/ShapeController.cs +++ b/SampleApplication/Controllers/ShapeController.cs @@ -2,6 +2,7 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using SampleApplication.Entities; +using System.Threading.Tasks; namespace SampleApplication.Controllers { @@ -29,7 +30,7 @@ namespace SampleApplication.Controllers [HttpPost] - public IActionResult AddShapes(List shapes) + public async Task AddShapes([FromBody] List shapes) { @@ -40,12 +41,19 @@ namespace SampleApplication.Controllers // - Ignore duplicate IDs // - Save via EF Core + + if (!shapes.Any()) + { + throw new ArgumentNullException(); + } this._calculator.AddShapes(shapes); - this._db.Shapes.AddRange(shapes); + this._db.Shapes.AddRange(shapes); - return Ok(shapes); + await this._db.SaveChangesAsync(); + + return Ok(); } [HttpGet("{id}")] @@ -58,19 +66,33 @@ namespace SampleApplication.Controllers var shape = await this._db.Shapes.Where(s => s.Id == id).FirstOrDefaultAsync(); + if(shape is null) + { + return NotFound(); + } + return Ok(shape); } [HttpGet("stats")] - public IActionResult Stats() - + public async Task Stats() { // TODO: - throw new NotImplementedException(); + var shapes = await this._db.Shapes.ToListAsync(); + if (!shapes.Any()) + { + return NoContent(); + } + + this._calculator.AddShapes(shapes); + + var stats = this._calculator.GetStatistics(); + + return Ok(new {stats.TotalShapes, stats.TotalArea, stats.MaxPerimeterId}); } } diff --git a/SampleApplication/Entities/ShapeInput.cs b/SampleApplication/Entities/ShapeInput.cs index a16e93a..bd288ba 100644 --- a/SampleApplication/Entities/ShapeInput.cs +++ b/SampleApplication/Entities/ShapeInput.cs @@ -8,6 +8,6 @@ namespace SampleApplication.Entities public ShapeType Type { get; set; } - public double[] Dimensions { get; set; } + public required double[] Dimensions { get; set; } } } diff --git a/SampleApplication/Program.cs b/SampleApplication/Program.cs index 30bc4f6..8e89cba 100644 --- a/SampleApplication/Program.cs +++ b/SampleApplication/Program.cs @@ -1,5 +1,8 @@ using Microsoft.EntityFrameworkCore; +using Microsoft.OpenApi; using SampleApplication; +using System.Reflection; +using System.IO; var builder = WebApplication.CreateBuilder(args); @@ -8,12 +11,24 @@ var builder = WebApplication.CreateBuilder(args); builder.Services.AddDbContext(options => options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection"))); -builder.Services.AddSingleton(); +builder.Services.AddScoped(); builder.Services.AddControllers(); // Learn more about configuring OpenAPI at https://aka.ms/aspnet/openapi builder.Services.AddOpenApi(); +builder.Services.AddSwaggerGen(c => +{ + // XML Comments file for API Documentation + var xmlCommentsFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml"; + var xmlCommentsFullPath = Path.Combine(AppContext.BaseDirectory, xmlCommentsFile); + + if (File.Exists(xmlCommentsFullPath)) + { + c.IncludeXmlComments(xmlCommentsFullPath); + } +}); + var app = builder.Build(); @@ -21,6 +36,9 @@ var app = builder.Build(); if (app.Environment.IsDevelopment()) { app.MapOpenApi(); + + app.UseSwagger(); + app.UseSwaggerUI(); } app.UseHttpsRedirection(); diff --git a/SampleApplication/Properties/launchSettings.json b/SampleApplication/Properties/launchSettings.json index eba8d85..d85acfa 100644 --- a/SampleApplication/Properties/launchSettings.json +++ b/SampleApplication/Properties/launchSettings.json @@ -1,23 +1,22 @@ -{ - "$schema": "https://json.schemastore.org/launchsettings.json", +{ "profiles": { "http": { "commandName": "Project", - "dotnetRunMessages": true, - "launchBrowser": false, - "applicationUrl": "http://localhost:5078", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" - } + }, + "dotnetRunMessages": true, + "applicationUrl": "http://localhost:5078" }, "https": { "commandName": "Project", - "dotnetRunMessages": true, - "launchBrowser": false, - "applicationUrl": "https://localhost:7203;http://localhost:5078", + "launchBrowser": true, "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" - } + }, + "dotnetRunMessages": true, + "applicationUrl": "https://localhost:7203;http://localhost:5078" } - } -} + }, + "$schema": "https://json.schemastore.org/launchsettings.json" +} \ No newline at end of file diff --git a/SampleApplication/SampleApplication.csproj b/SampleApplication/SampleApplication.csproj index 38cf46d..2e9a092 100644 --- a/SampleApplication/SampleApplication.csproj +++ b/SampleApplication/SampleApplication.csproj @@ -15,6 +15,7 @@ + diff --git a/SampleApplication/SampleDbContext.cs b/SampleApplication/SampleDbContext.cs index 0c83aa0..93e082f 100644 --- a/SampleApplication/SampleDbContext.cs +++ b/SampleApplication/SampleDbContext.cs @@ -1,4 +1,6 @@ -using Microsoft.EntityFrameworkCore; +using System; +using System.Linq; +using Microsoft.EntityFrameworkCore; namespace SampleApplication { @@ -9,5 +11,20 @@ namespace SampleApplication } public DbSet Shapes { get; set; } + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + base.OnModelCreating(modelBuilder); + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.Id); + entity.Property(e => e.Id).ValueGeneratedOnAdd(); + entity.Property(e => e.Type).IsRequired(); + entity.Property(e => e.Dimensions).IsRequired(); + entity.Property(e => e.Dimensions).HasConversion( + v => string.Join(',', v), + v => v.Split(',', StringSplitOptions.RemoveEmptyEntries).Select(double.Parse).ToArray()); + }); + } } }