AI Review Center
Commit Review Workspace ?
Select a commit on the left to inspect quality, security, business value, findings, and suggested code changes.
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');