예제 #1
0
        public void Execute()
        {
            IEnumerable <Message> messages = _gmailClient
                                             .GetRecentMessages();

            using (Database db = new Database())
            {
                foreach (var message in messages)
                {
                    ForwardedEmail email = null;

                    try
                    {
                        email = new ForwardedEmail(message);

                        db.ForwardedEmails.Add(email);
                        db.SaveChanges();

                        if (email.Status == Constants.Error)
                        {
                            throw new ParsingFailedException(email.Subject);
                        }

                        IEmailProcessor emailProcessor = _emailProcessorFactory.GetEmailProcessor(email.Operation);
                        emailProcessor.Process(email, db);

                        email.Status = Constants.Processed;
                        db.SaveChanges();
                        _logger.Information($"{Constants.Processed} - {{GoodleId}} sucessfully", email.GoodleId);
                    }
                    catch (ParsingFailedException ex)
                    {
                        _logger.Error(ex, "An error occued while parsing subject: {subject}", email.Subject);
                    }
                    catch (RecordSkippedException ex)
                    {
                        email.Status = $"{Constants.Skipped}";
                        _logger.Warning(ex, $"{Constants.Skipped} - {{message}}", ex.Message);
                        _logger.Verbose("{subject}", email.Subject);
                    }
                    catch (Exception ex)
                    {
                        email.Status = $"{Constants.Error} - {ex.Message}";
                        _logger.Error(ex, "{message} - {subject}", ex.Message, email.Subject);
                    }
                    finally
                    {
                        try
                        {
                            db.SaveChanges();
                        }
                        catch
                        {
                            _logger.Error("Could not save to database");
                        }
                    }
                }
            }
        }