finiching
continuous-integration/drone/push Build is passing Details

pull/14/head
Victor Perez NGOUNOU 2 years ago
parent 642ed3af8d
commit 4c5c17a3e0

@ -0,0 +1,308 @@
{
"info": {
"_postman_id": "03cfff4d-c3f5-4b46-af15-385a3b14f51c",
"name": "Requète pour excécuter et tester l'api ResFull",
"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json",
"_exporter_id": "19401801"
},
"item": [
{
"name": "https://localhost:7097/api/v1/Joueur",
"protocolProfileBehavior": {
"disableBodyPruning": true
},
"request": {
"method": "GET",
"header": [],
"body": {
"mode": "raw",
"raw": ""
},
"url": {
"raw": "https://localhost:7097/api/v1/Joueur",
"protocol": "https",
"host": [
"localhost"
],
"port": "7097",
"path": [
"api",
"v1",
"Joueur"
]
},
"description": "# Requète pour excécuter et tester l'api ResFull"
},
"response": []
},
{
"name": "https://localhost:7097/api/v1/Joueur/1/10",
"request": {
"method": "GET",
"header": [],
"url": {
"raw": "https://localhost:7097/api/v1/Joueur/1/10",
"protocol": "https",
"host": [
"localhost"
],
"port": "7097",
"path": [
"api",
"v1",
"Joueur",
"1",
"10"
]
},
"description": "**Recuperer les joueurs par pagination** \ntemplate:\n\n```uri \nhttps://localhost:7097/api/v1/Joueur/{page}/{pageSize}\n```"
},
"response": []
},
{
"name": "https://localhost:7097/api/v1/Joueur",
"request": {
"method": "POST",
"header": [],
"body": {
"mode": "raw",
"raw": "{\n \"pseudo\": \"vic\"\n}",
"options": {
"raw": {
"language": "json"
}
}
},
"url": {
"raw": "https://localhost:7097/api/v1/Joueur",
"protocol": "https",
"host": [
"localhost"
],
"port": "7097",
"path": [
"api",
"v1",
"Joueur"
]
}
},
"response": []
},
{
"name": "https://localhost:7097/api/v1/Joueur/3",
"request": {
"method": "PUT",
"header": [],
"body": {
"mode": "raw",
"raw": "{\n \"id\":3,\n \"pseudo\":\"maman\"\n}",
"options": {
"raw": {
"language": "json"
}
}
},
"url": {
"raw": "https://localhost:7097/api/v1/Joueur/3",
"protocol": "https",
"host": [
"localhost"
],
"port": "7097",
"path": [
"api",
"v1",
"Joueur",
"3"
]
},
"description": "**Metre à jour un joueur de la base de donnée**\n```url\nhttps://localhost:7097/api/v1/Joueur/{id}\n```"
},
"response": []
},
{
"name": "https://localhost:7097/api/v2/Joueur/1/10?name=vic",
"request": {
"method": "GET",
"header": [],
"url": {
"raw": "https://localhost:7097/api/v2/Joueur/1/10?name=vic",
"protocol": "https",
"host": [
"localhost"
],
"port": "7097",
"path": [
"api",
"v2",
"Joueur",
"1",
"10"
],
"query": [
{
"key": "name",
"value": "vic"
}
]
},
"description": "**Recuperer les joueurs par pagination et filtrage de donnée par pseudo**\nTemplate:\n```url\nhttps://localhost:7097/api/v1/Joueur/{page}/{pageSize}?name=\"pseudo\"\n```"
},
"response": []
},
{
"name": "https://localhost:7097/api/v2/Joueur/1/10?name=vic",
"request": {
"method": "GET",
"header": [],
"url": {
"raw": "https://localhost:7097/api/v2/Joueur/vic",
"protocol": "https",
"host": [
"localhost"
],
"port": "7097",
"path": [
"api",
"v2",
"Joueur",
"vic"
]
},
"description": "**Get joueur by name**\nTemplate:\n```url\nhttps://localhost:7097/api/v2/Joueur/{name}\n```"
},
"response": []
},
{
"name": "https://localhost:7097/api/v2/Joueur/4",
"request": {
"method": "DELETE",
"header": [],
"url": {
"raw": "https://localhost:7097/api/v2/Joueur/5",
"protocol": "https",
"host": [
"localhost"
],
"port": "7097",
"path": [
"api",
"v2",
"Joueur",
"5"
]
},
"description": "**Supprimer un joueur de la base de donnée**\nTemplate:\n```url\nhttps://localhost:7097/api/v2/Joueur/{id}\n```"
},
"response": []
},
{
"name": "https://localhost:7097/api/v1/Partie",
"request": {
"method": "GET",
"header": [],
"url": {
"raw": "https://localhost:7097/api/v1/Partie",
"protocol": "https",
"host": [
"localhost"
],
"port": "7097",
"path": [
"api",
"v1",
"Partie"
]
},
"description": "**Lister toutes les parties jouer**\nTemplate:\n```url\nhttps://localhost:7097/api/v1/Partie\n```"
},
"response": []
},
{
"name": "https://localhost:7097/api/v1/Partie",
"request": {
"method": "POST",
"header": [],
"body": {
"mode": "raw",
"raw": "{\n \"joueur\": {\n \"pseudo\": \"vic\"\n},\n \"score\": 7\n}",
"options": {
"raw": {
"language": "json"
}
}
},
"url": {
"raw": "https://localhost:7097/api/v1/Partie",
"protocol": "https",
"host": [
"localhost"
],
"port": "7097",
"path": [
"api",
"v1",
"Partie"
]
},
"description": "**Crée une partie**\n"
},
"response": []
},
{
"name": "https://localhost:7097/api/v1/Partie/8",
"request": {
"method": "GET",
"header": [],
"url": {
"raw": "https://localhost:7097/api/v1/Partie/8",
"protocol": "https",
"host": [
"localhost"
],
"port": "7097",
"path": [
"api",
"v1",
"Partie",
"8"
]
},
"description": "**Get partie by id**"
},
"response": []
},
{
"name": "https://localhost:7097/api/v1/Partie/8",
"request": {
"method": "PUT",
"header": [],
"body": {
"mode": "raw",
"raw": "{\n \"id\": 8,\n \"joueur\": {\n \"pseudo\": \"vic\"\n },\n \"score\": 48\n}",
"options": {
"raw": {
"language": "json"
}
}
},
"url": {
"raw": "https://localhost:7097/api/v1/Partie/8",
"protocol": "https",
"host": [
"localhost"
],
"port": "7097",
"path": [
"api",
"v1",
"Partie",
"8"
]
}
},
"response": []
}
]
}

