Skip to content

Commit

Permalink
とりあえずメアド登録まで
Browse files Browse the repository at this point in the history
  • Loading branch information
Nishibayashi Takuji committed Jan 13, 2012
1 parent ad727c2 commit d924901
Show file tree
Hide file tree
Showing 7 changed files with 120 additions and 10 deletions.
33 changes: 29 additions & 4 deletions lib/Xpost/Model/User.pm
@@ -1,8 +1,33 @@
package Xpost::Model::User;
use strict;
use 5.014001;
use warnings;
use 5.010;
package Xpost::Model::User {

use parent qw/Xpost::Model/;
use String::Random;

use parent qw/Xpost::Model/;

our $UNATH_PREFIX = '__UNAUTH__';

sub register_email {
state $validator = Data::Validator->new(
email => {isa => 'Str'}
)->with(qw/Method/);
my ($class, $args) = $validator->validate(@_);
my $random_uname = $class->create_initial_username;
$class->fast_insert({%$args, username => $UNATH_PREFIX.$random_uname});
return $random_uname;
}

sub create_initial_username {
my $class = shift;
state $rand = String::Random->new;
my $random_uname = $rand->randregex('[a-zA-Z0-9]{16}');
my $full_random_uname = $UNATH_PREFIX . $random_uname;
if ($class->db->count('user' => 'id', {username_hash => $class->make_hash($full_random_uname), username => $full_random_uname})) {
$random_uname = $class->create_initial_username;
}
return $random_uname;
}

}
1;
20 changes: 20 additions & 0 deletions lib/Xpost/Validator/Register.pm
@@ -0,0 +1,20 @@
use 5.014001;
use warnings;
package Xpost::Validator::Register {
use parent qw/Xpost::Validator/;

use Xpost::Model::User;

sub email {
my $self = shift;
$self->check(
email => ['NOT_NULL', 'EMAIL_LOOSE'],
);
return if $self->has_error;

if(Xpost::Model::User->count('id' => {email => $self->query->param('email')})) {
$self->set_error(email => 'UNIQUE');
}
}
}
1;
33 changes: 33 additions & 0 deletions lib/Xpost/Web/App/Dispatcher.pm
Expand Up @@ -4,11 +4,44 @@ use warnings;
use utf8;
use Amon2::Web::Dispatcher::Lite;

use Xpost::Validator::Register;
use Xpost::Model::User;
use Xpost::Email;

any '/' => sub {
my ($c) = @_;
$c->render('index.tx');
};

post '/register/email' => sub {
my $c = shift;
my $validator = Xpost::Validator::Register->new($c->req);
$validator->email;
unless($validator->has_error) {
my $uname = Xpost::Model::User->register_email(%{$validator->valid_data});
Xpost::Email->send(
template => 'register_email',
to => $c->req->param('email'),
param => {uname => $uname},
);
} else {
$c->stash->{validator} = $validator;
return $c->render('index.tx');
}
$c->redirect('/register/email', {success => 1});
};

get '/register/email' => sub {
my $c = shift;
$c->render('register/email.tx');
};

get '/register/' => sub {
my $c = shift;

$c->render('register/index.tx');
};

post '/account/logout' => sub {
my ($c) = @_;
$c->session->expire();
Expand Down
2 changes: 1 addition & 1 deletion sql/mysql.sql
Expand Up @@ -45,7 +45,7 @@ CREATE TABLE IF NOT EXISTS `tweet` (
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE IF NOT EXISTS `user` (
`id` bigint(20) unsigned NOT NULL,
`id` int(10) unsigned NOT NULL,
`created_at` datetime NOT NULL,
`username_hash` int(10) unsigned NOT NULL,
`username` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
Expand Down
20 changes: 18 additions & 2 deletions t/Util.pm
Expand Up @@ -40,10 +40,26 @@ sub slurp {
# initialize database
use Xpost;
{
unlink 'db/test.db' if -f 'db/test.db';

my $c = Xpost->new();
$c->setup_schema();
}

sub setup_db {
my $c = Xpost->new();
my $config = $c->config;
my $datasource = $config->{DBI};
my $dsn = $datasource->[0];
$dsn =~ s/mysql:([^;]+)/mysql:/;
my $dbname = $1;
my $dbh = DBI->connect(@{$datasource}, $config->{dbi_option});
$dbh->do(sprintf(q{ drop database if exists %s}, $dbname))
or die $dbh->errstr;
$dbh->do(sprintf(q{ create database %s}, $dbname))
or die $dbh->errstr;

$dbh->disconnect;

Xpost->context->setup_schema();
}

1;
16 changes: 13 additions & 3 deletions tmpl/app/index.tx
@@ -1,8 +1,18 @@
:cascade layout

:around content -> {
<h1>2011年マビノギ課金ログ</h1>
<p>課金件数:<: $cnt :>件</p>
<p>合計課金額:¥<: $sum :></p>
<h1>Xpost.jp <small>Simple twitter clone</small></h1>
<p>More simple. More fun.</p>

<h2>今すぐ登録</h2>
<p>登録にはメールアドレスが必要です。</p>
<p>携帯メールでも可ですがPCメールをオススメします。</p>
<p>登録されたメールアドレスはXpostからの通知、サポートなどサービスに必要な場合にのみ利用し、Senchan.jpの運営する他サービス含む他の目的には使用しません。</p>
<form action="/register/email" method="post" class="form-stacked">
:input({type => 'text', name => 'email', label => 'Email', class => 'span12'})
<div class="actions">
<button type="submit" class="btn primary">登録</button>
</div>
</form>
:}

6 changes: 6 additions & 0 deletions tmpl/app/register/email.tx
@@ -0,0 +1,6 @@
:cascade layout

:around content -> {
<h1>メールアドレス登録完了!</h1>
<p>入力したメールアドレスにメールを送信しました。メールに書かれているURLをクリックして登録を続けてください。</p>
:}

0 comments on commit d924901

Please sign in to comment.