summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2011-02-17 23:43:35 -0600
committerJesse Luehrs <doy@tozt.net>2011-02-17 23:43:35 -0600
commit2d2750b4c40f4ec2016b61ee244cb435b6e9a4e8 (patch)
treedf6b0f39039c7d586219f2c46cc78d6e1bf7123c /lib
parent58a447a99980b9921d498444a72f1705823a049e (diff)
downloadnarwhal-2d2750b4c40f4ec2016b61ee244cb435b6e9a4e8.tar.gz
narwhal-2d2750b4c40f4ec2016b61ee244cb435b6e9a4e8.zip
flesh out the data model a bit
Diffstat (limited to 'lib')
-rw-r--r--lib/Narwhal/Component/Wiki.pm12
-rw-r--r--lib/Narwhal/Component/Wiki/Edit.pm50
-rw-r--r--lib/Narwhal/Page.pm38
-rw-r--r--lib/Narwhal/Page/Revision.pm53
-rw-r--r--lib/Narwhal/User.pm13
5 files changed, 144 insertions, 22 deletions
diff --git a/lib/Narwhal/Component/Wiki.pm b/lib/Narwhal/Component/Wiki.pm
index 985e1af..e2a8ea7 100644
--- a/lib/Narwhal/Component/Wiki.pm
+++ b/lib/Narwhal/Component/Wiki.pm
@@ -5,18 +5,20 @@ with 'Narwhal::Component::Role::Wiki';
sub page {
my $self = shift;
- my ($req, $page) = @_;
+ my ($req, $page_name) = @_;
- my $page_obj = $self->lookup("page:$page");
+ my $page = $self->lookup("page:$page_name");
return $req->new_response(404)
- unless $page_obj;
+ unless $page;
$self->render(
$req,
'page.tt',
{
- text => $page_obj->text,
- page => $page,
+ page => $page_name,
+ text => $page->text,
+ author => $page->author,
+ modified => $page->modification_date,
},
);
}
diff --git a/lib/Narwhal/Component/Wiki/Edit.pm b/lib/Narwhal/Component/Wiki/Edit.pm
index df03598..1623d9a 100644
--- a/lib/Narwhal/Component/Wiki/Edit.pm
+++ b/lib/Narwhal/Component/Wiki/Edit.pm
@@ -1,38 +1,60 @@
package Narwhal::Component::Wiki::Edit;
use Moose;
+use Narwhal::Page;
+use Narwhal::User;
+
with 'Narwhal::Component::Role::Wiki';
sub get {
my $self = shift;
- my ($req, $page) = @_;
+ my ($req, $page_name) = @_;
- my $page_obj = $self->lookup("page:$page");
+ my $page = $self->lookup("page:$page_name");
- $self->render(
- $req,
- 'edit.tt',
- {
- text => ($page_obj ? $page_obj->text : ''),
- page => $page,
- }
+ my %template_env = (
+ page => $page_name,
+ text => '',
);
+
+ if ($page) {
+ %template_env = (
+ %template_env,
+ text => $page->text,
+ author => $page->author,
+ modified => $page->modification_date,
+ );
+ }
+
+ $self->render($req, 'edit.tt', \%template_env);
}
sub post {
my $self = shift;
- my ($req, $page) = @_;
+ my ($req, $page_name) = @_;
- my $page_obj = Narwhal::Page->new(text => $req->param('text'));
$self->txn_do(sub {
- $self->delete("page:$page");
- $self->insert("page:$page" => $page_obj);
+ my $page = $self->lookup("page:$page_name");
+ if ($page) {
+ $page->new_revision(
+ text => $req->param('text'),
+ author => Narwhal::User->new(id => 'foo'), # XXX
+ );
+ }
+ else {
+ $page = Narwhal::Page->new_page(
+ id => $page_name,
+ text => $req->param('text'),
+ author => Narwhal::User->new(id => 'foo'), # XXX
+ );
+ }
+ $self->store($page);
});
my $res = $req->new_response(303);
$res->location(
$req->uri_for({
action => 'page',
- page_name => $page
+ page_name => $page_name,
})
);
return $res;
diff --git a/lib/Narwhal/Page.pm b/lib/Narwhal/Page.pm
index d3e0a4d..70f2f87 100644
--- a/lib/Narwhal/Page.pm
+++ b/lib/Narwhal/Page.pm
@@ -1,11 +1,43 @@
package Narwhal::Page;
use Moose;
-has text => (
- is => 'ro',
- isa => 'Str',
+use Narwhal::Page::Revision;
+
+with 'KiokuDB::Role::ID';
+
+has id => (
+ is => 'ro',
+ isa => 'Str',
+ required => 1,
+);
+
+has current_revision => (
+ is => 'rw',
+ isa => 'Narwhal::Page::Revision',
+ required => 1,
+ handles => ['text', 'author', 'modification_date'],
);
+sub kiokudb_object_id { 'page:' . shift->id }
+
+sub new_revision {
+ my $self = shift;
+ my $rev = $self->current_revision->new_revision(@_);
+ $self->current_revision($rev);
+ return $rev;
+}
+
+sub new_page {
+ my $class = shift;
+ my %opts = @_;
+ my $id = delete $opts{id};
+ my $rev = Narwhal::Page::Revision->new(%opts);
+ return $class->new(
+ id => $id,
+ current_revision => $rev,
+ );
+}
+
__PACKAGE__->meta->make_immutable;
no Moose;
diff --git a/lib/Narwhal/Page/Revision.pm b/lib/Narwhal/Page/Revision.pm
new file mode 100644
index 0000000..08a21c9
--- /dev/null
+++ b/lib/Narwhal/Page/Revision.pm
@@ -0,0 +1,53 @@
+package Narwhal::Page::Revision;
+use KiokuDB::Class;
+
+use DateTime;
+
+with 'KiokuDB::Role::ID::Digest', 'MooseX::Clone';
+
+has text => (
+ is => 'ro',
+ isa => 'Str',
+ required => 1,
+);
+
+has author => (
+ is => 'ro',
+ isa => 'Narwhal::User',
+ required => 1,
+);
+
+has modification_date => (
+ traits => ['NoClone'],
+ is => 'ro',
+ isa => 'DateTime',
+ default => sub { DateTime->now },
+);
+
+has previous_revision => (
+ traits => ['KiokuDB::Lazy'],
+ is => 'ro',
+ isa => 'Narwhal::Page::Revision',
+);
+
+sub new_revision {
+ my $self = shift;
+ $self->clone(
+ previous_revision => $self,
+ @_,
+ );
+}
+
+sub digest_parts {
+ my $self = shift;
+ return (
+ $self->text,
+ $self->modification_date->iso8601,
+ $self->author->id,
+ );
+}
+
+__PACKAGE__->meta->make_immutable;
+no KiokuDB::Class;
+
+1;
diff --git a/lib/Narwhal/User.pm b/lib/Narwhal/User.pm
new file mode 100644
index 0000000..6bb66c6
--- /dev/null
+++ b/lib/Narwhal/User.pm
@@ -0,0 +1,13 @@
+package Narwhal::User;
+use Moose;
+
+has id => (
+ is => 'ro',
+ isa => 'Str',
+ required => 1,
+);
+
+__PACKAGE__->meta->make_immutable;
+no Moose;
+
+1;