birbmap/Birdmap.API/Controllers/ServicesController.cs

101 lines
3.5 KiB
C#
Raw Normal View History

2020-11-01 12:25:45 +01:00
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.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Threading.Tasks;
namespace Birdmap.API.Controllers
{
2020-11-11 16:55:50 +01:00
[Authorize(Roles = "User, Admin")]
2020-11-01 12:25:45 +01:00
[ApiController]
[Route("api/[controller]")]
2020-11-01 14:08:08 +01:00
public class ServicesController : ControllerBase
2020-11-01 12:25:45 +01:00
{
private readonly IServiceService _service;
private readonly IMapper _mapper;
2020-11-01 14:08:08 +01:00
private readonly ILogger<ServicesController> _logger;
2020-11-01 12:25:45 +01:00
2020-11-01 14:08:08 +01:00
public ServicesController(IServiceService service, IMapper mapper, ILogger<ServicesController> logger)
2020-11-01 12:25:45 +01:00
{
_service = service;
_mapper = mapper;
_logger = logger;
}
[HttpGet, ProducesResponseType(StatusCodes.Status200OK)]
2020-11-01 12:25:45 +01:00
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
{
2020-11-01 12:28:33 +01:00
_logger.LogInformation($"Sending a request to service [{si.Service.Name}] with url [{si.Service.Uri}]...");
2020-11-01 12:25:45 +01:00
var response = await client.GetAsync(si.Service.Uri);
si.StatusCode = response.StatusCode;
si.Response = await response.Content.ReadAsStringAsync();
}
catch (Exception ex)
{
2020-11-01 12:28:33 +01:00
_logger.LogWarning($"Requesting service [{si.Service.Name}] faulted.");
2020-11-01 12:25:45 +01:00
si.StatusCode = System.Net.HttpStatusCode.ServiceUnavailable;
si.Response = ex.ToString();
}
}
return serviceInfos.ToList();
}
2020-11-11 16:55:50 +01:00
[Authorize(Roles = "Admin")]
[HttpPost, ProducesResponseType(StatusCodes.Status201Created)]
2020-11-01 12:25:45 +01:00
public async Task<ActionResult<ServiceRequest>> PostAsync(ServiceRequest request)
{
2020-11-01 12:28:33 +01:00
_logger.LogInformation($"Creating service [{request.Name}]...");
2020-11-01 12:25:45 +01:00
var created = await _service.CreateServiceAsync(
_mapper.Map<Service>(request));
_logger.LogInformation($"Created service [{created.Id}].");
return CreatedAtAction(
nameof(GetAsync),
_mapper.Map<ServiceRequest>(created));
}
2020-11-11 16:55:50 +01:00
[Authorize(Roles = "Admin")]
[HttpPut, ProducesResponseType(StatusCodes.Status204NoContent)]
2020-11-01 12:25:45 +01:00
public async Task<IActionResult> PutAsync(ServiceRequest request)
{
2020-11-01 12:28:33 +01:00
_logger.LogInformation($"Updating service [{request.Name}]...");
2020-11-01 12:25:45 +01:00
var service = _mapper.Map<Service>(request);
service.IsFromConfig = false;
await _service.UpdateServiceAsync(service);
return NoContent();
}
2020-11-11 16:55:50 +01:00
[Authorize(Roles = "Admin")]
[HttpDelete("{id}"), ProducesResponseType(StatusCodes.Status204NoContent)]
2020-11-01 12:25:45 +01:00
public async Task<IActionResult> DeleteAsync(int id)
{
_logger.LogInformation($"Deleting service [{id}]...");
await _service.DeleteServiceAsync(id);
return NoContent();
}
}
}