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 · 64dd5e71
This commit adds a comprehensive blog management system including backend CRUD operations and API endpoints. It improves business capabilities by enabling blog creation, editing, listing, and deletion. The code includes validation, slug uniqueness, and read time calculations. The API provides filtered active blogs with metadata. While generally good, some security and quality improvements are possible.
Quality
?
80%
Security
?
70%
Business Value
?
85%
Maintainability
?
80%
Issues & Suggested Fixes
?
1AI detects the issue
2Shows file, line, or evidence
3Suggests the fix to apply
Missing Validation
Where
app/Http/Controllers/AdminBlogController.php:92
Issue / Evidence
image validation rule is different between creating and updating blogs. It can lead to inconsistent validation
Suggested Fix
unify validation rules or clarify the intent
Missing Validation
Where
app/Http/Controllers/AdminBlogController.php:38
Issue / Evidence
image file upload lacks validation for file type and size directly in controller
Suggested Fix
ensure server side validation is complete to improve security
Casting 'Is Active' From Input Without Str...
Where
app/Http/Controllers/AdminBlogController.php:54
Issue / Evidence
casting 'is_active' from input without strict checks may cause unintended values
Suggested Fix
validate input more strictly
Asset() Usage Without Sanitization May Lea...
Where
app/Http/Controllers/Api/BlogController.php:53
Issue / Evidence
asset() usage without sanitization may lead to URL injection issues
Suggested Fix
ensure image paths are sanitized
Duplicate Logic
Where
app/Http/Controllers/Api/BlogController.php:39-43
Issue / Evidence
eager loading of categories and tags with repeated collection transformations can be optimized for performance
Suggested Fix
Review and simplify this section.
Vague And Incomplete
Where
commit message
Issue / Evidence
vague and incomplete
Suggested Fix
provide detailed description of blog backend features and product import data fix for clarity and traceability
Code Change Preview · .gitignore
?
Removed / Before Commit
- avrithi.xlsx - /.claude - /avrithi.xlsx - /AVRITI_PROJECT_PROMPT.md - \ No newline at end of file - \ No newline at end of file
Added / After Commit
+ avrithi.xlsx + /.claude + /avrithi.xlsx + \ No newline at end of file + /AVRITI_PROJECT_PROMPT.md + /Product Excel Common.xlsx + \ No newline at end of file
Removed / Before Commit
Added / After Commit
+ <?php + + namespace App\Http\Controllers; + + use App\Models\Blog; + use Illuminate\Http\Request; + use Illuminate\Support\Str; + + class AdminBlogController extends Controller + { + public function index() + { + $blogs = Blog::orderByDesc('id')->get(); + return view('admin.blogs', compact('blogs')); + } + + public function create() + {
Removed / Before Commit
- 'short_description' => $get('Short Description') ?: null, - 'about' => $get('About This Product') ?: null, - 'one_line_meaning' => $get('One-Line Meaning') ?: null, - 'description' => $get('Description (HTML — Website Ready)') ?: null, - 'chakra_alignment' => $get('Chakra Alignment') ?: null, - 'zodiac_affinity' => $get('Zodiac Affinity') ?: null, - 'product_details' => $get('Product Details') ?: null, - 'country_of_origin' => $get('Country of Origin') ?: null, - 'storage_instructions' => $get('Storage Instructions') ?: null, - 'cleansing' => $get('Cleansing') ?: null, - 'charging' => $get('Charging') ?: null, - 'wearing' => $get('Wearing') ?: null, - 'daily_use' => $get('Daily Use') ?: null,
Added / After Commit
+ 'short_description' => $get('Short Description') ?: null, + 'about' => $get('About This Product') ?: null, + 'one_line_meaning' => $get('One-Line Meaning') ?: null, + 'description' => $get('Description') ?: null, + 'chakra_alignment' => $get('Chakra Alignment') ?: null, + 'zodiac_affinity' => $get('Zodiac Affinity') ?: null, + 'product_details' => $get('Product Details') ?: null, + 'country_of_origin' => $get('Country of Origin') ?: null, + 'storage_instructions' => $get('Storage Instructions') ?: null, + 'cleansing' => $get('Cleansing') ?: null, + 'caring_for_crystal' => $get('Caring for Your Crystal') ?: null, + 'charging' => $get('Charging') ?: null, + 'wearing' => $get('Wearing') ?: null, + 'daily_use' => $get('Daily Use') ?: null,
Removed / Before Commit
Added / After Commit
+ <?php + + namespace App\Http\Controllers\Api; + + use App\Http\Controllers\Controller; + use App\Models\Blog; + + class BlogController extends Controller + { + public function index() + { + $blogs = Blog::where('is_active', true) + ->orderByDesc('created_at') + ->get() + ->map(fn ($b) => $this->card($b)) + ->values(); + + return response()->json(['success' => true, 'data' => $blogs]);
Removed / Before Commit
Added / After Commit
+ <?php + + namespace App\Models; + + use Illuminate\Database\Eloquent\Model; + + class Blog extends Model + { + protected $fillable = [ + 'title', + 'slug', + 'excerpt', + 'image', + 'category', + 'tags', + 'author', + 'content', + 'read_time',
Removed / Before Commit
- 'product_details', - 'closing_tagline', - 'cleansing', - 'charging', - 'wearing', - 'daily_use',
Added / After Commit
+ 'product_details', + 'closing_tagline', + 'cleansing', + 'caring_for_crystal', + 'charging', + 'wearing', + 'daily_use',
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::create('blogs', function (Blueprint $table) { + $table->id(); + $table->string('title'); + $table->string('slug')->unique(); + $table->text('excerpt')->nullable(); + $table->string('image')->nullable(); + $table->string('category')->nullable(); + $table->json('tags')->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 + { + public function up(): void + { + Schema::table('products', function (Blueprint $table) { + $table->longText('caring_for_crystal')->nullable()->after('cleansing'); + }); + } + + public function down(): void + { + Schema::table('products', function (Blueprint $table) {
Removed / Before 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>
Added / After Commit
+ @extends('layouts.app') + + @section('title', 'Special Offers | 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]">Special Offers</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 Special Offer + </button> + @endif + </div>
Removed / Before Commit
Added / After Commit
+ @extends('layouts.app') + + @section('title', isset($blog) ? 'Edit Blog | Avriti Dashboard' : 'Add Blog | Avriti Dashboard') + + @push('styles') + <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/jodit@4.2.27/es2021/jodit.min.css" /> + <style> + .jodit-container { border-radius: 1rem !important; } + /* hide native datalist dropdown arrow on category input */ + input[list]::-webkit-calendar-picker-indicator { display: none !important; opacity: 0; } + input[list] { appearance: none; } + /* show list bullets / numbers inside the Jodit editor */ + .jodit-wysiwyg ul { list-style: disc !important; padding-left: 24px !important; } + .jodit-wysiwyg ol { list-style: decimal !important; padding-left: 24px !important; } + .jodit-wysiwyg li { display: list-item !important; } + .jodit-wysiwyg h1 { font-size: 30px; font-weight: 700; } + .jodit-wysiwyg h2 { font-size: 26px; font-weight: 700; } + .jodit-wysiwyg h3 { font-size: 22px; font-weight: 600; }
Removed / Before Commit
Added / After Commit
+ @extends('layouts.app') + + @section('title', 'Blogs | 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]">Blogs</h1> + </div> + <a href="{{ route('blogs.create') }}" + 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 Blog + </a> + </div> + + @if(session('success'))
Removed / Before 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> - <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>
Added / After Commit
+ </div> + + {{-- CMS Group --}} + @php $cmsOpen = request()->routeIs('home-page.*', 'about-page.*', 'faq.*', 'service-page.*', 'banners.*', 'blogs.*'); @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> + <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> + Special Offers + </a> + <a href="{{ route('blogs.index') }}" class="flex items-center gap-3 px-3 py-2 rounded-xl text-sm {{ request()->routeIs('blogs.*') ? $activeClass : $inactiveClass }}"> + <i class="fa-solid fa-newspaper"></i> + Blogs + </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>
Removed / Before Commit
- 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::post('/shipping/calculate', [ShippingController::class, 'calculate']); - Route::get('/payment-settings', [PaymentSettingController::class, 'index']); - Route::get('/banners', [BannerController::class, 'index']); - - Route::prefix('customer')->group(function () { - Route::post('/register', [CustomerAuthController::class, 'register']);
Added / After Commit
+ use App\Http\Controllers\Api\ServiceController; + use App\Http\Controllers\Api\ServiceDetailController; + use App\Http\Controllers\Api\BannerController; + use App\Http\Controllers\Api\BlogController; + use App\Http\Controllers\Api\ContactController; + use App\Http\Controllers\Api\AddressController; + use App\Http\Controllers\Api\OrderController; + Route::post('/shipping/calculate', [ShippingController::class, 'calculate']); + Route::get('/payment-settings', [PaymentSettingController::class, 'index']); + Route::get('/banners', [BannerController::class, 'index']); + Route::get('/blogs', [BlogController::class, 'index']); + Route::get('/blogs/{slug}', [BlogController::class, 'show']); + + Route::prefix('customer')->group(function () { + Route::post('/register', [CustomerAuthController::class, 'register']);
Removed / Before Commit
- use App\Http\Controllers\AdminCouponController; - use App\Http\Controllers\AdminPaymentSettingController; - use App\Http\Controllers\AdminBannerController; - use Illuminate\Support\Facades\Route; - - Route::get('/', function () { - Route::put('/banners/{banner}', [AdminBannerController::class, 'update'])->name('banners.update'); - Route::delete('/banners/{banner}', [AdminBannerController::class, 'destroy'])->name('banners.destroy'); - - Route::post('/logout', [AuthController::class, 'logout'])->name('logout'); - });
Added / After Commit
+ use App\Http\Controllers\AdminCouponController; + use App\Http\Controllers\AdminPaymentSettingController; + use App\Http\Controllers\AdminBannerController; + use App\Http\Controllers\AdminBlogController; + use Illuminate\Support\Facades\Route; + + Route::get('/', function () { + Route::put('/banners/{banner}', [AdminBannerController::class, 'update'])->name('banners.update'); + Route::delete('/banners/{banner}', [AdminBannerController::class, 'destroy'])->name('banners.destroy'); + + Route::get('/blogs', [AdminBlogController::class, 'index'])->name('blogs.index'); + Route::get('/blogs/create', [AdminBlogController::class, 'create'])->name('blogs.create'); + Route::post('/blogs', [AdminBlogController::class, 'store'])->name('blogs.store'); + Route::get('/blogs/{blog}/edit', [AdminBlogController::class, 'edit'])->name('blogs.edit'); + Route::put('/blogs/{blog}', [AdminBlogController::class, 'update'])->name('blogs.update'); + Route::delete('/blogs/{blog}', [AdminBlogController::class, 'destroy'])->name('blogs.destroy'); + + Route::post('/logout', [AuthController::class, 'logout'])->name('logout');