// ^ ^ ^ ^ = = = = = = = = = = = = = = = = = =
        public async Task <IActionResult> Suggest(string t)
        {
            if (string.IsNullOrEmpty(t))
            {
                CacheControlOverwrite.SetExpiresResponseHeaders(Request);                 // 4 weeks
            }
            var model = await _suggest.SearchSuggest(t);

            return(Json(model));
        }
        [ProducesResponseType(500)] // "Thumbnail generation failed"
        public async Task <IActionResult> DownloadPhoto(string f, bool isThumbnail = true, bool cache = true)
        {
            // f = subpath/filepath
            if (f.Contains("?isthumbnail"))
            {
                return(NotFound("please use &isthumbnail = " +
                                "instead of ?isthumbnail= "));
            }

            var fileIndexItem = await _query.GetObjectByFilePathAsync(f);

            if (fileIndexItem == null)
            {
                return(NotFound("not in index " + f));
            }

            if (!_iStorage.ExistFile(fileIndexItem.FilePath))
            {
                return(NotFound($"source image missing {fileIndexItem.FilePath}"));
            }

            // Return full image
            if (!isThumbnail)
            {
                if (cache)
                {
                    CacheControlOverwrite.SetExpiresResponseHeaders(Request);
                }
                var fileStream = _iStorage.ReadStream(fileIndexItem.FilePath);
                // Return the right mime type (enableRangeProcessing = needed for safari and mp4)
                return(File(fileStream, MimeHelper.GetMimeTypeByFileName(fileIndexItem.FilePath), true));
            }

            if (!_thumbnailStorage.ExistFolder("/"))
            {
                return(NotFound("ThumbnailTempFolder not found"));
            }

            var data = new ThumbnailSizesExistStatusModel {
                Small = _thumbnailStorage.ExistFile(
                    ThumbnailNameHelper.Combine(fileIndexItem.FileHash, ThumbnailSize.Small)),
                Large = _thumbnailStorage.ExistFile(
                    ThumbnailNameHelper.Combine(fileIndexItem.FileHash, ThumbnailSize.Large)),
                ExtraLarge = _thumbnailStorage.ExistFile(
                    ThumbnailNameHelper.Combine(fileIndexItem.FileHash, ThumbnailSize.ExtraLarge))
            };

            if (!data.Small || !data.Large || !data.ExtraLarge)
            {
                await new Thumbnail(_iStorage,
                                    _thumbnailStorage, _logger).CreateThumb(fileIndexItem.FilePath,
                                                                            fileIndexItem.FileHash);

                if (!_thumbnailStorage.ExistFile(
                        ThumbnailNameHelper.Combine(fileIndexItem.FileHash,
                                                    ThumbnailSize.Large)))
                {
                    Response.StatusCode = 500;
                    return(Json("Thumbnail generation failed"));
                }
            }

            var thumbnailFs = _thumbnailStorage.ReadStream(
                ThumbnailNameHelper.Combine(fileIndexItem.FileHash, ThumbnailSize.Large));

            return(File(thumbnailFs, "image/jpeg"));
        }