Files
Microsoft.SelfService.Porta…/Controllers/VirtualMachineController.cs

201 lines
7.2 KiB
C#

using AutoMapper;
using Microsoft.AspNetCore.Mvc;
using Microsoft.SelfService.Portal.Core.API.Dto.VirtualMachine.Add;
using Microsoft.SelfService.Portal.Core.API.Dto.VirtualMachine.Edit;
using Microsoft.SelfService.Portal.Core.API.Dto.VirtualMachine.Get;
using Microsoft.SelfService.Portal.Core.API.Interfaces;
using Microsoft.SelfService.Portal.Core.API.Models;
namespace Microsoft.SelfService.Portal.Core.API.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class VirtualMachineController : Controller
{
private readonly IVirtualMachineInterface _virtualmachineInterface;
private readonly IDomainInterface _domainInterface;
private readonly IMapper _mapper;
public VirtualMachineController(IVirtualMachineInterface virtualmachineInterface, IDomainInterface domainInterface, IMapper mapper)
{
_virtualmachineInterface = virtualmachineInterface;
_domainInterface = domainInterface;
_mapper = mapper;
}
[HttpGet]
[ProducesResponseType(200, Type = typeof(IEnumerable<VirtualMachineModel>))]
public IActionResult GetVirtualMachines()
{
var virtualMachines = _mapper.Map<List<GetVirtualMachineDto>>(_virtualmachineInterface.GetVirtualMachines());
if (!ModelState.IsValid)
return BadRequest(ModelState);
return Ok(virtualMachines);
}
[HttpGet("{Id}")]
[ProducesResponseType(200, Type = typeof(VirtualMachineModel))]
[ProducesResponseType(400)]
public IActionResult GetVirtualMachineById(Guid Id)
{
if (!_virtualmachineInterface.CheckVirtualMachineById(Id))
return NotFound();
var virtualMachine = _mapper.Map<GetVirtualMachineDetailsDto>(_virtualmachineInterface.GetVirtualMachineById(Id));
if (!ModelState.IsValid)
return BadRequest(ModelState);
return Ok(virtualMachine);
}
[HttpPost]
[ProducesResponseType(200)]
[ProducesResponseType(400)]
public IActionResult AddVirtualMachineById([FromBody] AddVirtualMachineDto virtualMachine)
{
if (virtualMachine == null)
return BadRequest(ModelState);
if (_virtualmachineInterface.CheckVirtualMachineByName(virtualMachine.Name))
{
ModelState.AddModelError("", "VirtualMachine already exists");
return StatusCode(422, ModelState);
}
if (virtualMachine.DomainID.HasValue && !_domainInterface.CheckDomainById(virtualMachine.DomainID.Value))
{
ModelState.AddModelError("", "Domain does not exist");
return BadRequest(ModelState);
}
if (!ModelState.IsValid)
return BadRequest(ModelState);
var virtualMachineMap = _mapper.Map<VirtualMachineModel>(virtualMachine);
if (!_virtualmachineInterface.AddVirtualMachineById(virtualMachineMap))
{
ModelState.AddModelError("", "Something went wrong while saving");
return StatusCode(500, ModelState);
}
return Ok(virtualMachineMap.Id);
}
[HttpPut("{Id}")]
[ProducesResponseType(204)]
[ProducesResponseType(400)]
[ProducesResponseType(404)]
public IActionResult EditVirtualMachineById(Guid Id, [FromBody] EditVirtualMachineDto virtualMachine)
{
if (virtualMachine == null)
return BadRequest(ModelState);
if (!_virtualmachineInterface.CheckVirtualMachineById(Id))
return NotFound();
if (!ModelState.IsValid)
return BadRequest(ModelState);
var existingVirtualMachine = _virtualmachineInterface.GetVirtualMachineById(Id);
if (existingVirtualMachine == null)
return NotFound();
existingVirtualMachine.Name = virtualMachine.Name;
existingVirtualMachine.ExternalId = virtualMachine.ExternalId;
existingVirtualMachine.MetadataJson = virtualMachine.MetadataJson;
if (!_virtualmachineInterface.EditVirtualMachineById(existingVirtualMachine))
{
ModelState.AddModelError("", "Something went wrong");
return StatusCode(500, ModelState);
}
return NoContent();
}
[HttpPost("{Id}/Domain/{domainId}")]
[ProducesResponseType(204)]
[ProducesResponseType(400)]
[ProducesResponseType(404)]
[ProducesResponseType(409)]
public IActionResult LinkVirtualMachineToDomain(Guid Id, Guid domainId)
{
if (!_virtualmachineInterface.CheckVirtualMachineById(Id))
return NotFound();
if (!_domainInterface.CheckDomainById(domainId))
return NotFound();
var existingVirtualMachine = _virtualmachineInterface.GetVirtualMachineById(Id);
if (existingVirtualMachine == null)
return NotFound();
if (existingVirtualMachine.DomainID.HasValue)
return Conflict("VirtualMachine is already linked to a domain. Unlink it first.");
existingVirtualMachine.DomainID = domainId;
if (!_virtualmachineInterface.EditVirtualMachineById(existingVirtualMachine))
{
ModelState.AddModelError("", "Something went wrong");
return StatusCode(500, ModelState);
}
return NoContent();
}
[HttpDelete("{Id}/Domain")]
[ProducesResponseType(204)]
[ProducesResponseType(404)]
public IActionResult UnlinkVirtualMachineFromDomain(Guid Id)
{
if (!_virtualmachineInterface.CheckVirtualMachineById(Id))
return NotFound();
var existingVirtualMachine = _virtualmachineInterface.GetVirtualMachineById(Id);
if (existingVirtualMachine == null)
return NotFound();
if (!existingVirtualMachine.DomainID.HasValue)
return NoContent();
existingVirtualMachine.DomainID = null;
if (!_virtualmachineInterface.EditVirtualMachineById(existingVirtualMachine))
{
ModelState.AddModelError("", "Something went wrong");
return StatusCode(500, ModelState);
}
return NoContent();
}
[HttpDelete("{Id}")]
[ProducesResponseType(204)]
[ProducesResponseType(400)]
[ProducesResponseType(404)]
public IActionResult DeleteVirtualMachineById(Guid Id)
{
if (!_virtualmachineInterface.CheckVirtualMachineById(Id))
return NotFound();
if (!ModelState.IsValid)
return BadRequest(ModelState);
var virtualMachine = _virtualmachineInterface.GetVirtualMachineById(Id);
if (!_virtualmachineInterface.DeleteVirtualMachineById(virtualMachine))
{
ModelState.AddModelError("", "Something went wrong while deleting");
return StatusCode(500, ModelState);
}
return NoContent();
}
}
}