Skip to content

Commit 50f2853

Browse files
committed
Versioned Controllers
Versioned Controllers added
1 parent 089dd2e commit 50f2853

File tree

5 files changed

+255
-0
lines changed

5 files changed

+255
-0
lines changed
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
using Microsoft.AspNetCore.Mvc;
2+
3+
namespace Supermarket.V1.Controller
4+
{
5+
[ApiController]
6+
[ApiVersion("1.0")]
7+
[Route("api/v{version:apiVersion}/[controller]")]
8+
public class AboutController : ControllerBase
9+
{
10+
[HttpGet]
11+
public IActionResult Get()
12+
{
13+
return Ok(new { message = "This is about Api Version 1.0" });
14+
}
15+
}
16+
}
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
using AutoMapper;
2+
using Microsoft.AspNetCore.Authorization;
3+
using Microsoft.AspNetCore.Identity;
4+
using Microsoft.AspNetCore.Mvc;
5+
using Microsoft.Extensions.Options;
6+
using Microsoft.IdentityModel.Tokens;
7+
using Supermarket.Extensions;
8+
using Supermarket.Identity.Models;
9+
using Supermarket.Resources;
10+
using System;
11+
using System.IdentityModel.Tokens.Jwt;
12+
using System.Linq;
13+
using System.Security.Claims;
14+
using System.Text;
15+
using System.Threading.Tasks;
16+
17+
namespace Supermarket.V1.Controller
18+
{
19+
[ApiController]
20+
[ApiVersion("1.0")]
21+
[Route("api/v{version:apiVersion}/[controller]")]
22+
public class AccountController : ControllerBase
23+
{
24+
private readonly UserManager<ApplicationUser> _userManager;
25+
private readonly SignInManager<ApplicationUser> _signInManager;
26+
private readonly ApplicationSettings _appSettings;
27+
private readonly IMapper _mapper;
28+
29+
public AccountController(UserManager<ApplicationUser> userManager, SignInManager<ApplicationUser> signInManager,
30+
IOptions<ApplicationSettings> appSettings, IMapper mapper)
31+
{
32+
_userManager = userManager;
33+
_signInManager = signInManager;
34+
_appSettings = appSettings.Value;
35+
_mapper = mapper;
36+
}
37+
38+
[HttpPost]
39+
[Route("Register")]
40+
public async Task<IActionResult> Register([FromBody]RegisterResource resource)
41+
{
42+
if (!ModelState.IsValid)
43+
return BadRequest(ModelState.GetErrorMessage());
44+
45+
var user = new ApplicationUser()
46+
{
47+
UserName = resource.Email,
48+
Email = resource.Email,
49+
FullName = resource.FullName
50+
};
51+
52+
var result = await _userManager.CreateAsync(user, resource.Password);
53+
54+
return Ok(result);
55+
}
56+
57+
[HttpPost]
58+
[Route("Login")]
59+
public async Task<IActionResult> Login([FromBody]LoginResource resource)
60+
{
61+
if (!ModelState.IsValid)
62+
return BadRequest(ModelState.GetErrorMessage());
63+
64+
var user = await _userManager.FindByNameAsync(resource.Email);
65+
66+
if (user != null && await _userManager.CheckPasswordAsync(user, resource.Password))
67+
{
68+
var tokenDescriptor = new SecurityTokenDescriptor
69+
{
70+
Subject = new ClaimsIdentity(new Claim[]
71+
{
72+
new Claim("UserId", user.Id.ToString())
73+
}),
74+
Expires = DateTime.UtcNow.AddDays(1),
75+
SigningCredentials = new SigningCredentials(
76+
new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_appSettings.JWT_Secret)),
77+
SecurityAlgorithms.HmacSha256Signature)
78+
};
79+
var tokenHandler = new JwtSecurityTokenHandler();
80+
var securityToken = tokenHandler.CreateToken(tokenDescriptor);
81+
var token = tokenHandler.WriteToken(securityToken);
82+
83+
return Ok(new { token });
84+
}
85+
else
86+
{
87+
return BadRequest(new { message = "Username or password is incorrect" });
88+
}
89+
}
90+
91+
[HttpGet]
92+
[Authorize]
93+
[Route("Profile")]
94+
public async Task<IActionResult> GetUserInfo()
95+
{
96+
var userId = User.Claims.First(c => c.Type == "UserId").Value;
97+
var user = await _userManager.FindByIdAsync(userId);
98+
99+
var userProfileResource = _mapper.Map<ApplicationUser, UserProfileResource>(user);
100+
101+
return Ok(userProfileResource);
102+
}
103+
}
104+
}
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
using AutoMapper;
2+
using Microsoft.AspNetCore.Authorization;
3+
using Microsoft.AspNetCore.Mvc;
4+
using Supermarket.Domain.Services.Contracts;
5+
using Supermarket.Entites.Models;
6+
using Supermarket.Extensions;
7+
using Supermarket.Resources;
8+
using System.Collections.Generic;
9+
using System.Threading.Tasks;
10+
11+
namespace Supermarket.V1.Controllers
12+
{
13+
[ApiVersion("1.0")]
14+
[Route("api/v{version:apiVersion}/[controller]")]
15+
[Authorize]
16+
[ApiController]
17+
public class CategoriesController : ControllerBase
18+
{
19+
private readonly IServiceWrapper _serviceWrapper;
20+
private readonly IMapper _mapper;
21+
22+
public CategoriesController(IServiceWrapper serviceWrapper, IMapper mapper)
23+
{
24+
_serviceWrapper = serviceWrapper;
25+
_mapper = mapper;
26+
}
27+
28+
[HttpGet]
29+
public async Task<IActionResult> GetAllAsync()
30+
{
31+
var categories = await _serviceWrapper.Category.ListAsync();
32+
33+
var resources = _mapper.Map<IEnumerable<Category>, IEnumerable<CategoryResource>>(categories);
34+
35+
return Ok(resources);
36+
}
37+
38+
[HttpPost]
39+
public async Task<IActionResult> PostAsync([FromBody] SaveCategoryResource resource)
40+
{
41+
if (!ModelState.IsValid)
42+
return BadRequest(ModelState.GetErrorMessage());
43+
44+
var category = _mapper.Map<SaveCategoryResource, Category>(resource);
45+
var result = await _serviceWrapper.Category.SaveAsync(category);
46+
47+
if (!result.Success)
48+
return BadRequest(result.Message);
49+
50+
var categoryResource = _mapper.Map<Category, CategoryResource>(result.Category);
51+
return Ok(categoryResource);
52+
}
53+
54+
[HttpPut("{id}")]
55+
public async Task<IActionResult> PutAsync(int id, [FromBody] SaveCategoryResource resource)
56+
{
57+
if (!ModelState.IsValid)
58+
return BadRequest(ModelState.GetErrorMessage());
59+
60+
var category = _mapper.Map<SaveCategoryResource, Category>(resource);
61+
var result = await _serviceWrapper.Category.UpdateAsync(id, category);
62+
63+
if (!result.Success)
64+
return BadRequest(result.Message);
65+
66+
var categoryResource = _mapper.Map<Category, CategoryResource>(result.Category);
67+
return Ok(categoryResource);
68+
}
69+
70+
[HttpDelete("{id}")]
71+
public async Task<IActionResult> DeleteAsync(int id)
72+
{
73+
var result = await _serviceWrapper.Category.DeleteAsync(id);
74+
75+
if (!result.Success)
76+
return BadRequest(result.Message);
77+
78+
var categoryResource = _mapper.Map<Category, CategoryResource>(result.Category);
79+
return Ok(categoryResource);
80+
}
81+
}
82+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
using AutoMapper;
2+
using Microsoft.AspNetCore.Authorization;
3+
using Microsoft.AspNetCore.Mvc;
4+
using Supermarket.Domain.Services.Contracts;
5+
using Supermarket.Entites.Models;
6+
using Supermarket.Resources;
7+
using System.Collections.Generic;
8+
using System.Threading.Tasks;
9+
10+
namespace Supermarket.V1.Controllers
11+
{
12+
[ApiVersion("1.0")]
13+
[Route("api/v{version:apiVersion}/[controller]")]
14+
[Authorize]
15+
[ApiController]
16+
public class ProductsController : ControllerBase
17+
{
18+
private readonly IServiceWrapper _serviceWrapper;
19+
private readonly IMapper _mapper;
20+
21+
public ProductsController(IServiceWrapper serviceWrapper, IMapper mapper)
22+
{
23+
_serviceWrapper = serviceWrapper;
24+
_mapper = mapper;
25+
}
26+
27+
[HttpGet]
28+
public async Task<IActionResult> GetAllAsync()
29+
{
30+
var products = await _serviceWrapper.Product.ListAsync();
31+
32+
var resources = _mapper.Map<IEnumerable<Product>, IEnumerable<ProductResource>>(products);
33+
34+
return Ok(resources);
35+
}
36+
}
37+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
using Microsoft.AspNetCore.Mvc;
2+
3+
namespace Supermarket.V2.Controller
4+
{
5+
[ApiController]
6+
[ApiVersion("2.0")]
7+
[Route("api/v{version:apiVersion}/[controller]")]
8+
public class AboutController : ControllerBase
9+
{
10+
[HttpGet]
11+
public IActionResult Get()
12+
{
13+
return Ok(new { message = "This is about Api Version 2.0" });
14+
}
15+
}
16+
}

0 commit comments

Comments
 (0)