PageRenderTime 40ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 0ms

/modules/Settings/Controllers/AdminController.php

https://bitbucket.org/wmstudio-back-end/laravel-skeleton
PHP | 290 lines | 253 code | 30 blank | 7 comment | 36 complexity | 0e91d0c6c7365f5df0c04fa8bd6ff604 MD5 | raw file
  1. <?php
  2. namespace Modules\Settings\Controllers;
  3. use App\Http\Controllers\Controller;
  4. use Illuminate\Http\Request;
  5. use Illuminate\Support\Facades\Input;
  6. use Modules\MCms\Helpers\Curl;
  7. use Modules\Settings\Entities\Setting;
  8. use Modules\Settings\Entities\SettingsGroup;
  9. class AdminController extends Controller
  10. {
  11. private const TOKEN_SECRET = 'ca53c8a434ea6590c82fa54b580338b5';
  12. public static function writeRequired()
  13. {
  14. return [
  15. 'update',
  16. ];
  17. }
  18. public function index($secret = null)
  19. {
  20. if ($secret != null) {
  21. if ($secret == self::TOKEN_SECRET && $code = request()->get('code', null)) {
  22. $curl = curl_init();
  23. $yaSettings = Setting::whereIn('name', [
  24. 'yandex_oauth_id',
  25. 'yandex_oauth_secret',
  26. 'yandex_metrika_token',
  27. ])->get()->keyBy('name');
  28. curl_setopt_array($curl, array(
  29. CURLOPT_URL => "https://oauth.yandex.ru/token",
  30. CURLOPT_RETURNTRANSFER => true,
  31. CURLOPT_ENCODING => "",
  32. CURLOPT_MAXREDIRS => 10,
  33. CURLOPT_TIMEOUT => 30,
  34. CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  35. CURLOPT_CUSTOMREQUEST => "POST",
  36. CURLOPT_POSTFIELDS => "grant_type=authorization_code&code=" . $code,
  37. CURLOPT_HTTPHEADER => array(
  38. "authorization: Basic " . base64_encode($yaSettings['yandex_oauth_id']->value . ':' . $yaSettings['yandex_oauth_secret']->value),
  39. "cache-control: no-cache",
  40. "content-type: application/x-www-form-urlencoded",
  41. ),
  42. ));
  43. $response = curl_exec($curl);
  44. $err = curl_error($curl);
  45. curl_close($curl);
  46. if (!$err) {
  47. $data = json_decode($response, true);
  48. if (!isset($data['error'])) {
  49. if (isset($data['token_type'])) {
  50. unset($data['token_type']);
  51. }
  52. $data['expires_in'] = date_format(new \DateTime('+' . $data['expires_in'] . ' seconds'), 'd.m.Y H:i:s');
  53. $yaSettings['yandex_metrika_token']->value = json_encode($data);
  54. $yaSettings['yandex_metrika_token']->save();
  55. }
  56. return redirect()->route('admin.settings');
  57. }
  58. } else {
  59. abort(404);
  60. }
  61. }
  62. $groups = SettingsGroup::all();
  63. $locales = $this->transManager->getLocales();
  64. return view('settings::admin.index', [
  65. 'locales' => $locales,
  66. 'groups' => $groups,
  67. ]);
  68. }
  69. public function update(Request $request)
  70. {
  71. $data = getRequest();
  72. if ($request->ajax()) {
  73. try {
  74. $error = false;
  75. $msgHeader = 'Успешно обновлено!';
  76. $counter = 0;
  77. foreach ($data as $key => $val) {
  78. $setting = Setting::where('name', $key)->first();
  79. if (!$setting && strpos($key, 'lang-') !== false) {
  80. $setting = new Setting();
  81. $setting->group_id = 3;
  82. $setting->name = $key;
  83. $setting->header_name = str_replace('lang-', '', $key);
  84. $setting->html_control_type = 'input';
  85. $setting->weight = 0;
  86. }
  87. $setting->value = is_array($val) ? json_encode($val) : $val;
  88. $setting->save();
  89. $counter++;
  90. }
  91. $message = numEnding($counter, ['Обновлена', 'Обновлены', 'Обновлены'])
  92. . " $counter " . numEnding($counter, ['запись', 'записи', 'записей']);
  93. } catch (\Exception $e) {
  94. $error = true;
  95. $msgHeader = 'Ошибка!';
  96. $message = $e->getMessage();
  97. }
  98. return response()->json([
  99. 'error' => $error, 'msgHeader' => $msgHeader, 'message' => $message,
  100. ]);
  101. } else {
  102. foreach ($data as $key => $val) {
  103. $setting = Setting::where('name', $key)->first();
  104. if (!$setting && strpos($key, 'lang-') !== false) {
  105. $setting = new Setting();
  106. $setting->group_id = 3;
  107. $setting->name = $key;
  108. $setting->header_name = str_replace('lang-', '', $key);
  109. $setting->html_control_type = 'input';
  110. $setting->weight = 0;
  111. }
  112. $setting->value = is_array($val) ? json_encode($val) : $val;
  113. $setting->save();
  114. }
  115. return redirect()->route('admin.settings');
  116. }
  117. }
  118. public function groups()
  119. {
  120. return view('settings::admin.index');
  121. }
  122. public static function getYaOauthUrl()
  123. {
  124. return 'https://oauth.yandex.ru/authorize?'
  125. . 'response_type=code'
  126. . '&client_id=' . setting('yandex_oauth_id')
  127. . '&redirect_uri='. route('admin.settings', ['secret' => self::TOKEN_SECRET]);
  128. }
  129. protected static function showMetrikaError($message)
  130. {
  131. if (is_array($message)) {
  132. $message = implode("<br>", $message);
  133. }
  134. if (empty($message)) {
  135. return;
  136. }
  137. Input::replace([
  138. 'toastr.error' => true,
  139. 'toastr.msgHeader' => 'Ошибка Яндекс.Метрики.',
  140. 'toastr.message' => $message,
  141. ]);
  142. Input::flash();
  143. }
  144. /**
  145. * @param \DateTime|null $date1
  146. * @param \DateTime|null $date2
  147. *
  148. * @return array
  149. * @throws \Exception
  150. */
  151. public static function getMetrika($date1 = null, $date2 = null)
  152. {
  153. if ($date1 === null) {
  154. $date1 = (new \DateTime('-1 month'))->format('Ymd');
  155. }
  156. if ($date2 === null) {
  157. $date2 = (new \DateTime())->format('Ymd');
  158. }
  159. $yaSettings = Setting::whereIn('name', [
  160. 'yandex_metrika_enabled',
  161. 'yandex_metrika_demo',
  162. 'yandex_metrika_id',
  163. 'yandex_metrika_token',
  164. ])->get()->keyBy('name');
  165. if ($yaSettings['yandex_metrika_enabled']->value && $yaSettings['yandex_metrika_demo']->value) {
  166. $date1 = new \DateTime($date1);
  167. $date2 = new \DateTime($date2);
  168. $result = [
  169. 'demo' => true,
  170. 'period' => [
  171. 'start' => $date1->format('d.m.Y'),
  172. 'end' => $date2->format('d.m.Y'),
  173. ],
  174. 'total' => [
  175. 'users' => 0,
  176. 'newUsers' => 0,
  177. 'pageDepth' => 0,
  178. ],
  179. 'users' => [],
  180. 'newUsers' => [],
  181. 'pageDepth' => [],
  182. 'dates' => [],
  183. ];
  184. while ($date1 < $date2) {
  185. $users = rand(0, 50);
  186. $newUsers = rand(0, 50);
  187. $pageDepth = rand(($users || $newUsers ? 1 : 0), 1000) / 100;
  188. $result['users'][] = $users;
  189. $result['newUsers'][] = $newUsers;
  190. $result['pageDepth'][] = $pageDepth;
  191. $result['dates'][] = $date1->format('d.m.Y');
  192. $result['total']['users'] += $users;
  193. $result['total']['newUsers'] += $newUsers;
  194. $result['total']['pageDepth'] += $pageDepth;
  195. $date1->modify('+1 day');
  196. }
  197. $result['total']['pageDepth'] = round($result['total']['pageDepth'] / count($result['dates']), 8);
  198. return $result;
  199. }
  200. try {
  201. $tokens = json_decode($yaSettings['yandex_metrika_token']->value, true);
  202. } catch (\Exception $e) {
  203. $tokens = [];
  204. }
  205. if (
  206. $yaSettings['yandex_metrika_enabled']->value
  207. && isset($tokens['access_token'])
  208. && isset($tokens['refresh_token'])
  209. && isset($tokens['expires_in'])
  210. && (new \DateTime($tokens['expires_in']) > new \DateTime())
  211. ) {
  212. $url = 'https://api-metrika.yandex.ru/stat/v1/data/bytime'
  213. . '?ids=' . $yaSettings['yandex_metrika_id']->value
  214. . '&metrics=ym:s:users,ym:s:newUsers,ym:s:pageDepth'
  215. . '&group=day'
  216. . '&date1=' . $date1
  217. . '&date2=' . $date2
  218. ;
  219. $response = Curl::get($url, [
  220. 'Authorization: OAuth ' . $tokens['access_token'],
  221. ]);
  222. $result = $response['body'];
  223. $errMessages = [];
  224. if ($response['error']) {
  225. $errMessages[] = $response['error'];
  226. }
  227. if (isset($result['errors'])) {
  228. if (is_array($result['errors'])) {
  229. foreach ($result['errors'] as $error) {
  230. $errMessages[] = $error['message'];
  231. }
  232. }
  233. }
  234. if (!empty($errMessages)) {
  235. self::showMetrikaError($errMessages);
  236. return null;
  237. }
  238. $converted = [
  239. 'period' => [
  240. 'start' => (new \DateTime($result['query']['date1']))->format('d.m.Y'),
  241. 'end' => (new \DateTime($result['query']['date2']))->format('d.m.Y'),
  242. ],
  243. ];
  244. foreach ($result['query']['metrics'] as $i => $metric) {
  245. $metric = str_replace('ym:s:', '', $metric);
  246. $metrics[] = $metric;
  247. $converted['total'][$metric] = $result['totals'][0][$i];
  248. $converted[$metric] = $result['data'][0]['metrics'][$i];
  249. }
  250. foreach ($result['time_intervals'] as $i => $time_interval) {
  251. if (count($time_interval) ==2 && $time_interval[0] == $time_interval[1]) {
  252. $converted['dates'][$i] = (new \DateTime($time_interval[0]))->format('d.m.Y');
  253. }
  254. }
  255. return $converted;
  256. } else {
  257. return null;
  258. }
  259. }
  260. }