LinkStorage.cs

61 lines | 1.89 kB Blame History Raw Download
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Collections.Concurrent;

using Model.Entities.Files.FS_Entities;

namespace BLL
{

    /// <summary>
    /// Создание одноразовых ссылок на файл.
    /// Используется для педоставления доступа к файлу с других сервисов (Просмотр документов)
    /// 
    /// Текущая реализация может привести к утечке памяти (ссылка удаляется только после обращения к ней)
    /// </summary>
    public class LinkStorage
    {
        private static readonly ConcurrentDictionary<string, SFile> TmpLinkData 
            = new ConcurrentDictionary<string, SFile>();


        /// <summary>
        /// Сгенерировать одноразовуй ключ для доступа к файлу
        /// </summary>
        /// <param name="file"></param>
        /// <returns></returns>
        public string CreateTmpLink(SFile file) 
        {
            string key = $"{Guid.NewGuid()}{Guid.NewGuid()}";

            if (!TmpLinkData.TryAdd(key, file)) 
            {
                throw new Exception("Данный ключ уже присутсвует коллизия. (В данных условиях не возможно)");
            }

            return key;
        }


        /// <summary>
        /// Получить данные о файле по ключу
        /// </summary>
        /// <returns></returns>
        public SFile GetLinkByKey(string key)
        {
            if (TmpLinkData.TryRemove(key, out SFile data))
            {
                return data;
            }

            throw new Exception("Не удалось найти указанный ключ");
        }


    }
}