mourningdove/cgi-bin/DW/StatData/PaidAccounts.pm

126 lines
2.9 KiB
Perl
Raw Normal View History

2026-05-24 01:03:05 +00:00
#!/usr/bin/perl
#
# DW::StatData::PaidAccounts - Paid accounts
#
# Authors:
# Afuna <coder.dw@afunamatata.com>
#
# Copyright (c) 2009 by Dreamwidth Studios, LLC.
#
# This program is free software; you may redistribute it and/or modify it under
# the same terms as Perl itself. For a copy of the license, please reference
# 'perldoc perlartistic' or 'perldoc perlgpl'.
package DW::StatData::PaidAccounts;
=head1 NAME
DW::StatData::PaidAccounts - Paid accounts
=head1 SYNOPSIS
my $data = DW::StatData::PaidAccounts->collect( @keys ); # See list below
my $stats_obj = DW::StatData::PaidAccounts->new( %$data );
=cut
use strict;
use warnings;
use base 'DW::StatData';
use DW::Pay;
sub category { "paid" }
sub name { "Paid Accounts" }
sub keylist {
my @account_type_keys;
my $default_typeid = DW::Pay::default_typeid();
my $shortnames = DW::Pay::all_shortnames();
while ( my ( $typeid, $name ) = each %$shortnames ) {
next if $typeid == $default_typeid;
push @account_type_keys, $name;
}
push @account_type_keys, 'total';
return \@account_type_keys;
}
=head1 API
=head2 C<< $class->collect >>
Collects data for each account type, defined as any capability class under $LJ::CAP with an _account_type, but excluding the default (assumed to be free)
Example: paid, premium, seed
=over
=item paid
=item premium
=item seed
=back
=cut
sub collect {
my $class = shift;
my %data = map { $_ => 0 } @_;
my $dbslow = LJ::get_dbh('slow') or die "Can't get slow role";
my $default_typeid = DW::Pay::default_typeid();
my $sth = $dbslow->prepare(
qq{
SELECT typeid, count(*) FROM dw_paidstatus WHERE typeid != ? GROUP BY typeid
}
);
$sth->execute($default_typeid);
while ( my ( $typeid, $active ) = $sth->fetchrow_array ) {
next unless DW::Pay::type_is_valid($typeid);
my $account_type = DW::Pay::type_shortname($typeid);
$data{$account_type} = $active if exists $data{$account_type};
}
return \%data;
}
sub data {
my $data = $_[0]->{data};
# don't double-calculate the total
return $data if $data->{total};
my $total = 0;
$total += $data->{$_} foreach keys %$data;
$data->{total} = $total;
return $data;
}
=head1 BUGS
Trying to get the number of free accounts from dw_paidstatus will return an inaccurate number, because that only counts accounts which were paid at some point. So we do not collect stats for the default_typeid, which are free accounts for Dreamwidth. This makes assumptions, but I think not too out of line.
=head1 AUTHORS
Afuna <coder.dw@afunamatata.com>
=head1 COPYRIGHT AND LICENSE
Copyright (c) 2009 by Dreamwidth Studios, LLC.
This program is free software; you may redistribute it and/or modify it under
the same terms as Perl itself. For a copy of the license, please reference
'perldoc perlartistic' or 'perldoc perlgpl'.
=cut
1;