Added ServiceController
This commit is contained in:
parent
1172d89484
commit
87d65ba25d
103
Birdmap.API/Controllers/ServiceController.cs
Normal file
103
Birdmap.API/Controllers/ServiceController.cs
Normal file
@ -0,0 +1,103 @@
|
||||
using AutoMapper;
|
||||
using Birdmap.API.DTOs;
|
||||
using Birdmap.BLL.Interfaces;
|
||||
using Birdmap.DAL.Entities;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Net.Http;
|
||||
using System.Runtime.InteropServices.ComTypes;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Birdmap.API.Controllers
|
||||
{
|
||||
[Authorize]
|
||||
[ApiController]
|
||||
[Route("api/[controller]")]
|
||||
public class ServiceController : ControllerBase
|
||||
{
|
||||
private readonly IServiceService _service;
|
||||
private readonly IMapper _mapper;
|
||||
private readonly ILogger<ServiceController> _logger;
|
||||
|
||||
public ServiceController(IServiceService service, IMapper mapper, ILogger<ServiceController> logger)
|
||||
{
|
||||
_service = service;
|
||||
_mapper = mapper;
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
[HttpGet]
|
||||
[ProducesResponseType(StatusCodes.Status200OK)]
|
||||
public async Task<ActionResult<List<ServiceInfo>>> GetAsync()
|
||||
{
|
||||
_logger.LogInformation($"Getting all services from db...");
|
||||
var serviceInfos = (await _service.GetAllServicesAsync())
|
||||
.Select(s => new ServiceInfo { Service = _mapper.Map<ServiceRequest>(s) });
|
||||
|
||||
var client = new HttpClient();
|
||||
foreach (var si in serviceInfos)
|
||||
{
|
||||
try
|
||||
{
|
||||
_logger.LogInformation($"Sending a request to service '{si.Service.Name}' with url '{si.Service.Uri}'...");
|
||||
var response = await client.GetAsync(si.Service.Uri);
|
||||
si.StatusCode = response.StatusCode;
|
||||
si.Response = await response.Content.ReadAsStringAsync();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogWarning($"Requesting service '{si.Service.Name}' faulted.");
|
||||
si.StatusCode = System.Net.HttpStatusCode.ServiceUnavailable;
|
||||
si.Response = ex.ToString();
|
||||
}
|
||||
}
|
||||
|
||||
return serviceInfos.ToList();
|
||||
}
|
||||
|
||||
[HttpPost]
|
||||
[ProducesResponseType(StatusCodes.Status201Created)]
|
||||
public async Task<ActionResult<ServiceRequest>> PostAsync(ServiceRequest request)
|
||||
{
|
||||
_logger.LogInformation($"Creating service {request.Name}...");
|
||||
var created = await _service.CreateServiceAsync(
|
||||
_mapper.Map<Service>(request));
|
||||
|
||||
_logger.LogInformation($"Created service [{created.Id}].");
|
||||
|
||||
return CreatedAtAction(
|
||||
nameof(GetAsync),
|
||||
_mapper.Map<ServiceRequest>(created));
|
||||
}
|
||||
|
||||
[HttpPut]
|
||||
[ProducesResponseType(StatusCodes.Status204NoContent)]
|
||||
public async Task<IActionResult> PutAsync(ServiceRequest request)
|
||||
{
|
||||
_logger.LogInformation($"Updating service {request.Name}...");
|
||||
var service = _mapper.Map<Service>(request);
|
||||
service.IsFromConfig = false;
|
||||
|
||||
await _service.UpdateServiceAsync(service);
|
||||
|
||||
return NoContent();
|
||||
}
|
||||
|
||||
[HttpDelete("{id}")]
|
||||
[ProducesResponseType(StatusCodes.Status204NoContent)]
|
||||
public async Task<IActionResult> DeleteAsync(int id)
|
||||
{
|
||||
_logger.LogInformation($"Deleting service [{id}]...");
|
||||
|
||||
await _service.DeleteServiceAsync(id);
|
||||
|
||||
return NoContent();
|
||||
}
|
||||
}
|
||||
}
|
11
Birdmap.API/DTOs/ServiceInfo.cs
Normal file
11
Birdmap.API/DTOs/ServiceInfo.cs
Normal file
@ -0,0 +1,11 @@
|
||||
using System.Net;
|
||||
|
||||
namespace Birdmap.API.DTOs
|
||||
{
|
||||
public class ServiceInfo
|
||||
{
|
||||
public ServiceRequest Service { get; set; }
|
||||
public HttpStatusCode StatusCode { get; set; }
|
||||
public string Response { get; set; }
|
||||
}
|
||||
}
|
9
Birdmap.API/DTOs/ServiceRequest.cs
Normal file
9
Birdmap.API/DTOs/ServiceRequest.cs
Normal file
@ -0,0 +1,9 @@
|
||||
namespace Birdmap.API.DTOs
|
||||
{
|
||||
public class ServiceRequest
|
||||
{
|
||||
public int Id { get; set; }
|
||||
public string Name { get; set; }
|
||||
public string Uri { get; set; }
|
||||
}
|
||||
}
|
@ -1,5 +1,7 @@
|
||||
using AutoMapper;
|
||||
using Birdmap.API.DTOs;
|
||||
using Birdmap.DAL.Entities;
|
||||
using System;
|
||||
|
||||
namespace Birdmap.API.MapperProfiles
|
||||
{
|
||||
@ -7,10 +9,31 @@ namespace Birdmap.API.MapperProfiles
|
||||
{
|
||||
public BirdmapProfile()
|
||||
{
|
||||
CreateMap<User, DTOs.AuthenticateResponse>()
|
||||
CreateMap<Uri, string>().ConvertUsing<UriToStringConverter>();
|
||||
CreateMap<string, Uri>().ConvertUsing<UriToStringConverter>();
|
||||
|
||||
CreateMap<User, AuthenticateResponse>()
|
||||
.ForMember(m => m.Username, opt => opt.MapFrom(m => m.Name))
|
||||
.ForMember(m => m.UserRole, opt => opt.MapFrom(m => m.Role))
|
||||
.ReverseMap();
|
||||
|
||||
CreateMap<Service, ServiceRequest>()
|
||||
.ReverseMap();
|
||||
}
|
||||
|
||||
private class UriToStringConverter : ITypeConverter<Uri, string>, ITypeConverter<string, Uri>
|
||||
{
|
||||
public string Convert(Uri source, string destination, ResolutionContext context)
|
||||
{
|
||||
destination = source.ToString();
|
||||
return destination;
|
||||
}
|
||||
|
||||
public Uri Convert(string source, Uri destination, ResolutionContext context)
|
||||
{
|
||||
Uri.TryCreate(source, UriKind.Absolute, out destination);
|
||||
return destination;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
15
Birdmap.BLL/Interfaces/IServiceService.cs
Normal file
15
Birdmap.BLL/Interfaces/IServiceService.cs
Normal file
@ -0,0 +1,15 @@
|
||||
using Birdmap.DAL.Entities;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Birdmap.BLL.Interfaces
|
||||
{
|
||||
public interface IServiceService
|
||||
{
|
||||
Task<List<Service>> GetAllServicesAsync();
|
||||
Task<Service> GetServiceAsync(int id);
|
||||
Task<Service> CreateServiceAsync(Service service);
|
||||
Task DeleteServiceAsync(int id);
|
||||
Task UpdateServiceAsync(Service service);
|
||||
}
|
||||
}
|
55
Birdmap.BLL/Services/ServiceService.cs
Normal file
55
Birdmap.BLL/Services/ServiceService.cs
Normal file
@ -0,0 +1,55 @@
|
||||
using Birdmap.BLL.Exceptions;
|
||||
using Birdmap.BLL.Interfaces;
|
||||
using Birdmap.DAL;
|
||||
using Birdmap.DAL.Entities;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Birdmap.BLL.Services
|
||||
{
|
||||
public class ServiceService : IServiceService
|
||||
{
|
||||
private readonly BirdmapContext _context;
|
||||
|
||||
public ServiceService(BirdmapContext context)
|
||||
{
|
||||
_context = context;
|
||||
}
|
||||
|
||||
public async Task<Service> CreateServiceAsync(Service service)
|
||||
{
|
||||
_context.Services.Add(service);
|
||||
await _context.SaveChangesAsync();
|
||||
|
||||
return service;
|
||||
}
|
||||
|
||||
public Task DeleteServiceAsync(int id)
|
||||
{
|
||||
var service = _context.Services.Find(id);
|
||||
if (service == null)
|
||||
return Task.CompletedTask;
|
||||
|
||||
_context.Services.Remove(service);
|
||||
return _context.SaveChangesAsync();
|
||||
}
|
||||
|
||||
public Task<List<Service>> GetAllServicesAsync()
|
||||
{
|
||||
return _context.Services.ToListAsync();
|
||||
}
|
||||
|
||||
public async Task<Service> GetServiceAsync(int id)
|
||||
{
|
||||
return await _context.Services.SingleOrDefaultAsync(s => s.Id == id)
|
||||
?? throw new EntityNotFoundException($"Cannot find service with id: {id}.");
|
||||
}
|
||||
|
||||
public Task UpdateServiceAsync(Service service)
|
||||
{
|
||||
_context.Services.Update(service);
|
||||
return _context.SaveChangesAsync();
|
||||
}
|
||||
}
|
||||
}
|
@ -11,6 +11,7 @@ namespace Birdmap.BLL
|
||||
{
|
||||
services.AddTransient<IAuthService, AuthService>();
|
||||
services.AddTransient<IUserService, UserService>();
|
||||
services.AddTransient<IServiceService, ServiceService>();
|
||||
|
||||
return services;
|
||||
}
|
||||
|
@ -2,7 +2,6 @@
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using static Birdmap.Common.PasswordHelper;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user