added category selected tradings api

This commit is contained in:
Amanmyrat 2022-12-02 18:57:09 +05:00
parent 0aa0a4942a
commit d9c2cc0c2a
23 changed files with 705 additions and 185 deletions

View File

@ -40,6 +40,7 @@ class CategoryCrudController extends CrudController
*/
protected function setupListOperation()
{
CRUD::column('id');
CRUD::column('title');
/**

View File

@ -0,0 +1,82 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Requests\SelectedTradingRequest;
use Backpack\CRUD\app\Http\Controllers\CrudController;
use Backpack\CRUD\app\Library\CrudPanel\CrudPanelFacade as CRUD;
/**
* Class SelectedTradingCrudController
* @package App\Http\Controllers\Admin
* @property-read \Backpack\CRUD\app\Library\CrudPanel\CrudPanel $crud
*/
class SelectedTradingCrudController extends CrudController
{
use \Backpack\CRUD\app\Http\Controllers\Operations\ListOperation;
use \Backpack\CRUD\app\Http\Controllers\Operations\CreateOperation;
use \Backpack\CRUD\app\Http\Controllers\Operations\UpdateOperation;
use \Backpack\CRUD\app\Http\Controllers\Operations\DeleteOperation;
use \Backpack\CRUD\app\Http\Controllers\Operations\ShowOperation;
/**
* Configure the CrudPanel object. Apply settings to all operations.
*
* @return void
*/
public function setup()
{
CRUD::setModel(\App\Models\SelectedTrading::class);
CRUD::setRoute(config('backpack.base.route_prefix') . '/selected-trading');
CRUD::setEntityNameStrings('selected trading', 'selected tradings');
}
/**
* Define what happens when the List operation is loaded.
*
* @see https://backpackforlaravel.com/docs/crud-operation-list-entries
* @return void
*/
protected function setupListOperation()
{
CRUD::column('category_id');
CRUD::column('title');
/**
* Columns can be defined using the fluent syntax or array syntax:
* - CRUD::column('price')->type('number');
* - CRUD::addColumn(['name' => 'price', 'type' => 'number']);
*/
}
/**
* Define what happens when the Create operation is loaded.
*
* @see https://backpackforlaravel.com/docs/crud-operation-create
* @return void
*/
protected function setupCreateOperation()
{
CRUD::setValidation(SelectedTradingRequest::class);
CRUD::field('category_id');
CRUD::field('title');
/**
* Fields can be defined using the fluent syntax or array syntax:
* - CRUD::field('price')->type('number');
* - CRUD::addField(['name' => 'price', 'type' => 'number']));
*/
}
/**
* Define what happens when the Update operation is loaded.
*
* @see https://backpackforlaravel.com/docs/crud-operation-update
* @return void
*/
protected function setupUpdateOperation()
{
$this->setupCreateOperation();
}
}

View File

@ -42,7 +42,6 @@ class TradingCrudController extends CrudController
CRUD::column('group_id');
CRUD::column('subgroup_id');
CRUD::column('category_id');
// CRUD::column('type');
CRUD::column('title');
CRUD::column('price');
CRUD::column('unit');

View File

@ -3,8 +3,6 @@
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
class ApiBaseController extends Controller
{

View File

@ -2,6 +2,7 @@
namespace App\Http\Controllers\Api;
use App\Models\Category;
use App\Models\Group;
use App\Models\Trading;
use App\Transformers\TradingTransformer;
@ -9,9 +10,9 @@ use Illuminate\Http\Request;
class TradingsController extends ApiController
{
public function index(Request $request)
public function index()
{
$last_tradings = Group::where("type", "trading")->with("tradings")->latest()->first()->tradings;
$last_tradings = Group::where("type", "trading")->with("tradings")->latest()->first()->tradings;
foreach($last_tradings as $trading){
$trading->title = trim(strtok($trading->title, '('));;
}
@ -27,15 +28,10 @@ class TradingsController extends ApiController
array_push($tradings, (object)[
'id' => $trading->id,
'title' => $title,
'unit' => $trading->unit,
'price' => $trading->price,
'old_price' => !$before_last_trading ? 0 : $before_last_trading->price,
'price_change' => number_format($difference, 1, ".", "")."%",
'amount' => $trading->amount,
'currency' => $trading->currency,
'seller_country' => $trading->seller_country,
'buyer_country' => $trading->buyer_country,
'point' => $trading->point,
]);
}
@ -44,11 +40,51 @@ class TradingsController extends ApiController
return $this->respondWithCollection($tradings, new TradingTransformer);
}
public function selectedTradings(Request $request){
$id = $request->category;
if($id){
$category = Category::with('selectedTradings')->find($id);
if($category){
$selectedTradings = $category->selectedTradings;
$myTradings = array();
foreach ($selectedTradings as $item) {
$tradings = Trading::where("title", 'LIKE', "%{$item->title}%")->orderBy('created_at', 'DESC')->get();
$tradings = $tradings->unique('group_id')->slice(0, 10)->values();
$prices = array();
foreach ($tradings as $trading) {
array_push($prices, (object)[
'price' => $trading->price,
'date' => $trading->created_at->todatetimestring(),
]);
}
$last_trading = $tradings[0];
$before_last_trading = count($tradings) > 1 ? $tradings[1] : null;
$difference = !$before_last_trading ? 0 : $this->getPercentageDifference($last_trading->price ?? 0, $before_last_trading->price ?? 0);
array_push($myTradings, (object)[
'id' => $last_trading->id,
'title' => trim(strtok($last_trading->title, '(')),
'price' => $last_trading->price,
'old_price' => !$before_last_trading ? 0 : $before_last_trading->price,
'price_change' => !$before_last_trading ? '100%' : number_format($difference, 1, ".", "")."%",
'currency' => $last_trading->currency,
'all_prices' => $prices
]);
}
$tradings = Trading::hydrate($myTradings);
return $this->respondWithCollection($tradings, new TradingTransformer('selected'));
}
return $this->errorNotFound();
}
return $this->errorWrongArgs();
}
function getPercentageDifference($new, $old){
// return (($new - $old) / $old) * 100;
// return (abs(($old - $new)) / ($old + $new) /2);
// return (abs($old - $new) / (($old + $new)/ 2)) * 100;
// return (abs($old - $new) / (($old + $new)/ 2)) * 100;
return (($new - $old) / abs($old)) * 100;
}
}

View File

@ -0,0 +1,55 @@
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class SelectedTradingRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
// only allow updates if the user is logged in
return backpack_auth()->check();
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
// 'name' => 'required|min:5|max:255'
];
}
/**
* Get the validation attributes that apply to the request.
*
* @return array
*/
public function attributes()
{
return [
//
];
}
/**
* Get the validation messages that apply to the request.
*
* @return array
*/
public function messages()
{
return [
//
];
}
}

