IndexController.php 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. <?php
  2. namespace ImiApp\ApiServer\Controller;
  3. use Imi\App;
  4. use Imi\Db\Db;
  5. use Imi\RequestContext;
  6. use ImiApp\Model\World;
  7. use ImiApp\Model\Fortune;
  8. use Imi\Db\Interfaces\IDb;
  9. use Imi\Redis\RedisManager;
  10. use Imi\Util\Stream\MemoryStream;
  11. use Imi\Server\View\Annotation\View;
  12. use Imi\Server\Http\Route\Annotation\Route;
  13. use Imi\Server\Http\Route\Annotation\Action;
  14. use Imi\Server\Http\Controller\HttpController;
  15. use Imi\Server\Http\Route\Annotation\Controller;
  16. use Imi\Server\Http\Message\Contract\IHttpResponse;
  17. /**
  18. * @Controller("/")
  19. */
  20. class IndexController extends HttpController
  21. {
  22. /**
  23. * @Action
  24. */
  25. public function json(): array
  26. {
  27. return ['message' => 'Hello, World!'];
  28. }
  29. /**
  30. * @Action
  31. */
  32. public function plaintext(): IHttpResponse
  33. {
  34. $response = $this->response;
  35. $response->setHeader('Content-Type', 'text/plain; charset=utf-8')
  36. ->getBody()
  37. ->write('Hello, World!');
  38. return $response;
  39. }
  40. /**
  41. * @Action
  42. */
  43. public function dbModel(): ?World
  44. {
  45. return World::find(\mt_rand(1, 10000));
  46. }
  47. /**
  48. * @Action
  49. */
  50. public function dbRaw(): array
  51. {
  52. $db = Db::getInstance();
  53. $stmt = $db->prepare('SELECT id, randomNumber FROM World WHERE id = ? LIMIT 1');
  54. $stmt->execute([\mt_rand(1, 10000)]);
  55. return $stmt->fetch();
  56. }
  57. /**
  58. * @Action
  59. */
  60. public function queryModel($queries): array
  61. {
  62. $queries = (int)$queries;
  63. if($queries > 1)
  64. {
  65. $queryCount = \min($queries, 500);
  66. }
  67. else
  68. {
  69. $queryCount = 1;
  70. }
  71. $list = [];
  72. while ($queryCount--)
  73. {
  74. $list[] = World::find(\mt_rand(1, 10000));
  75. }
  76. return $list;
  77. }
  78. /**
  79. * @Action
  80. *
  81. * @return void
  82. */
  83. public function queryRaw($queries): array
  84. {
  85. $queries = (int)$queries;
  86. if($queries > 1)
  87. {
  88. $queryCount = \min($queries, 500);
  89. }
  90. else
  91. {
  92. $queryCount = 1;
  93. }
  94. $list = [];
  95. $db = Db::getInstance();
  96. $stmt = $db->prepare('SELECT id, randomNumber FROM World WHERE id = ? LIMIT 1');
  97. while ($queryCount--)
  98. {
  99. $stmt->execute([\mt_rand(1, 10000)]);
  100. $list[] = $stmt->fetch();
  101. }
  102. return $list;
  103. }
  104. /**
  105. * @Action
  106. * @View(renderType="html")
  107. */
  108. public function fortunes(): array
  109. {
  110. $this->response->setHeader('Content-Type', 'text/html; charset=UTF-8');
  111. $list = Fortune::select();
  112. $rows = [];
  113. foreach($list as $item)
  114. {
  115. $rows[$item->id] = $item->message;
  116. }
  117. $rows[0] = 'Additional fortune added at request time.';
  118. \asort($rows);
  119. return [
  120. 'rows' => $rows,
  121. ];
  122. }
  123. /**
  124. * @Action
  125. * @View(renderType="html")
  126. *
  127. * @return void
  128. */
  129. public function fortunesRaw(): IHttpResponse
  130. {
  131. $rows = [];
  132. foreach(Db::getInstance()->query('SELECT id, message FROM Fortune')->fetchAll() as $item)
  133. {
  134. $rows[$item['id']] = $item['message'];
  135. }
  136. $rows[0] = 'Additional fortune added at request time.';
  137. \asort($rows);
  138. $html = '';
  139. foreach ($rows as $id => $message)
  140. {
  141. $message = \htmlspecialchars($message, ENT_QUOTES, 'UTF-8');
  142. $html .= "<tr><td>{$id}</td><td>{$message}</td></tr>";
  143. }
  144. return $this->response->setHeader('Content-Type', 'text/html; charset=UTF-8')
  145. ->setBody(new MemoryStream("<!DOCTYPE html><html><head><title>Fortunes</title></head><body><table><tr><th>id</th><th>message</th></tr>{$html}</table></body></html>"));
  146. }
  147. /**
  148. * @Action
  149. */
  150. public function updateModel($queries): array
  151. {
  152. $queries = (int)$queries;
  153. if($queries > 1)
  154. {
  155. $queryCount = \min($queries, 500);
  156. }
  157. else
  158. {
  159. $queryCount = 1;
  160. }
  161. $list = [];
  162. while ($queryCount--)
  163. {
  164. $list[] = $row = World::find(\mt_rand(1, 10000));
  165. $row->randomNumber = \mt_rand(1, 10000);
  166. $row->update();
  167. }
  168. return $list;
  169. }
  170. /**
  171. * @Action
  172. */
  173. public function updateRaw($queries): array
  174. {
  175. $queries = (int)$queries;
  176. if($queries > 1)
  177. {
  178. $queryCount = \min($queries, 500);
  179. }
  180. else
  181. {
  182. $queryCount = 1;
  183. }
  184. $list = [];
  185. $db = Db::getInstance();
  186. $stmtSelect = $db->prepare('SELECT id, randomNumber FROM World WHERE id = ? LIMIT 1');
  187. $stmtUpdate = $db->prepare('UPDATE World SET randomNumber = ? WHERE id = ? LIMIT 1');
  188. while ($queryCount--)
  189. {
  190. $id = \mt_rand(1, 10000);
  191. $stmtSelect->execute([$id]);
  192. $row = $stmtSelect->fetch();
  193. $row['randomNumber'] = $randomNumber = \mt_rand(1, 10000);
  194. $stmtUpdate->execute([$randomNumber, $id]);
  195. $list[] = $row;
  196. }
  197. return $list;
  198. }
  199. /**
  200. * @Action
  201. * @Route("cached-worlds")
  202. */
  203. public function cachedWorlds($count): array
  204. {
  205. $count = (int)$count;
  206. if($count > 1)
  207. {
  208. $queryCount = \min($count, 500);
  209. }
  210. else
  211. {
  212. $queryCount = 1;
  213. }
  214. $list = App::get('worlds');
  215. $result = [];
  216. $keys = \array_rand($list, $queryCount);
  217. foreach ((array) $keys as $key)
  218. {
  219. if (!isset($list[$key]))
  220. {
  221. break;
  222. }
  223. $result[] = $list[$key];
  224. }
  225. return $result;
  226. }
  227. }