From 2d2750b4c40f4ec2016b61ee244cb435b6e9a4e8 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Thu, 17 Feb 2011 23:43:35 -0600 Subject: flesh out the data model a bit --- lib/Narwhal/Component/Wiki.pm | 12 +++++---- lib/Narwhal/Component/Wiki/Edit.pm | 50 +++++++++++++++++++++++++---------- lib/Narwhal/Page.pm | 38 ++++++++++++++++++++++++--- lib/Narwhal/Page/Revision.pm | 53 ++++++++++++++++++++++++++++++++++++++ lib/Narwhal/User.pm | 13 ++++++++++ 5 files changed, 144 insertions(+), 22 deletions(-) create mode 100644 lib/Narwhal/Page/Revision.pm create mode 100644 lib/Narwhal/User.pm (limited to 'lib') 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; -- cgit v1.2.3-54-g00ecf