Versionnisation de l'API
continuous-integration/drone/push Build is passing Details

pull/10/head
Victor Perez NGOUNOU 2 years ago
parent f3bcd0a85e
commit 18c3c1e9a9

@ -1,9 +1,26 @@
{ {
"$schema": "http://json.schemastore.org/launchsettings.json", "$schema": "http://json.schemastore.org/launchsettings.json",
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:47947",
"sslPort": 44397
}
},
"profiles": { "profiles": {
"Bowling Api Gateway": { "Bowling Api Gateway": {
"commandName": "Project", "commandName": "Project",
"applicationUrl": "http://localhost:7003", "dotnetRunMessages": true,
"launchBrowser": true,
"applicationUrl": "https://localhost:7003",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": { "environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development" "ASPNETCORE_ENVIRONMENT": "Development"
} }

@ -17,6 +17,7 @@
<ItemGroup> <ItemGroup>
<!--<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="7.0.0" />--> <!--<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="7.0.0" />-->
<PackageReference Include="Microsoft.AspNetCore.Mvc.Versioning" Version="5.0.0" /> <PackageReference Include="Microsoft.AspNetCore.Mvc.Versioning" Version="5.0.0" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Versioning.ApiExplorer" Version="5.0.0" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.4.0" /> <PackageReference Include="Swashbuckle.AspNetCore" Version="6.4.0" />
<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="6.0.11" /> <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="6.0.11" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="6.0.13" /> <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="6.0.13" />

@ -5,7 +5,8 @@ using Microsoft.AspNetCore.Mvc;
namespace BowlingApi.Controllers; namespace BowlingApi.Controllers;
[ApiVersion("1.0")] [ApiVersion("1")]
[ApiVersion("2")]
[ApiController] [ApiController]
[Route("api/v{version:apiVersion}/[controller]")] [Route("api/v{version:apiVersion}/[controller]")]
public class JoueurController:Controller public class JoueurController:Controller
@ -29,6 +30,7 @@ public class JoueurController:Controller
[ProducesResponseType(typeof(string), StatusCodes.Status500InternalServerError)] [ProducesResponseType(typeof(string), StatusCodes.Status500InternalServerError)]
[ProducesResponseType(typeof(string), StatusCodes.Status404NotFound)] [ProducesResponseType(typeof(string), StatusCodes.Status404NotFound)]
[ProducesResponseType(typeof(IEnumerable<JoueurDTO>), StatusCodes.Status200OK)] [ProducesResponseType(typeof(IEnumerable<JoueurDTO>), StatusCodes.Status200OK)]
[MapToApiVersion("1")]
public async Task<IActionResult> Get() public async Task<IActionResult> Get()
{ {
try try
@ -59,6 +61,7 @@ public class JoueurController:Controller
[ProducesResponseType(typeof(string), StatusCodes.Status500InternalServerError)] [ProducesResponseType(typeof(string), StatusCodes.Status500InternalServerError)]
[ProducesResponseType(typeof(string), StatusCodes.Status404NotFound)] [ProducesResponseType(typeof(string), StatusCodes.Status404NotFound)]
[ProducesResponseType(typeof(IEnumerable<JoueurDTO>), StatusCodes.Status200OK)] [ProducesResponseType(typeof(IEnumerable<JoueurDTO>), StatusCodes.Status200OK)]
[MapToApiVersion("1")]
public async Task<IActionResult> Get(int page=1,int pageSize=10) public async Task<IActionResult> Get(int page=1,int pageSize=10)
{ {
try try
@ -85,6 +88,54 @@ public class JoueurController:Controller
} }
} }
/// <summary>
/// Get player with pagination
/// Get : api/Joueur?page=1&pageSize=10
/// </summary>
/// <param name="page"> </param>
/// <param name="pageSize"></param>
///< param name="name"></param>
/// <returns>la liste des Joueurs </returns>
/// <response code="200">Retourne la liste des joueurs</response>
/// <response code="404">Si la liste est vide</response>
/// <response code="500">Si une erreur est survenue</response>
[HttpGet("{page}/{pageSize}")]
[MapToApiVersion("2")]
[ProducesResponseType(typeof(string), StatusCodes.Status500InternalServerError)]
[ProducesResponseType(typeof(string), StatusCodes.Status404NotFound)]
[ProducesResponseType(typeof(IEnumerable<JoueurDTO>), StatusCodes.Status200OK)]
public async Task<IActionResult> Get(int page=1,int pageSize=10, string name=null)
{
try
{
var result = await _joueurService.GetAll();
if (result == null)
{
return NotFound();
}
if (name != null)
{
result = result.Where(x => x.Pseudo.ToLower().Contains(name.ToLower()));
}
var data = result.Skip((page - 1) * pageSize).Take(pageSize);
Response.Headers.Add("X-Pagination", Newtonsoft.Json.JsonConvert.SerializeObject(new
{
totalCount = result.Count(),
pageSize = pageSize,
currentPage = page,
totalPages = (int)Math.Ceiling(result.Count() / (double)pageSize)
}));
return Ok(data);
}
catch (Exception e)
{
return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
throw;
}
}
/// <summary> /// <summary>
/// Get a player by name /// Get a player by name
/// GET: api/Joueur/Djon /// GET: api/Joueur/Djon
@ -99,6 +150,7 @@ public class JoueurController:Controller
[ProducesResponseType(typeof(string), StatusCodes.Status404NotFound)] [ProducesResponseType(typeof(string), StatusCodes.Status404NotFound)]
[ProducesResponseType(typeof(string), StatusCodes.Status400BadRequest)] [ProducesResponseType(typeof(string), StatusCodes.Status400BadRequest)]
[ProducesResponseType(typeof(JoueurDTO), StatusCodes.Status200OK)] [ProducesResponseType(typeof(JoueurDTO), StatusCodes.Status200OK)]
[MapToApiVersion("2")]
public async Task<IActionResult> Get(string name) public async Task<IActionResult> Get(string name)
{ {
try try
@ -132,6 +184,7 @@ public class JoueurController:Controller
[ProducesResponseType(typeof(string), StatusCodes.Status500InternalServerError)] [ProducesResponseType(typeof(string), StatusCodes.Status500InternalServerError)]
[ProducesResponseType(typeof(string), StatusCodes.Status400BadRequest)] [ProducesResponseType(typeof(string), StatusCodes.Status400BadRequest)]
[ProducesResponseType(typeof(JoueurDTO), StatusCodes.Status201Created)] [ProducesResponseType(typeof(JoueurDTO), StatusCodes.Status201Created)]
[MapToApiVersion("1")]
public async Task<ActionResult<JoueurDTO>> Post([FromBody] JoueurDTO joueur) public async Task<ActionResult<JoueurDTO>> Post([FromBody] JoueurDTO joueur)
{ {
try try
@ -166,6 +219,7 @@ public class JoueurController:Controller
[ProducesResponseType(typeof(string), StatusCodes.Status404NotFound)] [ProducesResponseType(typeof(string), StatusCodes.Status404NotFound)]
[ProducesResponseType(typeof(string), StatusCodes.Status400BadRequest)] [ProducesResponseType(typeof(string), StatusCodes.Status400BadRequest)]
[ProducesResponseType(typeof(JoueurDTO), StatusCodes.Status200OK)] [ProducesResponseType(typeof(JoueurDTO), StatusCodes.Status200OK)]
[MapToApiVersion("1")]
public async Task<ActionResult<JoueurDTO>> Put(long id,[FromBody] JoueurDTO joueur) public async Task<ActionResult<JoueurDTO>> Put(long id,[FromBody] JoueurDTO joueur)
{ {
try try
@ -186,4 +240,35 @@ public class JoueurController:Controller
throw; throw;
} }
} }
/// <summary>
/// Supprimer un joueur par son id
/// DELETE: api/Joueur/5
/// </summary>
/// <param name="id"></param>
/// <response code="200">Retourne le joueur supprimé</response>
/// <response code="404">Si le joueur n'existe pas</response>
/// <response code="500">Si une erreur est survenue</response>
[HttpDelete("{id}")]
[ProducesResponseType(typeof(string), StatusCodes.Status500InternalServerError)]
[ProducesResponseType(typeof(string), StatusCodes.Status404NotFound)]
[ProducesResponseType(typeof(bool), StatusCodes.Status200OK)]
[MapToApiVersion("2")]
public async Task<ActionResult<bool>> Delete(long id)
{
try
{
var joueur = _joueurService.Delete(id);
if (joueur.Result == false)
{
return NotFound();
}
return Ok(joueur);
}
catch (Exception e)
{
StatusCode(StatusCodes.Status500InternalServerError, e.Message);
throw;
}
}
} }

@ -5,6 +5,7 @@ using BowlingRepository.Interface;
using BowlingService; using BowlingService;
using BowlingService.Interfaces; using BowlingService.Interfaces;
using Mapper; using Mapper;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
var builder = WebApplication.CreateBuilder(args); var builder = WebApplication.CreateBuilder(args);
@ -19,7 +20,15 @@ builder.Services.AddSwaggerGen(c=>
c.SwaggerDoc("v1", new() { Title = "APi Bowling APP", Version = "v1" }); c.SwaggerDoc("v1", new() { Title = "APi Bowling APP", Version = "v1" });
c.SwaggerDoc("v2", new() { Title = "APi Bowling APP", Version = "v2" }); c.SwaggerDoc("v2", new() { Title = "APi Bowling APP", Version = "v2" });
c.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, "BowlingApi.xml")); c.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, "BowlingApi.xml"));
});
builder.Services.AddVersionedApiExplorer(options =>
{
options.GroupNameFormat = "'v'VVV";
options.SubstituteApiVersionInUrl = true;
}); });
builder.Services.AddAutoMapper(typeof(JoueurProfile)); builder.Services.AddAutoMapper(typeof(JoueurProfile));
builder.Services.AddScoped<IJoueurService, JoueurService>(); builder.Services.AddScoped<IJoueurService, JoueurService>();
@ -33,6 +42,13 @@ builder.Services.AddScoped<IJoueurRepository, JoueurRepository>();
builder.Services.AddScoped<IpartieRepository, PartieRepository>(); builder.Services.AddScoped<IpartieRepository, PartieRepository>();
builder.Services.AddScoped<IpartieService, PartieService>(); builder.Services.AddScoped<IpartieService, PartieService>();
builder.Services.AddApiVersioning(config =>
{
config.DefaultApiVersion = new ApiVersion(1, 0);
config.AssumeDefaultVersionWhenUnspecified = true;
config.ReportApiVersions = true;
});
//configure Logger //configure Logger

