Skip to content

Instantly share code, notes, and snippets.

@aerith
Created September 21, 2011 11:04
Show Gist options
  • Save aerith/1231805 to your computer and use it in GitHub Desktop.
Save aerith/1231805 to your computer and use it in GitHub Desktop.
package Hoge::M::Post;
use strict;
use warnings;
our @POST_STATUSES = (
{ id => 0, form_label => '下書きで保存', list_label => '下書き' },
{ id => 1, form_label => '記事を公開する', list_label => '公開中' },
{ id => 99, form_label => '一時的に削除する', list_label => '一時削除' },
);
our $STATUS_AS_DRAFT = 0;
our $STATUS_PUBLISHED = 1;
our $STATUS_DELETED = 99;
sub insert_post {
my ($class, $c, $parameters) = @_;
my $post_data = {
$class->data_from_parameters($parameters),
published => \'now()',
created => \'now()',
modified => \'now()',
};
$c->db->txn_begin;
my $post = $c->db->insert(posts => $post_data);
goto CREATE_ROLLBACK unless defined $post;
my $post_tags = delete $parameters->{post_tags};
$class->reflesh_tags($c, $post, $post_tags);
$c->db->txn_commit;
return $post;
CREATE_ROLLBACK: {
$c->db->txn_rollback;
}
}
sub update_post {
my ($class, $c, $parameters) = @_;
my $post_data = {
$class->data_from_parameters($parameters),
modified => \'now()',
};
$c->db->txn_begin;
my $post = $c->db->single(posts => { id => $parameters->{id} });
$post->update($post_data);
goto UPDATE_ROLLBACK unless defined $post;
my $post_tags = delete $parameters->{post_tags};
$class->reflesh_tags($c, $post, $post_tags);
$c->db->txn_commit;
return $post;
UPDATE_ROLLBACK: {
$c->db->txn_rollback;
}
}
sub prepare_data {
my ($class, $c, $post) = @_;
my $post_data = {
id => $post->id,
user_id => $post->user_id,
blog_id => $post->blog_id,
note_id => $post->note_id,
title => $post->title || '',
excerpt => $post->excerpt || '',
body => $post->body || '',
status => $post->status || 0,
post_category_id => $post->post_category_id || 0,
};
my @post_tag_maps = $c->db->search(post_tag_maps => { post_id => $post->id });
my $post_tag_ids = [ map { $_->post_tag_id } @post_tag_maps ];
$post_data->{post_tags} = join ' ', map { $_->name } ($c->db->search(post_tags => { id => $post_tag_ids }));
$post_data;
}
sub data_from_parameters {
my ($class, $parameters) = @_;
(
user_id => int $parameters->{user_id},
blog_id => int $parameters->{blog_id},
note_id => int $parameters->{note_id},
title => $parameters->{title} || '',
excerpt => $parameters->{excerpt} || '',
body => $parameters->{body} || '',
post_category_id => int $parameters->{post_category} || 0,
status => int $parameters->{status} || 0,
)
}
sub reflesh_tags {
my ($class, $c, $post, $post_tags) = @_;
my @saved_post_tags = ();
my @saved_post_tag_maps = ();
$c->db->txn_begin;
$c->db->delete(post_tag_maps => {
post_id => $post->id
});
my @post_tags = map { $_ =~ s{(^\s+|\s+$)}{}g; $_ } (split /\s+/, $post_tags);
foreach my $post_tag (@post_tags) {
my $tag = $c->db->single(post_tags => { name => $post_tag });
unless (defined $tag) {
$tag = $c->db->insert(post_tags => {
name => $post_tag,
created => \'now()',
modified => \'now()',
});
}
goto REFLESH_TAG_ROLLBACK unless defined $tag;
push @saved_post_tags, $tag;
{
my $post_tag_map = $c->db->insert(post_tag_maps => {
post_tag_id => $tag->id,
post_id => $post->id,
created => \'now()',
modified => \'now()',
});
goto REFLESH_TAG_ROLLBACK unless defined $post_tag_map;
push @saved_post_tag_maps, $post_tag_map;
}
}
$c->db->txn_commit;
return { tags => \@saved_post_tags, tag_maps => \@saved_post_tag_maps };
REFLESH_TAG_ROLLBACK: {
$c->db->txn_rollback;
}
}
1;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment