| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 | using System;using System.ComponentModel.DataAnnotations;using System.Threading.Tasks;using Jellyfin.Api.Constants;using Jellyfin.Api.Extensions;using Jellyfin.Api.ModelBinders;using MediaBrowser.Controller.Collections;using MediaBrowser.Controller.Dto;using MediaBrowser.Controller.Net;using MediaBrowser.Model.Collections;using Microsoft.AspNetCore.Authorization;using Microsoft.AspNetCore.Http;using Microsoft.AspNetCore.Mvc;namespace Jellyfin.Api.Controllers{    /// <summary>    /// The collection controller.    /// </summary>    [Route("Collections")]    [Authorize(Policy = Policies.DefaultAuthorization)]    public class CollectionController : BaseJellyfinApiController    {        private readonly ICollectionManager _collectionManager;        private readonly IDtoService _dtoService;        private readonly IAuthorizationContext _authContext;        /// <summary>        /// Initializes a new instance of the <see cref="CollectionController"/> class.        /// </summary>        /// <param name="collectionManager">Instance of <see cref="ICollectionManager"/> interface.</param>        /// <param name="dtoService">Instance of <see cref="IDtoService"/> interface.</param>        /// <param name="authContext">Instance of <see cref="IAuthorizationContext"/> interface.</param>        public CollectionController(            ICollectionManager collectionManager,            IDtoService dtoService,            IAuthorizationContext authContext)        {            _collectionManager = collectionManager;            _dtoService = dtoService;            _authContext = authContext;        }        /// <summary>        /// Creates a new collection.        /// </summary>        /// <param name="name">The name of the collection.</param>        /// <param name="ids">Item Ids to add to the collection.</param>        /// <param name="parentId">Optional. Create the collection within a specific folder.</param>        /// <param name="isLocked">Whether or not to lock the new collection.</param>        /// <response code="200">Collection created.</response>        /// <returns>A <see cref="CollectionCreationOptions"/> with information about the new collection.</returns>        [HttpPost]        [ProducesResponseType(StatusCodes.Status200OK)]        public async Task<ActionResult<CollectionCreationResult>> CreateCollection(            [FromQuery] string? name,            [FromQuery, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] string[] ids,            [FromQuery] Guid? parentId,            [FromQuery] bool isLocked = false)        {            var userId = _authContext.GetAuthorizationInfo(Request).UserId;            var item = await _collectionManager.CreateCollectionAsync(new CollectionCreationOptions            {                IsLocked = isLocked,                Name = name,                ParentId = parentId,                ItemIdList = ids,                UserIds = new[] { userId }            }).ConfigureAwait(false);            var dtoOptions = new DtoOptions().AddClientFields(Request);            var dto = _dtoService.GetBaseItemDto(item, dtoOptions);            return new CollectionCreationResult            {                Id = dto.Id            };        }        /// <summary>        /// Adds items to a collection.        /// </summary>        /// <param name="collectionId">The collection id.</param>        /// <param name="ids">Item ids, comma delimited.</param>        /// <response code="204">Items added to collection.</response>        /// <returns>A <see cref="NoContentResult"/> indicating success.</returns>        [HttpPost("{collectionId}/Items")]        [ProducesResponseType(StatusCodes.Status204NoContent)]        public async Task<ActionResult> AddToCollection(            [FromRoute, Required] Guid collectionId,            [FromQuery, Required, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] Guid[] ids)        {            await _collectionManager.AddToCollectionAsync(collectionId, ids).ConfigureAwait(true);            return NoContent();        }        /// <summary>        /// Removes items from a collection.        /// </summary>        /// <param name="collectionId">The collection id.</param>        /// <param name="ids">Item ids, comma delimited.</param>        /// <response code="204">Items removed from collection.</response>        /// <returns>A <see cref="NoContentResult"/> indicating success.</returns>        [HttpDelete("{collectionId}/Items")]        [ProducesResponseType(StatusCodes.Status204NoContent)]        public async Task<ActionResult> RemoveFromCollection(            [FromRoute, Required] Guid collectionId,            [FromQuery, Required, ModelBinder(typeof(CommaDelimitedArrayModelBinder))] Guid[] ids)        {            await _collectionManager.RemoveFromCollectionAsync(collectionId, ids).ConfigureAwait(false);            return NoContent();        }    }}
 |