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 2e2195e1
authored
Sep 08, 2021
by
Vladislav
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
#20794 Сделать чтобы в целевых РК оставалась одна карточка
1 parent
99aac925
Hide whitespace changes
Inline
Side-by-side
Showing
14 changed files
with
286 additions
and
25 deletions
app/Console/Kernel.php
app/Http/Controllers/TokensController.php
app/Models/Pivots/GoalAdImage.php
app/Models/Pivots/GoalKeyword.php
app/Models/Pivots/GoalVCard.php
app/Models/Tokens.php
app/Models/YandexError.php
app/Service/Requests/Direct/AddAdImages.php
app/Service/Requests/Direct/DeleteVCards.php
resources/js/Pages/Tokens/CitySettings.vue
resources/js/Pages/Tokens/Edit.vue
resources/js/Pages/Tokens/Errors.vue
resources/js/Pages/Tokens/Index.vue
routes/web.php
app/Console/Kernel.php
View file @
2e2195e
...
@@ -109,12 +109,12 @@ protected function schedule(Schedule $schedule)
...
@@ -109,12 +109,12 @@ protected function schedule(Schedule $schedule)
$schedule
->
command
(
VCardsLoad
::
class
)
->
hourlyAt
(
25
);
$schedule
->
command
(
VCardsLoad
::
class
)
->
hourlyAt
(
25
);
$schedule
->
command
(
VCardsAdd
::
class
)
->
hourlyAt
(
35
);
$schedule
->
command
(
VCardsAdd
::
class
)
->
hourlyAt
(
35
);
//
$schedule->command(AdImagesAdd::class)->hourlyAt(35);
$schedule
->
command
(
AdImagesAdd
::
class
)
->
hourlyAt
(
35
);
$schedule
->
command
(
AdExtensionsAdd
::
class
)
->
hourlyAt
(
35
);
$schedule
->
command
(
AdExtensionsAdd
::
class
)
->
hourlyAt
(
35
);
$schedule
->
command
(
SitelinksAdd
::
class
)
->
hourlyAt
(
35
);
$schedule
->
command
(
SitelinksAdd
::
class
)
->
hourlyAt
(
35
);
$schedule
->
command
(
NegativeKeywordSharedSetsAdd
::
class
)
->
hourlyAt
(
35
);
$schedule
->
command
(
NegativeKeywordSharedSetsAdd
::
class
)
->
hourlyAt
(
35
);
$schedule
->
command
(
NegativeKeywordSharedSetsUpdate
::
class
)
->
hourlyAt
(
35
);
$schedule
->
command
(
NegativeKeywordSharedSetsUpdate
::
class
)
->
hourlyAt
(
35
);
//
$schedule->command(RetargetinglistsAdd::class)->hourlyAt(35);
$schedule
->
command
(
RetargetinglistsAdd
::
class
)
->
hourlyAt
(
35
);
$schedule
->
command
(
RetargetinglistsUpdate
::
class
)
->
hourlyAt
(
35
);
$schedule
->
command
(
RetargetinglistsUpdate
::
class
)
->
hourlyAt
(
35
);
$schedule
->
command
(
AdGroupsDelete
::
class
)
->
hourlyAt
(
30
);
$schedule
->
command
(
AdGroupsDelete
::
class
)
->
hourlyAt
(
30
);
...
@@ -130,7 +130,7 @@ protected function schedule(Schedule $schedule)
...
@@ -130,7 +130,7 @@ protected function schedule(Schedule $schedule)
$schedule
->
command
(
KeywordsUpdate
::
class
)
->
hourlyAt
(
40
);
$schedule
->
command
(
KeywordsUpdate
::
class
)
->
hourlyAt
(
40
);
$schedule
->
command
(
AdvertisementsAdd
::
class
)
->
hourlyAt
(
50
);
$schedule
->
command
(
AdvertisementsAdd
::
class
)
->
hourlyAt
(
50
);
//
$schedule->command(AdvertisementsUpdate::class)->hourlyAt(50);
$schedule
->
command
(
AdvertisementsUpdate
::
class
)
->
hourlyAt
(
50
);
$schedule
->
command
(
AdvertisementsArchive
::
class
)
->
hourlyAt
(
50
);
$schedule
->
command
(
AdvertisementsArchive
::
class
)
->
hourlyAt
(
50
);
$schedule
->
call
(
function
()
{
$schedule
->
call
(
function
()
{
...
...
app/Http/Controllers/TokensController.php
View file @
2e2195e
...
@@ -22,7 +22,7 @@ class TokensController extends Controller
...
@@ -22,7 +22,7 @@ class TokensController extends Controller
return
Inertia
::
render
(
'Tokens/Index'
,
[
return
Inertia
::
render
(
'Tokens/Index'
,
[
'filters'
=>
Request
::
all
(
'api'
,
'type'
,
'login'
),
'filters'
=>
Request
::
all
(
'api'
,
'type'
,
'login'
),
'types'
=>
[
Tokens
::
MAIN
=>
'Основной аккаунт'
,
Tokens
::
GOAL
=>
'Целевой аккаунт'
],
'types'
=>
[
Tokens
::
MAIN
=>
'Основной аккаунт'
,
Tokens
::
GOAL
=>
'Целевой аккаунт'
],
'tokens'
=>
Tokens
::
filter
(
Request
::
only
(
'api'
,
'type'
,
'login'
))
'tokens'
=>
Tokens
::
withCount
(
'errors'
)
->
filter
(
Request
::
only
(
'api'
,
'type'
,
'login'
))
->
paginate
()
->
paginate
()
->
withQueryString
()
->
withQueryString
()
->
through
(
function
(
$token
)
{
->
through
(
function
(
$token
)
{
...
@@ -32,6 +32,7 @@ class TokensController extends Controller
...
@@ -32,6 +32,7 @@ class TokensController extends Controller
'type'
=>
$token
->
type
,
'type'
=>
$token
->
type
,
'api'
=>
$token
->
api
,
'api'
=>
$token
->
api
,
'limit'
=>
$token
->
limit
,
'limit'
=>
$token
->
limit
,
'errors_count'
=>
$token
->
errors_count
,
];
];
}),
}),
]);
]);
...
@@ -39,6 +40,7 @@ class TokensController extends Controller
...
@@ -39,6 +40,7 @@ class TokensController extends Controller
function
edit
(
Tokens
$token
)
function
edit
(
Tokens
$token
)
{
{
$token
->
loadCount
(
'errors'
);
$mainToken
=
Tokens
::
where
(
'type'
,
Tokens
::
MAIN
)
->
first
();
$mainToken
=
Tokens
::
where
(
'type'
,
Tokens
::
MAIN
)
->
first
();
return
Inertia
::
render
(
'Tokens/Edit'
,
[
return
Inertia
::
render
(
'Tokens/Edit'
,
[
'token'
=>
[
'token'
=>
[
...
@@ -48,6 +50,7 @@ class TokensController extends Controller
...
@@ -48,6 +50,7 @@ class TokensController extends Controller
'token'
=>
$token
->
token
,
'token'
=>
$token
->
token
,
'type'
=>
$token
->
type
,
'type'
=>
$token
->
type
,
'main'
=>
$token
->
isMain
(),
'main'
=>
$token
->
isMain
(),
'errors_count'
=>
$token
->
errors_count
,
'campaigns'
=>
(
'campaigns'
=>
(
$token
->
isMain
()
$token
->
isMain
()
?
$token
->
campaignsForManaged
?
$token
->
campaignsForManaged
...
@@ -87,6 +90,45 @@ class TokensController extends Controller
...
@@ -87,6 +90,45 @@ class TokensController extends Controller
return
Redirect
::
back
()
->
with
(
'success'
,
'Token updated.'
);
return
Redirect
::
back
()
->
with
(
'success'
,
'Token updated.'
);
}
}
public
function
errors
(
Tokens
$token
)
{
return
Inertia
::
render
(
'Tokens/Errors'
,
[
'filters'
=>
Request
::
all
(
'service'
,
'method'
),
'services'
=>
$token
->
errors
()
->
groupBy
(
'service'
)
->
pluck
(
'service'
,
'service'
),
'methods'
=>
$token
->
errors
()
->
groupBy
(
'method'
)
->
pluck
(
'method'
,
'method'
),
'token'
=>
[
'id'
=>
$token
->
getKey
(),
'login'
=>
$token
->
login
,
],
'rows'
=>
$token
->
errors
()
->
filter
(
Request
::
only
(
'service'
,
'method'
))
->
paginate
()
->
withQueryString
()
->
through
(
function
(
$yandexError
)
{
$data
=
$yandexError
->
only
([
$yandexError
->
getKeyName
(),
'service'
,
'method'
,
'params'
,
'errors'
,
'created_at'
,
]);
$data
[
'created_at'
]
=
$data
[
'created_at'
]
->
format
(
'd.m.y H:m:s'
);
return
$data
;
}),
]);
}
public
function
errorsDelete
(
Tokens
$token
)
{
$token
->
errors
()
->
delete
();
return
Redirect
::
back
()
->
with
(
'success'
,
'Errors deleted.'
);
}
public
function
managedCampaign
(
Tokens
$token
,
$campaign_id
)
public
function
managedCampaign
(
Tokens
$token
,
$campaign_id
)
{
{
if
(
!
$token
->
isMain
())
{
if
(
!
$token
->
isMain
())
{
...
...
app/Models/Pivots/GoalAdImage.php
View file @
2e2195e
...
@@ -3,6 +3,7 @@
...
@@ -3,6 +3,7 @@
namespace
App\Models\Pivots
;
namespace
App\Models\Pivots
;
use
App\Models\AdImage
;
use
App\Models\AdImage
;
use
App\Models\YandexError
;
use
Illuminate\Database\Eloquent\Builder
;
use
Illuminate\Database\Eloquent\Builder
;
use
Illuminate\Database\Eloquent\Relations\Pivot
;
use
Illuminate\Database\Eloquent\Relations\Pivot
;
use
Illuminate\Database\Eloquent\SoftDeletes
;
use
Illuminate\Database\Eloquent\SoftDeletes
;
...
@@ -72,4 +73,9 @@ class GoalAdImage extends Pivot
...
@@ -72,4 +73,9 @@ class GoalAdImage extends Pivot
return
$this
->
belongsTo
(
AdImage
::
class
,
'ad_image_id'
);
return
$this
->
belongsTo
(
AdImage
::
class
,
'ad_image_id'
);
}
}
public
function
errors
()
{
return
$this
->
morphMany
(
YandexError
::
class
,
'cause'
);
}
}
}
app/Models/Pivots/GoalKeyword.php
View file @
2e2195e
...
@@ -3,6 +3,7 @@
...
@@ -3,6 +3,7 @@
namespace
App\Models\Pivots
;
namespace
App\Models\Pivots
;
use
App\Models\Keyword
;
use
App\Models\Keyword
;
use
App\Models\YandexError
;
use
Illuminate\Database\Eloquent\Builder
;
use
Illuminate\Database\Eloquent\Builder
;
use
Illuminate\Database\Eloquent\Relations\Pivot
;
use
Illuminate\Database\Eloquent\Relations\Pivot
;
use
Illuminate\Database\Eloquent\SoftDeletes
;
use
Illuminate\Database\Eloquent\SoftDeletes
;
...
@@ -210,4 +211,9 @@ class GoalKeyword extends Pivot
...
@@ -210,4 +211,9 @@ class GoalKeyword extends Pivot
->
get
();
->
get
();
}
}
public
function
errors
()
{
return
$this
->
morphMany
(
YandexError
::
class
,
'cause'
);
}
}
}
app/Models/Pivots/GoalVCard.php
View file @
2e2195e
...
@@ -5,6 +5,7 @@ namespace App\Models\Pivots;
...
@@ -5,6 +5,7 @@ namespace App\Models\Pivots;
use
App\Models\AdExtension
;
use
App\Models\AdExtension
;
use
App\Models\NegativeKeywordSharedSet
;
use
App\Models\NegativeKeywordSharedSet
;
use
App\Models\VCard
;
use
App\Models\VCard
;
use
App\Models\YandexError
;
use
Illuminate\Database\Eloquent\Builder
;
use
Illuminate\Database\Eloquent\Builder
;
use
Illuminate\Database\Eloquent\Relations\Pivot
;
use
Illuminate\Database\Eloquent\Relations\Pivot
;
use
Illuminate\Database\Eloquent\SoftDeletes
;
use
Illuminate\Database\Eloquent\SoftDeletes
;
...
@@ -125,4 +126,9 @@ class GoalVCard extends Pivot
...
@@ -125,4 +126,9 @@ class GoalVCard extends Pivot
return
$this
->
hasMany
(
GoalAdvertisement
::
class
,
'goal_v_card_id'
);
return
$this
->
hasMany
(
GoalAdvertisement
::
class
,
'goal_v_card_id'
);
}
}
public
function
errors
()
{
return
$this
->
morphMany
(
YandexError
::
class
,
'cause'
);
}
}
}
app/Models/Tokens.php
View file @
2e2195e
...
@@ -151,6 +151,12 @@ class Tokens extends Model
...
@@ -151,6 +151,12 @@ class Tokens extends Model
return
$this
->
type
===
$this
::
MAIN
;
return
$this
->
type
===
$this
::
MAIN
;
}
}
public
function
errors
()
{
return
$this
->
hasMany
(
YandexError
::
class
,
'token_id'
)
->
orderBy
(
'created_at'
,
'DESC'
);
}
public
function
limits
()
public
function
limits
()
{
{
return
$this
->
hasMany
(
Limits
::
class
,
'token'
,
'id'
)
return
$this
->
hasMany
(
Limits
::
class
,
'token'
,
'id'
)
...
...
app/Models/YandexError.php
View file @
2e2195e
...
@@ -2,6 +2,7 @@
...
@@ -2,6 +2,7 @@
namespace
App\Models
;
namespace
App\Models
;
use
Illuminate\Database\Eloquent\Builder
;
use
Illuminate\Database\Eloquent\SoftDeletes
;
use
Illuminate\Database\Eloquent\SoftDeletes
;
class
YandexError
extends
Model
class
YandexError
extends
Model
...
@@ -21,8 +22,8 @@ class YandexError extends Model
...
@@ -21,8 +22,8 @@ class YandexError extends Model
];
];
protected
$casts
=
[
protected
$casts
=
[
'params'
=>
'json'
,
'params'
=>
'json'
,
'errors'
=>
'array'
,
'errors'
=>
'array'
,
];
];
public
function
token
()
public
function
token
()
...
@@ -35,4 +36,18 @@ class YandexError extends Model
...
@@ -35,4 +36,18 @@ class YandexError extends Model
return
$this
->
morphTo
(
'cause'
);
return
$this
->
morphTo
(
'cause'
);
}
}
/**
* @param Builder $query
* @param array $filters
* @return Builder
*/
public
function
scopeFilter
(
$query
,
array
$filters
)
{
return
$query
->
when
(
$filters
[
'service'
]
??
null
,
function
(
$query
,
$service
)
{
$query
->
where
(
'service'
,
$service
);
})
->
when
(
$filters
[
'method'
]
??
null
,
function
(
$query
,
$method
)
{
$query
->
where
(
'method'
,
$method
);
});
}
}
}
app/Service/Requests/Direct/AddAdImages.php
View file @
2e2195e
...
@@ -55,12 +55,33 @@ class AddAdImages extends DirectRequest
...
@@ -55,12 +55,33 @@ class AddAdImages extends DirectRequest
$goalAdImage
=
$this
->
goalAdImages
->
get
(
$key
);
$goalAdImage
=
$this
->
goalAdImages
->
get
(
$key
);
$data
=
$this
->
getParams
()[
'AdImages'
][
$key
];
if
(
!
isset
(
$add_result
[
'AdImageHash'
]))
{
if
(
!
isset
(
$add_result
[
'AdImageHash'
]))
{
if
(
isset
(
$add_result
[
'Errors'
])
&&
count
(
$add_result
[
'Errors'
]))
{
$goalAdImage
->
errors
()
->
create
([
'token_id'
=>
$this
->
getToken
()
->
getKey
(),
'service'
=>
$this
->
getService
(),
'method'
=>
$this
->
getMethod
(),
'params'
=>
$data
,
'errors'
=>
$add_result
[
'Errors'
],
]);
GoalAdImage
::
where
(
'id'
,
$goalAdImage
->
getKey
())
->
update
([
'reserve_create_at'
=>
null
,
]);
continue
;
}
Log
::
debug
(
"AddAdImage, empty AdImageHash, token_id
{
$this
->
getToken
()
->
getKey
()
}
"
);
Log
::
debug
(
"AddAdImage, empty AdImageHash, token_id
{
$this
->
getToken
()
->
getKey
()
}
"
);
Log
::
debug
(
$add_result
);
Log
::
debug
(
$add_result
);
Log
::
debug
(
$
this
->
getParams
()[
'AdImages'
][
$key
]
[
'Name'
]);
Log
::
debug
(
$
data
[
'Name'
]);
$goalAdImage
->
where
(
'id'
,
$goalAdImage
->
getKey
())
GoalAdImage
::
where
(
'id'
,
$goalAdImage
->
getKey
())
->
update
([
->
update
([
'reserve_create_at'
=>
null
,
'reserve_create_at'
=>
null
,
]);
]);
...
...
app/Service/Requests/Direct/DeleteVCards.php
View file @
2e2195e
...
@@ -40,6 +40,8 @@ class DeleteVCards extends DirectRequest
...
@@ -40,6 +40,8 @@ class DeleteVCards extends DirectRequest
foreach
(
$response
[
'result'
][
'DeleteResults'
]
as
$key
=>
$delete_result
)
{
foreach
(
$response
[
'result'
][
'DeleteResults'
]
as
$key
=>
$delete_result
)
{
$external_id
=
$this
->
getParams
()[
'SelectionCriteria'
][
'Ids'
][
$key
];
if
(
!
isset
(
$delete_result
[
'Id'
]))
{
if
(
!
isset
(
$delete_result
[
'Id'
]))
{
if
(
if
(
...
@@ -48,24 +50,36 @@ class DeleteVCards extends DirectRequest
...
@@ -48,24 +50,36 @@ class DeleteVCards extends DirectRequest
$delete_result
[
'Errors'
][
0
][
'Code'
]
==
8800
$delete_result
[
'Errors'
][
0
][
'Code'
]
==
8800
)
{
)
{
if
(
$external_id
=
$this
->
getParams
()[
'SelectionCriteria'
][
'Ids'
][
$key
]){
if
(
$this
->
getToken
()
->
isMain
())
{
VCard
::
whereExternalId
(
$external_id
)
->
delete
();
}
else
{
GoalVCard
::
whereExternalId
(
$external_id
)
->
delete
();
}
if
(
$this
->
getToken
()
->
isMain
())
{
continue
;
VCard
::
whereExternalId
(
$external_id
)
->
delete
();
}
else
{
GoalVCard
::
whereExternalId
(
$external_id
)
->
delete
();
}
continue
;
}
elseif
(
isset
(
$delete_result
[
'Errors'
])
&&
count
(
$delete_result
[
'Errors'
]))
{
$goalVCard
=
GoalVCard
::
whereExternalId
(
$external_id
)
->
first
();
if
(
$goalVCard
)
{
$goalVCard
->
errors
()
->
create
([
'token_id'
=>
$this
->
getToken
()
->
getKey
(),
'service'
=>
$this
->
getService
(),
'method'
=>
$this
->
getMethod
(),
'params'
=>
$external_id
,
'errors'
=>
$delete_result
[
'Errors'
],
]);
$goalVCard
->
update
([
'reserve_update_at'
=>
null
,
]);
continue
;
}
}
}
}
Log
::
debug
(
"DeleteVCards, empty Id, token_id
{
$this
->
getToken
()
->
getKey
()
}
"
);
Log
::
debug
(
"DeleteVCards, empty Id, token_id
{
$this
->
getToken
()
->
getKey
()
}
"
);
Log
::
debug
(
$delete_result
);
Log
::
debug
(
$delete_result
);
$external_id
=
$this
->
getParams
()[
'SelectionCriteria'
][
'Ids'
][
$key
];
Log
::
debug
(
$external_id
);
Log
::
debug
(
$external_id
);
if
(
$this
->
getToken
()
->
isMain
())
{
if
(
$this
->
getToken
()
->
isMain
())
{
...
...
resources/js/Pages/Tokens/CitySettings.vue
View file @
2e2195e
...
@@ -58,7 +58,7 @@
...
@@ -58,7 +58,7 @@
<inertia-link
class=
"hover:text-indigo-500 focus:text-indigo-500"
<inertia-link
class=
"hover:text-indigo-500 focus:text-indigo-500"
:href=
"route('token.campaign.variables', [token.id, city.id, dictionary_campaign.campaign_id])"
:href=
"route('token.campaign.variables', [token.id, city.id, dictionary_campaign.campaign_id])"
>
>
{{
dictionary_campaign
.
name
}}
#
{{
dictionary_campaign
.
external_id
}}
{{
dictionary_campaign
.
name
}}
</inertia-link>
</inertia-link>
</span>
</span>
</td>
</td>
...
...
resources/js/Pages/Tokens/Edit.vue
View file @
2e2195e
...
@@ -8,14 +8,14 @@
...
@@ -8,14 +8,14 @@
<div
class=
"bg-white rounded-md shadow overflow-hidden max-w-3xl"
>
<div
class=
"bg-white rounded-md shadow overflow-hidden max-w-3xl"
>
<form
@
submit
.
prevent=
"tokenUpdate"
>
<form
@
submit
.
prevent=
"tokenUpdate"
>
<div
class=
"p-8 -mr-6 -mb-8 flex flex-wrap"
>
<div
class=
"p-8 -mr-6 -mb-8 flex flex-wrap"
>
<text-input
v-model=
"form.login"
:error=
"form.errors.login"
:
readonly
=
"true"
class=
"pr-6 pb-8 w-full lg:w-1/2"
<text-input
v-model=
"form.login"
:error=
"form.errors.login"
:
disabled
=
"true"
class=
"pr-6 pb-8 w-full lg:w-1/2"
label=
"Login"
/>
label=
"Login"
/>
<text-input
v-model=
"form.token"
:error=
"form.errors.token"
:
readonly
=
"true"
class=
"pr-6 pb-8 w-full lg:w-1/2"
<text-input
v-model=
"form.token"
:error=
"form.errors.token"
:
disabled
=
"true"
class=
"pr-6 pb-8 w-full lg:w-1/2"
label=
"Token"
/>
label=
"Token"
/>
<text-input
v-model=
"form.api"
:error=
"form.errors.api"
:
readonly
=
"true"
class=
"pr-6 pb-8 w-full lg:w-1/2"
<text-input
v-model=
"form.api"
:error=
"form.errors.api"
:
disabled
=
"true"
class=
"pr-6 pb-8 w-full lg:w-1/2"
label=
"API"
/>
label=
"API"
/>
<select-input
v-model=
"form.type"
:error=
"form.errors.type"
<select-input
v-model=
"form.type"
:error=
"form.errors.type"
:
readonly
=
"form.type"
:
disabled
=
"form.type"
class=
"pr-6 pb-8 w-full lg:w-1/2"
class=
"pr-6 pb-8 w-full lg:w-1/2"
label=
"Type"
>
label=
"Type"
>
<option
:value=
"null"
/>
<option
:value=
"null"
/>
...
@@ -30,13 +30,22 @@
...
@@ -30,13 +30,22 @@
>
>
Delete Token
Delete Token
</button>
</button>
<loading-button
:loading=
"form.processing"
v-if=
"!t
his.t
oken.type"
class=
"btn-indigo ml-auto"
type=
"submit"
>
<loading-button
:loading=
"form.processing"
v-if=
"!token.type"
class=
"btn-indigo ml-auto"
type=
"submit"
>
Update Token
Update Token
</loading-button>
</loading-button>
</div>
</div>
</form>
</form>
</div>
</div>
<inertia-link
class=
"text-red-600 hover:underline mt-10"
tabindex=
"-1"
type=
"button"
v-if=
"token.errors_count"
:href=
"route('token.errors', token.id)"
>
Errors
{{
token
.
errors_count
}}
</inertia-link>
<campaigns-settings
v-if=
"campaigns.length && token.main"
<campaigns-settings
v-if=
"campaigns.length && token.main"
:campaigns=
"campaigns"
:campaigns=
"campaigns"
:token=
"token"
:token=
"token"
...
...
resources/js/Pages/Tokens/Errors.vue
0 → 100644
View file @
2e2195e
<
template
>
<div>
<h1
class=
"mb-8 font-bold text-3xl"
>
<inertia-link
class=
"text-indigo-400 hover:text-indigo-600"
:href=
"route('tokens')"
>
Tokens
</inertia-link>
<span
class=
"text-indigo-400 font-medium"
>
/
</span>
<inertia-link
class=
"text-indigo-400 hover:text-indigo-600"
:href=
"route('token.edit', token.id)"
>
{{
token
.
login
}}
</inertia-link>
<span
class=
"text-indigo-400 font-medium"
>
/
</span>
Errors
</h1>
<div
class=
"mb-6 flex justify-between items-center"
>
<search-filter
class=
"w-full max-w-md mr-4"
@
reset=
"reset"
>
<label
class=
"block text-gray-700"
>
Service:
</label>
<select
v-model=
"form.service"
class=
"mt-1 w-full form-select"
>
<option
hidden
:value=
"null"
/>
<option
v-for=
"service in services"
:value=
"service"
>
{{
service
}}
</option>
</select>
<label
class=
"block text-gray-700 mt-2"
>
Method:
</label>
<select
v-model=
"form.method"
class=
"mt-1 w-full form-select"
>
<option
hidden
:value=
"null"
/>
<option
v-for=
"method in methods"
:value=
"method"
>
{{
method
}}
</option>
</select>
</search-filter>
<button
class=
"text-red-600 hover:underline mb-4"
tabindex=
"-1"
type=
"button"
@
click=
"errorsDestroy"
>
Delete errors
</button>
</div>
<div
class=
"bg-white rounded-md shadow overflow-x-auto"
>
<table
class=
"w-full whitespace-nowrap"
>
<tr
class=
"text-left font-bold"
>
<th
class=
"px-6 pt-6 pb-4"
>
Create
</th>
<th
class=
"px-6 pt-6 pb-4"
>
Service
</th>
<th
class=
"px-6 pt-6 pb-4"
>
Method
</th>
<th
class=
"px-6 pt-6 pb-4"
>
Errors
</th>
<th
class=
"px-6 pt-6 pb-4"
>
Params
</th>
</tr>
<tr
v-for=
"error in rows.data"
:key=
"error.id"
class=
""
>
<td
class=
"border-t px-6 pt-6 pb-4"
>
{{
error
.
created_at
}}
</td>
<td
class=
"border-t px-6 pt-6 pb-4"
>
{{
error
.
service
}}
</td>
<td
class=
"border-t px-6 pt-6 pb-4"
>
{{
error
.
method
}}
</td>
<td
class=
"border-t px-6 pt-6 pb-4"
>
<pre
v-html=
"objectFormatting(error.errors)"
/>
</td>
<td
class=
"border-t px-6 pt-6 pb-4"
>
<details>
<summary>
Params
</summary>
<pre
v-html=
"objectFormatting(error.params)"
/>
</details>
</td>
</tr>
<tr
v-if=
"rows.data.length === 0"
>
<td
class=
"border-t px-6 py-4"
colspan=
"6"
>
No errors found.
</td>
</tr>
</table>
</div>
<pagination
class=
"mt-6"
:links=
"rows.links"
/>
</div>
</
template
>
<
script
>
import
Icon
from
'@/Shared/Icon'
import
pickBy
from
'lodash/pickBy'
import
Layout
from
'@/Shared/Layout'
import
throttle
from
'lodash/throttle'
import
mapValues
from
'lodash/mapValues'
import
Pagination
from
'@/Shared/Pagination'
import
SearchFilter
from
'@/Shared/SearchFilter'
export
default
{
metaInfo
:
{
title
:
'Token'
},
components
:
{
Icon
,
Pagination
,
SearchFilter
,
},
layout
:
Layout
,
props
:
{
token
:
Object
,
rows
:
Object
,
filters
:
Object
,
services
:
Object
,
methods
:
Object
,
},
data
()
{
return
{
form
:
{
service
:
this
.
filters
.
service
,
method
:
this
.
filters
.
method
,
},
}
},
watch
:
{
form
:
{
handler
:
throttle
(
function
()
{
this
.
$inertia
.
get
(
this
.
route
(
'token.errors'
,
this
.
token
.
id
),
pickBy
(
this
.
form
))
},
150
),
deep
:
true
,
},
},
methods
:
{
objectFormatting
(
object
)
{
return
JSON
.
stringify
(
object
,
null
,
' '
).
replace
(
/
\n
/gi
,
'<br/>'
)
},
errorsDestroy
()
{
if
(
confirm
(
'Are you sure you want to delete this errors?'
))
{
this
.
$inertia
.
delete
(
this
.
route
(
'token.errors.destroy'
,
this
.
token
.
id
))
}
},
reset
()
{
this
.
form
=
mapValues
(
this
.
form
,
()
=>
null
)
},
},
}
</
script
>
resources/js/Pages/Tokens/Index.vue
View file @
2e2195e
...
@@ -23,6 +23,7 @@
...
@@ -23,6 +23,7 @@
<th
class=
"px-6 pt-6 pb-4"
>
АПИ
</th>
<th
class=
"px-6 pt-6 pb-4"
>
АПИ
</th>
<th
class=
"px-6 pt-6 pb-4"
>
Баллы
</th>
<th
class=
"px-6 pt-6 pb-4"
>
Баллы
</th>
<th
class=
"px-6 pt-6 pb-4"
colspan=
"2"
>
Тип
</th>
<th
class=
"px-6 pt-6 pb-4"
colspan=
"2"
>
Тип
</th>
<th
class=
"px-6 pt-6 pb-4"
>
Ошибки
</th>
</tr>
</tr>
<tr
v-for=
"token in tokens.data"
:key=
"token.id"
class=
"hover:bg-gray-100 focus-within:bg-gray-100"
>
<tr
v-for=
"token in tokens.data"
:key=
"token.id"
class=
"hover:bg-gray-100 focus-within:bg-gray-100"
>
<td
class=
"border-t"
>
<td
class=
"border-t"
>
...
@@ -50,9 +51,14 @@
...
@@ -50,9 +51,14 @@
<icon
name=
"cheveron-right"
class=
"block w-6 h-6 fill-gray-400"
/>
<icon
name=
"cheveron-right"
class=
"block w-6 h-6 fill-gray-400"
/>
</inertia-link>
</inertia-link>
</td>
</td>
<td
class=
"border-t"
>
<inertia-link
class=
"px-6 py-4 flex items-center"
:href=
"route('token.errors', token.id)"
tabindex=
"-1"
>
{{
token
.
errors_count
}}
<icon
name=
"cheveron-right"
class=
"block w-6 h-6 fill-gray-400"
/>
</inertia-link>
</td>
</tr>
</tr>
<tr
v-if=
"tokens.data.length === 0"
>
<tr
v-if=
"tokens.data.length === 0"
>
<td
class=
"border-t px-6 py-4"
colspan=
"
4
"
>
No tokens found.
</td>
<td
class=
"border-t px-6 py-4"
colspan=
"
5
"
>
No tokens found.
</td>
</tr>
</tr>
</table>
</table>
</div>
</div>
...
...
routes/web.php
View file @
2e2195e
...
@@ -163,6 +163,10 @@ Route::group(['middleware' => 'auth'], function () {
...
@@ -163,6 +163,10 @@ Route::group(['middleware' => 'auth'], function () {
Route
::
get
(
'token/edit/{token}'
,
[
TokensController
::
class
,
'edit'
])
Route
::
get
(
'token/edit/{token}'
,
[
TokensController
::
class
,
'edit'
])
->
name
(
'token.edit'
);
->
name
(
'token.edit'
);
Route
::
get
(
'token/errors/{token}'
,
[
TokensController
::
class
,
'errors'
])
->
name
(
'token.errors'
);
Route
::
delete
(
'token/errors/delete/{token}/'
,
[
TokensController
::
class
,
'errorsDelete'
])
->
name
(
'token.errors.destroy'
);
Route
::
post
(
'token/edit/{token}'
,
[
TokensController
::
class
,
'update'
])
Route
::
post
(
'token/edit/{token}'
,
[
TokensController
::
class
,
'update'
])
->
name
(
'token.update'
);
->
name
(
'token.update'
);
Route
::
delete
(
'token/delete/{token}'
,
[
TokensController
::
class
,
'destroy'
])
Route
::
delete
(
'token/delete/{token}'
,
[
TokensController
::
class
,
'destroy'
])
...
...
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