fixed namespaces
[p5sagit/Email-Archive.git] / lib / Email / Archive / Storage / DBIC.pm
CommitLineData
ec413087 1package Email::Archive::Storage::DBIC;
ef49e6b8 2use Moo;
3use Carp;
4use Email::MIME;
5use Email::Abstract;
ec413087 6use Email::Archive::Storage::DBIC::Schema;
ef49e6b8 7use autodie;
8use Try::Tiny;
9with q/Email::Archive::Storage/;
10
11has schema => (
12 is => 'rw',
13 isa => sub {
ec413087 14 ref $_[0] eq 'Email::Archive::Storage::DBIC::Schema' or die "schema must be a Email::Archive::Storage::DBIC schema",
ef49e6b8 15 },
16);
17
18sub store {
19 my ($self, $email) = @_;
20 $email = Email::Abstract->new($email);
21 $self->schema->resultset('Messages')->update_or_create({
22 message_id => $email->get_header('Message-ID'),
23 from_addr => $email->get_header('From'),
24 to_addr => $email->get_header('To'),
25 date => $email->get_header('Date'),
26 subject => $email->get_header('Subject'),
27 body => $email->get_body,
28 });
29}
30
31sub search {
32 my ($self, $attribs) = @_;
33 my $message = $self->schema
34 ->resultset('Messages')
35 ->find($attribs);
36 return Email::MIME->create(
37 header => [
38 From => $message->from_addr,
39 To => $message->to_addr,
40 Subject => $message->subject,
41 ],
42 body => $message->body,
43 );
44}
45
46sub retrieve {
47 my ($self, $message_id) = @_;
48 $self->search({ message_id => $message_id });
49}
50
51sub _deploy {
52 my ($self) = @_;
53 $self->schema->deploy;
54}
55
56sub _deployed {
57 my ($self) = @_;
58 my $deployed = 1;
59 try {
60 # naive check if table metadata exists
61 $self->schema->resultset('Metadata')->all;
62 }
63 catch {
64 $deployed = 0;
65 };
66
67 return $deployed;
68}
69
ec413087 70sub storage_connect {
ef49e6b8 71 my ($self, $dsn) = @_;
ec413087 72 $self->schema(Email::Archive::Storage::DBIC::Schema->connect($dsn));
ef49e6b8 73 my $deployed = $self->_deployed;
74 $self->_deploy unless $deployed;
75}
76
771;
78