<?php
namespace Tests\http\controller;
use Core\Map\WorkerMap;
use Facade\JsonRpc;
use Generator;
use Illuminate\Support\Facades\View;
use PRipple;
use RedisException;
use Support\Extends\Laravel\Facade\DB;
use Support\Extends\Session\Session;
use Support\Http\Request;
use Support\WebApplication\Route;
use Throwable;
use Worker\Built\RedisWorker;
class Index
{
public static function index(Request $request): Generator
{
yield $request->respondBody('hello world');
}
public static function info(Request $request): Generator
{
yield $request->respondJson([
'code' => 0,
'msg' => 'success',
'data' => [
'processId' => posix_getpid(),
'rpcServices' => array_keys(JsonRpc::getInstance()->rpcServiceConnections),
'configure' => PRipple::getArgument()
],
]);
}
public static function data(Request $request): Generator
{
$startTime = microtime(true);
$data = DB::table('device')
->leftJoin('project', 'device.project_id', '=', 'project.id')
->limit(100)
->get()
->toArray();
$endTime = microtime(true);
yield $request->respondJson([
'code' => 0,
'msg' => 'success',
'data' => [
'time' => $endTime - $startTime,
'data' => $data
],
]);
}
public static function cache(RedisWorker $redisWorker, Request $request): Generator
{
$redis = $redisWorker->getClient();
if ($key = $request->query['key'] ?? null) {
$redis->set('key', $key);
yield $request->respondJson([
'code' => 0,
'msg' => 'success',
'data' => [
'message' => 'login success,' . $key
],
]);
} elseif ($key = $redis->get('key')) {
yield $request->respondJson([
'code' => 0,
'msg' => 'success',
'data' => [
'message' => 'hello,' . $key
],
]);
} else {
yield $request->respondJson([
'code' => 1,
'msg' => 'error',
'data' => [
'message' => 'key is required'
],
]);
}
}
public static function fork(Request $request): Generator
{
$pid = WorkerMap::get('http')?->fork();
yield $request->respondJson([
'code' => 0,
'msg' => 'success',
'data' => [
'pid' => $pid
],
]);
}
public static function notice(Request $request): Generator
{
if ($message = $request->query['message'] ?? null) {
JsonRpc::call(['ws', 'sendMessageToAll'], $message);
yield $request->respondJson([
'code' => 0,
'msg' => 'success',
'data' => [
'message' => $message
],
]);
} else {
yield $request->respondJson([
'code' => 1,
'msg' => 'error',
'data' => [
'message' => 'message is required'
],
]);
}
}
public static function login(Request $request, Session $session): Generator
{
if ($name = $request->query['name'] ?? null) {
$session->set('name', $name);
yield $request->respondJson([
'code' => 0,
'msg' => 'success',
'data' => [
'message' => 'login success,' . $name
],
]);
} elseif ($name = $session->get('name')) {
yield $request->respondJson([
'code' => 0,
'msg' => 'success',
'data' => [
'message' => 'hello,' . $name
],
]);
} else {
yield $request->respondJson([
'code' => 1,
'msg' => 'error',
'data' => [
'message' => 'name is required'
],
]);
}
}
public static function logout(Request $request, Session $session): Generator
{
$session->clear();
yield $request->respondJson([
'code' => 0,
'msg' => 'success',
'data' => [
'message' => 'logout success'
],
]);
}
public static function download(Request $request): Generator
{
yield $request->respondFile(__DIR__ . '/Index.php', 'Index.php');
}
public static function upload(Request $request): Generator
{
if ($request->method === Route::GET) {
yield $request->respondBody(
View::make('upload', [
'title' => 'please select upload file'
])->render()
);
}
yield $request->respondBody('wait...');
if ($request->upload) {
$request->on(Request::ON_UPLOAD, function (array $fileInfo) {
JsonRpc::call(['ws', 'sendMessageToAll'], 'Upload File Info:' . json_encode($fileInfo));
});
}
}
}