|
| 1 | +<?php |
| 2 | +declare(strict_types=1); |
| 3 | + |
| 4 | +namespace Fc2blog\Model; |
| 5 | + |
| 6 | +use Fc2blog\Config; |
| 7 | +use Fc2blog\Service\MailService; |
| 8 | +use Fc2blog\Service\TwigService; |
| 9 | +use Fc2blog\Web\Request; |
| 10 | +use RuntimeException; |
| 11 | + |
| 12 | +class EmailLoginTokenService |
| 13 | +{ |
| 14 | + public static function create(EmailLoginToken $token): ?int |
| 15 | + { |
| 16 | + $pr_model = new EmailLoginTokenModel(); |
| 17 | + return $pr_model->insert((array)$token); |
| 18 | + } |
| 19 | + |
| 20 | + public static function getByToken(string $token): ?EmailLoginToken |
| 21 | + { |
| 22 | + $pr_model = new EmailLoginTokenModel(); |
| 23 | + $result = $pr_model->find('row', [ |
| 24 | + 'where' => 'token = :token', |
| 25 | + 'params' => ['token' => $token] |
| 26 | + ]); |
| 27 | + |
| 28 | + if ($result === false) return null; |
| 29 | + |
| 30 | + return EmailLoginToken::factoryFromArray($result); |
| 31 | + } |
| 32 | + |
| 33 | + public static function revokeToken(EmailLoginToken $token): void |
| 34 | + { |
| 35 | + $pr_model = new EmailLoginTokenModel(); |
| 36 | + $pr_model->deleteById($token->id); |
| 37 | + } |
| 38 | + |
| 39 | + public static function createAndSendToken(Request $request, User $user): bool |
| 40 | + { |
| 41 | + // create token |
| 42 | + $token = EmailLoginToken::factoryWithUser($user); |
| 43 | + if (is_null(static::create($token))) { |
| 44 | + throw new RuntimeException("create password reset token failed."); |
| 45 | + } |
| 46 | + |
| 47 | + // mail sending. |
| 48 | + $login_url = $token->getLoginUrl($request); |
| 49 | + |
| 50 | + $email = new Email(); |
| 51 | + $email->setFrom( |
| 52 | + Config::get("ADMIN_MAIL_ADDRESS"), |
| 53 | + "Fc2blog OSS" |
| 54 | + ); |
| 55 | + $email->setTo($user->login_id); |
| 56 | + $email->setSubjectAndBodyByTwig( |
| 57 | + TwigService::getTwigInstance(), |
| 58 | + 'mail/email_login.twig', |
| 59 | + ['url' => $login_url] |
| 60 | + ); |
| 61 | + return MailService::send($email); |
| 62 | + } |
| 63 | + |
| 64 | + // TODO clean up token. |
| 65 | +} |
0 commit comments