using System.ComponentModel.DataAnnotations;
using Microsoft.AspNetCore.Mvc;
using SWAD.API.Consts;
using SWAD.API.Consts.Enums;
using SWAD.API.Controllers.DTOs;
using SWAD.API.Services.Links;
namespace SWAD.API.Controllers;
///
/// Controller for get links from music providers
///
[Tags($"{nameof(LinkController)}: Controller for get links from music providers")]
[Route("[controller]")]
[ApiController]
public class LinkController(LinksService linksService) : SwadController
{
///
/// Get link from other link
///
/// Track query such as Name, artist, Albums
/// Link for track
[HttpPost("FromLink")]
[ProducesResponseType(typeof(LinkResultDto), 200)]
[ProducesResponseType(typeof(ProblemDetails), 400)]
[ProducesResponseType(typeof(ProblemDetails), 404)]
[ProducesResponseType(typeof(ProblemDetails), 502)]
public async Task GetLink(TrackLinkDto track)
{
var serviceResult = await linksService.MapLinks(track);
switch (serviceResult.result)
{
case ServiceResult.Success:
return Ok(new LinkResultDto(serviceResult.link));
case ServiceResult.Failure:
return BadRequest($"{track.Link} is not recognized. Try other link");
case ServiceResult.NoResponse:
return BadGateway("Bad gateway with one of services");
case ServiceResult.BadRequest:
return BadRequest($"Unknown service {track.Service} or parameters not valid");
case ServiceResult.NotFound:
return NotFound(ErrorResources.NotFound);
default:
throw new ApplicationException("Unknown response from service");
}
}
///
/// Get link from search query such as artist and song Name
///
/// Track query such as Name, artist, Albums
/// Link for track
[HttpPost("FromQuery")]
[ProducesResponseType(typeof(LinkResultDto), 200)]
[ProducesResponseType(typeof(ProblemDetails), 400)]
[ProducesResponseType(typeof(ProblemDetails), 404)]
[ProducesResponseType(typeof(ProblemDetails), 502)]
public async Task GetLink(TrackDto track)
{
var serviceResult = await linksService.GetLinkByQuery(track);
switch (serviceResult.result)
{
case ServiceResult.Success:
return Ok(new LinkResultDto(serviceResult.link));
case ServiceResult.Failure:
return NotFound($"Track {track.Name} - {track.Artist} not found!");
case ServiceResult.NoResponse:
return BadGateway($"Bad gateway with service {track.Service}");
case ServiceResult.BadRequest:
return BadRequest($"Unknown service {track.Service} or parameters not valid");
case ServiceResult.NotFound:
return BadRequest(ErrorResources.NotFound);
default:
throw new ApplicationException($"Unknown response from service {linksService}");
}
}
///
/// Get service what uses that link
///
///
///
///
[HttpGet("GetService")]
[ProducesResponseType(typeof(ServiceDto), 200)]
[ProducesResponseType(typeof(ProblemDetails), 400)]
public async Task GetServiceOfLink([Required] string link)
{
var serviceResult = await linksService.GetServiceByLink(link);
switch (serviceResult.result)
{
case ServiceResult.Success:
return Ok(new ServiceDto(serviceResult.service!.Value,
serviceResult.service.Value.ToString()));
case ServiceResult.Failure:
return BadRequest($"{link} is not recognized. Try other link");
default:
throw new ApplicationException("WTF are you doing?");
}
}
}