Skip to content
Toggle navigation
Projects
Groups
Snippets
Help
Письменов Дмитрий Иванович
/
yourroomads
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Settings
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit 511a09a8
authored
Jun 01, 2021
by
Vladislav
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
#20207 Доработка изменения РК
1 parent
fe85f62b
Show whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
169 additions
and
61 deletions
app/Jobs/ProcessCallAPI.php
app/Service/Contract/APIRequest.php
app/Service/Requests/APIRequest.php
app/Service/Requests/Direct/AddCampaigns.php
app/Service/Requests/Direct/GetCampaigns.php
app/Service/Requests/Direct/ResumeCampaigns.php
app/Service/Requests/Direct/SuspendCampaigns.php
app/Service/Requests/Direct/UpdateCampaigns.php
app/Service/Requests/DirectRequest.php
app/Jobs/ProcessCallAPI.php
View file @
511a09a
...
...
@@ -45,10 +45,17 @@ class ProcessCallAPI implements ShouldQueue
//считаем на сколько объектов зарезервировано получение данных
//только их и запрашиваем
$limit
=
\App\Models\Limits
::
find
(
$this
->
limitId
);
$limits
=
Limits
::
getInstance
(
$this
->
api
->
getToken
());
$maxObjects
=
$limits
->
countObjectsLimit
(
$this
->
api
);
if
(
$maxObjects
and
$maxObjects
!==
$limits
::
NAN
&&
$this
->
api
->
getObjectsCount
()
>
$maxObjects
)
{
//те на которые не хватило баллов помещаем в очередь
if
(
$apiR
=
$this
->
api
->
slice
(
$limit
->
spent
))
{
if
(
$apiR
=
$this
->
api
->
slice
(
$maxObjects
))
{
dispatch
(
new
ProcessCallLimitedAPI
(
$apiR
));
}
}
$response
=
$api
->
execute
();
$limits
->
acceptRezerv
(
$this
->
limitId
,
new
HeaderLimits
(
$response
->
headers
()));
//TODO: обработать результат.
...
...
app/Service/Contract/APIRequest.php
View file @
511a09a
...
...
@@ -14,7 +14,8 @@ interface APIRequest{
function
getToken
()
:
Tokens
;
function
getApi
()
:
string
;
function
slice
(
$objects
)
:
?
APIRequest
;
function
slice
(
$maxObjects
)
:
?
APIRequest
;
function
sliceByKey
(
$maxObjects
,
$key
)
:
?
APIRequest
;
function
call
(
$params
=
null
);
function
handle
(
$response
);
...
...
app/Service/Requests/APIRequest.php
View file @
511a09a
<?php
namespace
App\Service\Requests
;
use
App\Models\Tokens
;
use
App\Service\API\API
;
class
APIRequest
implements
\App\Service\Contract\APIRequest
{
class
APIRequest
implements
\App\Service\Contract\APIRequest
{
protected
$api
;
protected
$service
;
protected
$method
;
protected
$params
;
protected
$token
;
protected
function
__construct
(
$api
){
protected
function
__construct
(
$api
)
{
$this
->
api
=
$api
;
}
static
function
getInstance
(
$type
){
switch
(
$type
){
static
function
getInstance
(
$type
)
{
switch
(
$type
)
{
case
API
::
YANDEX
:
return
new
DirectRequest
(
$type
);
default
:
...
...
@@ -73,6 +77,58 @@ class APIRequest implements \App\Service\Contract\APIRequest {
return
$this
->
token
;
}
function
sliceByKey
(
$maxObjects
,
$key
)
:
?
\App\Service\Contract\APIRequest
{
$params
=
$this
->
getParams
();
if
(
is_array
(
$key
))
{
$params_i
=
$params
;
for
(
$i
=
0
;
$i
<
count
(
$key
);
$i
++
)
{
$params_i
=
$params_i
[
$key
[
$i
]];
}
$params_by_key
=
$params_i
;
}
else
{
$params_by_key
=
$params
[
$key
];
}
$replication
=
clone
$this
;
$objects
=
$this
->
sliceArray
(
$params_by_key
,
0
,
$maxObjects
);
if
(
is_array
(
$key
))
{
$params
=
$this
->
changeInArray
(
$params
,
$objects
,
$key
);
}
else
{
$params
[
$key
]
=
$this
->
sliceArray
(
$params_by_key
,
$maxObjects
);
}
$replication
->
setParams
(
$params
);
if
(
is_array
(
$key
))
{
$params
=
$this
->
changeInArray
(
$params
,
$objects
,
$key
);
}
else
{
$params
[
$key
]
=
$this
->
sliceArray
(
$params_by_key
,
$maxObjects
);
}
$this
->
setParams
(
$params
);
return
$replication
;
}
private
function
sliceArray
(
$params
,
$offset
,
$length
=
null
)
:
array
{
return
array_values
(
array_slice
(
$params
,
$offset
,
$length
));
}
private
function
changeInArray
(
$params
,
$objects
,
$key
)
{
$params_i
=
&
$params
;
for
(
$i
=
0
;
$i
<
count
(
$key
);
$i
++
)
{
$params_i
=
&
$params_i
[
$key
[
$i
]];
}
$params_i
=
$objects
;
return
$params
;
}
function
slice
(
$count
)
:
?
\App\Service\Contract\APIRequest
{
throw
new
Exception
(
'Я не знаю формата запрсов, чтобы его разбить'
);
...
...
@@ -83,15 +139,18 @@ class APIRequest implements \App\Service\Contract\APIRequest {
throw
new
Exception
(
'Я не знаю формата запрсов, чтобы его разбить'
);
}
function
call
(
$params
=
null
){
function
call
(
$params
=
null
)
{
}
function
handle
(
$response
){
function
handle
(
$response
)
{
}
function
getObjectsCount
(){
function
getObjectsCount
()
{
throw
new
Exception
(
'Не задано сколкьо бъектов обрабатывается'
);
}
}
app/Service/Requests/Direct/AddCampaigns.php
View file @
511a09a
...
...
@@ -6,6 +6,7 @@ use App\Jobs\ProcessCallLimitedAPI;
use
App\Models\Campaigns
;
use
App\Models\Pivots\DictionaryCampaign
;
use
App\Models\Variable
;
use
App\Service\Contract\APIRequest
;
use
App\Service\Requests\DirectRequest
;
use
App\Service\StrReplaceByVariables
;
use
Carbon\Carbon
;
...
...
@@ -29,11 +30,38 @@ class AddCampaigns extends DirectRequest
dispatch
(
$process
)
->
onQueue
(
'limits'
);
}
public
function
getObjectsCount
(){
$params
=
$this
->
getParams
();
$cnt
=
count
(
$params
[
'Campaigns'
]);
return
$cnt
>
self
::
MAX_COUNT
?
self
::
MAX_COUNT
:
$cnt
;
}
public
function
slice
(
$maxObjects
)
:
?
APIRequest
{
$splinter
=
$this
->
sliceByKey
(
$maxObjects
,
'Campaigns'
);
$dictionaryCampaigns_splinter
=
$this
->
dictionaryCampaigns
->
slice
(
$maxObjects
)
->
values
();
$splinter
->
putParams
([
'dictionaryCampaigns'
=>
$dictionaryCampaigns_splinter
,
'variables'
=>
$this
->
variables
,
]);
$this
->
putParams
([
'dictionaryCampaigns'
=>
$this
->
dictionaryCampaigns
->
slice
(
0
,
$maxObjects
),
'variables'
=>
$this
->
variables
,
]);
return
$splinter
;
}
public
function
handle
(
$response
)
{
try
{
if
(
!
isset
(
$response
[
'result'
]))
{
Log
::
debug
(
$response
);
Log
::
debug
(
$this
->
getParams
());
}
foreach
(
$response
[
'result'
][
'AddResults'
]
as
$key
=>
$add_result
)
{
...
...
@@ -42,6 +70,7 @@ class AddCampaigns extends DirectRequest
if
(
!
$external_id
)
{
Log
::
debug
(
"AddCampaigns, empty Id"
);
Log
::
debug
(
$add_result
);
Log
::
debug
(
$this
->
getParams
());
continue
;
}
...
...
@@ -49,6 +78,7 @@ class AddCampaigns extends DirectRequest
'external_id'
=>
$external_id
,
'external_upload_at'
=>
Carbon
::
now
(),
]);
}
}
catch
(
\Exception
$e
)
{
Log
::
debug
(
$e
);
...
...
@@ -75,8 +105,10 @@ class AddCampaigns extends DirectRequest
$bidding_strategy
=
$dictionaryCampaign
->
campaign
->
bidding_strategy
;
if
(
!
isset
(
$bidding_strategy
[
'Network'
][
'NetworkDefault'
])
&&
$bidding_strategy
[
'Network'
][
'BiddingStrategyType'
]
!==
'HIGHEST_POSITION'
)
{
// $bidding_strategy['Network']['NetworkDefault'] = null;
if
(
$bidding_strategy
)
{
if
(
!
isset
(
$bidding_strategy
[
'Network'
][
'NetworkDefault'
])
&&
$bidding_strategy
[
'Network'
][
'BiddingStrategyType'
]
===
'NETWORK_DEFAULT'
)
{
$bidding_strategy
[
'Network'
][
'NetworkDefault'
]
=
(
object
)[];
}
elseif
(
isset
(
$bidding_strategy
[
'Network'
][
'NetworkDefault'
])
&&
is_null
(
$bidding_strategy
[
'Network'
][
'NetworkDefault'
][
'LimitPercent'
]))
{
unset
(
$bidding_strategy
[
'Network'
][
'NetworkDefault'
]);
}
...
...
@@ -141,6 +173,8 @@ class AddCampaigns extends DirectRequest
unset
(
$bidding_strategy
[
'Search'
][
'PayForConversion'
][
'WeeklySpendLimit'
]);
}
}
$data
=
[
'Name'
=>
StrReplaceByVariables
::
getInstance
(
$dictionaryCampaign
->
name
,
$list
)
->
get
(),
'StartDate'
=>
Carbon
::
now
()
->
format
(
'Y-m-d'
),
...
...
@@ -216,10 +250,4 @@ class AddCampaigns extends DirectRequest
]);
}
function
getObjectsCount
(){
$params
=
$this
->
getParams
();
$cnt
=
count
(
$params
[
'Campaigns'
]);
return
$cnt
>
self
::
MAX_COUNT
?
self
::
MAX_COUNT
:
$cnt
;
}
}
app/Service/Requests/Direct/GetCampaigns.php
View file @
511a09a
...
...
@@ -12,14 +12,23 @@ class GetCampaigns extends DirectRequest
{
protected
$timestamp
;
function
call
(
$params
=
null
)
public
function
call
(
$params
=
null
)
{
$this
->
requestPrepare
(
$params
);
$process
=
new
ProcessCallLimitedAPI
(
$this
);
dispatch
(
$process
)
->
onQueue
(
'limits'
);
}
function
handle
(
$response
)
public
function
getObjectsCount
()
{
$params
=
$this
->
getParams
();
if
(
isset
(
$params
[
'SelectionCriteria'
][
'Ids'
])
&&
count
(
$params
[
'SelectionCriteria'
][
'Ids'
])
<
self
::
MAX_COUNT
){
return
count
(
$params
[
'SelectionCriteria'
][
'Ids'
]);
}
return
self
::
MAX_COUNT
;
}
public
function
handle
(
$response
)
{
try
{
foreach
(
$response
[
'result'
][
'Campaigns'
]
as
$campaign_data
)
{
...
...
@@ -87,11 +96,4 @@ class GetCampaigns extends DirectRequest
$this
->
setParams
(
$params
);
}
function
getObjectsCount
(){
$params
=
$this
->
getParams
();
if
(
isset
(
$params
[
'SelectionCriteria'
][
'Ids'
])
&&
count
(
$params
[
'SelectionCriteria'
][
'Ids'
])
<
self
::
MAX_COUNT
){
return
count
(
$params
[
'SelectionCriteria'
][
'Ids'
]);
}
return
self
::
MAX_COUNT
;
}
}
app/Service/Requests/Direct/ResumeCampaigns.php
View file @
511a09a
...
...
@@ -5,6 +5,7 @@ namespace App\Service\Requests\Direct;
use
App\Jobs\ProcessCallLimitedAPI
;
use
App\Models\Campaigns
;
use
App\Models\Pivots\DictionaryCampaign
;
use
App\Service\Contract\APIRequest
;
use
App\Service\Requests\DirectRequest
;
use
Illuminate\Support\Facades\Log
;
...
...
@@ -12,14 +13,26 @@ class ResumeCampaigns extends DirectRequest
{
CONST
MAX_COUNT
=
1000
;
function
call
(
$params
=
null
)
public
function
call
(
$params
=
null
)
{
$this
->
requestPrepare
(
$params
);
$process
=
new
ProcessCallLimitedAPI
(
$this
);
dispatch
(
$process
)
->
onQueue
(
'limits'
);
}
function
handle
(
$response
)
public
function
getObjectsCount
(){
$params
=
$this
->
getParams
();
$cnt
=
count
(
$params
[
'SelectionCriteria'
][
'Ids'
]);
return
$cnt
>
self
::
MAX_COUNT
?
self
::
MAX_COUNT
:
$cnt
;
}
public
function
slice
(
$maxObjects
)
:
?
APIRequest
{
return
$this
->
sliceByKey
(
$maxObjects
,
[
'SelectionCriteria'
,
'Ids'
]);
}
public
function
handle
(
$response
)
{
try
{
foreach
(
$response
[
'result'
][
'ResumeResults'
]
as
$resume_result
)
{
...
...
@@ -60,10 +73,4 @@ class ResumeCampaigns extends DirectRequest
$this
->
setParams
(
$params
);
}
function
getObjectsCount
(){
$params
=
$this
->
getParams
();
$cnt
=
count
(
$params
[
'SelectionCriteria'
][
'Ids'
]);
return
$cnt
>
self
::
MAX_COUNT
?
self
::
MAX_COUNT
:
$cnt
;
}
}
app/Service/Requests/Direct/SuspendCampaigns.php
View file @
511a09a
...
...
@@ -5,6 +5,7 @@ namespace App\Service\Requests\Direct;
use
App\Jobs\ProcessCallLimitedAPI
;
use
App\Models\Campaigns
;
use
App\Models\Pivots\DictionaryCampaign
;
use
App\Service\Contract\APIRequest
;
use
App\Service\Requests\DirectRequest
;
use
Carbon\Carbon
;
use
Illuminate\Support\Facades\Log
;
...
...
@@ -13,14 +14,27 @@ class SuspendCampaigns extends DirectRequest
{
CONST
MAX_COUNT
=
1000
;
function
call
(
$params
=
null
)
public
function
call
(
$params
=
null
)
{
$this
->
requestPrepare
(
$params
);
$process
=
new
ProcessCallLimitedAPI
(
$this
);
dispatch
(
$process
)
->
onQueue
(
'limits'
);
}
function
handle
(
$response
)
public
function
getObjectsCount
()
{
$params
=
$this
->
getParams
();
$cnt
=
count
(
$params
[
'SelectionCriteria'
][
'Ids'
]);
return
$cnt
>
self
::
MAX_COUNT
?
self
::
MAX_COUNT
:
$cnt
;
}
public
function
slice
(
$maxObjects
)
:
?
APIRequest
{
return
$this
->
sliceByKey
(
$maxObjects
,
[
'SelectionCriteria'
,
'Ids'
]);
}
public
function
handle
(
$response
)
{
try
{
foreach
(
$response
[
'result'
][
'SuspendResults'
]
as
$suspend_result
)
{
...
...
@@ -61,10 +75,4 @@ class SuspendCampaigns extends DirectRequest
$this
->
setParams
(
$params
);
}
function
getObjectsCount
(){
$params
=
$this
->
getParams
();
$cnt
=
count
(
$params
[
'SelectionCriteria'
][
'Ids'
]);
return
$cnt
>
self
::
MAX_COUNT
?
self
::
MAX_COUNT
:
$cnt
;
}
}
app/Service/Requests/Direct/UpdateCampaigns.php
View file @
511a09a
...
...
@@ -6,6 +6,7 @@ use App\Jobs\ProcessCallLimitedAPI;
use
App\Models\Campaigns
;
use
App\Models\Pivots\DictionaryCampaign
;
use
App\Models\Variable
;
use
App\Service\Contract\APIRequest
;
use
App\Service\Requests\DirectRequest
;
use
App\Service\StrReplaceByVariables
;
use
Carbon\Carbon
;
...
...
@@ -24,6 +25,19 @@ class UpdateCampaigns extends DirectRequest
dispatch
(
$process
)
->
onQueue
(
'limits'
);
}
public
function
getObjectsCount
()
{
$params
=
$this
->
getParams
();
$cnt
=
count
(
$params
[
'Campaigns'
]);
return
$cnt
>
self
::
MAX_COUNT
?
self
::
MAX_COUNT
:
$cnt
;
}
public
function
slice
(
$maxObjects
)
:
?
APIRequest
{
return
$this
->
sliceByKey
(
$maxObjects
,
'Campaigns'
);
}
public
function
handle
(
$response
)
{
try
{
...
...
@@ -127,10 +141,4 @@ class UpdateCampaigns extends DirectRequest
]);
}
function
getObjectsCount
(){
$params
=
$this
->
getParams
();
$cnt
=
count
(
$params
[
'Campaigns'
]);
return
$cnt
>
self
::
MAX_COUNT
?
self
::
MAX_COUNT
:
$cnt
;
}
}
app/Service/Requests/DirectRequest.php
View file @
511a09a
...
...
@@ -20,21 +20,9 @@ class DirectRequest extends APIRequest {
$this
->
url
=
config
(
'api.yandex.url'
);
}
function
slice
(
$
count
)
:
?
\App\Service\Contract\APIRequest
function
slice
(
$
maxObjects
)
:
?
\App\Service\Contract\APIRequest
{
return
null
;
if
(
$count
<
0
)
return
null
;
//для запросов get ничего не разбиваем, т.к. заранее не знаем сколько чего будет
//для них только после выполнения запроса будет известно есть ли кроме $count еще данные
//а текущий запрос просто устанавливается в $count
//а вот для запросов мутаторов будем разбивать. Но тут уже будет зависеть от запроса
//будем под каждый реализовывать делитель
if
(
!
isset
(
$this
->
params
[
'Page'
])){
$this
->
params
[
'Page'
]
=
[];
}
$this
->
params
[
'Page'
][
'Limit'
]
=
$count
;
return
null
;
}
function
next
(
$offset
){
...
...
Write
Preview
Markdown
is supported
Attach a file
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to post a comment