public async Task <ICommandResult <FileInvite> > SendAttachmentInviteAsync(FileInvite invite)
        {
            if (invite == null)
            {
                throw new ArgumentException(nameof(invite));
            }

            // Create result
            var result = new CommandResult <FileInvite>();

            if (invite.FileId <= 0)
            {
                return(result.Failed(T["A file is required to share"].Value));
            }

            if (string.IsNullOrEmpty(invite.Email))
            {
                return(result.Failed(T["An email address is required"].Value));
            }

            // Get file
            var file = await _fileStore.GetByIdAsync(invite.FileId);

            // Ensure we found the file
            if (file == null)
            {
                return(result.Failed(T["The file could not be found"].Value));
            }

            // Get email template
            const string templateId = "ShareFileAttachment";
            var          culture    = await _contextFacade.GetCurrentCultureAsync();

            var email = await _localeStore.GetFirstOrDefaultByKeyAsync <LocaleEmail>(culture, templateId);

            if (email != null)
            {
                // Build message
                var message = email.BuildMailMessage();
                message.Subject = string.Format(
                    email.Subject,
                    invite.CreatedBy.DisplayName);
                message.Body = string.Format(
                    email.Message,
                    invite.CreatedBy.DisplayName);
                message.IsBodyHtml = true;
                message.To.Add(new MailAddress(invite.Email.Trim()));
                message.Attachments.Add(file.ToAttachment());

                // Send message
                var emailResult = await _emailManager.SaveAsync(message);

                if (emailResult.Succeeded)
                {
                    return(result.Success(invite));
                }

                return(result.Failed(emailResult.Errors?.ToArray()));
            }

            return(result.Failed($"No email template with the Id '{templateId}' exists within the 'locales/{culture}/emails.json' file!"));
        }
        public async Task <ICommandResult <FileInvite> > SendLinkInviteAsync(FileInvite invite)
        {
            if (invite == null)
            {
                throw new ArgumentException(nameof(invite));
            }

            // Create result
            var result = new CommandResult <FileInvite>();

            if (invite.FileId <= 0)
            {
                return(result.Failed(T["A file is required to share"].Value));
            }

            if (string.IsNullOrEmpty(invite.Email))
            {
                return(result.Failed(T["An email address is required"].Value));
            }

            // Get file
            var file = await _fileStore.GetByIdAsync(invite.FileId);

            // Ensure we found the file
            if (file == null)
            {
                return(result.Failed(T["The file could not be found"].Value));
            }

            // Get email template
            const string templateId = "ShareFileLink";

            // Configured culture
            var culture = await _contextFacade.GetCurrentCultureAsync();

            var email = await _localeStore.GetFirstOrDefaultByKeyAsync <LocaleEmail>(culture, templateId);

            if (email != null)
            {
                // Ensure email is safe for URL
                var token = Convert.ToBase64String(Encoding.UTF8.GetBytes(invite.Email));

                // Build invite URL
                var baseUri = await _capturedRouterUrlHelper.GetBaseUrlAsync();

                var url = _capturedRouterUrlHelper.GetRouteUrl(baseUri, new RouteValueDictionary()
                {
                    ["area"]       = "Plato.Files.Sharing",
                    ["controller"] = "Home",
                    ["action"]     = "Index",
                    ["id"]         = invite.Id,
                    ["token"]      = token,
                    ["alias"]      = file.Alias
                });

                // Build message from template
                var message = email.BuildMailMessage();
                message.Subject = string.Format(
                    email.Subject,
                    invite.CreatedBy.DisplayName);
                message.Body = string.Format(
                    email.Message,
                    invite.CreatedBy.DisplayName,
                    file.Name,
                    file.ContentLength.ToFriendlyFileSize(),
                    baseUri + url);
                message.IsBodyHtml = true;
                message.To.Add(new MailAddress(invite.Email));

                // Send message
                var emailResult = await _emailManager.SaveAsync(message);

                if (emailResult.Succeeded)
                {
                    return(result.Success(invite));
                }

                return(result.Failed(emailResult.Errors?.ToArray()));
            }

            return(result.Failed($"No email template with the Id '{templateId}' exists within the 'locales/{culture}/emails.json' file!"));
        }