@ -57,13 +57,65 @@ $ dotnet tool install --global dotnet-ef
### Setup ### Setup
* Ouvrir le projet dans Visual Studio. * Ouvrir le projet dans Visual Studio.
#### pour l'API Gateway
* Configurer l'exécution de l'application en mode "Multiple startup projects" et sélectionner les projets suivants : * Configurer l'exécution de l'application en mode "Multiple startup projects" et sélectionner les projets suivants :
* BowlingApi * BowlingApi: RestFull
* Bowling Api Gateway * Bowling Api Gateway
* GraphQL Project * GraphQL Project: GraphQL
* Build le projet.
* L'application est prête à être utilisée.
#### pour l'API RestFull
* Configurer l'exécution de l'application en mode "Multiple startup projects" et sélectionner les projets suivants :
* BowlingApi: Https
* Build le projet. * Build le projet.
* L'application est prête à être utilisée. * L'application est prête à être utilisée.
#### pour l'API GraphQL
* Configurer l'exécution de l'application en mode "Multiple startup projects" et sélectionner les projets suivants :
* GraphQL Project: GraphQL
* Build le projet.
* L'application est prête à être utilisée.
## Requêtes GraphQL
url:
```shell
https://localhost:7197/graphql/
```
### Créer un joueur
```graphql
mutation Addjoueur{
addjoueur (input: {
pseudo:"dadada"
}){
joueur {
pseudo
}
}
}
```
### Récupérer tous les joueurs
```graphql
query GetJoueur{
joueurs{
id
pseudo
}
}
```
## Requêtes RestFull
Client RestFull utilisé : Postman
lien de la collection : https://codefirst.iut.uca.fr/git/victor_perez.ngounou/ApiBowlingProject/-/blob/master/Documentation/RestFull%20API%20Bowling.postman_collection.json
## Usage ## Usage
* Open the solution in Visual Studio 2022 * Open the solution in Visual Studio 2022

