package AppUser::DB::Item::UserToken;
use strict;
use warnings;
use lib '/app/tools/common/lib';
use Common::Assert;
use Common::RSApp;
use Common::DB::Item;

use Digest::MD5 qw( md5_hex );

use base 'Common::DB::Item';

use constant kTable        => 'user_token';
use constant kDB           => Common::DB::Item::kCommonDB();
use constant kTokenExpiry  => 300; # 300 seconds (5 minutes)

sub isValidToken {
    my ( $class, $tokenPlain ) = @_;
    return undef if ( !defined $tokenPlain || $tokenPlain eq '' );

    my $dbo = Common::RSApp::GetCommonDB();

    my $sql = "SELECT * FROM " . kTable . " WHERE email = ". $dbo->DBQuote($class->email) . " "
        . "AND token = " . $dbo->DBQuote($tokenPlain) . " "
        . "AND TIMESTAMPDIFF(SECOND, date_modified, NOW()) < " . kTokenExpiry;

    my $collection = Common::DB::ItemCollection->new(
        class => "AppUser::DB::Item::UserToken",
        query => $sql,
        dbID  => kDB,
    );

    return ( $collection->hasNext() ) ? 1 : undef;
}

sub generateToken {
    my ( $class ) = @_;
    $class->token( md5_hex( rand ) );
}

1;