View File

@ -0,0 +1,30 @@
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class StoreSelectedTradingRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return false;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
//
];
}
}

View File

@ -0,0 +1,30 @@
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class UpdateSelectedTradingRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return false;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
//
];
}
}

View File

@ -31,4 +31,9 @@ class Category extends Model
{
return $this->hasMany(Trading::class);
}
public function selectedTradings()
{
return $this->hasMany(SelectedTrading::class);
}
}

View File

@ -0,0 +1,19 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class SelectedTrading extends Model
{
use \Backpack\CRUD\app\Models\Traits\CrudTrait;
use HasFactory;
protected $guarded = [''];
public function category()
{
return $this->belongsTo(Category::class);
}
}

View File

@ -0,0 +1,94 @@
<?php
namespace App\Policies;
use App\Models\SelectedTrading;
use App\Models\User;
use Illuminate\Auth\Access\HandlesAuthorization;
class SelectedTradingPolicy
{
use HandlesAuthorization;
/**
* Determine whether the user can view any models.
*
* @param \App\Models\User $user
* @return \Illuminate\Auth\Access\Response|bool
*/
public function viewAny(User $user)
{
//
}
/**
* Determine whether the user can view the model.
*
* @param \App\Models\User $user
* @param \App\Models\SelectedTrading $selectedTrading
* @return \Illuminate\Auth\Access\Response|bool
*/
public function view(User $user, SelectedTrading $selectedTrading)
{
//
}
/**
* Determine whether the user can create models.
*
* @param \App\Models\User $user
* @return \Illuminate\Auth\Access\Response|bool
*/
public function create(User $user)
{
//
}
/**
* Determine whether the user can update the model.
*
* @param \App\Models\User $user
* @param \App\Models\SelectedTrading $selectedTrading
* @return \Illuminate\Auth\Access\Response|bool
*/
public function update(User $user, SelectedTrading $selectedTrading)
{
//
}
/**
* Determine whether the user can delete the model.
*
* @param \App\Models\User $user
* @param \App\Models\SelectedTrading $selectedTrading
* @return \Illuminate\Auth\Access\Response|bool
*/
public function delete(User $user, SelectedTrading $selectedTrading)
{
//
}
/**
* Determine whether the user can restore the model.
*
* @param \App\Models\User $user
* @param \App\Models\SelectedTrading $selectedTrading
* @return \Illuminate\Auth\Access\Response|bool
*/
public function restore(User $user, SelectedTrading $selectedTrading)
{
//
}
/**
* Determine whether the user can permanently delete the model.
*
* @param \App\Models\User $user
* @param \App\Models\SelectedTrading $selectedTrading
* @return \Illuminate\Auth\Access\Response|bool
*/
public function forceDelete(User $user, SelectedTrading $selectedTrading)
{
//
}
}