@ -14,8 +14,8 @@ using Microsoft.AspNetCore.Mvc;
namespace BowlingApi.Controllers namespace BowlingApi.Controllers
{ {
[ApiVersion("1")]
[Route("api/[controller]")] [Route("api/v{version:apiVersion}/[controller]")]
[ApiController] [ApiController]
public class PartieController : ControllerBase public class PartieController : ControllerBase
{ {
@ -148,7 +148,7 @@ namespace BowlingApi.Controllers
return BadRequest("La partie est obligatoire"); return BadRequest("La partie est obligatoire");
var updatepartie = _partieService.Update(partie); var updatepartie = _partieService.Update(partie);
if (updatepartie.Result == null) if (updatepartie.Result == false)
{ {
return NotFound(); return NotFound();
} }

Binary file not shown.

@ -10,7 +10,7 @@ namespace BowlingRepository.Interface
public Task<bool> Update(PartieEntity _partie); public Task<bool> Update(PartieEntity _partie);
public Task<List<PartieEntity>> GetAll(); public Task<List<PartieEntity>> GetAll();
public Task<IEnumerable<PartieEntity>> GetAllWithDate(DateTime date); public Task<IEnumerable<PartieEntity>> GetAllWithDate(DateTime date);
public Task<PartieEntity> GetDataWithId(int id); public Task<PartieEntity> GetDataWithId(long id);
} }
} }

@ -40,10 +40,19 @@ public class JoueurRepository:IJoueurRepository
public async Task<bool> Delete(long id) public async Task<bool> Delete(long id)
{ {
JoueurEntity entity = _context.Joueurs.Find(id); JoueurEntity entity = _context.Joueurs.Find(id);
if (entity == null)
{
return false;
}
_context.Joueurs.Remove(entity); _context.Joueurs.Remove(entity);
return await _context.SaveChangesAsync() > 0; return await _context.SaveChangesAsync() > 0;
} }
/// <summary>
/// Methode pour mettre à jour un joueur de la base de données
/// </summary>
/// <param name="joueur"></param>
/// <returns></returns>
public async Task<bool> Update(JoueurEntity joueur) public async Task<bool> Update(JoueurEntity joueur)
{ {
return await _context.SaveChangesAsync() > 0; return await _context.SaveChangesAsync() > 0;

@ -48,7 +48,7 @@ namespace BowlingRepository.Interface
throw new NotImplementedException(); throw new NotImplementedException();
} }
public async Task<PartieEntity> GetDataWithId(int id) public async Task<PartieEntity> GetDataWithId(long id)
{ {
var data = await _context.Parties.FirstOrDefaultAsync(n => n.Id == id); var data = await _context.Parties.FirstOrDefaultAsync(n => n.Id == id);
return data; return data;

@ -11,7 +11,7 @@ namespace BowlingService.Interfaces
public Task<bool> Update(PartieDTO _partie); public Task<bool> Update(PartieDTO _partie);
public Task<IEnumerable<PartieDTO>> GetAll(); public Task<IEnumerable<PartieDTO>> GetAll();
public Task<IEnumerable<PartieEntity>> GetAllWithDate(DateTime date); public Task<IEnumerable<PartieEntity>> GetAllWithDate(DateTime date);
public Task<PartieDTO> GetDataWithId(int id); public Task<PartieDTO> GetDataWithId(long id);
} }
} }

