Showing AI reviews for avriti-backend
Project AI Score ?
59%
Quality Avg ?
64%
Security Avg ?
45%
Reviews ?
57

Review Result ?

jattin01/avriti-backend · 70bd77d2
The commit adds API and service management for banners and service details including CRUD operations with validation, file uploads, and slug generation. The code generally follows good practices and is functional but has several security risks and potential maintenance issues.
Quality ?
80%
Security ?
50%
Business Value ?
75%
Maintainability ?
70%
Issues & Suggested Fixes ?
1AI detects the issue
2Shows file, line, or evidence
3Suggests the fix to apply
Security Issue
Where .env:39
Issue / Evidence security risk
Suggested Fix avoid committing empty DB_PASSWORD or partial sensitive values in .env; remove from commit or mask
Security Issue
Where app/Http/Controllers/AdminBannerController.php:27
Issue / Evidence security risk
Suggested Fix validate and sanitize file uploads more strictly to prevent malicious files
Business Rule Clarity
Where app/Http/Controllers/AdminBannerController.php:18
Issue / Evidence business rule clarity
Suggested Fix max 5 banners hardcoded, consider making configurable
Code Quality
Where app/Http/Controllers/AdminServiceDetailController.php:40
Issue / Evidence code quality
Suggested Fix consider abstracting repeated directory/file upload code into helper methods
Bug Risk
Where app/Http/Controllers/AdminServiceDetailController.php:92
Issue / Evidence bug risk
Suggested Fix check file delete success or handle failure when deleting old image
Performance
Where app/Http/Controllers/AdminServiceDetailController.php:34
Issue / Evidence performance
Suggested Fix slug uniqueness check could benefit from unique database constraint to avoid race conditions
Missing Validation
Where app/Http/Controllers/AdminServiceDetailController.php:25
Issue / Evidence validation
Suggested Fix validate consultation_fee as numeric or specific format instead of generic string
Clarity
Where commit message
Issue / Evidence clarity
Suggested Fix improve commit message to describe added features and scope more precisely
Code Change Preview · .env ?
Removed / Before Commit
- LOG_DEPRECATIONS_CHANNEL=null
- LOG_LEVEL=debug
- 
- #DB_CONNECTION=mysql
- #DB_HOST=127.0.0.1
- #DB_PORT=3306
- #DB_DATABASE=avriti_db
- #DB_USERNAME=root
- #DB_PASSWORD=
- 
- DB_CONNECTION=mysql
- DB_HOST=127.0.0.1
- DB_PORT=3306
- DB_DATABASE=avriti
- DB_USERNAME=root
- DB_PASSWORD="H3llo#W0rld!2023"
- # SESSION_DRIVER=database
- # SESSION_LIFETIME=120
Added / After Commit
+ LOG_DEPRECATIONS_CHANNEL=null
+ LOG_LEVEL=debug
+ 
+ DB_CONNECTION=mysql
+ DB_HOST=127.0.0.1
+ DB_PORT=3306
+ DB_DATABASE=avriti_db
+ DB_USERNAME=root
+ DB_PASSWORD=
+ 
+ # DB_CONNECTION=mysql
+ # DB_HOST=127.0.0.1
+ # DB_PORT=3306
+ # DB_DATABASE=avriti
+ # DB_USERNAME=root
+ # DB_PASSWORD="H3llo#W0rld!2023"
+ # SESSION_DRIVER=database
+ # SESSION_LIFETIME=120
Removed / Before Commit

                                                
Added / After Commit
+ <?php
+ 
+ namespace App\Http\Controllers;
+ 
+ use App\Models\Banner;
+ use Illuminate\Http\Request;
+ 
+ class AdminBannerController extends Controller
+ {
+     public function index()
+     {
+         $banners = Banner::orderBy('id')->get();
+         return view('admin.banners', compact('banners'));
+     }
+ 
+     public function store(Request $request)
+     {
+         if (Banner::count() >= 5) {
Removed / Before Commit
- namespace App\Http\Controllers;
- 
- use App\Models\Service;
- use Illuminate\Http\RedirectResponse;
- use Illuminate\Http\Request;
- use Illuminate\Support\Facades\File;
- {
- public function index(): View
- {
-         $service = Service::first() ?? new Service();
-         $svgFiles = $this->getSvgFiles();
- 
-         return view('admin.service', compact('service', 'svgFiles'));
- }
- 
- public function update(Request $request): RedirectResponse
Added / After Commit
+ namespace App\Http\Controllers;
+ 
+ use App\Models\Service;
+ use App\Models\ServiceDetail;
+ use Illuminate\Http\RedirectResponse;
+ use Illuminate\Http\Request;
+ use Illuminate\Support\Facades\File;
+ {
+ public function index(): View
+ {
+         $service        = Service::first() ?? new Service();
+         $svgFiles       = $this->getSvgFiles();
+         $serviceDetails = ServiceDetail::orderBy('id')->get();
+ 
+         return view('admin.service', compact('service', 'svgFiles', 'serviceDetails'));
+ }
+ 
+ public function update(Request $request): RedirectResponse
Removed / Before Commit

                                                
Added / After Commit
+ <?php
+ 
+ namespace App\Http\Controllers;
+ 
+ use App\Models\ServiceDetail;
+ use Illuminate\Http\RedirectResponse;
+ use Illuminate\Http\Request;
+ use Illuminate\Support\Facades\File;
+ use Illuminate\Support\Str;
+ use Illuminate\View\View;
+ 
+ class AdminServiceDetailController extends Controller
+ {
+     public function create(): View
+     {
+         $svgFiles = $this->getSvgFiles();
+         return view('admin.service-detail-form', compact('svgFiles'));
+     }
Removed / Before Commit

                                                
Added / After Commit
+ <?php
+ 
+ namespace App\Http\Controllers\Api;
+ 
+ use App\Http\Controllers\Controller;
+ use App\Models\Banner;
+ 
+ class BannerController extends Controller
+ {
+     public function index()
+     {
+         $banners = Banner::where('is_active', true)
+             ->orderBy('id')
+             ->get()
+             ->map(fn($b) => [
+                 'id'    => $b->id,
+                 'image' => asset($b->image),
+                 'url'   => $b->url,
Removed / Before Commit
- use App\Models\CartItem;
- use App\Models\PaymentSetting;
- use App\Models\Product;
- use App\Services\CouponService;
- use App\Services\ShippingService;
- use App\Services\TaxService;
- }
- 
- $taxResult      = TaxService::calculate($subtotal - $discount);
-         $shippingResult = ShippingService::calculate($subtotal - $discount, $shippingAddress['pincode'] ?? null);
-         $shippingCharge = $shippingResult['shipping_charge'];
- $totalAmount    = round($subtotal - $discount + $shippingCharge + $taxResult['tax_amount'], 2);
- 
- $order = Order::create([
- }
- 
- // create order items from cart or buy_now payload
-         $items = $request->input('items', []);
Added / After Commit
+ use App\Models\CartItem;
+ use App\Models\PaymentSetting;
+ use App\Models\Product;
+ use App\Models\ServiceDetail;
+ use App\Services\CouponService;
+ use App\Services\ShippingService;
+ use App\Services\TaxService;
+ }
+ 
+ $taxResult      = TaxService::calculate($subtotal - $discount);
+         $requestItems   = $request->input('items', []);
+         $allService     = count($requestItems) > 0 && collect($requestItems)->every(fn($i) => !empty($i['service_detail_id']));
+         $shippingCharge = $allService ? 0 : ShippingService::calculate($subtotal - $discount, $shippingAddress['pincode'] ?? null)['shipping_charge'];
+ $totalAmount    = round($subtotal - $discount + $shippingCharge + $taxResult['tax_amount'], 2);
+ 
+ $order = Order::create([
+ }
+ 
Removed / Before Commit

                                                
Added / After Commit
+ <?php
+ 
+ namespace App\Http\Controllers\Api;
+ 
+ use App\Http\Controllers\Controller;
+ use App\Models\ServiceDetail;
+ 
+ class ServiceDetailController extends Controller
+ {
+     public function index()
+     {
+         $details = ServiceDetail::where('is_active', true)
+             ->orderBy('id')
+             ->get(['id', 'name', 'slug', 'short_description', 'icon', 'image', 'consultation_fee']);
+ 
+         $data = $details->map(function ($sd) {
+             return [
+                 'id'                => $sd->id,
Removed / Before Commit

                                                
Added / After Commit
+ <?php
+ 
+ namespace App\Models;
+ 
+ use Illuminate\Database\Eloquent\Model;
+ 
+ class Banner extends Model
+ {
+     protected $fillable = ['image', 'url', 'is_active'];
+ 
+     protected function casts(): array
+     {
+         return ['is_active' => 'boolean'];
+     }
+ }
Removed / Before Commit

                                                
Added / After Commit
+ <?php
+ 
+ namespace App\Models;
+ 
+ use Illuminate\Database\Eloquent\Model;
+ 
+ class ServiceDetail extends Model
+ {
+     protected $fillable = [
+         'name',
+         'slug',
+         'short_description',
+         'consultation_fee',
+         'icon',
+         'image',
+         'other_details',
+         'taglines',
+         'is_active',
Removed / Before Commit

                                                
Added / After Commit
+ <?php
+ 
+ use Illuminate\Database\Migrations\Migration;
+ use Illuminate\Database\Schema\Blueprint;
+ use Illuminate\Support\Facades\Schema;
+ 
+ return new class extends Migration
+ {
+     /**
+      * Run the migrations.
+      */
+     public function up(): void
+     {
+         Schema::create('service_details', function (Blueprint $table) {
+             $table->id();
+             $table->string('name');
+             $table->string('slug')->unique();
+             $table->text('short_description')->nullable();
Removed / Before Commit

                                                
Added / After Commit
+ <?php
+ 
+ use Illuminate\Database\Migrations\Migration;
+ use Illuminate\Database\Schema\Blueprint;
+ use Illuminate\Support\Facades\Schema;
+ 
+ return new class extends Migration
+ {
+     /**
+      * Run the migrations.
+      */
+     public function up(): void
+     {
+         Schema::table('service_details', function (Blueprint $table) {
+             $table->text('taglines')->nullable()->after('other_details');
+         });
+     }
+ 
Removed / Before Commit

                                                
Added / After Commit
+ <?php
+ 
+ use Illuminate\Database\Migrations\Migration;
+ use Illuminate\Database\Schema\Blueprint;
+ use Illuminate\Support\Facades\Schema;
+ 
+ return new class extends Migration
+ {
+     public function up(): void
+     {
+         Schema::table('order_items', function (Blueprint $table) {
+             $table->unsignedBigInteger('service_detail_id')->nullable()->after('combo_product_id');
+         });
+     }
+ 
+     public function down(): void
+     {
+         Schema::table('order_items', function (Blueprint $table) {
Removed / Before Commit

                                                
Added / After Commit
+ <?php
+ 
+ use Illuminate\Database\Migrations\Migration;
+ use Illuminate\Database\Schema\Blueprint;
+ use Illuminate\Support\Facades\Schema;
+ 
+ return new class extends Migration
+ {
+     /**
+      * Run the migrations.
+      */
+     public function up(): void
+     {
+         Schema::create('banners', function (Blueprint $table) {
+             $table->id();
+             $table->string('image');
+             $table->string('url');
+             $table->boolean('is_active')->default(true);
Removed / Before Commit

                                                
Added / After Commit
+ @extends('layouts.app')
+ 
+ @section('title', 'Banners | Avriti Dashboard')
+ 
+ @section('content')
+ 
+ <div class="mb-6 flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between">
+   <div>
+     <h1 class="text-2xl font-semibold text-[#0b3dba]">Banners</h1>
+   </div>
+   @if($banners->count() < 5)
+   <button type="button" data-modal-target="createBannerModal"
+     class="inline-flex h-11 items-center justify-center gap-2 rounded-md bg-[#0b3dba] px-5 text-sm font-semibold text-white shadow-sm transition hover:bg-blue-600">
+     <i class="fa-solid fa-plus"></i>
+     Add Banner
+   </button>
+   @endif
+ </div>
Removed / Before Commit

                                                
Added / After Commit
+ @extends('layouts.app')
+ 
+ @section('title', isset($serviceDetail) ? 'Edit Service Detail | Avriti Dashboard' : 'Add Service Detail | Avriti Dashboard')
+ 
+ @push('styles')
+ <link href="https://cdn.quilljs.com/1.3.6/quill.snow.css" rel="stylesheet" />
+ <style>
+   .ql-container { font-size: 14px; }
+   .ql-editor { min-height: 80px; max-height: 160px; overflow-y: auto; }
+   .ql-editor::-webkit-scrollbar { width: 4px; }
+   .ql-editor::-webkit-scrollbar-thumb { background: #cbd5e1; border-radius: 4px; }
+   .word-count { font-size: 11px; color: #9ca3af; text-align: right; margin-top: 4px; }
+   .word-count.warn { color: #ef4444; }
+ </style>
+ @endpush
+ 
+ @section('content')
+ 
Removed / Before Commit
- </div>
- </div>
- 
-   {{-- Section 2 — Cards --}}
-   <div class="overflow-hidden rounded-[32px] bg-white shadow-sm mb-6">
-     <div class="flex items-center gap-3 border-b border-gray-200 px-6 py-5">
-       <span class="inline-flex h-8 w-8 items-center justify-center rounded-xl bg-[#eef4ff] text-[#0b3dba] text-sm font-bold">2</span>
-       <h2 class="text-base font-semibold text-gray-800">Service Cards</h2>
-     </div>
-     <div class="px-6 py-6">
- 
-       <div id="cards-container" class="flex flex-col gap-5">
-         @php $existingCards = $service->cards ?? []; @endphp
-         @forelse ($existingCards as $index => $card)
-           @php $savedIcon = $card['s_card_icon'] ?? ''; $savedDesc = $card['s_card_description'] ?? ''; @endphp
-           <div class="card-item border border-gray-200 rounded-2xl p-5 relative">
-             <button type="button" onclick="removeCard(this)"
-               class="absolute top-3 right-3 text-red-400 hover:text-red-600 text-sm font-semibold">
Added / After Commit
+ </div>
+ </div>
+ 
+ {{-- Submit --}}
+ <div class="flex justify-end">
+ <button type="submit"
+ </div>
+ </form>
+ 
+ {{-- Section 2 — Service Details Table --}}
+ <div class="overflow-hidden rounded-[32px] bg-white shadow-sm mt-8">
+   <div class="flex flex-col gap-3 border-b border-gray-200 px-6 py-5 sm:flex-row sm:items-center sm:justify-between">
+     <div class="flex items-center gap-3">
+       <span class="inline-flex h-8 w-8 items-center justify-center rounded-xl bg-[#eef4ff] text-[#0b3dba] text-sm font-bold">2</span>
+       <div>
+         <h2 class="text-base font-semibold text-gray-800">Service Details</h2>
+         <p class="text-sm text-gray-400 mt-0.5">Manage individual service detail pages.</p>
+       </div>
Removed / Before Commit
- 
- @foreach ($items as $item)
- @php
-                   $title = $item['title'] ?? $item['product_name'] ?? 'Product';
- $qty = (int) ($item['quantity'] ?? 1);
- $price = (float) ($item['selling_price'] ?? $item['price'] ?? 0);
- $lineTotal = $price * $qty;
Added / After Commit
+ 
+ @foreach ($items as $item)
+ @php
+                   $isService = !empty($item['is_service']);
+                   $title = ($item['title'] ?? $item['product_name'] ?? 'Product') . ($isService ? ' (Service)' : '');
+ $qty = (int) ($item['quantity'] ?? 1);
+ $price = (float) ($item['selling_price'] ?? $item['price'] ?? 0);
+ $lineTotal = $price * $qty;
Removed / Before Commit
- </div>
- 
- {{-- CMS Group --}}
-     @php $cmsOpen = request()->routeIs('home-page.*', 'about-page.*', 'faq.*', 'service-page.*'); @endphp
- <div>
- <button type="button" id="cmsToggle"
- class="w-full flex items-center justify-between px-3 py-2.5 rounded-xl text-white/70 hover:bg-white/10 hover:text-white transition">
- <a href="{{ route('home-page.index') }}" class="flex items-center gap-3 px-3 py-2 rounded-xl text-sm {{ request()->routeIs('home-page.*') ? $activeClass : $inactiveClass }}">
- <i class="fa-solid fa-house"></i>
- Home Page
- </a>
- <a href="{{ route('about-page.index') }}" class="flex items-center gap-3 px-3 py-2 rounded-xl text-sm {{ request()->routeIs('about-page.*') ? $activeClass : $inactiveClass }}">
- <i class="fa-solid fa-circle-info"></i>
- <i class="fa-solid fa-hand-sparkles"></i>
- Services Page
- </a>
- <a href="{{ route('contacts.index') }}" class="flex items-center gap-3 px-3 py-2.5 rounded-xl {{ request()->routeIs('contacts.*') ? $activeClass : $inactiveClass }}">
- <i class="fa-solid fa-envelope"></i>
Added / After Commit
+ </div>
+ 
+ {{-- CMS Group --}}
+     @php $cmsOpen = request()->routeIs('home-page.*', 'about-page.*', 'faq.*', 'service-page.*', 'banners.*'); @endphp
+ <div>
+ <button type="button" id="cmsToggle"
+ class="w-full flex items-center justify-between px-3 py-2.5 rounded-xl text-white/70 hover:bg-white/10 hover:text-white transition">
+ <a href="{{ route('home-page.index') }}" class="flex items-center gap-3 px-3 py-2 rounded-xl text-sm {{ request()->routeIs('home-page.*') ? $activeClass : $inactiveClass }}">
+ <i class="fa-solid fa-house"></i>
+ Home Page
+         </a>
+          <a href="{{ route('banners.index') }}" class="flex items-center gap-3 px-3 py-2 rounded-xl text-sm {{ request()->routeIs('banners.*') ? $activeClass : $inactiveClass }}">
+           <i class="fa-solid fa-image"></i>
+           Banners
+ </a>
+ <a href="{{ route('about-page.index') }}" class="flex items-center gap-3 px-3 py-2 rounded-xl text-sm {{ request()->routeIs('about-page.*') ? $activeClass : $inactiveClass }}">
+ <i class="fa-solid fa-circle-info"></i>
+ <i class="fa-solid fa-hand-sparkles"></i>
Removed / Before Commit
- use App\Http\Controllers\Api\HomeController;
- use App\Http\Controllers\Api\FaqController;
- use App\Http\Controllers\Api\ServiceController;
- use App\Http\Controllers\Api\ContactController;
- use App\Http\Controllers\Api\AddressController;
- use App\Http\Controllers\Api\OrderController;
- Route::get('/faqs', [FaqController::class, 'index']);
- Route::get('/home', [HomeController::class, 'index']);
- Route::get('/services', [ServiceController::class, 'index']);
- Route::get('/combo-products', [ComboProductController::class, 'index']);
- Route::get('/combo-products/{slug}', [ComboProductController::class, 'show']);
- Route::post('/contact', [ContactController::class, 'store']);
- Route::post('/subscribe', [ContactController::class, 'subscribe']);
- Route::post('/tax/calculate', [TaxController::class, 'calculate']);
- Route::post('/shipping/calculate', [ShippingController::class, 'calculate']);
- Route::get('/payment-settings', [PaymentSettingController::class, 'index']);
- 
- Route::prefix('customer')->group(function () {
Added / After Commit
+ use App\Http\Controllers\Api\HomeController;
+ use App\Http\Controllers\Api\FaqController;
+ use App\Http\Controllers\Api\ServiceController;
+ use App\Http\Controllers\Api\ServiceDetailController;
+ use App\Http\Controllers\Api\BannerController;
+ use App\Http\Controllers\Api\ContactController;
+ use App\Http\Controllers\Api\AddressController;
+ use App\Http\Controllers\Api\OrderController;
+ Route::get('/faqs', [FaqController::class, 'index']);
+ Route::get('/home', [HomeController::class, 'index']);
+ Route::get('/services', [ServiceController::class, 'index']);
+ Route::get('/service-details', [ServiceDetailController::class, 'index']);
+ Route::get('/service-details/{slug}', [ServiceDetailController::class, 'show']);
+ Route::get('/combo-products', [ComboProductController::class, 'index']);
+ Route::get('/combo-products/{slug}', [ComboProductController::class, 'show']);
+ Route::post('/contact', [ContactController::class, 'store']);
+ Route::post('/subscribe', [ContactController::class, 'subscribe']);
+ Route::post('/tax/calculate', [TaxController::class, 'calculate']);
Removed / Before Commit
- use App\Http\Controllers\AdminContactController;
- use App\Http\Controllers\AdminPincodeController;
- use App\Http\Controllers\AdminServiceController;
- use App\Http\Controllers\AdminCustomerController;
- use App\Http\Controllers\AdminDashboardController;
- use App\Http\Controllers\AdminOrderController;
- use App\Http\Controllers\AdminComboProductController;
- use App\Http\Controllers\AdminCouponController;
- use App\Http\Controllers\AdminPaymentSettingController;
- use Illuminate\Support\Facades\Route;
- 
- Route::get('/', function () {
- Route::get('/service-page', [AdminServiceController::class, 'index'])->name('service-page.index');
- Route::put('/service-page', [AdminServiceController::class, 'update'])->name('service-page.update');
- 
- Route::get('/tax-settings', [AdminTaxSettingController::class, 'index'])->name('tax-settings.index');
- Route::post('/tax-settings', [AdminTaxSettingController::class, 'store'])->name('tax-settings.store');
- Route::put('/tax-settings/{taxSetting}', [AdminTaxSettingController::class, 'update'])->name('tax-settings.update');
Added / After Commit
+ use App\Http\Controllers\AdminContactController;
+ use App\Http\Controllers\AdminPincodeController;
+ use App\Http\Controllers\AdminServiceController;
+ use App\Http\Controllers\AdminServiceDetailController;
+ use App\Http\Controllers\AdminCustomerController;
+ use App\Http\Controllers\AdminDashboardController;
+ use App\Http\Controllers\AdminOrderController;
+ use App\Http\Controllers\AdminComboProductController;
+ use App\Http\Controllers\AdminCouponController;
+ use App\Http\Controllers\AdminPaymentSettingController;
+ use App\Http\Controllers\AdminBannerController;
+ use Illuminate\Support\Facades\Route;
+ 
+ Route::get('/', function () {
+ Route::get('/service-page', [AdminServiceController::class, 'index'])->name('service-page.index');
+ Route::put('/service-page', [AdminServiceController::class, 'update'])->name('service-page.update');
+ 
+     Route::get('/service-details/create', [AdminServiceDetailController::class, 'create'])->name('service-details.create');