Compacted BASE Story date() and new User xdate().
[gruta.git] / Gruta / Data.pm
blobd1b4954b48773ed3e5348fdf039f17a980d3c427
1 package Gruta::Data;
3 use strict;
4 use warnings;
6 package Gruta::Data::BASE;
8 use Carp;
10 sub fields { return (); }
11 sub vfields { return (); }
12 sub afields { return ($_[0]->fields(), $_[0]->vfields()); }
14 sub source {
15 my $self = shift;
17 if (@_) {
18 $self->{_source} = shift;
21 return $self->{_source};
25 sub _assert {
26 my $self = shift;
28 my $id = $self->get('id') || '';
29 $id =~ /^[\d\w_-]+$/ or croak "Bad id [$id]";
31 return $self;
34 sub new {
35 my $class = shift;
36 my %args = @_;
38 my $self = bless({ }, $class);
40 foreach my $k ($self->afields()) {
41 $self->{$k} = $args{$k};
44 return $self;
47 sub get {
48 my $self = shift;
49 my $field = shift;
51 croak 'get ' . ref($self) . " field '$field'?" unless exists $self->{$field};
53 return $self->{$field};
56 sub set {
57 my $self = shift;
58 my $field = shift;
60 croak 'set ' . ref($self) . " field '$field'?" unless exists $self->{$field};
62 $self->{$field} = shift;
64 return $self->{$field};
68 package Gruta::Data::Topic;
70 use base 'Gruta::Data::BASE';
72 sub fields { return qw(id name editors max_stories internal); }
74 package Gruta::Data::Story;
76 use base 'Gruta::Data::BASE';
78 use Carp;
80 sub fields { return qw(id topic_id title date userid format hits ctime content); }
81 sub vfields { return qw(tags abstract body); }
83 sub _assert {
84 my $self = shift;
86 $self->SUPER::_assert();
88 my $topic_id = $self->get('topic_id') || '';
89 $topic_id =~ /^[\d\w_-]+$/ or croak "Bad topic_id";
91 return $self;
94 sub date { return Gruta::Data::format_date($_[0]->get('date'), $_[1]); }
96 sub touch { return $_[0]; }
98 sub tags {
99 my $self = shift;
100 my @ret = undef;
102 if (scalar(@_)) {
103 $self->set('tags', [ @_ ]);
105 else {
106 @ret = @{ $self->get('tags') };
109 return @ret;
112 sub new_id {
113 my $self = shift;
115 return sprintf ('%08x', int(rand(0xffffffff)));
118 package Gruta::Data::User;
120 use base 'Gruta::Data::BASE';
122 sub fields { return qw(id username email password can_upload is_admin xdate); }
123 sub vfields { return qw(sid); }
125 sub xdate { return Gruta::Data::format_date($_[0]->get('xdate'), $_[1]); }
127 package Gruta::Data::Session;
129 use base 'Gruta::Data::BASE';
131 sub fields { return qw(id time user_id ip); }
133 package Gruta::Data;
135 sub format_date {
136 my $date = shift;
137 my $format = shift;
139 if ($format) {
140 my ($y, $m, $d, $H, $M, $S) = ($date =~
141 /^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})$/);
143 $format =~ s/%Y/$y/g;
144 $format =~ s/%y/$y/g;
145 $format =~ s/%m/$m/g;
146 $format =~ s/%d/$d/g;
147 $format =~ s/%H/$H/g;
148 $format =~ s/%M/$M/g;
149 $format =~ s/%S/$S/g;
151 else {
152 $format = $date;
155 return $format;
159 sub today {
160 my $format = shift;
162 my ($S,$M,$H,$d,$m,$y) = (localtime)[0..5];
164 my $date = sprintf('%04d%02d%02d%02d%02d%02d',
165 1900 + $y, $m + 1, $d, $H, $M, $S);
167 return Gruta::Data::format_date($date, $format);