public async Task <PublicationViewModel> CreatePublication(NewPostRequest request, User user)
    {
        var extractor = new X.Web.MetaExtractor.Extractor();

        var metadata = await extractor.ExtractAsync(request.Link);

        var existingPublication = await _publicationService.Get(new Uri(metadata.Url));

        if (existingPublication != null)
        {
            throw new DuplicateNameException("Publication with this URL already exist");
        }

        var languageCode = _languageAnalyzer.GetTextLanguage(metadata.Description);
        var languageId   = await _localizationService.GetLanguageId(languageCode) ?? Core.Language.EnglishId;

        var player     = EmbeddedPlayerFactory.CreatePlayer(request.Link);
        var playerCode = player != null ? await player.GetEmbeddedPlayerUrl(request.Link) : null;

        var publication = await _publicationService.CreatePublication(
            metadata,
            user.Id,
            languageId,
            playerCode,
            request.CategoryId,
            request.Comment);

        if (publication != null)
        {
            var model = new PublicationViewModel(publication, _settings.WebSiteUrl);

            //If we can embed main content into site page, so we can share this page.
            var url = string.IsNullOrEmpty(model.EmbeddedPlayerCode) ? model.RedirectUrl : model.ShareUrl;

            var services = await GetServices(publication);

            foreach (var service in services)
            {
                await service.Send(request.Comment, url, GetTags(request));
            }

            return(model);
        }

        throw new Exception("Can't save publication to database");
    }
Exemple #2
0
        public async Task <IActionResult> AddPublication(NewPostRequest request)
        {
            var user = await _userManager.GetBySecretKey(request.Key);

            if (user == null)
            {
                _logger.Write(LogLevel.Warning, $"Somebody tried to login with this key: `{request.Key}`. Text: `{request.Comment}`");

                return(StatusCode((int)HttpStatusCode.Forbidden, "Incorrect security key"));
            }

            var extractor        = new X.Web.MetaExtractor.Extractor();
            var languageAnalyzer = new LanguageAnalyzerService(_settings.CognitiveServicesTextAnalyticsKey, _logger);

            try
            {
                var metadata = await extractor.ExtractAsync(request.Link);

                var existingPublication = await _publicationManager.Get(new Uri(metadata.Url));

                if (existingPublication != null)
                {
                    return(StatusCode((int)HttpStatusCode.Conflict, "Publication with this URL already exist"));
                }

                var languageCode = languageAnalyzer.GetTextLanguage(metadata.Description);
                var languageId   = await _localizationManager.GetLanguageId(languageCode) ?? Language.EnglishId;

                var image = metadata.Images.FirstOrDefault();

                var publication = new DAL.Publication
                {
                    Title       = metadata.Title,
                    Description = metadata.Description,
                    Link        = metadata.Url,
                    Image       = string.IsNullOrWhiteSpace(image) || image.Length > 250 ? string.Empty : image,
                    Type        = "article",
                    DateTime    = DateTime.Now,
                    UserId      = user.Id,
                    CategoryId  = request.CategoryId,
                    Comment     = request.Comment,
                    LanguageId  = languageId
                };

                var player = EmbeddedPlayerFactory.CreatePlayer(request.Link);

                if (player != null)
                {
                    publication.EmbededPlayerCode = await player.GetEmbeddedPlayerUrl(request.Link);
                }

                publication = await _publicationManager.Save(publication);

                if (publication != null)
                {
                    var model = new PublicationViewModel(publication, _settings.WebSiteUrl);

                    //If we can embed main content into site page, so we can share this page.
                    var url = string.IsNullOrEmpty(model.EmbededPlayerCode) ? model.Link : model.ShareUrl;

                    foreach (var crossPostManager in _crossPostManagers)
                    {
                        await crossPostManager.Send(request.CategoryId, request.Comment, url);
                    }

                    return(Created(new Uri(model.ShareUrl), model));
                }

                throw new Exception("Can't save publication to database");
            }
            catch (Exception ex)
            {
                _logger.Write(LogLevel.Error, "Error while creating new publication", ex);

                return(BadRequest(ex.Message));
            }
        }