Exemplo n.º 1
0
        public async Task <IActionResult> Post([FromBody] OAuthDto oauth)
        {
            var accessToken = await _redditService.Authorize(oauth.Code);

            var redditIdentity = await _redditService.GetRedditIdentity();

            var redditUser = await _redditUserStorage.FindByAsync(r => r.RedditUsername == redditIdentity.RedditUsername);

            if (redditUser == null)
            {
                var redditEntity          = new RedditUserEntity(redditIdentity.RedditUsername, accessToken.AccessToken, accessToken.RefreshToken, accessToken.Scope, accessToken.TokenExpiration);
                var savedRedditUserEntity = await _redditUserStorage.CreateAsync(redditEntity);

                return(Ok(new OAuthResponseDto(savedRedditUserEntity.Id)));
            }
            else
            {
                // return stored user but update access token
                redditUser.AccessToken    = accessToken.AccessToken;
                redditUser.RefreshToken   = accessToken.RefreshToken;
                redditUser.Scope          = accessToken.Scope;
                redditUser.TokenExpiresAt = accessToken.TokenExpiration;
                await _redditUserStorage.UpdateAsync(redditUser);

                return(Ok(new OAuthResponseDto(redditUser.Id)));
            }
        }
Exemplo n.º 2
0
        protected async override Task ExecuteAsync(CancellationToken stoppingToken)
        {
            while (!stoppingToken.IsCancellationRequested)
            {
                try
                {
                    var posts = await _postRecurrenceStorage.FindAllAsync();

                    foreach (var post in posts)
                    {
                        if (!ShouldStart(post.NextPost))
                        {
                            continue;
                        }

                        var redditUser = await _redditUserStorage.FindAsync(post.RedditUserId);

                        var accessToken = await _redditService.RefreshIfExpiredAsync(redditUser.RefreshToken, redditUser.TokenExpiresAt, redditUser.AccessToken);

                        if (accessToken != null)
                        {
                            // update record with refreshed token
                            redditUser.AccessToken    = accessToken.AccessToken;
                            redditUser.TokenExpiresAt = accessToken.TokenExpiration;
                            redditUser.Scope          = accessToken.Scope;
                            await _redditUserStorage.UpdateAsync(redditUser);
                        }

                        var subs = post.Subreddits.Split(",");

                        foreach (var sub in subs)
                        {
                            try
                            {
                                await _redditService.CreatePostAsync(sub, post.Title, post.Body);
                            }
                            catch (Exception ex)
                            {
                                _logger.LogCritical($"Post failed for Post Id: {post.Id}, on Subreddit {sub}");
                                _logger.LogCritical(ex.Message, ex.StackTrace);
                            }
                        }

                        // reset next send
                        post.LastPost = DateTimeOffset.UtcNow;
                        post.NextPost = DateTimeOffset.UtcNow.AddSeconds(post.IntervalSeconds);
                        await _postRecurrenceStorage.UpdateAsync(post);
                    }

                    await Task.Delay(TimeSpan.FromSeconds(15), stoppingToken);
                }
                catch (Exception ex)
                {
                    _logger.LogCritical($"Post job through unhandled exception. Will try to continue.");
                    _logger.LogCritical(ex.Message, ex.StackTrace);
                    await Task.Delay(TimeSpan.FromSeconds(15), stoppingToken);
                }
            }
        }