1 package Newslash::Plugin::Stories;
2 use Mojo::Base 'Mojolicious::Plugin';
5 use DateTime::Format::MySQL;
6 use DateTime::Format::ISO8601;
13 my ($self, $app, $conf) = @_;
15 $app->helper(stories => sub { $self->c(shift); state $stories = $self; });
17 # default config values
18 my $cnf = $app->config->{Stories} ||= {};
19 $cnf->{title_max_byte} ||= 100;
20 $cnf->{submission_karma_bonus} = 3 if !defined $cnf->{submission_karma_bonus};
24 my ($self, $stoid) = @_;
25 my $stories = $self->app->model('stories');
27 return $stories->get_related_items(stoid => $stoid);
31 my ($self, $limit) = @_;
34 my $user = $c->stash('user');
35 $limit ||= $c->_get_config("item_per_page", 10);
36 my $show_future = $user->{is_admin} ? 1 : 0;
37 my $show_nonpublic = $user->{is_admin} ? 1 : 0;
40 if ($user->{is_login}) {
41 $stories = $c->model('stories');
44 # TODO: check expire time
45 $stories = $c->ezcache->model('stories', { expire => 60 });
47 my $items = $stories->select(hide_future => !$user->{is_admin},
48 public_only => !$user->{is_admin},
50 order_by => {create_time => 'desc'},
57 my ($self, @params) = @_;
58 my $params = {@params};
60 my $config = $self->app->config->{Stories} || {};
61 my $stories = $self->model("stories");
64 # required parameters are: uid, title, introtext
65 my $intro_text = $params->{introtext} || $params->{intro_text};
66 $err = "no_introtext_given" if !$intro_text;
67 $err = "no_title_given" if !$params->{title};
68 $err = "no_uid_given" if !$params->{uid};
71 if (length($params->{title}) > $config->{title_max_byte}) {
72 $err = "title_is_too_long";
75 # check timestamp if exists. use ISO8601 style timestamp like: 2006-08-14T02:34:56-0600
76 if ($params->{time}) {
77 $params->{create_time} = $params->{time};
78 delete $params->{time};
80 if ($params->{create_time}) {
81 my $rex_timestamp = qr/
82 ^(\d+)-(\d+)-(\d+)[^ 0-9]+(\d+):(\d+):(\d+(?:\.\d+)?) # datetime
83 (?:Z|([+-])(\d+):(\d+))?$ # tz
85 if ($params->{create_time} =~ $rex_timestamp) {
86 my $dt = DateTime::Format::ISO8601->parse_datetime($params->{time});
87 $params->{create_time} = DateTime::Format::MySQL->format_datetime($dt);
92 $self->last_error = $err;
96 my $dbh = $stories->start_transaction;
98 # allocate sid (insert blank story)
99 my ($sid, $stoid) = $stories->allocate_sid(base_datetime => $params->{create_time});
101 $self->last_error = "sid allocation failed";
106 # insert into story_text
107 my $rs = $stories->text->create(stoid => $stoid,
108 title => $params->{title},
109 introtext => $intro_text,
110 bodytext => $params->{bodytext} || $params->{body_text});
112 $self->last_error = "insert text failed";
118 $rs = $self->update(stoid => $stoid, %$params);
120 $self->last_error = "insert story failed";
126 my $users = $stories->new_instance_of("Users");
127 my $firehose = $stories->new_instance_of("Firehose");
128 my $submissions = $stories->new_instance_of("Submissions");
130 # transfer from journal/firehose discussion
132 # create firehose item
134 # update submitter info
135 my $submission_id = $params->{submission_id} || $params->{subid};
136 if ($submission_id) {
137 # if the story is derived from submission, do some action
138 # first, update firehose item correspod to submission
139 my $rs = $firehose->update(type => "submission",
140 src_id => $submission_id,
145 my $submission = $submissions->select(id => $submission_id);
146 my $submitter_uid = $submission->{uid};
147 if (!$users->is_anonymous_uid($submitter_uid)) {
148 # update submitter's karma
149 my $karma_bonus = $config->{submission_karma_bonus};
151 $users->update_karma(uid => $submitter_uid,
152 add => $karma_bonus);
154 $users->class->clear_rookie(uid => $submitter_uid);
155 $users->class->validate_submitter(uid => $submitter_uid);
168 Newslash::Plugin::Stories - Newslash stories manipulation plugin
173 $app->plugin('Newslash::Plugin::Stories');
177 L<Newslash::Plugin::Stories> is 'Business Logic' layer of Newslash.
182 L<Mojolicious::Plugin::Stories> implements the following helpers.
186 [% helpers.boxes() %]
188 Fetch box contents for current user and returns them.
190 =head2 format_timestamp
192 $c->format_timestamp(user => $user, epoch => $epoch, format => "user")
193 $c->format_timestamp(datetime => $dt, format => "simple")
195 Return formated string.
201 $plugin->register(Mojolicious->new);
203 Register helpers in L<Mojolicious> application.
207 L<Mojolicious>, L<Mojolicious::Guides>, L<http://mojolicious.org>.