Skip to content

Commit

Permalink
Merge pull request #421 from V-Power-Inc/dev
Browse files Browse the repository at this point in the history
Merge dev into master
  • Loading branch information
PC-Principal authored Jan 5, 2025
2 parents a63e5a9 + 1114425 commit 22df201
Show file tree
Hide file tree
Showing 21 changed files with 384 additions and 589 deletions.
3 changes: 1 addition & 2 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ ENVIRONMENT=dev
DEBUG_STATUS=false

# Database
# ---------------------
DB_DSN=mysql:host=localhost;dbname=dev_db
DB_NAME=dev_db
DB_USER=usr_test
Expand Down Expand Up @@ -37,5 +36,5 @@ RECAPCHASITEKEY=your_site_key
# DSN for log
SENTRY_DSN=https://log-url.ru

# Restriced urls
# Restriced urls that should be excepted
RESTRICTED_URLS=test1,test2,test
14 changes: 12 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@
[![GitHub Actions](https://github.com/PC-Principal/wiki-tarkov/actions/workflows/DockerApp-Actions.yml/badge.svg)](https://github.com/PC-Principal/wiki-tarkov/actions/workflows/DockerApp-Actions.yml)
[![Deploy on Prod](https://github.com/V-Power-Inc/wiki-tarkov/actions/workflows/DeployProd.yml/badge.svg)](https://github.com/V-Power-Inc/wiki-tarkov/actions/workflows/DeployProd.yml)
![Site status](https://img.shields.io/badge/site%20status-works-success)
![Stable Version](https://img.shields.io/badge/version-v7.3.31-brightgreen)
![Stable Version](https://img.shields.io/badge/version-v7.3.41-brightgreen)
![Stable branch](https://img.shields.io/badge/Stable%20branch-master-success)
![Tests Count](https://img.shields.io/badge/tests%20count-815-informational)
![Tests Code Coverage](https://img.shields.io/badge/coverage-87%25-success)
![Vulnerabilities Snyk Bitbucket](https://img.shields.io/badge/vulnerabilities-1-red)
![Vulnerabilities Snyk Bitbucket](https://img.shields.io/badge/vulnerabilities-0-success)
![Discord Online](https://img.shields.io/discord/405924890328432652?label=Discord&logo=Discord&color=informational)


Expand Down Expand Up @@ -206,6 +206,16 @@ Snyk в настоящий момент применяет 2 теста для
# Domain Credentials
DOMAIN_PROTOCOL=http://
DOMAIN=localhost

# Recapcha things (Без рекапчи не будет авторизация в админку/отправка форм с сайта, можно отключить проверку в AR моделях)
RECAPCHAKEY=your_custom_secret_key
RECAPCHASITEKEY=your_site_key

# DSN for log
SENTRY_DSN=https://log-url.ru

# Restriced urls that should be excepted
RESTRICTED_URLS=test1,test2,test

Домен и протокол можно указать и свои, это для продакшена. Мы все равно будем на localhost, когда проект будет развернут через Docker.

Expand Down
2 changes: 1 addition & 1 deletion common/interfaces/ApiInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ function getBosses(string $map_name = null);
* @param ApiForm $model - Объект поисковой формы Api
* @return mixed
*/
function proccessSearchItem(ApiForm $model);
function processSearchItem(ApiForm $model);

/**
* Метод для получения квестов торговцев, в качестве параметра используется URL адрес квестов этого приложения
Expand Down
160 changes: 82 additions & 78 deletions common/services/ApiService.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
use app\models\{ApiLoot, ApiSearchLogs, Bosses, Tasks};
use app\models\forms\ApiForm;
use yii\base\{InvalidArgumentException, InvalidConfigException, ErrorException};
use yii\db\Exception;
use yii\db\StaleObjectException;
use yii\helpers\Json;
use yii\web\HttpException;
Expand Down Expand Up @@ -134,9 +135,9 @@ private function isEmptyBosses(): bool
* @throws StaleObjectException if [[optimisticLock|optimistic locking]] is enabled and the data
* being deleted is outdated.
* @throws \Throwable in case delete failed.
* @return bool
* @return void
*/
private function removeOldBosses(): bool
private function removeOldBosses(): void
{
/** Задаем SQL запрос переменной - ищем устаревшие записи */
$bosses = Bosses::find()->all();
Expand All @@ -145,9 +146,6 @@ private function removeOldBosses(): bool
foreach ($bosses as $boss) {
$boss->delete();
}

/** Возвращаем true - если удаление боссов прошло успешно */
return true;
}

/**
Expand Down Expand Up @@ -187,10 +185,10 @@ private function getApiData(bool $encoded = true)
* Метод сохраняет данные в таблицу Bosses
*
* @param array $data - массив с данными о боссах
* @return bool
* @throws InvalidConfigException
* @return void
* @throws InvalidConfigException|Exception
*/
private function saveData(array $data): bool
private function saveData(array $data): void
{
/** Проходим в цикле все полученные карты */
foreach ($data[Api::ATTR_DATA][Api::ATTR_MAPS] as $map) {
Expand All @@ -210,9 +208,6 @@ private function saveData(array $data): bool

/** Логируем что API вернул кривые данные */
LogService::saveErrorData(Yii::$app->request->getUrl(), ErrorDesc::TYPE_ERROR_JSON_ENCODE_API, ErrorDesc::DESC_ERROR_JSON_ENCODE_API);

/** Возвращаем false - Не удалось сохранить новые данные */
return false;
}

/** Передаем название карты в генератор Url */
Expand All @@ -221,17 +216,15 @@ private function saveData(array $data): bool
/** Сохраняем новый объект данных о боссе */
$model->save();
}

/** Возвращаем true - если сохранение прошло удачно */
return true;
}

/**
* Метод проверяет актуальность данных и если они устарели - помечает их на удаление
*
* @return bool
* @return void
* @throws Exception
*/
private function setOldBosses(): bool
private function setOldBosses(): void
{
/** Задаем переменную с выборкой боссов, которые еще актуальны */
$bosses = Bosses::findAll([Bosses::ATTR_OLD => Bosses::FALSE]);
Expand All @@ -240,9 +233,9 @@ private function setOldBosses(): bool
foreach ($bosses as $boss) {

/** Дата устаревания записи */
$date = date('Y-m-d H:i:s', strtotime($boss->date_create . ' +1 month'));
$date = date('Y-m-d H:i:s', strtotime($boss->date_create . ' +2 month'));

/** Если дата записи +1 месяца - меньше текущего времени - запись должна быть помечена на удаление */
/** Если дата записи +2 месяца - меньше текущего времени - запись должна быть помечена на удаление */
if ($date < date("Y-m-d H:i:s",time())) {

/** Устанавливаем флаг старой записи */
Expand All @@ -252,9 +245,6 @@ private function setOldBosses(): bool
$boss->save();
}
}

/** Возвращаем true если все прошло успешно */
return true;
}

/**
Expand Down Expand Up @@ -284,6 +274,8 @@ private function setTasksQuery(): void
* - Если квестов в БД нет или устарели, удалим их
* - Если квесты есть и нет устаревших, возвращаем их из базы по урлу торговца
*
* UPD 05-01-2025 - Обновление данных отключено на время рефакторинга
*
* @param string $url - URL до квестов торговцев
* @return mixed
* @throws StaleObjectException
Expand All @@ -293,25 +285,26 @@ private function setTasksQuery(): void
public function getTasks(string $url)
{
/** Проверяем, если записи о квестах устарели или их нет - проводим следующие операции */
if ($this->isOldTasks() | $this->isEmptyTasks()) {

/** Удаляем устаревшие записи о квестах */
$this->removeOldTasks();

/** Сетапим запрос для API на получение информации о квестах */
$this->setTasksQuery();

/** Переменная для получения данных о квестах через API */
$data = $this->getApiData();

/** Отправляем массив с данными о квестах в метод, который сохранит их в БД */
$this->createTasks($data);

} else if (!$this->isEmptyTasks()) { /** Если таблица с квестами не пуста - помечаем устаревшие записи */

/** Помечаем устаревшие квесты */
$this->setOldTasks();
}
// TODO: Раскомментить после рефактора
// if ($this->isOldTasks() | $this->isEmptyTasks()) {
//
// /** Удаляем устаревшие записи о квестах */
// $this->removeOldTasks();
//
// /** Сетапим запрос для API на получение информации о квестах */
// $this->setTasksQuery();
//
// /** Переменная для получения данных о квестах через API */
// $data = $this->getApiData();
//
// /** Отправляем массив с данными о квестах в метод, который сохранит их в БД */
// $this->createTasks($data);
//
// } else if (!$this->isEmptyTasks()) { /** Если таблица с квестами не пуста - помечаем устаревшие записи */
//
// /** Помечаем устаревшие квесты */
// $this->setOldTasks();
// }

/** Получаем данные о квестах из таблицы Tasks */
$result = new TasksResult(Tasks::getTasksData($url));
Expand All @@ -335,52 +328,61 @@ public function getTasks(string $url)
* - Предмета нет в базе но есть в API
* - Есть предмет в базе
*
* UPD 05-01-2025 - Не получаем новые предметы на время рефактора
*
* @param ApiForm $model - поисковый запрос на получение предмета
*
* @return mixed
* @return null|array
* @throws StaleObjectException if [[optimisticLock|optimistic locking]] is enabled and the data
* being deleted is outdated.
* @throws \Throwable in case delete failed.
* @throws InvalidConfigException
*/
public function proccessSearchItem(ApiForm $model)
public function processSearchItem(ApiForm $model): ?array
{
/** Проверка - если в БД у нас есть эта запись, тогда должны спарсить и обновить */
if (ApiLoot::findItemsByName($model->item_name)) {

/** Сперва удалим существующие записи */
$this->removeItemsByQuery($model->item_name);

/** Если нам удалось создать новые предметы, возвращаем их в контроллер */
if ($this->createNewItems($model)) {

/** Возвращаем в контроллер набор данных, который искали ранее */
return ApiLoot::findItemsByName($model->item_name);
}

/** Возвращаем False в контроллер, если в API нет данных */
return false;
}

/** Проверка - если в БД у нас нет похожих записей, тогда должны спарсить и создать */
if (!ApiLoot::findItemsByName($model->item_name)) {

/** Если нам удалось создать новые предметы, возвращаем их в контроллер */
if ($this->createNewItems($model)) {

/** Возвращаем в контроллер набор данных, который искали ранее */
return ApiLoot::findItemsByName($model->item_name);
}

/** Возвращаем False в контроллер, если в API нет данных */
return false;
if (!empty($items = ApiLoot::findItemsByName($model->item_name))) {
return $items;
} else {
return null;
}

/** Логируем в БД ошибку */
LogService::saveErrorData(Yii::$app->request->getUrl(), ErrorDesc::TYPE_SERVER_API_ERROR, ErrorDesc::DESC_SERVER_API_ERROR);

/** Эксепшн на случай непредвиденных обстоятельств (Мы не должны сюда попадать, т.к. должны по идее остаться в одном из кейсов выше) */
throw new HttpException(ResponseStatusInterface::SERVER_ERROR_CODE, 'Server error code');
// TODO: Вернуть к прежнему виду после рефактора
// /** Проверка - если в БД у нас есть эта запись, тогда должны спарсить и обновить */
// if (ApiLoot::findItemsByName($model->item_name)) {
//
// /** Сперва удалим существующие записи */
// $this->removeItemsByQuery($model->item_name);
//
// /** Если нам удалось создать новые предметы, возвращаем их в контроллер */
// if ($this->createNewItems($model)) {
//
// /** Возвращаем в контроллер набор данных, который искали ранее */
// return ApiLoot::findItemsByName($model->item_name);
// }
//
// /** Возвращаем False в контроллер, если в API нет данных */
// return false;
// }
//
// /** Проверка - если в БД у нас нет похожих записей, тогда должны спарсить и создать */
// if (!ApiLoot::findItemsByName($model->item_name)) {
//
// /** Если нам удалось создать новые предметы, возвращаем их в контроллер */
// if ($this->createNewItems($model)) {
//
// /** Возвращаем в контроллер набор данных, который искали ранее */
// return ApiLoot::findItemsByName($model->item_name);
// }
//
// /** Возвращаем False в контроллер, если в API нет данных */
// return false;
// }
//
// /** Логируем в БД ошибку */
// LogService::saveErrorData(Yii::$app->request->getUrl(), ErrorDesc::TYPE_SERVER_API_ERROR, ErrorDesc::DESC_SERVER_API_ERROR);
//
// /** Эксепшн на случай непредвиденных обстоятельств (Мы не должны сюда попадать, т.к. должны по идее остаться в одном из кейсов выше) */
// throw new HttpException(ResponseStatusInterface::SERVER_ERROR_CODE, 'Server error code');
}

/**
Expand Down Expand Up @@ -439,7 +441,7 @@ private function createNewItems(ApiForm $model): bool
$newItem->name = trim($data[Api::ATTR_ITEM_NAME]);
$newItem->url = $data[Api::ATTR_NORMALIZED_ITEM_NAME];

/** Исключение по определенным урлам */
/** Исключение обновлений по определенным урлам todo - В будущем убрать, после полноценного рефакторинга */
if (in_array($newItem->url, explode(',', $_ENV['RESTRICTED_URLS'])) === true) {
continue;
}
Expand Down Expand Up @@ -476,6 +478,7 @@ private function createNewItems(ApiForm $model): bool
* @param ApiForm $model - объект модели ApiForm
* @param int $flag - флаг, для проверки - вернулись ли данные по запросу или нет
* @return bool
* @throws Exception
*/
public function setSearchLog(ApiForm $model, int $flag = 0): bool
{
Expand All @@ -502,7 +505,7 @@ public function setSearchLog(ApiForm $model, int $flag = 0): bool
*/
private function isEmptyTasks(): bool
{
return empty(Tasks::find()->all()) ? true : false;
return empty(Tasks::find()->all());
}

/**
Expand Down Expand Up @@ -623,6 +626,7 @@ private function setGraphsItemQuery(string $id): bool
/**
* @param string $id - id предмета из API tarkov.dev
* @return string
* @throws InvalidConfigException
*/
public function getGraphsById(string $id): string
{
Expand Down
2 changes: 1 addition & 1 deletion composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,9 @@
"yiisoft/yii2-bootstrap": "~2.0.4",
"yiisoft/yii2-swiftmailer": "~2.1.0",
"mihaildev/yii2-ckeditor": "*",
"mihaildev/yii2-elfinder": "*",
"himiklab/yii2-recaptcha-widget" : "*",
"yiisoft/yii2-imagine": "~2.1.0",
"yiisoft/yii2-jui": "~2.0.0",
"kartik-v/yii2-widget-typeahead": "*",
"yiisoft/yii2-redis": "~2.0.0",
"martyn911/yii2-adblock-detector":"*",
Expand Down
Loading

0 comments on commit 22df201

Please sign in to comment.