Skip to content
This repository was archived by the owner on Nov 13, 2021. It is now read-only.

Maturity level two issues #104

Merged
merged 16 commits into from
Mar 22, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion maturity-level-one/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@
- [Versioning](#versioning)
- [Data Contracts](#data-contracts)
- [HTTP Methods](#http-methods)
- [HTTP Status Codes](#http-status-codes)
- [HTTP Status Codes](#http-status-codes
)
2. [Security-first](#security-first)
3. [Error Handling](#error-handling)
4. [Document your APIs](#document-your-apis)
Expand Down
7 changes: 4 additions & 3 deletions maturity-level-two/src/ContentTypeNames.cs
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
namespace Codit.LevelTwo
namespace Codit.LevelTwo
{
public static class ContentTypeNames
static class ContentTypeNames
{
public static class Application
internal static class Application

{
public const string Json = "application/json";
public const string JsonPatch = "application/json-patch+json";
Expand Down
45 changes: 20 additions & 25 deletions maturity-level-two/src/Controllers/v1/CustomizationController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -77,9 +77,7 @@ public async Task<IActionResult> GetCustomization(int id)
[SwaggerResponse((int)HttpStatusCode.BadRequest, "Invalid request")]
[SwaggerResponse((int)HttpStatusCode.InternalServerError, "API is not available")]
public async Task<IActionResult> Create(NewCustomizationDto newCustomization)
{


{
if (newCustomization.CarId == -9999)
{
throw new ArgumentException("this is evil code");
Expand Down Expand Up @@ -117,13 +115,15 @@ public async Task<IActionResult> Create(NewCustomizationDto newCustomization)
[SwaggerResponse((int)HttpStatusCode.InternalServerError, "API is not available")]
public async Task<IActionResult> DeleteCustomization(int id)
{
var CustomizationObj = await _coditoRepository.GetCustomizationAsync(id);
if (CustomizationObj == null)
int numberOfChanges = await _coditoRepository.DeleteCustomizationAsync(id);
if(numberOfChanges > 0)
{
return NotFound(new ProblemDetailsError(StatusCodes.Status404NotFound));
return NoContent();
}
await _coditoRepository.DeleteCustomizationAsync(id);
return NoContent();
else
{
return NotFound(new ProblemDetailsError(StatusCodes.Status404NotFound));
}
}

/// <summary>
Expand All @@ -145,8 +145,9 @@ public async Task<IActionResult> UpdateIncremental(int id, [FromBody] Customizat
return NotFound(new ProblemDetailsError(StatusCodes.Status404NotFound));
}

// User passes Id as a parameter. If an Id is passed in the body, it is ignored.
customizationDto.Id = id;
var customizationUpdated = Mapper.Map<Customization>(customizationDto);
customizationUpdated.Id = id;

await _coditoRepository.ApplyPatchAsync(customizationUpdated);
return NoContent();
Expand All @@ -160,27 +161,21 @@ public async Task<IActionResult> UpdateIncremental(int id, [FromBody] Customizat
/// <returns>Acknowledge that the c</returns>
[HttpPost("{id}/sale", Name = Constants.RouteNames.v1.SellCustomization)]
[SwaggerResponse((int)HttpStatusCode.Accepted, "Sale accepted. No response body")]
[SwaggerResponse((int)HttpStatusCode.BadRequest, "Out of stock")]
[SwaggerResponse((int)HttpStatusCode.Conflict, "Out of stock")]
[SwaggerResponse((int)HttpStatusCode.NotFound, "Car customization not found")]
[SwaggerResponse((int)HttpStatusCode.InternalServerError, "API is not available")]
public async Task<IActionResult> VoteAsBestPlayer(int id)
public async Task<IActionResult> SellCustomization(int id)
{
var customization = await _coditoRepository.GetCustomizationAsync(id);
if (customization == null)
SalesRequestResult result = await _coditoRepository.ApplyCustomizationSaleAsync(id);
switch (result)
{
return NotFound(new ProblemDetailsError(StatusCodes.Status404NotFound));
}
if (customization.InventoryLevel <= 0)
{
return BadRequest();
case SalesRequestResult.NotFound:
return NotFound(new ProblemDetailsError(StatusCodes.Status404NotFound));
case SalesRequestResult.OutOfStock:
return Conflict(new ProblemDetailsError(StatusCodes.Status409Conflict));
default:
return Accepted();
}

await _coditoRepository.ApplyCustomizationSaleAsync(customization);

return Accepted();
}



}
}
2 changes: 1 addition & 1 deletion maturity-level-two/src/Controllers/v1/ErrorController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;

namespace Codit.LevelOne.Controllers.v1
namespace Codit.LevelTwo.Controllers.v1
{
[Route("/errors")]
[ApiController]
Expand Down
72 changes: 32 additions & 40 deletions maturity-level-two/src/DB/DbDataSeed.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
using System;
using Codit.LevelTwo.Entities;
using System.Collections.Generic;
using System.Linq;
using Codit.LevelTwo.Entities;


namespace Codit.LevelTwo.DB
{
Expand All @@ -21,52 +21,44 @@ public static void DataSeed(this CoditoContext context)
Brand = "Volkswagen",
Model = "Tiguan",
BodyType = CarBodyType.SUV,
Description = "Volkswagen's SUV model.",

Customizations = new List<Customization>
{
new Customization
{
NumberSold = 5,
Name = "Tiguan Trendline",
Url = "https://fake-url.com",
InventoryLevel = 4
},
new Customization
{
NumberSold = 3,
Name = "Tiguan Comfortline",
Url = "https://fake-url.com",
InventoryLevel = 4
}
}
Description = "Volkswagen's SUV model."
},
new Car
{
Brand = "Skoda",
Model = "Octavia Combi",
BodyType = CarBodyType.Break,
Description = "Skoda's most popular break.",

Customizations = new List<Customization>
{
new Customization
{
NumberSold = 3,
Name = "Octavia Combi RS",
Url = "https://fake-url.com",
InventoryLevel = 8
},
new Customization
{
NumberSold = 4,
Name = "Octavia Combi Scout",
Url = "https://fake-url.com",
InventoryLevel = 6
}
}
Description = "Skoda's most popular break."
}
};
cars[0].Customizations.Add(new Customization
{
NumberSold = 5,
Name = "Tiguan Trendline",
Url = "https://fake-url.com",
InventoryLevel = 4
});
cars[0].Customizations.Add(new Customization
{
NumberSold = 3,
Name = "Tiguan Comfortline",
Url = "https://fake-url.com",
InventoryLevel = 4
});
cars[1].Customizations.Add(new Customization
{
NumberSold = 3,
Name = "Octavia Combi RS",
Url = "https://fake-url.com",
InventoryLevel = 8
});
cars[1].Customizations.Add(new Customization
{
NumberSold = 4,
Name = "Octavia Combi Scout",
Url = "https://fake-url.com",
InventoryLevel = 6
});

context.Cars.AddRange(cars);
context.SaveChanges();
Expand Down
6 changes: 2 additions & 4 deletions maturity-level-two/src/Entities/Car.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ namespace Codit.LevelTwo.Entities
public class Car
{
[Key]
public int Id { get; set; }
public int Id { get; private set; }

[Required]
public string Brand { get; set; }
Expand All @@ -20,8 +20,6 @@ public class Car

public string Description { get; set; }

public ICollection<Customization> Customizations { get; set; } = new List<Customization>();


public ICollection<Customization> Customizations { get; } = new List<Customization>();
}
}
12 changes: 7 additions & 5 deletions maturity-level-two/src/Entities/Customization.cs
Original file line number Diff line number Diff line change
@@ -1,15 +1,12 @@
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;




namespace Codit.LevelTwo.Entities
{
public class Customization
{
[Key]
public int Id { get; set; }
public int Id { get; private set; }

[Required]
public string Name { get; set; }
Expand All @@ -19,12 +16,17 @@ public class Customization

public int NumberSold { get; set; }


public int InventoryLevel { get; set; }

[ForeignKey(name: "CarId")]
public Car Car { get; set; }

public int CarId { get; set; }

public void Sell()
{
NumberSold += 1;
InventoryLevel -= 1;
}
}
}
16 changes: 8 additions & 8 deletions maturity-level-two/src/Open-Api-Docs.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading