Commit addba62f by Vladislav

#20304 Проблемы на epl3

1 parent 83188a98
......@@ -45,18 +45,47 @@ class DictionaryCampaignsSyncByCampaign extends Command
{
Campaigns::has('dictionaryCampaignSynchronizedNeedSynced')->forManaged()->get()->each(function (Campaigns $campaign) {
$campaign->load([
'groups.keywords',
'groupsForNotKeywordsLoadable.keywords',
'dictionaryCampaignSynchronizedNeedSynced'
]);
$campaign->dictionaryCampaignSynchronizedNeedSynced->each(function (DictionaryCampaign $dictionaryCampaign) use ($campaign) {
$campaign->groups->each(function (AdGroup $adGroup) use ($dictionaryCampaign) {
$campaign->groupsForNotKeywordsLoadable->each(function (AdGroup $adGroup) use ($dictionaryCampaign) {
$goalAdGroup = GoalAdGroup::updateOrCreateByMain($adGroup, $dictionaryCampaign);
$adGroup->keywords->each(function (Keyword $keyword) use ($goalAdGroup, $dictionaryCampaign) {
GoalKeyword::updateOrCreateByMain($keyword, $goalAdGroup, $dictionaryCampaign);
$data_keywords = $adGroup->keywords->map(function (Keyword $keyword) use ($goalAdGroup, $dictionaryCampaign) {
return GoalKeyword::getDataByMain($keyword, $goalAdGroup, $dictionaryCampaign);
})->toArray();
GoalKeyword::upsert($data_keywords, [
'dictionary_campaign_id',
'dictionary_campaign_external_id',
'goal_ad_group_id',
'goal_ad_group_external_id',
'keyword_id',
'deleted_at',
], [
'dictionary_campaign_id',
'dictionary_campaign_external_id',
'goal_ad_group_id',
'goal_ad_group_external_id',
'keyword_id',
'deleted_at',
]);
$goalKeywordQuery = GoalKeyword::where('dictionary_campaign_id', $dictionaryCampaign->getKey())
->where('goal_ad_group_id', $goalAdGroup->getKey());
if (count($data_keywords)) {
$goalKeywordQuery->whereNotIn('keyword_id', array_column($data_keywords, 'keyword_id'));
}
$goalKeywords = $goalKeywordQuery->get();
$goalKeywords->each(function (GoalKeyword $goalKeyword) {
$goalKeyword->delete();
});
});
......
......@@ -281,9 +281,7 @@ class TokensController extends Controller
}
$dictionary->token()->dissociate();
$dictionary->dictionaryCampaigns->each(function (DictionaryCampaign $dictionaryCampaign) {
$dictionaryCampaign->delete();
});
$dictionary->dictionaryCampaigns()->delete();
$dictionary->save();
return Redirect::route('token.edit', $token->getKey())->with('success', 'City deleted.');
......
......@@ -50,6 +50,7 @@ use Illuminate\Support\Collection;
* @method static Builder|AdGroup whereMobileAppAdGroup($value)
* @method static Builder|AdGroup whereSmartAdGroup($value)
* @method static Builder|AdGroup forKeywordsLoadable()
* @method static Builder|AdGroup forNotKeywordsLoadable()
* @method static Builder|AdGroup forUpdatedSelf()
* @method static Builder|AdGroup newModelQuery()
* @method static Builder|AdGroup newQuery()
......@@ -163,34 +164,6 @@ class AdGroup extends Model
public static function boot()
{
parent::boot();
static::created(function (AdGroup $ad_group) {
if ($ad_group->campaign) {
$ad_group->campaign->dictionaryCampaigns()->update([
'synced_need' => Carbon::now(),
]);
}
});
static::updated(function (AdGroup $ad_group) {
if (GoalAdGroup::getPropertiesCopyWithPivot()->first(function ($property_name) use ($ad_group) {
return $ad_group->{$property_name} !== $ad_group->getOriginal($property_name);
})) {
$ad_group->campaign->dictionaryCampaigns()->update([
'synced_need' => Carbon::now(),
]);
}
if (self::getPropertiesWatch()->first(function ($property_name) use ($ad_group) {
return $ad_group->{$property_name} !== $ad_group->getOriginal($property_name);
})) {
$ad_group->goalGroups()->has('dictionaryCampaignSynchronized')->forExternal()->update([
'updated_need' => Carbon::now(),
]);
}
});
}
/**
......@@ -211,6 +184,15 @@ class AdGroup extends Model
return $query->whereNull('keywords_loaded_at');
}
/**
* @param Builder $query
* @return Builder
*/
public function scopeForNotKeywordsLoadable($query)
{
return $query->whereNotNull('keywords_loaded_at');
}
public function goalGroups()
{
return $this->hasMany(GoalAdGroup::class, 'ad_group_id');
......
......@@ -42,6 +42,7 @@ use Illuminate\Support\Collection;
* @property-read int|null $dictionaries_count
* @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\AdGroup[] $groups
* @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\AdGroup[] $groupsForKeywordsLoadable
* @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\AdGroup[] $groupsForNotKeywordsLoadable
* @property-read int|null $groups_count
* @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Variable[] $dictionaryCampaignVariables
* @property-read int|null $dictionary_campaign_variables_count
......@@ -222,41 +223,6 @@ class Campaigns extends Model
});
}
public function copyGroupInGoalGroup()
{
$campaign = $this;
$campaign->dictionaryCampaignSynchronized->each(function (DictionaryCampaign $dictionaryCampaign) use ($campaign) {
$campaign->groups->each(function (AdGroup $adGroup) use ($dictionaryCampaign) {
GoalAdGroup::updateOrCreateByMain($adGroup, $dictionaryCampaign);
});
});
}
public function copyGroupInGoalKeyword()
{
$campaign = $this;
$campaign->dictionaryCampaignSynchronized->each(function (DictionaryCampaign $dictionaryCampaign) use ($campaign) {
$dictionaryCampaign->groups->each(function (GoalAdGroup $goalAdGroup) use ($campaign, $dictionaryCampaign) {
$goalAdGroup->group->keywords()->where('campaign_id', $campaign->getKey())->get()->each(function (Keyword $keyword) use ($dictionaryCampaign, $goalAdGroup) {
GoalKeyword::updateOrCreateByMain($keyword, $goalAdGroup, $dictionaryCampaign);
});
});
});
}
public function getBiddingStrategyAttribute($bidding_strategy)
{
$bidding_strategy = json_decode($bidding_strategy, true);
......@@ -343,6 +309,11 @@ class Campaigns extends Model
return $this->groups()->forKeywordsLoadable();
}
public function groupsForNotKeywordsLoadable()
{
return $this->groups()->forNotKeywordsLoadable();
}
public function dictionaryCampaigns()
{
return $this->hasMany(DictionaryCampaign::class, 'campaign_id');
......
......@@ -110,35 +110,6 @@ class Keyword extends Model
{
parent::boot();
static::created(function (Keyword $keyword) {
if ($keyword->campaign) {
$keyword->campaign->dictionaryCampaigns()->update([
'synced_need' => Carbon::now(),
]);
}
});
static::updated(function (Keyword $keyword) {
if (GoalKeyword::getPropertiesCopyWithPivot()->first(function ($property_name) use ($keyword) {
return $keyword->{$property_name} !== $keyword->getOriginal($property_name);
})) {
$keyword->campaign->dictionaryCampaigns()->update([
'synced_need' => Carbon::now(),
]);
}
if (self::getPropertiesWatch()->first(function ($property_name) use ($keyword) {
return $keyword->{$property_name} !== $keyword->getOriginal($property_name);
})) {
$keyword->goalKeywords()->update([
'updated_need' => Carbon::now(),
]);
}
});
static::deleted(function (Keyword $keyword) {
if (!$keyword->isForceDeleting()) {
$keyword->goalKeywords->each(function (GoalKeyword $goalKeyword) {
......
......@@ -117,7 +117,7 @@ class GoalAdGroup extends Pivot
'dictionary_campaign_external_id' => $dictionaryCampaign->external_id,
'ad_group_id' => $adGroup->getKey(),
'deleted_at' => null,
], GoalAdGroup::copyPropertyFromMain($adGroup));
]);
}
/**
......@@ -192,11 +192,6 @@ class GoalAdGroup extends Pivot
return $this->belongsTo(DictionaryCampaign::class, 'dictionary_campaign_id');
}
public function dictionaryCampaignSynchronized()
{
return $this->dictionaryCampaign()->synchronized();
}
public function goalKeywords()
{
return $this->hasMany(GoalKeyword::class, 'goal_ad_group_id');
......
......@@ -122,16 +122,16 @@ class GoalKeyword extends Pivot
->all();
}
static public function updateOrCreateByMain(Keyword $keyword, GoalAdGroup $goalAdGroup, DictionaryCampaign $dictionaryCampaign)
static public function getDataByMain(Keyword $keyword, GoalAdGroup $goalAdGroup, DictionaryCampaign $dictionaryCampaign)
{
return GoalKeyword::updateOrCreate([
return [
'dictionary_campaign_id' => $dictionaryCampaign->getKey(),
'dictionary_campaign_external_id' => $dictionaryCampaign->external_id,
'goal_ad_group_id' => $goalAdGroup->getKey(),
'goal_ad_group_external_id' => $goalAdGroup->external_id,
'keyword_id' => $keyword->getKey(),
'deleted_at' => null,
], GoalKeyword::copyPropertyFromMain($keyword));
];
}
/**
......
......@@ -83,6 +83,8 @@ class GetAdGroups extends DirectRequest
->keyBy('external_id');
}
$campaign_ids_synced_need = [];
foreach ($response['result']['AdGroups'] as $ad_group) {
$external_id = (string)$ad_group['CampaignId'];
......@@ -122,13 +124,19 @@ class GetAdGroups extends DirectRequest
'updated_self' => null,
];
AdGroup::updateOrCreate([
$ad_group = AdGroup::updateOrCreate([
'external_id' => $external_id,
], $data);
$campaign->update([
'groups_loaded_at' => Carbon::now(),
]);
if ($ad_group->wasRecentlyCreated) {
$campaign_ids_synced_need[$ad_group->campaign_id] = true;
} elseif ($ad_group->wasChanged(['campaign_id'])) {
$campaign_ids_synced_need[$ad_group->campaign_id] = true;
} elseif ($ad_group->wasChanged($ad_group::getPropertiesWatch()->toArray())) {
$ad_group->goalGroups()->has('dictionaryCampaign')->forExternal()->update([
'updated_need' => Carbon::now(),
]);
}
} else {
$goalAdGroup = GoalAdGroup::firstWhere('external_id', $external_id);
......@@ -149,6 +157,25 @@ class GetAdGroups extends DirectRequest
}
if ($this->getToken()->isMain()) {
if (isset($this->getParams()['SelectionCriteria']['CampaignIds'])) {
Campaigns::whereIn('external_id', $this->getParams()['SelectionCriteria']['CampaignIds'])
->update([
'groups_loaded_at' => Carbon::now(),
]);
}
if (count($campaign_ids_synced_need)) {
Campaigns::findMany(array_keys($campaign_ids_synced_need))->each(function (Campaigns $campaign) {
$campaign->dictionaryCampaigns()->update([
'synced_need' => Carbon::now(),
]);
});
}
}
} catch (\Exception $e) {
Log::debug($e);
throw $e;
......
......@@ -4,6 +4,7 @@ namespace App\Service\Requests\Direct;
use App\Jobs\ProcessCallLimitedAPI;
use App\Models\AdGroup;
use App\Models\Campaigns;
use App\Models\Keyword;
use App\Models\Pivots\GoalAdGroup;
use App\Models\Pivots\GoalKeyword;
......@@ -91,13 +92,15 @@ class GetKeywords extends DirectRequest
}
$ids = [];
$campaign_ids_synced_need = [];
foreach ($response['result']['Keywords'] as $keyword) {
$ad_group = $ad_groups->get((string)$keyword['AdGroupId']);
if (!$ad_group)
if (!$ad_group) {
continue;
}
$external_id = (string)$keyword['Id'];
......@@ -125,11 +128,17 @@ class GetKeywords extends DirectRequest
'external_id' => $external_id
], $data);
$ids[] = $keyword->getKey();
if ($keyword->wasRecentlyCreated) {
$campaign_ids_synced_need[$keyword->campaign_id] = true;
} elseif ($keyword->wasChanged(['campaign_id'])) {
$campaign_ids_synced_need[$keyword->campaign_id] = true;
} elseif ($keyword->wasChanged($keyword::getPropertiesWatch()->toArray())) {
$keyword->goalKeywords()->has('dictionaryCampaign')->forExternal()->update([
'updated_need' => Carbon::now(),
]);
}
$ad_group->update([
'keywords_loaded_at' => Carbon::now(),
]);
$ids[] = $keyword->getKey();
} else {
$goalKeyword = GoalKeyword::firstWhere('external_id', $external_id);
......@@ -154,6 +163,22 @@ class GetKeywords extends DirectRequest
}
if ($this->getToken()->isMain()) {
if (isset($this->getParams()['SelectionCriteria']['AdGroupIds'])) {
AdGroup::whereIn('external_id', $this->getParams()['SelectionCriteria']['AdGroupIds'])
->update([
'keywords_loaded_at' => Carbon::now(),
]);
}
if (count($campaign_ids_synced_need)) {
Campaigns::findMany(array_keys($campaign_ids_synced_need))->each(function (Campaigns $campaign) {
$campaign->dictionaryCampaigns()->update([
'synced_need' => Carbon::now(),
]);
});
}
$keywordQuery = Keyword::query();
if (isset($this->getParams()['SelectionCriteria']['AdGroupIds'])) {
......
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateGoalKeywordsUnique extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('goal_keywords', function (Blueprint $table) {
$table->unique([
'dictionary_campaign_id',
'dictionary_campaign_external_id',
'goal_ad_group_id',
'goal_ad_group_external_id',
'keyword_id',
'deleted_at',
]);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
//
}
}
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!