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

Размер файла: 3.88Kb
  1. <?php
  2.  
  3. declare(strict_types=1);
  4.  
  5. namespace App\Controllers;
  6.  
  7. use App\Classes\Validator;
  8. use App\Models\Advert;
  9. use Illuminate\Http\Request;
  10.  
  11. class AdvertController extends BaseController
  12. {
  13. /**
  14. * Конструктор
  15. */
  16. public function __construct()
  17. {
  18. parent::__construct();
  19.  
  20. if (! setting('rekusershow')) {
  21. abort('default', __('adverts.advert_closed'));
  22. }
  23. }
  24.  
  25. /**
  26. * Главная страница
  27. *
  28. * @return string
  29. */
  30. public function index(): string
  31. {
  32. $adverts = Advert::query()
  33. ->where('deleted_at', '>', SITETIME)
  34. ->orderByDesc('deleted_at')
  35. ->with('user')
  36. ->paginate(setting('rekuserpost'));
  37.  
  38. return view('adverts/index', compact('adverts'));
  39. }
  40.  
  41. /**
  42. * Покупка рекламы
  43. *
  44. * @param Request $request
  45. * @param Validator $validator
  46. *
  47. * @return string
  48. */
  49. public function create(Request $request, Validator $validator): string
  50. {
  51. if (! $user = getUser()) {
  52. abort(403, __('main.not_authorized'));
  53. }
  54.  
  55. if ($user->point < setting('rekuserpoint')) {
  56. abort('default', __('adverts.advert_point', ['point' => plural(50, setting('scorename'))]));
  57. }
  58.  
  59. $total = Advert::query()->where('deleted_at', '>', SITETIME)->count();
  60. if ($total >= setting('rekusertotal')) {
  61. abort('default', __('adverts.advert_not_seats'));
  62. }
  63.  
  64. $advert = Advert::query()
  65. ->where('user_id', $user->id)
  66. ->where('deleted_at', '>', SITETIME)
  67. ->first();
  68.  
  69. if ($advert) {
  70. abort('default', __('adverts.advert_already_posted'));
  71. }
  72.  
  73. if ($request->isMethod('post')) {
  74. $site = $request->input('site');
  75. $name = $request->input('name');
  76. $color = $request->input('color');
  77. $bold = empty($request->input('bold')) ? 0 : 1;
  78.  
  79. $price = setting('rekuserprice');
  80.  
  81. if ($color) {
  82. $price += setting('rekuseroptprice');
  83. }
  84.  
  85. if ($bold) {
  86. $price += setting('rekuseroptprice');
  87. }
  88.  
  89. $validator->equal($request->input('token'), $_SESSION['token'], __('validator.token'))
  90. ->gte($user->point, setting('rekuserpoint'), __('adverts.advert_point', ['point' => plural(50, setting('scorename'))]))
  91. ->true(captchaVerify(), ['protect' => __('validator.captcha')])
  92. ->regex($site, '|^https?://([а-яa-z0-9_\-\.])+(\.([а-яa-z0-9\/\-?_=#])+)+$|iu', ['site' => __('validator.url')])
  93. ->length($site, 5, 100, ['site' => __('validator.url_text')])
  94. ->length($name, 5, 35, ['name' => __('validator.text')])
  95. ->regex($color, '|^#+[A-f0-9]{6}$|', ['color' => __('validator.color')], false)
  96. ->gte($user->money, $price, __('adverts.advert_not_money'));
  97.  
  98. if ($validator->isValid()) {
  99. Advert::query()->where('deleted_at', '<', SITETIME)->delete();
  100.  
  101. Advert::query()->create([
  102. 'site' => $site,
  103. 'name' => $name,
  104. 'color' => $color,
  105. 'bold' => $bold,
  106. 'user_id' => $user->id,
  107. 'created_at' => SITETIME,
  108. 'deleted_at' => strtotime('+' . setting('rekusertime') . ' hours', SITETIME),
  109. ]);
  110.  
  111. $user->decrement('money', $price);
  112.  
  113. clearCache('adverts');
  114. setFlash('success', __('adverts.advert_success_posted'));
  115. redirect('/adverts');
  116. } else {
  117. setInput($request->all());
  118. setFlash('danger', $validator->getErrors());
  119. }
  120. }
  121.  
  122. return view('adverts/create');
  123. }
  124. }