SelfSiteController.php 6.4 KB
<?php

namespace App\Http\Controllers\Api;

use App\Exceptions\InquiryFilterException;
use App\Models\Mail\Mail;
use App\Models\Project\DeployBuild;
use App\Models\Project\Project;
use App\Models\User\User;
use App\Models\Visit\SyncSubmitTask;
use App\Models\WebSetting\WebSettingFormBack;
use App\Services\CosService;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Redis;

class SelfSiteController extends BaseController
{
    /**
     * 自建站访问接口
     * @param Request $request
     * @return false|string
     * @author Akun
     * @date 2024/05/16 11:21
     */
    public function selfSiteApi(Request $request)
    {
        $token = $request->header('token');//token
        $pid = $request->header('pid');//项目id

        $data = $request->input('data');//访问数据
        $domain = $request->input('domain');//访问域名
        $ip = $request->input('ip');//访问ip
        $referer = $request->input('referer');//访问来源
        $user_agent = $request->input('user_agent');//访问头信息
        $type = $request->input('type');//类型:visit,inquiry
        $traffic = $request->input('traffic', SyncSubmitTask::TRAFFIC_DEFAULT);//是否引流
        $files = $request->input('files', []);//文件

        if (empty($token) || empty($pid)) {
            return $this->error('token无效', 401);
        }

        if (empty($data) || empty($domain)) {
            return $this->error('参数错误');
        }

        if (!in_array($type, [SyncSubmitTask::TYPE_VISIT, SyncSubmitTask::TYPE_INQUIRY])) {
            return $this->error('类型错误');
        }

        //判断token是否有效
        $cache_key = 'self_site_api_' . $pid . '_' . $token;
        $project_info = Redis::get($cache_key);
        if ($project_info === null) {
            $project_model = new Project();
            $project_info = $project_model->read(['id' => $pid, 'site_token' => $token]);
            Redis::set($cache_key, json_encode($project_info));
            Redis::expire($cache_key, 3600);
        }

        if (!$project_info) {
            return $this->error('token无效', 401);
        }

        if (!empty($files)) {
            try {
                foreach ($files as $key => $file) {
                    $cos = new CosService();
                    $fileName = uniqid() . rand(10000, 99999) . '.' . $file['ext'];
                    $file_data = base64_decode($file['data']);
                    $path = $cos->uploadFile($file_data, '/inquiry/' . date('Ymd'), $fileName,true);
                    $data[$key] = [
                        'path' => $path,
                        'original_name' => $file['name'],
                    ];
                }
            } catch (InquiryFilterException $e) {
                return $this->error($e->getMessage());
            } catch (\Exception $e) {
                return $this->error('File upload fail');
            }
        }

        $array = [
            'data' => $data,
            'ip' => $ip,
            'domain' => $domain,
            'referer' => $referer,
            'user_agent' => $user_agent
        ];
        SyncSubmitTask::createTask($array, $type, $traffic);

        $result = [];
        if ($type == SyncSubmitTask::TYPE_INQUIRY) {
            $result = $this->inquiryResult($pid, $domain);
        }
        return $this->success($result);
    }

    protected function inquiryResult($pid, $domain)
    {
        $cache_key = 'inquiry_form_back_' . $domain;
        $result = Cache::get($cache_key);
        if (!$result) {
            $result = [
                'message' => "",
                'url' => "",
                'other' => ""
            ];
            $webFormBack = WebSettingFormBack::getBack($pid);
            if (!empty($webFormBack)) {
                $result["message"] = $webFormBack->message ?? "";
                $result["url"] = $webFormBack->url ?? "";
                $result["other"] = $webFormBack->other ?? "";
                Cache::put($cache_key, $result, 3600);
            }
        }

        return $result;
    }

    /**
     * 自建站页面更新通知接口
     * @param Request $request
     * @return false|string
     * @author Akun
     * @date 2024/05/22 15:24
     */
    public function selfSiteNotify(Request $request)
    {
        $token = $request->header('token');//token
        $pid = $request->header('pid');//项目id
        $domain = $request->input('domain');//域名

        if (empty($token) || empty($pid)) {
            return $this->error('token无效', 401);
        }

        //判断token是否有效
        $project_model = new Project();
        $project_info = $project_model->read(['id' => $pid, 'site_token' => $token]);
        if (!$project_info) {
            return $this->error('token无效', 401);
        }

        $user = new User();
        $userInfo = $user->list(['project_id' => $pid], 'id', ['id']);
        $user_list = '';
        if ($userInfo) {
            $user_list = implode(',', array_column($userInfo, 'id'));
        }

        $mail = new Mail();
        $data["title"] = "页面更新通知";
        $data["user_list"] = $mail->setUserList($user_list);
        $data["content"] = "该项目于 " . date('Y-m-d H:i:s') . " 执行页面更新完成,更新站点域名:" . $domain;
        $mail->add($data);

        return $this->success([]);
    }

    /**
     * 自建站上传验证文件接口
     * @param Request $request
     * @return false|string
     * @author Akun
     * @date 2024/05/28 11:47
     */
    public function selfSiteVerify(Request $request)
    {
        $token = $request->header('token');//token
        $pid = $request->header('pid');//项目id
        $file_name = $request->input('file_name');//验证文件名称
        $type = $request->input('type');//验证文件类型,1主站,2小语种站

        if (empty($token) || empty($pid)) {
            return $this->error('token无效', 401);
        }

        //判断token是否有效
        $project_model = new Project();
        $project_info = $project_model->read(['id' => $pid, 'site_token' => $token]);
        if (!$project_info) {
            return $this->error('token无效', 401);
        }

        $model = new DeployBuild();
        $data = $type == 1 ? ['main_verify_file' => $file_name] : ['amp_verify_file' => $file_name];
        $model->edit($data, ['project_id' => $pid]);

        return $this->success([]);
    }
}