visuddhinanda 1 year ago
parent
commit
e0a15ffbe5

+ 100 - 0
api-v8/app/Http/Controllers/EmailCertificationController.php

@@ -0,0 +1,100 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use Illuminate\Http\Request;
+use App\Models\Invite;
+use App\Http\Resources\InviteResource;
+use Illuminate\Support\Str;
+use App\Mail\EmailCertif;
+use Illuminate\Support\Facades\Mail;
+use App\Tools\RedisClusters;
+use App\Models\UserInfo;
+
+class EmailCertificationController extends Controller
+{
+    /**
+     * Display a listing of the resource.
+     *
+     * @return \Illuminate\Http\Response
+     */
+    public function index()
+    {
+        //
+    }
+
+    /**
+     * Store a newly created resource in storage.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @return \Illuminate\Http\Response
+     */
+    public function store(Request $request)
+    {
+        //查询是否重复
+        if (UserInfo::where('email', $request->get('email'))->exists()) {
+            return $this->error('email.exists', 'err.email.exists', 200);
+        }
+        $sender = config("mint.admin.root_uuid");
+
+        $uuid = Str::uuid();
+        $invite = Invite::firstOrNew(
+            ['email' => $request->get('email')],
+            ['id' => $uuid]
+        );
+        $invite->user_uid = $sender;
+        $invite->status = 'invited';
+        $invite->save();
+
+        Mail::to($request->get('email'))
+            ->send(new EmailCertif(
+                $invite->id,
+                $request->get('subject', 'sign up wikipali'),
+                $request->get('lang'),
+            ));
+        if (Mail::failures()) {
+            return $this->error('send email fail', '', 200);
+        }
+
+        return $this->ok(new InviteResource($invite));
+    }
+
+    /**
+     * Display the specified resource.
+     *
+     * @param  string  $id
+     * @return \Illuminate\Http\Response
+     */
+    public function show(string $id)
+    {
+        //
+        $code = RedisClusters::get("/email/certification/" . $id);
+        if (empty($code)) {
+            return $this->error('Certification is avalide', 200, 200);
+        }
+        return $this->ok($code);
+    }
+
+    /**
+     * Update the specified resource in storage.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @param  int  $id
+     * @return \Illuminate\Http\Response
+     */
+    public function update(Request $request, $id)
+    {
+        //
+    }
+
+    /**
+     * Remove the specified resource from storage.
+     *
+     * @param  int  $id
+     * @return \Illuminate\Http\Response
+     */
+    public function destroy($id)
+    {
+        //
+    }
+}

+ 46 - 0
api-v8/app/Mail/EmailCertif.php

@@ -0,0 +1,46 @@
+<?php
+
+namespace App\Mail;
+
+use Illuminate\Bus\Queueable;
+use Illuminate\Mail\Mailable;
+use Illuminate\Queue\SerializesModels;
+use App\Tools\RedisClusters;
+use Illuminate\Support\Facades\Log;
+
+class EmailCertif extends Mailable
+{
+    use Queueable, SerializesModels;
+    protected $uuid;
+    protected $lang;
+    /**
+     * Create a new message instance.
+     *
+     * @return void
+     */
+    public function __construct(string $uuid, string $subject = 'wikipali email certification', string $lang = 'en-US')
+    {
+        //
+        $this->uuid = $uuid;
+        $this->lang = $lang;
+        $this->subject($subject);
+    }
+
+    /**
+     * Build the message.
+     *
+     * @return $this
+     */
+    public function build()
+    {
+        // 生成一个介于 1000 到 9999 之间的随机整数
+        $randomNumber = random_int(1000, 9999);
+        $key = "/email/certification/" . $this->uuid;
+        Log::debug('email certification', ['key' => $key, 'value' => $randomNumber]);
+        RedisClusters::put($key, $randomNumber,  30 * 60);
+        return $this->view('emails.certification.' . $this->lang)
+            ->with([
+                'code' => $randomNumber,
+            ]);
+    }
+}

+ 15 - 0
api-v8/resources/views/emails/certification/en-US.blade.php

@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+    <title>email certification</title>
+</head>
+
+<body>
+    <div>wikipali email certification</div>
+    <div>wikipali sign up email certification.</div>
+    <div><b>{{ $code }}</b></div>
+    <div>This email is sent automatically by system, please don't reply.</div>
+</body>
+
+</html>

+ 15 - 0
api-v8/resources/views/emails/certification/en.blade.php

@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+    <title>email certification</title>
+</head>
+
+<body>
+    <div>wikipali email certification</div>
+    <div>wikipali sign up email certification.</div>
+    <div><b>{{ $code }}</b></div>
+    <div>This email is sent automatically by system, please don't reply.</div>
+</body>
+
+</html>

+ 18 - 0
api-v8/resources/views/emails/certification/zh-Hans.blade.php

@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+    <title>invite</title>
+</head>
+
+<body>
+    <h2>验证你的电子邮件地址</h2>
+    <div>你好:</div>
+    <div>已收到用此邮箱注册wikipali账号的请求。要完成此流程,请在验证页面输入以下代码:</div>
+    <h3>{{ $code }}</h3>
+    <div>该验证码三十分钟内有效</div>
+    <div>如果你未曾注册wikipali账号,请忽略此邮件。如果你反复收到此邮件,请联系wikipali管理员</div>
+    <div>此邮件为系统自动发送,请勿回复。</div>
+</body>
+
+</html>

+ 15 - 0
api-v8/resources/views/emails/certification/zh-Hant.blade.php

@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+    <title>invite</title>
+</head>
+
+<body>
+    <div>wikipali 注册邮箱验证码</div>
+    <div>使用下面的邮箱验证码。</div>
+    <div><b>{{ $code }}</b></div>
+    <div>此郵件為係統自動發送,請勿回複。</div>
+</body>
+
+</html>