View File

@ -7,20 +7,30 @@ use League\Fractal\TransformerAbstract;
class TradingTransformer extends TransformerAbstract
{
private $type;
public function __construct($type='')
{
$this->type = $type;
}
public function transform(Trading $trading)
{
return [
return $this->type == 'selected' ? [
'id' => $trading->id,
'title' => $trading->title,
'price' => $trading->price,
'old_price' => $trading->old_price,
'price_change' => $trading->price_change,
'currency' => $trading->currency,
'all_prices' => $trading->all_prices,
] : [
'id' => $trading->id,
'title' => $trading->title,
'unit' => $trading->unit,
'price' => $trading->price,
'old_price' => $trading->old_price,
'price_change' => $trading->price_change,
'amount' => $trading->amount,
'currency' => $trading->currency,
'seller_country' => $trading->seller_country,
'buyer_country' => $trading->buyer_country,
'point' => $trading->point,
];
}
}

View File

@ -29,6 +29,17 @@
'Gravatar' => 'Creativeorange\\Gravatar\\Facades\\Gravatar',
),
),
'digitallyhappy/assets' =>
array (
'providers' =>
array (
0 => 'DigitallyHappy\\Assets\\AssetsServiceProvider',
),
'aliases' =>
array (
'Assets' => 'DigitallyHappy\\Assets\\Facades\\Assets',
),
),
'facade/ignition' =>
array (
'providers' =>

View File

@ -26,32 +26,33 @@
22 => 'Backpack\\CRUD\\BackpackServiceProvider',
23 => 'Backpack\\Generators\\GeneratorsServiceProvider',
24 => 'Creativeorange\\Gravatar\\GravatarServiceProvider',
25 => 'Facade\\Ignition\\IgnitionServiceProvider',
26 => 'Fideloper\\Proxy\\TrustedProxyServiceProvider',
27 => 'Fruitcake\\Cors\\CorsServiceProvider',
28 => 'Inertia\\ServiceProvider',
29 => 'Intervention\\Image\\ImageServiceProvider',
30 => 'Jenssegers\\Agent\\AgentServiceProvider',
31 => 'Laravel\\Fortify\\FortifyServiceProvider',
32 => 'Laravel\\Jetstream\\JetstreamServiceProvider',
33 => 'Laravel\\Sail\\SailServiceProvider',
34 => 'Laravel\\Sanctum\\SanctumServiceProvider',
35 => 'Laravel\\Scout\\ScoutServiceProvider',
36 => 'Laravel\\Tinker\\TinkerServiceProvider',
37 => 'Maatwebsite\\Excel\\ExcelServiceProvider',
38 => 'Carbon\\Laravel\\ServiceProvider',
39 => 'NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider',
40 => 'Prologue\\Alerts\\AlertsServiceProvider',
41 => 'Spatie\\Translatable\\TranslatableServiceProvider',
42 => 'Tightenco\\Ziggy\\ZiggyServiceProvider',
43 => 'TimeHunter\\LaravelGoogleReCaptchaV3\\Providers\\GoogleReCaptchaV3ServiceProvider',
44 => 'Vinkla\\Hashids\\HashidsServiceProvider',
45 => 'App\\Providers\\AppServiceProvider',
46 => 'App\\Providers\\AuthServiceProvider',
47 => 'App\\Providers\\EventServiceProvider',
48 => 'App\\Providers\\RouteServiceProvider',
49 => 'App\\Providers\\FortifyServiceProvider',
50 => 'App\\Providers\\JetstreamServiceProvider',
25 => 'DigitallyHappy\\Assets\\AssetsServiceProvider',
26 => 'Facade\\Ignition\\IgnitionServiceProvider',
27 => 'Fideloper\\Proxy\\TrustedProxyServiceProvider',
28 => 'Fruitcake\\Cors\\CorsServiceProvider',
29 => 'Inertia\\ServiceProvider',
30 => 'Intervention\\Image\\ImageServiceProvider',
31 => 'Jenssegers\\Agent\\AgentServiceProvider',
32 => 'Laravel\\Fortify\\FortifyServiceProvider',
33 => 'Laravel\\Jetstream\\JetstreamServiceProvider',
34 => 'Laravel\\Sail\\SailServiceProvider',
35 => 'Laravel\\Sanctum\\SanctumServiceProvider',
36 => 'Laravel\\Scout\\ScoutServiceProvider',
37 => 'Laravel\\Tinker\\TinkerServiceProvider',
38 => 'Maatwebsite\\Excel\\ExcelServiceProvider',
39 => 'Carbon\\Laravel\\ServiceProvider',
40 => 'NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider',
41 => 'Prologue\\Alerts\\AlertsServiceProvider',
42 => 'Spatie\\Translatable\\TranslatableServiceProvider',
43 => 'Tightenco\\Ziggy\\ZiggyServiceProvider',
44 => 'TimeHunter\\LaravelGoogleReCaptchaV3\\Providers\\GoogleReCaptchaV3ServiceProvider',
45 => 'Vinkla\\Hashids\\HashidsServiceProvider',
46 => 'App\\Providers\\AppServiceProvider',
47 => 'App\\Providers\\AuthServiceProvider',
48 => 'App\\Providers\\EventServiceProvider',
49 => 'App\\Providers\\RouteServiceProvider',
50 => 'App\\Providers\\FortifyServiceProvider',
51 => 'App\\Providers\\JetstreamServiceProvider',
),
'eager' =>
array (
@ -68,30 +69,31 @@
10 => 'Backpack\\CRUD\\BackpackServiceProvider',
11 => 'Backpack\\Generators\\GeneratorsServiceProvider',
12 => 'Creativeorange\\Gravatar\\GravatarServiceProvider',
13 => 'Facade\\Ignition\\IgnitionServiceProvider',
14 => 'Fideloper\\Proxy\\TrustedProxyServiceProvider',
15 => 'Fruitcake\\Cors\\CorsServiceProvider',
16 => 'Inertia\\ServiceProvider',
17 => 'Intervention\\Image\\ImageServiceProvider',
18 => 'Jenssegers\\Agent\\AgentServiceProvider',
19 => 'Laravel\\Fortify\\FortifyServiceProvider',
20 => 'Laravel\\Jetstream\\JetstreamServiceProvider',
21 => 'Laravel\\Sanctum\\SanctumServiceProvider',
22 => 'Laravel\\Scout\\ScoutServiceProvider',
23 => 'Maatwebsite\\Excel\\ExcelServiceProvider',
24 => 'Carbon\\Laravel\\ServiceProvider',
25 => 'NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider',
26 => 'Prologue\\Alerts\\AlertsServiceProvider',
27 => 'Spatie\\Translatable\\TranslatableServiceProvider',
28 => 'Tightenco\\Ziggy\\ZiggyServiceProvider',
29 => 'TimeHunter\\LaravelGoogleReCaptchaV3\\Providers\\GoogleReCaptchaV3ServiceProvider',
30 => 'Vinkla\\Hashids\\HashidsServiceProvider',
31 => 'App\\Providers\\AppServiceProvider',
32 => 'App\\Providers\\AuthServiceProvider',
33 => 'App\\Providers\\EventServiceProvider',
34 => 'App\\Providers\\RouteServiceProvider',
35 => 'App\\Providers\\FortifyServiceProvider',
36 => 'App\\Providers\\JetstreamServiceProvider',
13 => 'DigitallyHappy\\Assets\\AssetsServiceProvider',
14 => 'Facade\\Ignition\\IgnitionServiceProvider',
15 => 'Fideloper\\Proxy\\TrustedProxyServiceProvider',
16 => 'Fruitcake\\Cors\\CorsServiceProvider',
17 => 'Inertia\\ServiceProvider',
18 => 'Intervention\\Image\\ImageServiceProvider',
19 => 'Jenssegers\\Agent\\AgentServiceProvider',
20 => 'Laravel\\Fortify\\FortifyServiceProvider',
21 => 'Laravel\\Jetstream\\JetstreamServiceProvider',
22 => 'Laravel\\Sanctum\\SanctumServiceProvider',
23 => 'Laravel\\Scout\\ScoutServiceProvider',
24 => 'Maatwebsite\\Excel\\ExcelServiceProvider',
25 => 'Carbon\\Laravel\\ServiceProvider',
26 => 'NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider',
27 => 'Prologue\\Alerts\\AlertsServiceProvider',
28 => 'Spatie\\Translatable\\TranslatableServiceProvider',
29 => 'Tightenco\\Ziggy\\ZiggyServiceProvider',
30 => 'TimeHunter\\LaravelGoogleReCaptchaV3\\Providers\\GoogleReCaptchaV3ServiceProvider',
31 => 'Vinkla\\Hashids\\HashidsServiceProvider',
32 => 'App\\Providers\\AppServiceProvider',
33 => 'App\\Providers\\AuthServiceProvider',
34 => 'App\\Providers\\EventServiceProvider',
35 => 'App\\Providers\\RouteServiceProvider',
36 => 'App\\Providers\\FortifyServiceProvider',
37 => 'App\\Providers\\JetstreamServiceProvider',
),
'deferred' =>
array (

View File

@ -6,8 +6,7 @@
"license": "MIT",
"require": {
"php": "^7.3|^8.0",
"backpack/crud": "4.1.*",
"backpack/generators": "3.1",
"backpack/crud": "^5.4",
"doctrine/dbal": "^3.1",
"fideloper/proxy": "^4.4",
"fruitcake/laravel-cors": "^2.0",
@ -30,6 +29,7 @@
"vinkla/hashids": "^9.1"
},
"require-dev": {
"backpack/generators": "^3.3",
"facade/ignition": "^2.5",
"fakerphp/faker": "^1.9.1",
"laravel/sail": "^1.0.1",

296
composer.lock generated
View File

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "f28b6d2da4dab2aa93154b8aad8d319e",
"content-hash": "69e7f8d07e328c25ef6627fc6b2a0ab0",
"packages": [
{
"name": "asm89/stack-cors",
@ -64,31 +64,32 @@
},
{
"name": "backpack/crud",
"version": "4.1.71",
"version": "5.4.10",
"source": {
"type": "git",
"url": "https://github.com/Laravel-Backpack/CRUD.git",
"reference": "03a0ad4a8d7182d6ee9cf9c86d784d171a942484"
"reference": "050b288caf2f60c79313f2b0b7d4fefd25177f3f"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/Laravel-Backpack/CRUD/zipball/03a0ad4a8d7182d6ee9cf9c86d784d171a942484",
"reference": "03a0ad4a8d7182d6ee9cf9c86d784d171a942484",
"url": "https://api.github.com/repos/Laravel-Backpack/CRUD/zipball/050b288caf2f60c79313f2b0b7d4fefd25177f3f",
"reference": "050b288caf2f60c79313f2b0b7d4fefd25177f3f",
"shasum": ""
},
"require": {
"composer/package-versions-deprecated": "^1.8",
"creativeorange/gravatar": "~1.0",
"digitallyhappy/assets": "^2.0.1",
"doctrine/dbal": "^2.5|^3.0",
"guzzlehttp/guzzle": "^7.0|^6.3",
"laravel/framework": "^8.0|^7.0|^6.0",
"prologue/alerts": "^0.4.1"
"laravel/framework": "^9.0|^8.69",
"prologue/alerts": "^1.0|^0.4"
},
"require-dev": {
"orchestra/testbench": "^6.0|^5.0|^4.0|^3.0",
"orchestra/testbench": "^7.0|^6.0|^5.0|^4.0|^3.0",
"phpunit/phpunit": "~8.0|~7.0|~9.0",
"scrutinizer/ocular": "~1.7|~1.1",
"spatie/laravel-translatable": "^4.0"
"spatie/laravel-translatable": "^4.0|^5.0|^6.0"
},
"suggest": {
"backpack/filemanager": "Required to use the browse and browse_multiple fields.",
@ -118,12 +119,12 @@
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"proprietary"
"MIT"
],
"authors": [
{
"name": "Cristian Tabacitu",
"email": "tabacitu@backpackforlaravel.com",
"email": "cristian.tabacitu@backpackforlaravel.com",
"homepage": "https://backpackforlaravel.com",
"role": "Creator & Maintainer"
}
@ -151,73 +152,9 @@
],
"support": {
"issues": "https://github.com/Laravel-Backpack/CRUD/issues",
"source": "https://github.com/Laravel-Backpack/CRUD/tree/4.1.71"
"source": "https://github.com/Laravel-Backpack/CRUD/tree/5.4.10"
},
"time": "2022-08-08T16:30:20+00:00"
},
{
"name": "backpack/generators",
"version": "v3.1.0",
"source": {
"type": "git",
"url": "https://github.com/Laravel-Backpack/Generators.git",
"reference": "12a44a285ff65cdff649e2a1560d0d0f917c2f7d"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/Laravel-Backpack/Generators/zipball/12a44a285ff65cdff649e2a1560d0d0f917c2f7d",
"reference": "12a44a285ff65cdff649e2a1560d0d0f917c2f7d",
"shasum": ""
},
"require": {
"backpack/crud": "4.1.*"
},
"require-dev": {
"phpunit/phpunit": "^9.0||^7.0",
"scrutinizer/ocular": "~1.1"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.0-dev"
},
"laravel": {
"providers": [
"Backpack\\Generators\\GeneratorsServiceProvider"
]
}
},
"autoload": {
"psr-4": {
"Backpack\\Generators\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"proprietary"
],
"authors": [
{
"name": "Cristian Tone",
"email": "cristitone@outlook.com",
"homepage": "http://updivision.com",
"role": "Developer"
}
],
"description": "Generate files for laravel projects",
"homepage": "https://github.com/laravel-backpack/generators",
"keywords": [
"config",
"generators",
"model",
"request",
"view"
],
"support": {
"issues": "https://github.com/Laravel-Backpack/Generators/issues",
"source": "https://github.com/Laravel-Backpack/Generators/tree/v3.1.0"
},
"time": "2020-05-20T07:31:20+00:00"
"time": "2022-11-30T16:46:04+00:00"
},
{
"name": "bacon/bacon-qr-code",
@ -653,6 +590,68 @@
},
"time": "2022-10-27T11:44:00+00:00"
},
{
"name": "digitallyhappy/assets",
"version": "2.0.4",
"source": {
"type": "git",
"url": "https://github.com/DigitallyHappy/assets.git",
"reference": "a79e6b0e4d50f31c325f7da9b6e600d89256177d"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/DigitallyHappy/assets/zipball/a79e6b0e4d50f31c325f7da9b6e600d89256177d",
"reference": "a79e6b0e4d50f31c325f7da9b6e600d89256177d",
"shasum": ""
},
"require": {
"laravel/framework": "^9.0|^8.0"
},
"require-dev": {
"orchestra/testbench": "~5|~6",
"phpunit/phpunit": "~9.0"
},
"type": "library",
"extra": {
"laravel": {
"providers": [
"DigitallyHappy\\Assets\\AssetsServiceProvider"
],
"aliases": {
"Assets": "DigitallyHappy\\Assets\\Facades\\Assets"
}
}
},
"autoload": {
"psr-4": {
"DigitallyHappy\\Assets\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Cristian Tabacitu",
"email": "hello@tabacitu.ro",
"homepage": "https://tabacitu.ro"
}
],
"description": "Dead-simple way to load CSS or JS assets only once per page, when using Laravel 8+.",
"homepage": "https://github.com/digitallyhappy/assets",
"keywords": [
"Load CSS once",
"Load JS once",
"assets",
"laravel"
],
"support": {
"issues": "https://github.com/DigitallyHappy/assets/issues",
"source": "https://github.com/DigitallyHappy/assets/tree/2.0.4"
},
"time": "2022-03-08T23:50:02+00:00"
},
{
"name": "doctrine/cache",
"version": "2.2.0",
@ -2365,16 +2364,16 @@
},
{
"name": "laravel/fortify",
"version": "v1.13.7",
"version": "v1.14.0",
"source": {
"type": "git",
"url": "https://github.com/laravel/fortify.git",
"reference": "28c2dc66639571ac656c13617a1a0876a82319b1"
"reference": "20aeaf31edbf01e21348954088641cdb3d48ebe8"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laravel/fortify/zipball/28c2dc66639571ac656c13617a1a0876a82319b1",
"reference": "28c2dc66639571ac656c13617a1a0876a82319b1",
"url": "https://api.github.com/repos/laravel/fortify/zipball/20aeaf31edbf01e21348954088641cdb3d48ebe8",
"reference": "20aeaf31edbf01e21348954088641cdb3d48ebe8",
"shasum": ""
},
"require": {
@ -2424,7 +2423,7 @@
"issues": "https://github.com/laravel/fortify/issues",
"source": "https://github.com/laravel/fortify"
},
"time": "2022-11-04T20:57:17+00:00"
"time": "2022-11-23T09:03:43+00:00"
},
{
"name": "laravel/framework",
@ -6103,16 +6102,16 @@
},
{
"name": "symfony/css-selector",
"version": "v6.1.3",
"version": "v6.2.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/css-selector.git",
"reference": "0dd5e36b80e1de97f8f74ed7023ac2b837a36443"
"reference": "91c342ffc99283c43653ed8eb47bc2a94db7f398"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/css-selector/zipball/0dd5e36b80e1de97f8f74ed7023ac2b837a36443",
"reference": "0dd5e36b80e1de97f8f74ed7023ac2b837a36443",
"url": "https://api.github.com/repos/symfony/css-selector/zipball/91c342ffc99283c43653ed8eb47bc2a94db7f398",
"reference": "91c342ffc99283c43653ed8eb47bc2a94db7f398",
"shasum": ""
},
"require": {
@ -6148,7 +6147,7 @@
"description": "Converts CSS selectors to XPath expressions",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/css-selector/tree/v6.1.3"
"source": "https://github.com/symfony/css-selector/tree/v6.2.0"
},
"funding": [
{
@ -6164,7 +6163,7 @@
"type": "tidelift"
}
],
"time": "2022-06-27T17:24:16+00:00"
"time": "2022-08-26T05:51:22+00:00"
},
{
"name": "symfony/deprecation-contracts",
@ -6306,16 +6305,16 @@
},
{
"name": "symfony/event-dispatcher",
"version": "v6.1.0",
"version": "v6.2.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/event-dispatcher.git",
"reference": "a0449a7ad7daa0f7c0acd508259f80544ab5a347"
"reference": "9efb1618fabee89515fe031314e8ed5625f85a53"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/a0449a7ad7daa0f7c0acd508259f80544ab5a347",
"reference": "a0449a7ad7daa0f7c0acd508259f80544ab5a347",
"url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/9efb1618fabee89515fe031314e8ed5625f85a53",
"reference": "9efb1618fabee89515fe031314e8ed5625f85a53",
"shasum": ""
},
"require": {
@ -6369,7 +6368,7 @@
"description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/event-dispatcher/tree/v6.1.0"
"source": "https://github.com/symfony/event-dispatcher/tree/v6.2.0"
},
"funding": [
{
@ -6385,7 +6384,7 @@
"type": "tidelift"
}
],
"time": "2022-05-05T16:51:07+00:00"
"time": "2022-11-02T09:08:04+00:00"
},
{
"name": "symfony/event-dispatcher-contracts",
@ -6803,16 +6802,16 @@
},
{
"name": "symfony/options-resolver",
"version": "v6.1.0",
"version": "v6.2.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/options-resolver.git",
"reference": "a3016f5442e28386ded73c43a32a5b68586dd1c4"
"reference": "d28f02acde71ff75e957082cd36e973df395f626"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/options-resolver/zipball/a3016f5442e28386ded73c43a32a5b68586dd1c4",
"reference": "a3016f5442e28386ded73c43a32a5b68586dd1c4",
"url": "https://api.github.com/repos/symfony/options-resolver/zipball/d28f02acde71ff75e957082cd36e973df395f626",
"reference": "d28f02acde71ff75e957082cd36e973df395f626",
"shasum": ""
},
"require": {
@ -6850,7 +6849,7 @@
"options"
],
"support": {
"source": "https://github.com/symfony/options-resolver/tree/v6.1.0"
"source": "https://github.com/symfony/options-resolver/tree/v6.2.0"
},
"funding": [
{
@ -6866,7 +6865,7 @@
"type": "tidelift"
}
],
"time": "2022-02-25T11:15:52+00:00"
"time": "2022-11-02T09:08:04+00:00"
},
{
"name": "symfony/polyfill-ctype",
@ -7922,16 +7921,16 @@
},
{
"name": "symfony/string",
"version": "v6.1.7",
"version": "v6.2.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/string.git",
"reference": "823f143370880efcbdfa2dbca946b3358c4707e5"
"reference": "145702685e0d12f81d755c71127bfff7582fdd36"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/string/zipball/823f143370880efcbdfa2dbca946b3358c4707e5",
"reference": "823f143370880efcbdfa2dbca946b3358c4707e5",
"url": "https://api.github.com/repos/symfony/string/zipball/145702685e0d12f81d755c71127bfff7582fdd36",
"reference": "145702685e0d12f81d755c71127bfff7582fdd36",
"shasum": ""
},
"require": {
@ -7947,6 +7946,7 @@
"require-dev": {
"symfony/error-handler": "^5.4|^6.0",
"symfony/http-client": "^5.4|^6.0",
"symfony/intl": "^6.2",
"symfony/translation-contracts": "^2.0|^3.0",
"symfony/var-exporter": "^5.4|^6.0"
},
@ -7987,7 +7987,7 @@
"utf8"
],
"support": {
"source": "https://github.com/symfony/string/tree/v6.1.7"
"source": "https://github.com/symfony/string/tree/v6.2.0"
},
"funding": [
{
@ -8003,20 +8003,20 @@
"type": "tidelift"
}
],
"time": "2022-10-10T09:34:31+00:00"
"time": "2022-11-30T17:13:47+00:00"
},
{
"name": "symfony/translation",
"version": "v6.1.6",
"version": "v6.2.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/translation.git",
"reference": "e6cd330e5a072518f88d65148f3f165541807494"
"reference": "c08de62caead8357244efcb809d0b1a2584f2198"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/translation/zipball/e6cd330e5a072518f88d65148f3f165541807494",
"reference": "e6cd330e5a072518f88d65148f3f165541807494",
"url": "https://api.github.com/repos/symfony/translation/zipball/c08de62caead8357244efcb809d0b1a2584f2198",
"reference": "c08de62caead8357244efcb809d0b1a2584f2198",
"shasum": ""
},
"require": {
@ -8036,6 +8036,7 @@
"symfony/translation-implementation": "2.3|3.0"
},
"require-dev": {
"nikic/php-parser": "^4.13",
"psr/log": "^1|^2|^3",
"symfony/config": "^5.4|^6.0",
"symfony/console": "^5.4|^6.0",
@ -8050,6 +8051,7 @@
"symfony/yaml": "^5.4|^6.0"
},
"suggest": {
"nikic/php-parser": "To use PhpAstExtractor",
"psr/log-implementation": "To use logging capability in translator",
"symfony/config": "",
"symfony/yaml": ""
@ -8083,7 +8085,7 @@
"description": "Provides tools to internationalize your application",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/translation/tree/v6.1.6"
"source": "https://github.com/symfony/translation/tree/v6.2.0"
},
"funding": [
{
@ -8099,7 +8101,7 @@
"type": "tidelift"
}
],
"time": "2022-10-07T08:04:03+00:00"
"time": "2022-11-02T09:08:04+00:00"
},
{
"name": "symfony/translation-contracts",
@ -8750,6 +8752,76 @@
}
],
"packages-dev": [
{
"name": "backpack/generators",
"version": "v3.3.7",
"source": {
"type": "git",
"url": "https://github.com/Laravel-Backpack/Generators.git",
"reference": "788189f081b01b5c790f0fcab701817dd9c57706"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/Laravel-Backpack/Generators/zipball/788189f081b01b5c790f0fcab701817dd9c57706",
"reference": "788189f081b01b5c790f0fcab701817dd9c57706",
"shasum": ""
},
"require": {
"backpack/crud": "^5.3.11"
},
"require-dev": {
"phpunit/phpunit": "^9.0||^7.0",
"scrutinizer/ocular": "~1.1"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.0-dev"
},
"laravel": {
"providers": [
"Backpack\\Generators\\GeneratorsServiceProvider"
]
}
},
"autoload": {
"psr-4": {
"Backpack\\Generators\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"proprietary"
],
"authors": [
{
"name": "Cristian Tabacitu",
"email": "tabacitu@backpackforlaravel.com",
"homepage": "https://backpackforlaravel.com",
"role": "Lead Developer & Maintainer"
},
{
"name": "Cristian Tone",
"email": "cristitone@outlook.com",
"homepage": "http://updivision.com",
"role": "Developer"
}
],
"description": "Generate files for laravel projects",
"homepage": "https://github.com/laravel-backpack/generators",
"keywords": [
"config",
"generators",
"model",
"request",
"view"
],
"support": {
"issues": "https://github.com/Laravel-Backpack/Generators/issues",
"source": "https://github.com/Laravel-Backpack/Generators/tree/v3.3.7"
},
"time": "2022-11-26T07:21:23+00:00"
},
{
"name": "doctrine/instantiator",
"version": "1.4.1",

View File

@ -0,0 +1,20 @@
<?php
namespace Database\Factories;
use Illuminate\Database\Eloquent\Factories\Factory;
class SelectedTradingFactory extends Factory
{
/**
* Define the model's default state.
*
* @return array
*/
public function definition()
{
return [
//
];
}
}

View File

@ -0,0 +1,34 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateSelectedTradingsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('selected_tradings', function (Blueprint $table) {
$table->id();
$table->unsignedBigInteger('category_id')->unsigned();
$table->foreign('category_id')->references('id')->on('categories')->onDelete('cascade');
$table->string('title');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('selected_tradings');
}
}

View File

@ -0,0 +1,18 @@
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
class SelectedTradingSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
//
}
}

