From d476aff59f531a40068099773c0e3e2f3c33a598 Mon Sep 17 00:00:00 2001 From: "nathan.boileau" Date: Mon, 13 Mar 2023 15:58:16 +0100 Subject: [PATCH 1/2] add : V2 of ControllerChampions --- .../apiLOL/Controllers/ControllerChampions.cs | 66 ++++++++++++++++--- Sources/apiLOL/Program.cs | 19 ++++-- 2 files changed, 71 insertions(+), 14 deletions(-) diff --git a/Sources/apiLOL/Controllers/ControllerChampions.cs b/Sources/apiLOL/Controllers/ControllerChampions.cs index 98ff22e..cfb8269 100644 --- a/Sources/apiLOL/Controllers/ControllerChampions.cs +++ b/Sources/apiLOL/Controllers/ControllerChampions.cs @@ -6,13 +6,14 @@ using Model; namespace apiLOL.Controllers { - [ApiController] + [ApiController] [Route("api/v1/[controller]")] [ApiVersion("1.0")] public class ControllerChampions : Controller { private readonly IDataManager data; + // EFdata manager qui implémente l'interface IDataManager // coté client : Refaire un APIdata manager qui implémente l'interface IDataManager private readonly ILogger _logger; @@ -26,20 +27,23 @@ namespace apiLOL.Controllers // GET: api/ [HttpGet] - public async Task Get([FromQuery]int index = 0, int count = 10, string? name = "") + public async Task Get([FromQuery] int index = 0, int count = 10, string? name = "") { //FromQuery permet de filtrer dans la collection de champions en fonction du nom - _logger.LogInformation($"methode Get de ControllerChampions appelée index:{index}, count: {count} et name:{name}"); + _logger.LogInformation( + $"methode Get de ControllerChampions appelée index:{index}, count: {count} et name:{name}"); int nbChampions = await data.ChampionsMgr.GetNbItems(); _logger.LogInformation($"Nombre de champions : {nbChampions}"); //var champs = (await data.ChampionsMgr.GetItems(index, count)).Where(Model => Model.Name.Contains(name)).Select(Model => Model.ToDTO()); - var champs = (await data.ChampionsMgr.GetItems(index, await data.ChampionsMgr.GetNbItems())).Where(Model => Model.Name.Contains(name)).Skip(index * count).Take(count).Select(Model => Model.ToDTO()); + var champs = (await data.ChampionsMgr.GetItems(index, await data.ChampionsMgr.GetNbItems())) + .Where(Model => Model.Name.Contains(name)).Skip(index * count).Take(count) + .Select(Model => Model.ToDTO()); var page = new ChampionPageDTO { - Data = (IEnumerable)champs, + Data = (IEnumerable) champs, Index = index, Count = count, TotalCount = nbChampions @@ -59,11 +63,11 @@ namespace apiLOL.Controllers var champs = (await data.ChampionsMgr.GetItemsByName(name, 0, 1)); return Ok(champs.First().ToDTO()); } - catch(Exception ex) - { + catch (Exception ex) + { _logger.LogError($"erreur methode Get de ControllerChampions: {ex}"); return BadRequest("erreur de nom de champion"); - } + } } @@ -77,7 +81,7 @@ namespace apiLOL.Controllers Champion tmp = champDTO.ToModel(); Champion champion = await data.ChampionsMgr.AddItem(tmp); ChampionDTO dtoChamp = champion.ToDTO(); - return CreatedAtAction(nameof(GetChampion), new { name = dtoChamp.Name }, dtoChamp); + return CreatedAtAction(nameof(GetChampion), new {name = dtoChamp.Name}, dtoChamp); } catch (Exception ex) { @@ -90,7 +94,8 @@ namespace apiLOL.Controllers [HttpPut("{name}")] public async Task Put(string name, string bio) { - _logger.LogInformation($"methode Put de ControllerChampions appelée avec le paramètre name: {name} et bio: {bio}"); + _logger.LogInformation( + $"methode Put de ControllerChampions appelée avec le paramètre name: {name} et bio: {bio}"); try { @@ -125,4 +130,45 @@ namespace apiLOL.Controllers } } + + [ApiController] + [Route("api/v2/[controller]")] + [ApiVersion("2.0")] + + public class ControllerChampionsSecondVersion : Controller + { + private readonly ILogger _logger; + + public ControllerChampionsSecondVersion(ILogger log) + { + _logger = log; + } + + + // GET api//5 + [HttpGet()] + public string Get(int id) + { + return "Version 2 of GET"; + } + + // POST api/ + [HttpPost] + public void Post([FromBody] string value) + { + } + + // PUT api//5 + [HttpPut("{id}")] + public void Put(int id, [FromBody] string value) + { + } + + // DELETE api//5 + [HttpDelete("{id}")] + public void Delete(int id) + { + } + + } } \ No newline at end of file diff --git a/Sources/apiLOL/Program.cs b/Sources/apiLOL/Program.cs index 4535ba4..80d2be9 100644 --- a/Sources/apiLOL/Program.cs +++ b/Sources/apiLOL/Program.cs @@ -1,3 +1,5 @@ +using Microsoft.AspNetCore.Mvc.Versioning; +using Microsoft.AspNetCore.Mvc; using Model; using StubLib; @@ -10,18 +12,27 @@ builder.Services.AddControllers(); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); -builder.Services.AddSingleton(); +builder.Services.AddSingleton(); // Scoped et Transient sont des types de cycle de vie // Transient : une instance a chaque contruction d'objet // Scoped : une instance par requete client +// Configure API versioning +builder.Services.AddApiVersioning(options => +{ + options.ReportApiVersions = true; + options.AssumeDefaultVersionWhenUnspecified = true; + options.DefaultApiVersion = new ApiVersion(1, 0); + options.ApiVersionReader = new HeaderApiVersionReader("api-version"); +}); + var app = builder.Build(); // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) { - app.UseSwagger(); - app.UseSwaggerUI(); + app.UseSwagger(); + app.UseSwaggerUI(); } app.UseHttpsRedirection(); @@ -30,4 +41,4 @@ app.UseAuthorization(); app.MapControllers(); -app.Run(); +app.Run(); \ No newline at end of file From 6f8ec9fa205bfcf32ecad11eac26902ee33d9dce Mon Sep 17 00:00:00 2001 From: "nathan.boileau" Date: Mon, 13 Mar 2023 16:22:27 +0100 Subject: [PATCH 2/2] =?UTF-8?q?D=C3=A9tails=20REST=20FULL?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../apiLOL/Controllers/ControllerChampions.cs | 43 +++++++------------ 1 file changed, 15 insertions(+), 28 deletions(-) diff --git a/Sources/apiLOL/Controllers/ControllerChampions.cs b/Sources/apiLOL/Controllers/ControllerChampions.cs index cfb8269..0817c85 100644 --- a/Sources/apiLOL/Controllers/ControllerChampions.cs +++ b/Sources/apiLOL/Controllers/ControllerChampions.cs @@ -12,38 +12,32 @@ namespace apiLOL.Controllers public class ControllerChampions : Controller { - private readonly IDataManager data; - - // EFdata manager qui implémente l'interface IDataManager - // coté client : Refaire un APIdata manager qui implémente l'interface IDataManager + private readonly IDataManager _data; private readonly ILogger _logger; public ControllerChampions(IDataManager manager, ILogger log) { - data = manager; + _data = manager; _logger = log; } - // GET: api/ [HttpGet] + [ProducesResponseType(typeof(ChampionPageDTO), 200)] public async Task Get([FromQuery] int index = 0, int count = 10, string? name = "") { - //FromQuery permet de filtrer dans la collection de champions en fonction du nom - _logger.LogInformation( - $"methode Get de ControllerChampions appelée index:{index}, count: {count} et name:{name}"); - int nbChampions = await data.ChampionsMgr.GetNbItems(); + _logger.LogInformation($"methode Get de ControllerChampions appelée index:{index}, count: {count} et name:{name}"); + int nbChampions = await _data.ChampionsMgr.GetNbItems(); _logger.LogInformation($"Nombre de champions : {nbChampions}"); - //var champs = (await data.ChampionsMgr.GetItems(index, count)).Where(Model => Model.Name.Contains(name)).Select(Model => Model.ToDTO()); - var champs = (await data.ChampionsMgr.GetItems(index, await data.ChampionsMgr.GetNbItems())) - .Where(Model => Model.Name.Contains(name)).Skip(index * count).Take(count) - .Select(Model => Model.ToDTO()); + var champions = await _data.ChampionsMgr.GetItems(index, nbChampions); + var filteredChampions = champions.Where(Model => Model.Name.Contains(name)).Skip(index * count).Take(count); + var championDTO = filteredChampions.Select(Model => Model.ToDTO()); var page = new ChampionPageDTO { - Data = (IEnumerable) champs, + Data = championDTO, Index = index, Count = count, TotalCount = nbChampions @@ -52,15 +46,15 @@ namespace apiLOL.Controllers } - // GET api//Charle [HttpGet] [Route("{name}")] + [ProducesResponseType(typeof(ChampionDTO), 200)] public async Task GetChampion(string name) { _logger.LogInformation($"methode GetChampion de ControllerChampions appelée avec le paramètre {name}"); try { - var champs = (await data.ChampionsMgr.GetItemsByName(name, 0, 1)); + var champs = (await _data.ChampionsMgr.GetItemsByName(name, 0, 1)); return Ok(champs.First().ToDTO()); } catch (Exception ex) @@ -71,7 +65,6 @@ namespace apiLOL.Controllers } - // POST api/ [HttpPost] public async Task Post(ChampionDTO champDTO) { @@ -79,7 +72,7 @@ namespace apiLOL.Controllers try { Champion tmp = champDTO.ToModel(); - Champion champion = await data.ChampionsMgr.AddItem(tmp); + Champion champion = await _data.ChampionsMgr.AddItem(tmp); ChampionDTO dtoChamp = champion.ToDTO(); return CreatedAtAction(nameof(GetChampion), new {name = dtoChamp.Name}, dtoChamp); } @@ -90,7 +83,6 @@ namespace apiLOL.Controllers } } - // PUT api//5 [HttpPut("{name}")] public async Task Put(string name, string bio) { @@ -99,7 +91,7 @@ namespace apiLOL.Controllers try { - var champs = (await data.ChampionsMgr.GetItemsByName(name, 0, 1)).First(); + var champs = (await _data.ChampionsMgr.GetItemsByName(name, 0, 1)).First(); champs.Bio = bio; return Ok(champs.ToDTO()); } @@ -110,7 +102,6 @@ namespace apiLOL.Controllers } } - // DELETE api//5 [HttpDelete("{name}")] public async Task Delete(string name) { @@ -118,8 +109,8 @@ namespace apiLOL.Controllers try { - var champ = (await data.ChampionsMgr.GetItemsByName(name, 0, 1)).First(); - await data.ChampionsMgr.DeleteItem(champ); + var champ = (await _data.ChampionsMgr.GetItemsByName(name, 0, 1)).First(); + await _data.ChampionsMgr.DeleteItem(champ); return Ok(champ.ToDTO()); } catch (Exception ex) @@ -145,26 +136,22 @@ namespace apiLOL.Controllers } - // GET api//5 [HttpGet()] public string Get(int id) { return "Version 2 of GET"; } - // POST api/ [HttpPost] public void Post([FromBody] string value) { } - // PUT api//5 [HttpPut("{id}")] public void Put(int id, [FromBody] string value) { } - // DELETE api//5 [HttpDelete("{id}")] public void Delete(int id) {