using AutoMapper;
using Services.CategoryAPI.Models;
using Services.CategoryAPI.Models.Dto;
namespace Services.CategoryAPI
{
public class MappingConfig
{
public static MapperConfiguration RegisterMaps()
{
var mappingConfig = new MapperConfiguration(config =>
{
config.CreateMap<CategoryDto, Category>().ReverseMap();
});
return mappingConfig;
}
}
}
- Create WebApplicationBuilderExtensions in Extensions folder
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;
using System.Text;
namespace Services.CategoryAPI.Extensions
{
public static class WebApplicationBuilderExtensions
{
public static WebApplicationBuilder AddAppAuthetication(this WebApplicationBuilder builder)
{
var settingsSection = builder.Configuration.GetSection("ApiSettings");
var secret = settingsSection.GetValue<string>("Secret");
var issuer = settingsSection.GetValue<string>("Issuer");
var audience = settingsSection.GetValue<string>("Audience");
var key = Encoding.ASCII.GetBytes(secret);
builder.Services.AddAuthentication(x =>
{
x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(x =>
{
x.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(key),
ValidateIssuer = true,
ValidIssuer = issuer,
ValidAudience = audience,
ValidateAudience = true
};
});
return builder;
}
}
}
- Create ResponseDto.cs in Models/Dto folder
using System.Text.Json.Serialization;
namespace Services.AuthAPI.Models.Dto
{
public class ResponseDto
{
[JsonPropertyName("data")]
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault | JsonIgnoreCondition.WhenWritingNull)]
public object? Result { get; set; }
[JsonPropertyName("success")]
public bool IsSuccess { get; set; } = true;
[JsonPropertyName("message")]
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault | JsonIgnoreCondition.WhenWritingNull)]
public string? Message { get; set; }
}
}
"ConnectionStrings": {
"DefaultConnection": "Server=DESKTOP-A01;Database=Category;Trusted_Connection=True;TrustServerCertificate=True;Integrated Security=true"
},
"ApiSettings": {
"Secret": "THIS IS USED TO SIGN AND VERIFY JWT TOKENS",
"Issuer": "mango-auth-api",
"Audience": "mango-client"
}
using AutoMapper;
using Services.CategoryAPI;
using Services.CategoryAPI.Data;
using Services.CategoryAPI.Extensions;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.EntityFrameworkCore;
using Microsoft.OpenApi.Models;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddDbContext<AppDbContext>(option =>
{
option.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection"));
});
IMapper mapper = MappingConfig.RegisterMaps().CreateMapper();
builder.Services.AddSingleton(mapper);
builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen(option =>
{
option.AddSecurityDefinition(name: JwtBearerDefaults.AuthenticationScheme, securityScheme: new OpenApiSecurityScheme
{
Name = "Authorization",
Description = "Enter the Bearer Authorization string as following: `Bearer Generated-JWT-Token`",
In = ParameterLocation.Header,
Type = SecuritySchemeType.ApiKey,
Scheme = "Bearer"
});
option.AddSecurityRequirement(new OpenApiSecurityRequirement
{
{
new OpenApiSecurityScheme
{
Reference= new OpenApiReference
{
Type = ReferenceType.SecurityScheme,
Id = JwtBearerDefaults.AuthenticationScheme
}
}, new string[]{}
}
});
});
builder.AddAppAuthetication();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.UseAuthentication();
app.UseAuthorization();
app.MapControllers();
ApplyMigration();
app.Run();
void ApplyMigration()
{
using (var scope = app.Services.CreateScope())
{
var _db = scope.ServiceProvider.GetRequiredService<AppDbContext>();
if (_db.Database.GetPendingMigrations().Count() > 0)
{
_db.Database.Migrate();
}
}
}
- Create CategoryAPIController.cs in Controllers folder
using AutoMapper;
using Services.CategoryAPI.Data;
using Services.CategoryAPI.Models.Dto;
using Services.CategoryAPI.Models;
using Microsoft.AspNetCore.Mvc;
namespace Lumina.Services.CategoryAPI.Controllers
{
[Route("api/category")]
[ApiController]
public class CategoryAPIController : ControllerBase
{
private readonly AppDbContext _db;
private ResponseDto _response;
private IMapper _mapper;
public CategoryAPIController(AppDbContext db, IMapper mapper)
{
_db = db;
_mapper = mapper;
_response = new ResponseDto();
}
[HttpGet]
public ResponseDto Get()
{
try
{
IEnumerable<Category> objList = _db.Categories.ToList();
_response.Result = _mapper.Map<IEnumerable<CategoryDto>>(objList);
}
catch (Exception ex)
{
_response.IsSuccess = false;
_response.Message = ex.Message;
}
return _response;
}
[HttpGet]
[Route("{id:int}")]
public ResponseDto Get(int id)
{
try
{
Category obj = _db.Categories.First(u => u.CateId == id);
_response.Result = _mapper.Map<CategoryDto>(obj);
}
catch (Exception ex)
{
_response.IsSuccess = false;
_response.Message = ex.Message;
}
return _response;
}
[HttpPost]
public ResponseDto Post([FromBody] CategoryDto categoryDto)
{
try
{
Category obj = _mapper.Map<Category>(categoryDto);
_db.Categories.Add(obj);
_db.SaveChanges();
_response.Result = _mapper.Map<CategoryDto>(obj);
}
catch (Exception ex)
{
_response.IsSuccess = false;
_response.Message = ex.Message;
}
return _response;
}
[HttpPut]
public ResponseDto Put([FromBody] CategoryDto categoryDto)
{
try
{
Category obj = _mapper.Map<Category>(categoryDto);
_db.Categories.Update(obj);
_db.SaveChanges();
_response.Result = _mapper.Map<CategoryDto>(obj);
}
catch (Exception ex)
{
_response.IsSuccess = false;
_response.Message = ex.Message;
}
return _response;
}
[HttpDelete]
public ResponseDto Delete(int id)
{
try
{
Category obj = _db.Categories.First(u => u.CateId == id);
_db.Categories.Remove(obj);
_db.SaveChanges();
_response.Result = _mapper.Map<CategoryDto>(obj);
}
catch (Exception ex)
{
_response.IsSuccess = false;
_response.Message = ex.Message;
}
return _response;
}
}
}