summaryrefslogtreecommitdiff
path: root/src/management/mail.cpp
blob: d569826a5ab803b9a1b065c8632205c7a2cd013f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include <algorithm>

#include "mail.hpp"

namespace smtp::manage
{
    //
    //Constructors
    //

    Mail::Mail( file::mail::types::IFileManipulatorPtr const& file_reader )
            : mFileReader( file_reader )
            , mMails( mFileReader->Read() )
	{
	}


    //
    //Public methods
    //

	MailsSet Mail::GetMailToSend() const
	{
		return mMails;
	}

	bool Mail::AddMailsToSend( MailsSet const& mails_to_add )
	{
        auto merged_mails = GetMergedMails( mails_to_add );

        return RefreshMails( merged_mails );
	}

    bool Mail::DeleteMailToSend( MailsSet const& mail_to_delete )
	{
        auto mails_to_delete = GetItersectionMails( mail_to_delete );

		auto result_set_after_delete = GetMailsAfterDelete( mails_to_delete );

        return RefreshMails( result_set_after_delete );
	}

    //
    //Private methods
    //

    MailsSet Mail::GetMergedMails( MailsSet const& mails_to_add )
	{
        auto result = mails_to_add;
        result.merge( mMails );

        result.sort();
        result.unique();

        return result;
    }

    MailsSet Mail::GetItersectionMails( MailsSet const& mail_to_delete ) const
	{
        MailsSet result;

        auto sorted_mail_to_send = mail_to_delete;
		sorted_mail_to_send.sort();
		std::set_intersection( mMails.cbegin(), mMails.cend(),
							   sorted_mail_to_send.cbegin(), sorted_mail_to_send.cend(),
                               std::back_inserter( result ) );
		return result;
	}

    MailsSet Mail::GetMailsAfterDelete( MailsSet const& mails_to_delete )
    {
        auto result = mMails;
        for( const auto& mail : mails_to_delete )
        {
            result.remove( mail );
        }
        return result;
    }

    bool Mail::RefreshMails( MailsSet const& new_mails )
    {
        auto result = mFileReader->Write( new_mails );
        mMails = mFileReader->Read();
        return result;
    }
}