Binary file not shown.

@ -6,7 +6,7 @@ namespace BowlingService.Interfaces;
public interface IJoueurService public interface IJoueurService
{ {
Task<JoueurDTO> Add(JoueurDTO data); Task<JoueurDTO> Add(JoueurDTO data);
Task<bool> Delete(JoueurDTO data); Task<bool> Delete(long data);
Task<bool> Update(long id,JoueurDTO data); Task<bool> Update(long id,JoueurDTO data);
Task<JoueurDTO> GetDataWithName(string name); Task<JoueurDTO> GetDataWithName(string name);
Task<IEnumerable<JoueurDTO>> GetAll(); Task<IEnumerable<JoueurDTO>> GetAll();

@ -63,17 +63,17 @@ namespace BowlingService
/// </summary> /// </summary>
/// <param name="_joueur"></param> /// <param name="_joueur"></param>
/// <returns></returns> /// <returns></returns>
public async Task<bool> Delete(JoueurDTO _joueur) public async Task<bool> Delete(long _joueurId)
{ {
var result = false; var result = false;
try try
{ {
result = await _joueurRepository.Delete(_joueur.Id); result = await _joueurRepository.Delete(_joueurId);
_logger.LogInformation("A player was deleted : {player}", _joueur.Pseudo); _logger.LogInformation("A player was deleted : {player}", _joueurId);
} }
catch (Exception ex) catch (Exception ex)
{ {
_logger.LogError(ex, "Error while deleting player : {player}", _joueur.Pseudo); _logger.LogError(ex, "Error while deleting player : {player}", _joueurId);
throw; throw;
} }
return result; return result;

Loading…
Cancel
Save