private async Task <InternalFolder> ValidateAddFolderShare(AddFolderShareBody body)
        {
            if (string.IsNullOrWhiteSpace(body.Name))
            {
                throw (HttpResultException)BadRequest("Name missing");
            }

            string         userId = HttpContext.User.FindFirstValue(ClaimTypes.NameIdentifier);
            InternalFolder folder = await ShareFolderHelper.GetFolderItem(body.Path, dbContext, userId, this);

            if (folder == null)
            {
                throw (HttpResultException)NotFound("Base not found");
            }
            if (!HasPermission(folder.Permission, body.Permission))
            {
                throw (HttpResultException)Forbid();
            }
            if (!string.IsNullOrWhiteSpace(folder.PhysicalPath) && !System.IO.Directory.Exists(folder.PhysicalPath))
            {
                throw (HttpResultException)NotFound("Folder not found");
            }

            if (body.UserId != null && !await dbContext.Users.AnyAsync(u => u.Id == body.UserId))
            {
                throw (HttpResultException)BadRequest("User not found");
            }

            return(folder);
        }
        public async Task <ActionResult <FolderItem> > AddFolderShare([FromBody] AddFolderShareBody body)
        {
            InternalFolder folder;

            try
            {
                folder = await ValidateAddFolderShare(body);
            }
            catch (HttpResultException exc)
            {
                return(exc.Result);
            }

            if (!HasPermission(folder.Permission, body.Permission))
            {
                return(Forbid());
            }
            if (!string.IsNullOrWhiteSpace(folder.PhysicalPath) && !System.IO.Directory.Exists(folder.PhysicalPath))
            {
                return(NotFound("Folder not found"));
            }

            if (body.UserId != null && !await dbContext.Users.AnyAsync(u => u.Id == body.UserId))
            {
                return(BadRequest("User not found"));
            }

            if (await dbContext.ShareFolders.AnyAsync(f => f.Name == body.Name && f.UserId == body.UserId))
            {
                return(BadRequest("Folder with this name is already shared"));
            }

            ShareFolder shareFolder = new ShareFolder()
            {
                Name       = body.Name,
                Path       = folder.PhysicalPath,
                IsListed   = body.IsListed,
                UserId     = body.UserId,
                Permission = Models.FolderItemPermission.New(body.Permission),
            };

            await dbContext.ShareFolders.AddAsync(shareFolder);

            await dbContext.SaveChangesAsync();

            return(shareFolder.ToFolderItem());
        }