19304d5a2c92474ebf7ff2747b6bb06a73ea0eda
[dbsrgits/DBIx-Class-Journal.git] / lib / DBIx / Class / Journal.pm
1 package DBIx::Class::Journal;
2
3 use base qw/DBIx::Class/;
4
5 ## On create/insert, add new entry to AuditLog
6
7 # sub new
8 # {
9 #     my ($class, $attrs, @rest) = @_;
10
11 #     $class->result_source->schema->_journal_schema->current_user(delete $attrs->{user_id});
12
13 #     $class->next::method($attrs, @rest);
14 # }
15
16 sub insert
17 {
18     my ($self) = @_;
19
20     return if($self->in_storage);
21     ## create new transaction here?
22     my $res = $self->next::method();
23     if($self->in_storage)
24     {
25         my $s_name = $self->result_source->source_name();
26         my $al = $self->result_source->schema->_journal_schema->resultset("${s_name}AuditLog");
27         my ($pri, $too_many) = map { $self->get_column($_)} $self->primary_columns;
28         if(defined $pri && defined $too_many) 
29         {
30             $self->throw_exception( "More than one possible key found for auto-inc on ".ref $self );
31         }
32         $pri ||= \'NULL';   #'
33         $al->create({
34             ID => $pri,
35 #            created => {
36 #                changeset => $self->result_source->schema->_journal_schema->current_changeset(),
37 #            },
38         });
39     }
40
41     return $res;
42 }
43
44 ## On delete, update delete_id of AuditLog
45
46 sub delete
47 {
48     my ($self, @rest) = @_;
49     $self->next::method(@rest);
50
51     if(!$self->in_storage)
52     {
53         my $s_name = $self->result_source->source_name();
54         my $al = $self->result_source->schema->_journal_schema->resultset("${s_name}AuditLog");
55         my ($pri, $too_many) = map { $self->get_column($_)} $self->primary_columns;
56         if(defined $pri && defined $too_many) 
57         {
58             $self->throw_exception( "More than one possible key found for auto-inc on ".ref $self );
59         }
60
61         if($pri)
62         {
63             my $alentry = $al->find({ID => $pri});
64             $self->throw_exception( "No audit_log entry found for ".ref($self) . " item $pri" ) if(!$alentry);
65              
66             ## bulk_update doesnt do "create new item on update of rel-accessor with hashref, yet
67             my $change = $self->result_source->schema->_journal_schema->resultset('Change')->create({ changeset_id => $self->result_source->schema->_journal_schema->current_changeset });
68             $alentry->delete_id($change->ID);
69             $alentry->update();
70         }
71     }
72     
73 }
74
75 ## On update, copy previous row's contents to AuditHistory
76
77 sub update 
78 {
79     my ($self, $upd, @rest) = @_;
80
81     if($self->in_storage)
82     {
83         my $s_name = $self->result_source->source_name();
84         my $ah = $self->result_source->schema->_journal_schema->resultset("${s_name}AuditHistory");
85
86         my $obj = $self->result_source->resultset->find( $self->ident_condition );
87         $ah->create({
88             $obj->get_columns
89             });
90     }
91
92     $self->next::method($upd, @rest);
93 }
94
95
96
97 1;