View File

@ -4,4 +4,5 @@
<li class="nav-item"><a class="nav-link" href="{{ backpack_url('category') }}"><i class="nav-icon la la-question"></i> Categories</a></li>
<li class="nav-item"><a class="nav-link" href="{{ backpack_url('trading') }}"><i class="nav-icon la la-question"></i> Tradings</a></li>
<li class="nav-item"><a class="nav-link" href="{{ backpack_url('news') }}"><i class="nav-icon la la-question"></i> News</a></li>
<li class='nav-item'><a class='nav-link' href='{{ backpack_url('document') }}'><i class='nav-icon la la-question'></i> Documents</a></li>
<li class='nav-item'><a class='nav-link' href='{{ backpack_url('document') }}'><i class='nav-icon la la-question'></i> Documents</a></li>
<li class="nav-item"><a class="nav-link" href="{{ backpack_url('selected-trading') }}"><i class="nav-icon la la-question"></i> Selected tradings</a></li>

View File

@ -9,6 +9,7 @@ use App\Http\Controllers\Api\TradingsController;
use App\Http\Controllers\Api\NewsController;
use App\Http\Controllers\Api\CategoryController;
use App\Http\Controllers\Api\DocumentController;
use App\Http\Controllers\Api\SelectedTradingController;
/*
|--------------------------------------------------------------------------
@ -30,5 +31,6 @@ Route::get('other-filters', [FiltersController::class, 'otherFilters']);
Route::get('categories', [CategoryController::class, 'index']);
Route::get('tradings', [TradingsController::class, 'index']);
Route::get('categories/tradings', [TradingsController::class, 'selectedTradings']);
Route::get('news', [NewsController::class, 'index']);
Route::get('documents', [DocumentController::class, 'index']);

View File

@ -20,4 +20,5 @@ Route::group([
Route::crud('trading', 'TradingCrudController');
Route::crud('news', 'NewsCrudController');
Route::crud('document', 'DocumentCrudController');
Route::crud('selected-trading', 'SelectedTradingCrudController');
}); // this should be the absolute last line of this file

Binary file not shown.