using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using API.Data; using API.Data.Repositories; using API.DTOs.Device; using API.Extensions; using API.Services; using API.SignalR; using Kavita.Common; using Microsoft.AspNetCore.Mvc; namespace API.Controllers; /// /// Responsible interacting and creating Devices /// public class DeviceController : BaseApiController { private readonly IUnitOfWork _unitOfWork; private readonly IDeviceService _deviceService; private readonly IEmailService _emailService; private readonly IEventHub _eventHub; public DeviceController(IUnitOfWork unitOfWork, IDeviceService deviceService, IEmailService emailService, IEventHub eventHub) { _unitOfWork = unitOfWork; _deviceService = deviceService; _emailService = emailService; _eventHub = eventHub; } [HttpPost("create")] public async Task CreateOrUpdateDevice(CreateDeviceDto dto) { var user = await _unitOfWork.UserRepository.GetUserByUsernameAsync(User.GetUsername(), AppUserIncludes.Devices); if (user == null) return Unauthorized(); var device = await _deviceService.Create(dto, user); if (device == null) return BadRequest("There was an error when creating the device"); return Ok(); } [HttpPost("update")] public async Task UpdateDevice(UpdateDeviceDto dto) { var user = await _unitOfWork.UserRepository.GetUserByUsernameAsync(User.GetUsername(), AppUserIncludes.Devices); if (user == null) return Unauthorized(); var device = await _deviceService.Update(dto, user); if (device == null) return BadRequest("There was an error when updating the device"); return Ok(); } /// /// Deletes the device from the user /// /// /// [HttpDelete] public async Task DeleteDevice(int deviceId) { if (deviceId <= 0) return BadRequest("Not a valid deviceId"); var user = await _unitOfWork.UserRepository.GetUserByUsernameAsync(User.GetUsername(), AppUserIncludes.Devices); if (user == null) return Unauthorized(); if (await _deviceService.Delete(user, deviceId)) return Ok(); return BadRequest("Could not delete device"); } [HttpGet] public async Task>> GetDevices() { var userId = await _unitOfWork.UserRepository.GetUserIdByUsernameAsync(User.GetUsername()); return Ok(await _unitOfWork.DeviceRepository.GetDevicesForUserAsync(userId)); } [HttpPost("send-to")] public async Task SendToDevice(SendToDeviceDto dto) { if (dto.ChapterIds.Any(i => i < 0)) return BadRequest("ChapterIds must be greater than 0"); if (dto.DeviceId < 0) return BadRequest("DeviceId must be greater than 0"); if (await _emailService.IsDefaultEmailService()) return BadRequest("Send to device cannot be used with Kavita's email service. Please configure your own."); var userId = await _unitOfWork.UserRepository.GetUserIdByUsernameAsync(User.GetUsername()); await _eventHub.SendMessageToAsync(MessageFactory.NotificationProgress, MessageFactory.SendingToDeviceEvent($"Transferring files to your device", "started"), userId); try { var success = await _deviceService.SendTo(dto.ChapterIds, dto.DeviceId); if (success) return Ok(); } catch (KavitaException ex) { return BadRequest(ex.Message); } finally { await _eventHub.SendMessageToAsync(MessageFactory.SendingToDevice, MessageFactory.SendingToDeviceEvent($"Transferring files to your device", "ended"), userId); } return BadRequest("There was an error sending the file to the device"); } [HttpPost("send-series-to")] public async Task SendSeriesToDevice(SendSeriesToDeviceDto dto) { if (dto.SeriesId <= 0) return BadRequest("SeriesId must be greater than 0"); if (dto.DeviceId < 0) return BadRequest("DeviceId must be greater than 0"); if (await _emailService.IsDefaultEmailService()) return BadRequest("Send to device cannot be used with Kavita's email service. Please configure your own."); var userId = await _unitOfWork.UserRepository.GetUserIdByUsernameAsync(User.GetUsername()); await _eventHub.SendMessageToAsync(MessageFactory.NotificationProgress, MessageFactory.SendingToDeviceEvent($"Transferring files to your device", "started"), userId); var series = await _unitOfWork.SeriesRepository.GetSeriesByIdAsync(dto.SeriesId, SeriesIncludes.Volumes | SeriesIncludes.Chapters); if (series == null) return BadRequest("Series doesn't Exist"); var chapterIds = series.Volumes.SelectMany(v => v.Chapters.Select(c => c.Id)).ToList(); try { var success = await _deviceService.SendTo(chapterIds, dto.DeviceId); if (success) return Ok(); } catch (KavitaException ex) { return BadRequest(ex.Message); } finally { await _eventHub.SendMessageToAsync(MessageFactory.SendingToDevice, MessageFactory.SendingToDeviceEvent($"Transferring files to your device", "ended"), userId); } return BadRequest("There was an error sending the file(s) to the device"); } }