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))); } }
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); } } }