diff --git a/config/avored.php b/config/avored.php index a2f19a98..332f0cfe 100644 --- a/config/avored.php +++ b/config/avored.php @@ -1,7 +1,9 @@ \AvoRed\Framework\Graphql\Queries\ShippingQuery::class, ], 'mutation' => [ + 'CreateSubscriberMutation' => CreateSubscriberMutation::class, 'register' => \AvoRed\Framework\Graphql\Mutations\Auth\RegisterMutation::class, 'login' => \AvoRed\Framework\Graphql\Mutations\Auth\LoginMutation::class, 'customerUpdate' => \AvoRed\Framework\Graphql\Mutations\Customer\CustomerUpdateMutation::class, @@ -103,6 +106,7 @@ 'cartProduct' => AvoRed\Framework\Graphql\Types\CartProductType::class, 'payment' => AvoRed\Framework\Graphql\Types\PaymentType::class, 'shipping' => AvoRed\Framework\Graphql\Types\ShippingType::class, + 'subscriber' => SubscriberType::class, ], ], ]; diff --git a/database/migrations/2017_03_29_000000_avored_framework_schema.php b/database/migrations/2017_03_29_000000_avored_framework_schema.php index c009f1ea..36a13a90 100644 --- a/database/migrations/2017_03_29_000000_avored_framework_schema.php +++ b/database/migrations/2017_03_29_000000_avored_framework_schema.php @@ -274,6 +274,15 @@ public function up() $table->foreign('product_id')->references('id')->on('products'); }); + Schema::create('subscribers', function (Blueprint $table) { + $table->uuid('id')->primary(); + $table->uuid('customer_id')->nullable()->default(null); + $table->string('email')->nullable()->default(null)->unique(); + $table->enum('status', ['ENABLED', 'DISABLED'])->default('ENABLED'); + $table->timestamps(); + $table->foreign('customer_id')->references('id')->on('customers')->onDelete('cascade'); + }); + $path = __DIR__.'/../../assets/countries.json'; $json = json_decode(file_get_contents($path), true); foreach ($json as $country) { @@ -298,6 +307,7 @@ public function up() */ public function down() { + Schema::dropIfExists('subscribers'); Schema::dropIfExists('visitors'); Schema::dropIfExists('category_product'); Schema::dropIfExists('documents'); diff --git a/resources/lang/en/system.php b/resources/lang/en/system.php index d182d37c..dc088d82 100644 --- a/resources/lang/en/system.php +++ b/resources/lang/en/system.php @@ -97,5 +97,8 @@ 'image_path' => 'Image', 'upload_file' => 'Upload File', 'drag_and_drop' => 'drag and drop', - 'png_jpg_gif_up_to_10mb' => 'PNG, JPG, GIF up to 10MB' + 'png_jpg_gif_up_to_10mb' => 'PNG, JPG, GIF up to 10MB', + 'subscriber' => 'Subscriber', + 'enabled' => 'Enabled', + 'disabled' => 'Disabled', ]; diff --git a/resources/views/user/staff/_fields.blade.php b/resources/views/user/staff/_fields.blade.php index af61d568..b3eb06c9 100644 --- a/resources/views/user/staff/_fields.blade.php +++ b/resources/views/user/staff/_fields.blade.php @@ -37,14 +37,16 @@ @endif +
+
+ +
+ + +
+ + + + + +
diff --git a/resources/views/user/subscriber/create.blade.php b/resources/views/user/subscriber/create.blade.php new file mode 100644 index 00000000..63beabcc --- /dev/null +++ b/resources/views/user/subscriber/create.blade.php @@ -0,0 +1,53 @@ + +
+
+
+

+ {{ __('avored::system.create') }} {{ __('avored::system.subscriber') }} +

+ +
+ +
+ + + @foreach ($tabs as $tab) +
+
+
+ + {{ $tab->label() }} + + + + +
+ +
+
+ @php + $path = $tab->view(); + @endphp + @include($path) +
+
+ @endforeach + +
+ + + + Cancel + +
+
+
+
+ +
+ +
diff --git a/resources/views/user/subscriber/edit.blade.php b/resources/views/user/subscriber/edit.blade.php new file mode 100644 index 00000000..4cae3043 --- /dev/null +++ b/resources/views/user/subscriber/edit.blade.php @@ -0,0 +1,50 @@ + +
+
+
+

+ {{ __('avored::system.edit') }} {{ __('avored::system.subscriber') }} +

+ +
+ +
+ + @foreach ($tabs as $tab) +
+
+
+ + {{ $tab->label() }} + + + + +
+ +
+
+ @php + $path = $tab->view(); + @endphp + @include($path) +
+
+ @endforeach + +
+ + + + {{ __('avored::system.cancel') }} + +
+
+
+
+
+
diff --git a/resources/views/user/subscriber/index.blade.php b/resources/views/user/subscriber/index.blade.php new file mode 100644 index 00000000..eaaa4155 --- /dev/null +++ b/resources/views/user/subscriber/index.blade.php @@ -0,0 +1,132 @@ + +
+
+
+

+ {{ __('avored::system.subscriber') }} {{ __('avored::system.list') }} +

+ + + {{ __('avored::system.create') }} + + +
+ +
+
+ + + + + {{ __('avored::system.email') }} + + + {{ __('avored::system.status') }} + + + {{ __('avored::system.actions') }} + + + + + @foreach ($subscribers as $subscriber) + + + {{ $subscriber->email ?? '' }} + + + {{ $subscriber->status ?? '' }} + + +
+ + + + | + + + + + +
+
+
+ @endforeach +
+
+
+ {{ $subscribers->render() }} +
+
+
+
+ + +
+
diff --git a/routes/web.php b/routes/web.php index adf8d01d..c2047314 100644 --- a/routes/web.php +++ b/routes/web.php @@ -11,6 +11,7 @@ use AvoRed\Framework\System\Controllers\RoleController; use AvoRed\Framework\User\Controllers\LoginController; use AvoRed\Framework\User\Controllers\StaffController; +use AvoRed\Framework\User\Controllers\SubscriberController; use Illuminate\Support\Facades\Route; /* @@ -77,6 +78,7 @@ /***************** USER ROUTES *****************/ Route::resource('staff', StaffController::class); + Route::resource('subscriber', SubscriberController::class); /***************** ORDER ROUTES *****************/ diff --git a/src/Breadcrumb/BreadcrumbProvider.php b/src/Breadcrumb/BreadcrumbProvider.php index da05652f..5b9adcc8 100644 --- a/src/Breadcrumb/BreadcrumbProvider.php +++ b/src/Breadcrumb/BreadcrumbProvider.php @@ -148,6 +148,58 @@ function (BreadcrumbItem $breadcrumb) { } ); + Breadcrumb::make( + 'admin.subscriber.index', + function (BreadcrumbItem $breadcrumb) { + $breadcrumb->label('avored::system.subscriber') + ->parent('admin.dashboard'); + } + ); + + Breadcrumb::make( + 'admin.subscriber.create', + function (BreadcrumbItem $breadcrumb) { + $breadcrumb->label('avored::system.create') + ->parent('admin.dashboard') + ->parent('admin.subscriber.index'); + } + ); + + Breadcrumb::make( + 'admin.subscriber.edit', + function (BreadcrumbItem $breadcrumb) { + $breadcrumb->label('avored::system.edit') + ->parent('admin.dashboard') + ->parent('admin.subscriber.index'); + } + ); + + Breadcrumb::make( + 'admin.staff.index', + function (BreadcrumbItem $breadcrumb) { + $breadcrumb->label('avored::system.staff') + ->parent('admin.dashboard'); + } + ); + + Breadcrumb::make( + 'admin.staff.create', + function (BreadcrumbItem $breadcrumb) { + $breadcrumb->label('avored::system.create') + ->parent('admin.dashboard') + ->parent('admin.staff.index'); + } + ); + + Breadcrumb::make( + 'admin.staff.edit', + function (BreadcrumbItem $breadcrumb) { + $breadcrumb->label('avored::system.edit') + ->parent('admin.dashboard') + ->parent('admin.staff.index'); + } + ); + // Breadcrumb::make( // 'admin.language.index', // function (BreadcrumbItem $breadcrumb) { diff --git a/src/Database/Contracts/SubscriberModelInterface.php b/src/Database/Contracts/SubscriberModelInterface.php new file mode 100644 index 00000000..bdea2ac1 --- /dev/null +++ b/src/Database/Contracts/SubscriberModelInterface.php @@ -0,0 +1,7 @@ +belongsTo(Customer::class); + } +} diff --git a/src/Database/Repository/SubscriberRepository.php b/src/Database/Repository/SubscriberRepository.php new file mode 100644 index 00000000..52106921 --- /dev/null +++ b/src/Database/Repository/SubscriberRepository.php @@ -0,0 +1,31 @@ +model = new Subscriber(); + } + + /** + * Get the model for the repository + * @return Subscriber + */ + public function model(): Subscriber + { + return $this->model; + } +} diff --git a/src/Graphql/Mutations/Customer/CreateSubscriberMutation.php b/src/Graphql/Mutations/Customer/CreateSubscriberMutation.php new file mode 100644 index 00000000..7fe9ee79 --- /dev/null +++ b/src/Graphql/Mutations/Customer/CreateSubscriberMutation.php @@ -0,0 +1,63 @@ + 'CreateSubscriberMutation', + 'description' => 'A mutation' + ]; + + /** + * Subscriber Repository + * @var AvoRed\Framework\Database\Repository\SubscriberRepository + */ + protected $subscriberRepository; + + /** + * All Subscriber construct + * @param \AvoRed\Framework\Database\Contracts\SubscriberModelInterface $subscriberRepository + * @return void + */ + public function __construct(SubscriberModelInterface $subscriberRepository) + { + $this->subscriberRepository = $subscriberRepository; + } + + public function type(): Type + { + return GraphQL::type('subscriber'); + } + + public function args(): array + { + return [ + 'email' => [ + 'name' => 'email', + 'type' => Type::nonNull(Type::string()), + ] + ]; + } + + public function resolve($root, $args, $context, ResolveInfo $resolveInfo, Closure $getSelectFields) + { + if (Auth::guard('visitor_api')->check()) { + $visitor = Auth::guard('visitor_api')->user(); + $customerId = Arr::get($visitor, 'customer_id', null); + $args['customer_id'] = $customerId; + } + $args['status'] = 'ENABLED'; + + return $this->subscriberRepository->create($args); + } +} diff --git a/src/Graphql/Mutations/PlaceOrderMutation.php b/src/Graphql/Mutations/PlaceOrderMutation.php index 871532f8..648a508c 100644 --- a/src/Graphql/Mutations/PlaceOrderMutation.php +++ b/src/Graphql/Mutations/PlaceOrderMutation.php @@ -79,18 +79,6 @@ public function args(): array 'billing_address_id' => [ 'name' => 'billing_address_id', 'type' => Type::nonNull(Type::string()) - ], - 'products' => [ - 'name' => 'products', - 'type' => Type::listOf(new InputObjectType([ - 'name' => 'order_products', - 'fields' => [ - 'product_id' => ['name' => 'product_id', 'type' => Type::nonNull(Type::string())], - 'qty' => ['name' => 'qty', 'type' => Type::nonNull(Type::float())], - 'price' => ['name' => 'price', 'type' => Type::nonNull(Type::float())], - 'tax_amount' => ['name' => 'tax_amount', 'type' => Type::nonNull(Type::float())], - ] - ])) ] ]; } @@ -99,7 +87,7 @@ public function resolve($root, $args, $context, ResolveInfo $resolveInfo, Closur { $order = $this->orderRepository->create($args); - $this->syncProducts($order, $args); + // $this->syncProducts($order, $args); return $order; } @@ -113,7 +101,6 @@ public function resolve($root, $args, $context, ResolveInfo $resolveInfo, Closur */ private function syncProducts(Order $order, $args) { - foreach ($args['products'] as $product) { $orderProductData = [ 'product_id' => $product['product_id'], diff --git a/src/Graphql/Queries/AllCategoryQuery.php b/src/Graphql/Queries/AllCategoryQuery.php index e40facea..34c12e28 100644 --- a/src/Graphql/Queries/AllCategoryQuery.php +++ b/src/Graphql/Queries/AllCategoryQuery.php @@ -12,7 +12,7 @@ class AllCategoryQuery extends Query { - use AuthorizedTrait; + // use AuthorizedTrait; protected $attributes = [ 'name' => 'allCategory', diff --git a/src/Graphql/Queries/LatestProductQuery.php b/src/Graphql/Queries/LatestProductQuery.php index acb689a7..d0107f1a 100644 --- a/src/Graphql/Queries/LatestProductQuery.php +++ b/src/Graphql/Queries/LatestProductQuery.php @@ -12,7 +12,7 @@ class LatestProductQuery extends Query { - use AuthorizedTrait; + // use AuthorizedTrait; protected $attributes = [ 'name' => 'latestProductQuery', diff --git a/src/Graphql/Types/SubscriberType.php b/src/Graphql/Types/SubscriberType.php new file mode 100644 index 00000000..02592a1d --- /dev/null +++ b/src/Graphql/Types/SubscriberType.php @@ -0,0 +1,52 @@ + 'subscriber', + 'description' => 'A type' + ]; + + /** + * Fields for Subscriber Type + * @return array $fields + */ + public function fields(): array + { + return [ + 'id' => [ + 'type' => Type::nonNull(Type::string()), + 'description' => 'The id of the subscriber' + ], + 'customer_id' => [ + 'type' => Type::string(), + 'description' => 'The customer id of the subscriber' + ], + 'email' => [ + 'type' => Type::nonNull(Type::string()), + 'description' => 'The email of the subscriber' + ], + 'status' => [ + 'type' => Type::string(), + 'description' => 'The status of the subscriber' + ], + 'created_at' => [ + 'type' => Type::nonNull(Type::string()), + 'description' => 'The created_at of the subscriber' + ], + 'updated_at' => [ + 'type' => Type::nonNull(Type::string()), + 'description' => 'The updated_at of the subscriber' + ], + + ]; + } +} diff --git a/src/Menu/MenuProvider.php b/src/Menu/MenuProvider.php index c4476193..8856b6c6 100644 --- a/src/Menu/MenuProvider.php +++ b/src/Menu/MenuProvider.php @@ -126,7 +126,7 @@ public function registerAdminMenu() }); /** @var Builder $orderMenu */ $orderMenu = Menu::get('order'); - + $orderMenu->subMenu('order', function (MenuItem $menu) { $menu->key('order') ->type(MenuItem::ADMIN) @@ -192,6 +192,12 @@ public function registerAdminMenu() ->label('avored::system.staff') ->route('admin.staff.index'); }); + $userMenu->subMenu('subscriber', function (MenuItem $menu) { + $menu->key('subscriber') + ->type(MenuItem::ADMIN) + ->label('avored::system.subscriber') + ->route('admin.subscriber.index'); + }); Menu::make('system', function (MenuItem $menu) { $menu->label('avored::system.system') diff --git a/src/Permission/PermissionProvider.php b/src/Permission/PermissionProvider.php index 77a87ab8..f9f525cd 100644 --- a/src/Permission/PermissionProvider.php +++ b/src/Permission/PermissionProvider.php @@ -289,6 +289,41 @@ function (PermissionItem $permission) { ->routes('admin.admin-user.destroy'); } ); + + $group = Permission::add( + 'subscriber', + function (PermissionGroup $group) { + $group->label('avored::system.subscriber'); + } + ); + $group->addPermission( + 'admin-subscriber-list', + function (PermissionItem $permission) { + $permission->label('avored::system.list') + ->routes('admin.subscriber.index'); + } + ); + $group->addPermission( + 'admin-subscriber-create', + function (PermissionItem $permission) { + $permission->label('avored::system.create') + ->routes('admin.subscriber.create,admin.subscriber.store'); + } + ); + $group->addPermission( + 'admin-subscriber-update', + function (PermissionItem $permission) { + $permission->label('avored::system.edit') + ->routes('admin.subscriber.edit,admin.subscriber.update'); + } + ); + $group->addPermission( + 'admin-subscriber-destroy', + function (PermissionItem $permission) { + $permission->label('avored::system.destroy') + ->routes('admin.subscriber.destroy'); + } + ); // $group = Permission::add( // 'currency', // function (PermissionGroup $group) { diff --git a/src/Support/Providers/ModelsProvider.php b/src/Support/Providers/ModelsProvider.php index fcc31e04..b50acfea 100644 --- a/src/Support/Providers/ModelsProvider.php +++ b/src/Support/Providers/ModelsProvider.php @@ -18,6 +18,7 @@ use AvoRed\Framework\Database\Contracts\ProductModelInterface; use AvoRed\Framework\Database\Contracts\PropertyModelInterface; use AvoRed\Framework\Database\Contracts\RoleModelInterface; +use AvoRed\Framework\Database\Contracts\SubscriberModelInterface; use AvoRed\Framework\Database\Contracts\VisitorModelInterface; use AvoRed\Framework\Database\Repository\AddressRepository; use AvoRed\Framework\Database\Repository\AdminUserRepository; @@ -35,6 +36,7 @@ use AvoRed\Framework\Database\Repository\ProductRepository; use AvoRed\Framework\Database\Repository\PropertyRepository; use AvoRed\Framework\Database\Repository\RoleRepository; +use AvoRed\Framework\Database\Repository\SubscriberRepository; use AvoRed\Framework\Database\Repository\VisitorRepository; use Illuminate\Support\ServiceProvider; @@ -68,6 +70,7 @@ class ModelsProvider extends ServiceProvider PermissionModelInterface::class => PermissionRepository::class, VisitorModelInterface::class => VisitorRepository::class, RoleModelInterface::class => RoleRepository::class, + SubscriberModelInterface::class => SubscriberRepository::class, ]; /** diff --git a/src/Tab/TabProvider.php b/src/Tab/TabProvider.php index e1952b1d..5cf6d94b 100644 --- a/src/Tab/TabProvider.php +++ b/src/Tab/TabProvider.php @@ -160,6 +160,11 @@ public function registerTabs() ->label('avored::system.basic_info') ->view('avored::user.staff._fields'); }); + Tab::put('user.subscriber', function (TabItem $tab) { + $tab->key('user.subscriber.info') + ->label('avored::system.basic_info') + ->view('avored::user.subscriber._fields'); + }); /******SYSTEM CURRENCY TABS *******/ Tab::put('system.currency', function (TabItem $tab) { diff --git a/src/User/Controllers/SubscriberController.php b/src/User/Controllers/SubscriberController.php new file mode 100644 index 00000000..8f4bb669 --- /dev/null +++ b/src/User/Controllers/SubscriberController.php @@ -0,0 +1,114 @@ +subscriberRepository = $repository; + } + + /** + * Display a listing of the resource. + * + * @return \Illuminate\Http\Response + */ + public function index() + { + $subscribers = $this->subscriberRepository->paginate(); + + return view('avored::user.subscriber.index') + ->with('subscribers', $subscribers); + } + + /** + * Show the form for creating a new resource. + * + * @return \Illuminate\Http\Response + */ + public function create() + { + $roles = $this->roleRepository->options(); + $tabs = Tab::get('user.subscriber'); + + return view('avored::user.subscriber.create') + ->with('tabs', $tabs); + } + + /** + * Store a newly created resource in storage. + * + * @param SubscriberRequest $request + * @return \Illuminate\Http\Response + */ + public function store(SubscriberRequest $request) + { + $this->subscriberRepository->create($request->all()); + + return redirect(route('admin.subscriber.index')); + } + + /** + * Show the form for editing the specified resource. + * + * @param Subscriber $subscriber + * @return \Illuminate\Http\Response + */ + public function edit(Subscriber $subscriber) + { + $tabs = Tab::get('user.subscriber'); + + return view('avored::user.subscriber.edit') + ->with('subscriber', $subscriber) + ->with('tabs', $tabs); + } + + /** + * Update the specified resource in storage. + * + * @param SubscriberRequest $request + * @param Subscriber $subscriber + * @return \Illuminate\Http\Response + */ + public function update(SubscriberRequest $request, Subscriber $subscriber) + { + $subscriber->update($request->all()); + + return redirect(route('admin.subscriber.index')); + } + + /** + * Remove the specified resource from storage. + * + * @param Subscriber $subscriber + * @return \Illuminate\Http\Response + */ + public function destroy(Subscriber $subscriber) + { + $subscriber->delete(); + + return new JsonResponse([ + 'success' => true, + 'message' => __('avored::system.success_delete_message', ['attribute' => __('avored::system.subscriber')]) + ]); + } +} diff --git a/src/User/Requests/SubscriberRequest.php b/src/User/Requests/SubscriberRequest.php new file mode 100644 index 00000000..3541883a --- /dev/null +++ b/src/User/Requests/SubscriberRequest.php @@ -0,0 +1,29 @@ + 'required', + ]; + } +}