Просмотр файла app/Http/Controllers/PageController.php

Размер файла: 4.58Kb
  1. <?php
  2.  
  3. declare(strict_types=1);
  4.  
  5. namespace App\Http\Controllers;
  6.  
  7. use App\Models\Rule;
  8. use App\Models\Sticker;
  9. use App\Models\StickersCategory;
  10. use App\Models\Status;
  11. use App\Models\Surprise;
  12. use Illuminate\Http\RedirectResponse;
  13. use Illuminate\Support\Facades\DB;
  14. use Illuminate\View\View;
  15.  
  16. class PageController extends Controller
  17. {
  18. /**
  19. * Главная страница
  20. *
  21. * @param string $page
  22. *
  23. * @return View
  24. */
  25. public function index(string $page = 'index'): View
  26. {
  27. if (
  28. $page === 'menu'
  29. || ! preg_match('|^[a-z0-9_\-]+$|i', $page)
  30. || ! file_exists(resource_path('views/main/' . $page . '.blade.php'))
  31. ) {
  32. abort(404);
  33. }
  34.  
  35. return view('main/layout', compact('page'));
  36. }
  37.  
  38. /**
  39. * Меню
  40. *
  41. * @return View
  42. */
  43. public function menu(): View
  44. {
  45. if (! getUser()) {
  46. abort(404);
  47. }
  48.  
  49. return view('main/layout', ['page' => 'menu']);
  50. }
  51.  
  52. /**
  53. * Теги
  54. *
  55. * @return View
  56. */
  57. public function tags(): View
  58. {
  59. return view('pages/tags');
  60. }
  61.  
  62. /**
  63. * Правила
  64. *
  65. * @return View
  66. */
  67. public function rules(): View
  68. {
  69. $rules = Rule::query()->first();
  70.  
  71. if ($rules) {
  72. $rules['text'] = str_replace('%SITENAME%', setting('title'), $rules['text']);
  73. }
  74.  
  75. return view('pages/rules', compact('rules'));
  76. }
  77.  
  78. /**
  79. * Стикеры
  80. *
  81. * @return View
  82. */
  83. public function stickers(): View
  84. {
  85. $categories = StickersCategory::query()
  86. ->selectRaw('sc.id, sc.name, count(s.id) cnt')
  87. ->from('stickers_categories as sc')
  88. ->leftJoin('stickers as s', 's.category_id', 'sc.id')
  89. ->groupBy('sc.id')
  90. ->orderBy('sc.id')
  91. ->get();
  92.  
  93. return view('pages/stickers', compact('categories'));
  94. }
  95.  
  96. /**
  97. * Стикеры
  98. *
  99. * @param int $id
  100. *
  101. * @return View
  102. */
  103. public function stickersCategory(int $id): View
  104. {
  105. $category = StickersCategory::query()->where('id', $id)->first();
  106.  
  107. if (! $category) {
  108. abort(404, __('stickers.category_not_exist'));
  109. }
  110.  
  111. $stickers = Sticker::query()
  112. ->where('category_id', $id)
  113. ->orderBy(DB::raw('CHAR_LENGTH(code)'))
  114. ->orderBy('name')
  115. ->with('category')
  116. ->paginate(setting('stickerlist'));
  117.  
  118. return view('pages/stickers_category', compact('category', 'stickers'));
  119. }
  120.  
  121. /**
  122. * Ежегодный сюрприз
  123. *
  124. * @return RedirectResponse
  125. */
  126. public function surprise(): RedirectResponse
  127. {
  128. $surprise['requiredDate'] = '10.01';
  129.  
  130. $money = mt_rand(10000, 50000);
  131. $point = mt_rand(150, 250);
  132. $rating = mt_rand(3, 10);
  133. $year = date('Y');
  134.  
  135. if (! $user = getUser()) {
  136. abort(403, __('main.not_authorized'));
  137. }
  138.  
  139. if (strtotime(date('d.m.Y')) > strtotime($surprise['requiredDate'].'.'.date('Y'))) {
  140. abort(200, __('pages.surprise_date_receipt'));
  141. }
  142.  
  143. $existSurprise = Surprise::query()
  144. ->where('user_id', $user->id)
  145. ->where('year', $year)
  146. ->first();
  147.  
  148. if ($existSurprise) {
  149. abort(200, __('pages.surprise_already_received'));
  150. }
  151.  
  152. if ($user->point >= 50) {
  153. $user->increment('point', $point);
  154. } else {
  155. $point = 0;
  156. }
  157.  
  158. $user->increment('money', $money);
  159. $user->increment('posrating', $rating);
  160. $user->update(['rating' => $user->posrating - $user->negrating]);
  161.  
  162. $text = textNotice('surprise', ['year' => $year, 'point' => plural($point, setting('scorename')), 'money' => plural($money, setting('moneyname')), 'rating' => $rating]);
  163. $user->sendMessage(null, $text);
  164.  
  165. Surprise::query()->create([
  166. 'user_id' => $user->id,
  167. 'year' => $year,
  168. 'created_at' => SITETIME,
  169. ]);
  170.  
  171. setFlash('success', __('pages.surprise_success_received'));
  172. return redirect('/');
  173. }
  174.  
  175. /**
  176. * FAQ по сайту
  177. *
  178. * @return View
  179. */
  180. public function faq(): View
  181. {
  182. return view('pages/faq');
  183. }
  184.  
  185.  
  186. /**
  187. * FAQ по статусам
  188. *
  189. * @return View
  190. */
  191. public function statusfaq(): View
  192. {
  193. $statuses = Status::query()
  194. ->orderByDesc('topoint')
  195. ->get();
  196.  
  197. return view('pages/statusfaq', compact('statuses'));
  198. }
  199. }