@ -69,7 +69,12 @@ namespace BowlingService
try try
{ {
result = await _joueurRepository.Delete(_joueurId); result = await _joueurRepository.Delete(_joueurId);
_logger.LogInformation("A player was deleted : {player}", _joueurId);
if (result)
_logger.LogInformation("A player was deleted : {player}", _joueurId);
else
_logger.LogWarning("A player not found : {player}", _joueurId);
} }
catch (Exception ex) catch (Exception ex)
{ {

@ -104,7 +104,7 @@ public async Task<PartieDTO> Add(PartieDTO _partie)
throw new NotImplementedException(); throw new NotImplementedException();
} }
public async Task<PartieDTO> GetDataWithId(int id) public async Task<PartieDTO> GetDataWithId(long id)
{ {
PartieDTO _partie = null; PartieDTO _partie = null;
@ -129,19 +129,29 @@ public async Task<PartieDTO> Add(PartieDTO _partie)
{ {
bool result = false; bool result = false;
using (var context = new BowlingContext()) try
{ {
PartieEntity entity = _mapper.Map<PartieEntity>(_partie); PartieEntity entity=await _IpartieRepository.GetDataWithId(_partie.Id);
entity.Date = _partie.Date; entity.Date = _partie.Date;
entity.Score = _partie.Score; entity.Score = _partie.Score;
result = _IpartieRepository.Update(entity).Result; result = await _IpartieRepository.Update(entity);
if (result)
{
_logger.LogInformation("partie was updated : {partie}", _partie.Id);
}
else
{
_logger.LogInformation("partie was not updated : {partie}", _partie.Id);
}
}
catch (Exception ex)
{
_logger.LogError(ex, "Error while updating player : {player}", _partie.Id);
throw;
} }
return result; return result;
} }
} }
} }

@ -53,21 +53,7 @@ namespace BowlingAPITest
testItems.Add(new PartieDTO { Score = 2 }); testItems.Add(new PartieDTO { Score = 2 });
return testItems; return testItems;
} }
//[Fact]
//public async Task Get_With_Invalid_id_Should_Return_BadRequest()
//{
// // Arrange
// var PartieController = new PartieController(null);
// // Act
// var result = await PartieController.Get(0);
// // Assert
// result.Should().BeOfType<BadRequestObjectResult>();
// var badRequestResult = result as BadRequestObjectResult;
// badRequestResult.Value.Should().Be("Le id de la partie est obligatoire");
//}
[Fact] [Fact]
public async Task Get_With_Valid_id_Should_Return_Ok_With_partie() public async Task Get_With_Valid_id_Should_Return_Ok_With_partie()
{ {
@ -141,22 +127,7 @@ namespace BowlingAPITest
result.Should().BeOfType<NotFoundResult>(); result.Should().BeOfType<NotFoundResult>();
} }
//[Fact]
//public async Task Get_White_id_ShouldReturnNotFound()
//{
// // Arrange
// var partie1 = new PartieDTO { Score = 1 };
// var mockService = new Mock<IpartieService>();
// mockService.Setup(service => service.GetDataWithId(2)).ReturnsAsync(partie1);
// var controller = new PartieController(mockService.Object);
// // Act
// var result = await controller.Get(2);
// // Assert
// result.Should().BeOfType<NotFoundResult>();
//}
[Fact] [Fact]
public async Task Get_ShouldReturnInternalServerError() public async Task Get_ShouldReturnInternalServerError()
{ {
@ -172,24 +143,8 @@ namespace BowlingAPITest
result.Should().BeOfType<ObjectResult>(); result.Should().BeOfType<ObjectResult>();
result.StatusCode.Should().Be(500); result.StatusCode.Should().Be(500);
} }
//TEST POST
//[Fact]
//public async Task Post_With_Invalid_parti_Should_Return_BadRequest()
//{
// // Arrange
// var PartieController = new PartieController(null);
// // Act
// var result = await PartieController.Post(null);
// // Assert
// result.Should().BeOfType<ActionResult<PartieDTO>>();
// var actionResult = result as ActionResult<PartieDTO>;
// actionResult.Result.Should().BeOfType<BadRequestObjectResult>();
// var badRequestResult = actionResult.Result as BadRequestObjectResult;
// badRequestResult.Value.Should().Be("La partie est obligatoire");
//}
[Fact] [Fact]
void test() void test()

Loading…
Cancel
Save