aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEthan Pippin <ethanpippin2343@gmail.com>2026-05-21 13:30:24 -0400
committerGitHub <noreply@github.com>2026-05-21 19:30:24 +0200
commit40485aa2f67c903baab2cdde939f4ee13c40b569 (patch)
treedb9b67ddb53ef18361d7d6d4723106d439cfe2ac
parent49cc2f78990d2b78c0dabea327ddd79c8f90e2ef (diff)
Have device deletion take list of ids (#12834)
* add delete multiple devices via id * make atomic * use Add * Update Jellyfin.Api/Controllers/DevicesController.cs Co-authored-by: JPVenson <ger-delta-07@hotmail.de> * remove model binding, use functional device selection * use singular id * use BadRequest instead --------- Co-authored-by: JPVenson <ger-delta-07@hotmail.de>
-rw-r--r--Jellyfin.Api/Controllers/DevicesController.cs33
1 files changed, 20 insertions, 13 deletions
diff --git a/Jellyfin.Api/Controllers/DevicesController.cs b/Jellyfin.Api/Controllers/DevicesController.cs
index eadb8c9855..2bbfeb40b8 100644
--- a/Jellyfin.Api/Controllers/DevicesController.cs
+++ b/Jellyfin.Api/Controllers/DevicesController.cs
@@ -1,7 +1,11 @@
using System;
+using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
+using System.Linq;
using System.Threading.Tasks;
+using Jellyfin.Api.Attributes;
using Jellyfin.Api.Helpers;
+using Jellyfin.Api.ModelBinders;
using Jellyfin.Data.Dtos;
using Jellyfin.Data.Queries;
using MediaBrowser.Common.Api;
@@ -112,28 +116,31 @@ public class DevicesController : BaseJellyfinApiController
}
/// <summary>
- /// Deletes a device.
+ /// Deletes devices.
/// </summary>
- /// <param name="id">Device Id.</param>
+ /// <param name="id">Device Ids.</param>
/// <response code="204">Device deleted.</response>
- /// <response code="404">Device not found.</response>
- /// <returns>A <see cref="NoContentResult"/> on success, or a <see cref="NotFoundResult"/> if the device could not be found.</returns>
+ /// <response code="400">A requested device is invalid.</response>
+ /// <returns>A <see cref="NoContentResult"/> on success, or a <see cref="BadRequestResult"/> if a requested device is invalid.</returns>
[HttpDelete]
[ProducesResponseType(StatusCodes.Status204NoContent)]
- [ProducesResponseType(StatusCodes.Status404NotFound)]
- public async Task<ActionResult> DeleteDevice([FromQuery, Required] string id)
+ [ProducesResponseType(StatusCodes.Status400BadRequest)]
+ public async Task<ActionResult> DeleteDevice([FromQuery] string[] id)
{
- var existingDevice = _deviceManager.GetDevice(id);
- if (existingDevice is null)
+ var devices = id.Select(_deviceManager.GetDevice).ToArray();
+ if (devices.Any(f => f is null))
{
- return NotFound();
+ return BadRequest();
}
- var sessions = _deviceManager.GetDevices(new DeviceQuery { DeviceId = id });
-
- foreach (var session in sessions.Items)
+ foreach (var device in devices)
{
- await _sessionManager.Logout(session).ConfigureAwait(false);
+ var sessions = _deviceManager.GetDevices(new DeviceQuery { DeviceId = device!.Id });
+
+ foreach (var session in sessions.Items)
+ {
+ await _sessionManager.Logout(session).ConfigureAwait(false);
+ }
}
return NoContent();