Bivio::Biz::Model::Email
# Copyright (c) 1999-2008 bivio Software, Inc. All rights reserved. # $Id$ package Bivio::Biz::Model::Email; use strict; use Bivio::Base 'Model.LocationBase'; my($_E) = b_use('Type.Email'); sub create { my($self, $values) = (shift, shift); $values->{want_bulletin} = 1 unless defined($values->{want_bulletin}); return $self->SUPER::create($self->internal_prepare_query($values), @_); } sub email_for_auth_user { my($self) = @_; return $self->unauth_load_or_die({ realm_id => $self->req('auth_user_id'), location => $self->DEFAULT_LOCATION, })->get('email'); } sub internal_initialize { return { version => 2, table_name => 'email_t', columns => { realm_id => ['RealmOwner.realm_id', 'PRIMARY_KEY'], location => ['Location', 'PRIMARY_KEY'], email => ['Email', 'NOT_NULL_UNIQUE'], want_bulletin => ['Boolean', 'NOT_NULL'], }, auth_id => 'realm_id', other => [ [qw(realm_id RealmOwner.realm_id)], ], }; } sub internal_prepare_query { my($self, $values) = (shift, shift); $values->{email} = lc($values->{email}) if $values->{email}; return $self->SUPER::internal_prepare_query($values, @_); } sub invalidate { my($self) = @_; my($address) = $self->get('email'); my($prefix) = $self->get_field_type('email')->INVALID_PREFIX; return if $address =~ /^\Q$prefix/o; my($other) = $self->new_other('Email'); my($i) = 0; $i++ while $other->unauth_load({email => $prefix . $i . $address}); $self->update({ email => $prefix . $i . $address, want_bulletin => 0, }); return; } sub is_ignore { my($proto, $model, $model_prefix) = shift->internal_get_target(@_); return $_E->is_ignore($model->get($model_prefix.'email')); } sub unsafe_user_id_from_email { my($self, $email) = @_; # detect a rewritted email domain if ($email && $email =~ /(\w+)\*(\d+)@/) { my($tag, $realm_id) = ($1, $2); if ($tag eq b_use('Action.MailForward')->REWRITE_FROM_DOMAIN_URI) { if ($self->new_other('User')->set_ephemeral->unauth_load({ user_id => $realm_id, })) { return $realm_id; } } } # guard against duplicate email, use user with role, or oldest id my($user_ids) = $self->map_iterate( 'realm_id', 'unauth_iterate_start', 'realm_id ASC', { email => $email, }); return undef unless @$user_ids; if (@$user_ids > 1) { foreach my $user_id (@$user_ids) { return $user_id if @{$self->new_other('RealmUser')->map_iterate('role', { user_id => $user_id, })}; } } return $user_ids->[0]; } sub update { my($self, $values) = (shift, shift); return $self->SUPER::update($self->internal_prepare_query($values), @_); } 1;