Skip to content

Commit 6a87dc4

Browse files
committed
updated check for the entity state
1 parent f0dba68 commit 6a87dc4

File tree

7 files changed

+25
-18
lines changed

7 files changed

+25
-18
lines changed

src/Api/Endpoints/V1/Products/Create.cs

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,18 +37,21 @@ public async Task<IActionResult> PostAsync(Product product, string culture = "en
3737
{
3838
if (!ModelState.IsValid) return BadRequest(ModelState.GetErrorMessages());
3939

40-
var entity = await _db.Products.AddAsync(product);
40+
var addedProduct = await _db.Products.AddAsync(product);
41+
42+
var stateAded = addedProduct.State == Microsoft.EntityFrameworkCore.EntityState.Added;
43+
4144
var count = await _db.SaveChangesAsync();
4245

4346
var responseProduct = new ProductDTO
4447
{
45-
DeliveryPrice = entity.Entity.DeliveryPrice,
46-
Description = entity.Entity.Description,
47-
Id = entity.Entity.Id,
48-
Name = entity.Entity.Name,
49-
Price = entity.Entity.Price
48+
DeliveryPrice = addedProduct.Entity.DeliveryPrice,
49+
Description = addedProduct.Entity.Description,
50+
Id = addedProduct.Entity.Id,
51+
Name = addedProduct.Entity.Name,
52+
Price = addedProduct.Entity.Price
5053
};
51-
return count == 1 ? CreatedAtRoute(RouteNames.GetByIdAsync, new { id = responseProduct.Id, culture }, responseProduct) : StatusCode(StatusCodes.Status500InternalServerError);
54+
return stateAded && count == 1 ? CreatedAtRoute(RouteNames.GetByIdAsync, new { id = responseProduct.Id, culture }, responseProduct) : StatusCode(StatusCodes.Status500InternalServerError);
5255
}
5356
}
5457
}

src/Api/Endpoints/V1/Products/Delete.cs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using Microsoft.AspNetCore.Authorization;
22
using Microsoft.AspNetCore.Http;
33
using Microsoft.AspNetCore.Mvc;
4+
using Microsoft.EntityFrameworkCore;
45
using System;
56
using System.Threading.Tasks;
67
using Xero.Demo.Api.Domain.Extension;
@@ -10,9 +11,6 @@ namespace Xero.Demo.Api.Endpoints.V1.Products
1011
{
1112
public partial class ProductsController
1213
{
13-
private static int rowCountDeleted = 0;
14-
private readonly bool deleted = rowCountDeleted != 1;
15-
1614
/// <summary>
1715
/// Delete product by sending valid JWT token provided through only 'api/{culture}/v1/Login/Admin' endpoint
1816
/// </summary>
@@ -32,11 +30,12 @@ public async Task<IActionResult> DeleteAsync(Guid id, string culture = "en-US")
3230
var product = await _db.Products.FindAsync(id);
3331

3432
if (product == default) return NotFound(string.Format(CustomException.NotFoundException, id));
33+
var removedProduct = _db.Products.Remove(product);
34+
var stateDeleted = removedProduct.State == EntityState.Deleted;
3535

36-
_db.Products.Remove(product);
37-
rowCountDeleted = await _db.SaveChangesAsync();
36+
var rowCountDeleted = await _db.SaveChangesAsync();
3837

39-
return deleted ? NoContent() : StatusCode(StatusCodes.Status500InternalServerError);
38+
return stateDeleted && rowCountDeleted == 1 ? NoContent() : StatusCode(StatusCodes.Status500InternalServerError);
4039
}
4140
}
4241
}

src/Api/Endpoints/V1/Products/Read.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,14 +46,15 @@ public async Task<IActionResult> GetAsync(string culture = "en-US")
4646
/// Get product by id by sending valid JWT token provided through 'api/{culture}/v1/Login/Admin' or 'api/en-US/v1/Login/Editor' or 'api/{culture}/v1/Login/Reader'
4747
/// </summary>
4848
/// <param name="id">Enter the id of product</param>
49+
/// <param name="culture"></param>
4950
/// <returns>Returns list of products</returns>
5051
[Authorize(Policy = Policy.ShouldBeAReader)]
5152
[ApiVersion(ApiVersionNumbers.V1)]
5253
[HttpGet("{id}", Name = RouteNames.GetByIdAsync)]
5354
[ProducesResponseType(StatusCodes.Status200OK, Type = typeof(ProductDTO))]
5455
[ProducesResponseType(StatusCodes.Status400BadRequest)]
5556
[ProducesResponseType(StatusCodes.Status500InternalServerError)]
56-
public async Task<IActionResult> GetByIdAsync(Guid id)
57+
public async Task<IActionResult> GetByIdAsync(Guid id, string culture = "en-US")
5758
{
5859
if (!ModelState.IsValid || id == Guid.Empty) return BadRequest(ModelState.GetErrorMessages());
5960

src/Api/Endpoints/V1/Products/Update.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using Microsoft.AspNetCore.Authorization;
22
using Microsoft.AspNetCore.Http;
33
using Microsoft.AspNetCore.Mvc;
4+
using Microsoft.EntityFrameworkCore;
45
using System;
56
using System.Threading.Tasks;
67
using Xero.Demo.Api.Domain.Extension;
@@ -32,10 +33,13 @@ public async Task<IActionResult> PutAsync(Guid id, Product product, string cultu
3233

3334
if (savedProduct == default) return NotFound(string.Format(CustomException.NotFoundException, id));
3435

35-
_db.Products.Update(product);
36+
var updatedProduct = _db.Products.Update(product);
37+
38+
var stateUpdated = updatedProduct.State == EntityState.Modified;
39+
3640
var count = await _db.SaveChangesAsync();
3741

38-
return count == 1 ? NoContent() : StatusCode(StatusCodes.Status500InternalServerError);
42+
return stateUpdated && count == 1 ? NoContent() : StatusCode(StatusCodes.Status500InternalServerError);
3943
}
4044
}
4145
}

src/Api/Product.db

0 Bytes
Binary file not shown.

src/Api/Xero.Demo.Infrastructure/Security/ShouldBeAReaderAuthorizationHandler.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ protected override Task HandleRequirementAsync(AuthorizationHandlerContext conte
1919

2020
var claim = context.User.Claims.FirstOrDefault(x => x.Type == ClaimTypes.Role);
2121

22-
if (claim.Value == Roles.Reader) context.Succeed(requirement);
22+
if (claim.Value == Roles.Admin || claim.Value == Roles.Editor || claim.Value == Roles.Reader) context.Succeed(requirement);
2323

2424
return Task.CompletedTask;
2525
}

src/Api/Xero.Demo.Infrastructure/Security/ShouldBeAnAdminRequirementHandler.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ protected override Task HandleRequirementAsync(AuthorizationHandlerContext conte
1919

2020
var claim = context.User.Claims.FirstOrDefault(x => x.Type == ClaimTypes.Role);
2121

22-
if (claim.Value == Roles.Admin || claim.Value == Roles.Editor || claim.Value == Roles.Reader) context.Succeed(requirement);
22+
if (claim.Value == Roles.Admin) context.Succeed(requirement);
2323

2424
return Task.CompletedTask;
2525
}

0 commit comments

Comments
 (0)