/// <summary>
        /// Saves the specified reference identifier.
        /// </summary>
        /// <param name="referenceId">The reference identifier.</param>
        /// <param name="imageModel">The image model.</param>
        /// <returns></returns>
        /// <exception cref="System.ArgumentNullException">imageModel</exception>
        public async Task <string> SaveImage(Guid referenceId, ImageModel imageModel)
        {
            // check write permissions
            if (imageModel == null)
            {
                throw new ArgumentNullException("imageModel");
            }

            await((IAsyncInitialization)_configManager).Initialization;

            var directoryInfo =
                Directory.CreateDirectory(Path.Combine(_configManager.CacheLocation, referenceId.ToString()));

            // this is for Images
            directoryInfo.CreateSubdirectory(ImagesFolder);

            var imageFilePath = Path.Combine(directoryInfo.FullName,
                                             $"Source{imageModel.Extension}");

            using (var file = File.OpenWrite(imageFilePath))
            {
                var encryptedData = EncryptionLibrary.EncryptData(imageModel.ImageFileModel.Buffer, EncryptionConfig.AesKey, EncryptionConfig.HmacKey);
                await file.WriteAsync(encryptedData, 0, encryptedData.Length);
            }

            return(imageFilePath);
        }