-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathEmailContactServices.cs
146 lines (121 loc) · 4.3 KB
/
EmailContactServices.cs
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
using System.Net.Mail;
using System.Net;
using System.Linq;
using System.Threading;
using System.Collections.Generic;
using ServiceStack;
using ServiceStack.FluentValidation;
using ServiceStack.Aws.DynamoDb;
namespace EmailContacts
{
public class CotntactsValidator : AbstractValidator<CreateContact>
{
public CotntactsValidator()
{
RuleFor(x => x.Name).NotEmpty().WithMessage("A Name is what's needed.");
RuleFor(x => x.Email).NotEmpty().EmailAddress();
RuleFor(x => x.Age).GreaterThan(0);
}
}
public class ContactsServices : Service
{
public IPocoDynamo Dynamo { get; set; }
public Contact Any(GetContact request)
{
return Dynamo.GetItem<Contact>(request.Id);
}
public object Any(FindContacts request)
{
var contacts = request.Age.HasValue
? Dynamo.FromQueryIndex<ContactAgeIndex>(q => q.Age == request.Age.Value).ExecInto<Contact>().ToList()
: Dynamo.ScanAll<Contact>().ToList();
return contacts.OrderBy(x => x.Id);
}
public Contact Post(CreateContact request)
{
var contact = request.ConvertTo<Contact>();
Dynamo.PutItem(contact);
return contact;
}
public void Any(DeleteContact request)
{
Dynamo.DeleteItem<Contact>(request.Id);
}
public void Any(Reset request)
{
Dynamo.DeleteItems<Email>(Dynamo.FromScan<Email>().ExecColumn(x => x.Id));
Dynamo.DeleteItems<Contact>(Dynamo.FromScan<Contact>().ExecColumn(x => x.Id));
AddCustomers(Dynamo);
}
public static void AddCustomers(IPocoDynamo db)
{
db.PutItem(new Contact { Name = "Kurt Cobain", Email = "demo+kurt@servicestack.net", Age = 27 });
db.PutItem(new Contact { Name = "Mike Patton", Email = "demo+mike@servicestack.net", Age = 47 });
db.PutItem(new Contact { Name = "Dave Groul", Email = "demo+dave@servicestack.net", Age = 46 });
}
}
public class EmailContactValidator : AbstractValidator<EmailContact>
{
public EmailContactValidator()
{
RuleFor(x => x.Subject).NotEmpty();
}
}
public class EmailServices : Service
{
public IEmailer Emailer { get; set; }
public IPocoDynamo Dynamo { get; set; }
public EmailContactResponse Any(EmailContact request)
{
var contact = Dynamo.GetItem<Contact>(request.ContactId);
if (contact == null)
throw HttpError.NotFound("Contact does not exist");
var msg = new Email { From = "demo@servicestack.net", To = contact.Email }.PopulateWith(request);
Emailer.Email(msg);
return new EmailContactResponse { Email = contact.Email };
}
public object Any(FindEmails request)
{
var query = request.To != null
? Dynamo.FromScan<Email>(q => q.To == request.To)
: Dynamo.FromScan<Email>();
return query.Exec(limit: request.Take.GetValueOrDefault(100)).OrderByDescending(x => x.Id);
}
}
public class SmtpConfig
{
public string Host { get; set; }
public int Port { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
}
public interface IEmailer
{
void Email(Email email);
}
public class SmtpEmailer : IEmailer
{
public SmtpConfig Config { get; set; }
public IPocoDynamo Dynamo { get; set; }
public void Email(Email email)
{
var msg = new MailMessage(email.From, email.To).PopulateWith(email);
using (var client = new SmtpClient(Config.Host, Config.Port))
{
client.Credentials = new NetworkCredential(Config.UserName, Config.Password);
client.EnableSsl = true;
client.Send(msg);
}
Dynamo.PutItem(email);
}
}
public class DbEmailer : IEmailer
{
public IPocoDynamo Dynamo { get; set; }
public void Email(Email email)
{
Thread.Sleep(1000); //simulate processing delay
Dynamo.PutItem(email);
}
}
}