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

Review Result ?

jattin01/avriti-backend · 6ed22edd
The commit adds backend support for importing products and service details from Excel files, including sample file downloads and input validation. It processes Excel shared strings properly and converts specific fields to HTML. While the functionality added is useful and structured, the code could be improved with better input validation, clearer error handling, and added security considerations (e.g., file type verification and error conditions). The commit message is vague and does not fully describe the changes, reducing fake work confidence.
Quality ?
75%
Security ?
50%
Business Value ?
80%
Maintainability ?
78%
Issues & Suggested Fixes ?
1AI detects the issue
2Shows file, line, or evidence
3Suggests the fix to apply
Too Vague
Where commit message
Issue / Evidence too vague
Suggested Fix provide a detailed summary of changes to improve business value and fake work confidence
Missing Type Import Statement For Binaryfi...
Where app/Http/Controllers/AdminProductController.php:87
Issue / Evidence missing type import statement for BinaryFileResponse
Suggested Fix add explicit use statement for better readability and maintainability
File Existence Check Using Abort Unless La...
Where app/Http/Controllers/AdminProductController.php:90
Issue / Evidence file existence check using abort_unless lacks detailed error message
Suggested Fix improve error handling for clarity
Html Tag Check Only Considers A Limited Se...
Where app/Http/Controllers/AdminProductController.php:470
Issue / Evidence HTML tag check only considers a limited set of tags
Suggested Fix extend regex or use HTML parsing to avoid false negatives
Bullet List Detection Is Simplistic
Where app/Http/Controllers/AdminProductController.php:479
Issue / Evidence bullet list detection is simplistic
Suggested Fix validate more bullet types or formatting
Missing Validation
Where app/Http/Controllers/AdminServiceDetailController.php:147
Issue / Evidence file validation uses MIME types XLSX and XLS; consider verifying file content to avoid spoofing
Suggested Fix Review and simplify this section.
Zip Open Failure Returns Generic Error
Where app/Http/Controllers/AdminServiceDetailController.php:153
Issue / Evidence zip open failure returns generic error
Suggested Fix log detailed error for debugging
Duplicate Logic
Where app/Http/Controllers/AdminServiceDetailController.php:223
Issue / Evidence duplicate check uses DB query per row
Suggested Fix consider batch lookup for performance
Error Response Code 422 Used
Where app/Http/Controllers/AdminServiceDetailController.php:161
Issue / Evidence error response code 422 used
Suggested Fix ensure consistency with API standards
Simplexml Load String Could Throw Warnings...
Where app/Http/Controllers/AdminServiceDetailController.php:174
Issue / Evidence simplexml_load_string could throw warnings/errors on invalid XML
Suggested Fix add error handling
Code Change Preview · .gitignore ?
Removed / Before Commit
- /.claude
- /avrithi.xlsx
- /AVRITI_PROJECT_PROMPT.md
- /Product Excel Common.xlsx
- \ No newline at end of file
Added / After Commit
+ /.claude
+ /avrithi.xlsx
+ /AVRITI_PROJECT_PROMPT.md
+ \ No newline at end of file
+ /Product Excel Common.xlsx
+ /Product Excel test only.xlsx
+ /Avriti_Ratna_Updated.xlsx
+ /Service Detail test.xlsx
Removed / Before Commit
- ->with('success', 'Product updated successfully.');
- }
- 
- public function import(Request $request): \Illuminate\Http\JsonResponse
- {
- $request->validate([
- 'file' => ['required', 'file', 'mimes:xlsx,xls', 'max:10240'],
- ], [], ['file' => 'Excel file']);
- 
- $file = $request->file('file');
- $filePath = $file->getPathname();
- 
- return response()->json(['success' => false, 'message' => 'Excel sheet data not found.'], 422);
- }
- 
-         // Parse shared strings
- $strings = [];
- if ($sharedXml) {
Added / After Commit
+ ->with('success', 'Product updated successfully.');
+ }
+ 
+     /** Download the sample Excel template for product import. */
+     public function sampleExcel(): \Symfony\Component\HttpFoundation\BinaryFileResponse
+     {
+         $path = storage_path('app/samples/product-sample.xlsx');
+         abort_unless(file_exists($path), 404);
+ 
+         return response()->download($path, 'Product Sample.xlsx');
+     }
+ 
+ public function import(Request $request): \Illuminate\Http\JsonResponse
+ {
+ $request->validate([
+ 'file' => ['required', 'file', 'mimes:xlsx,xls', 'max:10240'],
+ ], [], ['file' => 'Excel file']);
+ 
Removed / Before Commit
- return redirect()->route('service-page.index')->with('success', 'Service detail deleted successfully.');
- }
- 
- private function parseOtherDetails(Request $request): array
- {
- $otherDetails = [];
Added / After Commit
+ return redirect()->route('service-page.index')->with('success', 'Service detail deleted successfully.');
+ }
+ 
+     /** Download the sample Excel template for service-detail import. */
+     public function sampleExcel(): \Symfony\Component\HttpFoundation\BinaryFileResponse
+     {
+         $path = storage_path('app/samples/service-detail-sample.xlsx');
+         abort_unless(File::exists($path), 404);
+ 
+         return response()->download($path, 'Service Detail Sample.xlsx');
+     }
+ 
+     /**
+      * Import service details from an Excel (.xlsx) file.
+      * Known columns → direct fields; every other column → an other_details section.
+      */
+     public function import(Request $request): \Illuminate\Http\JsonResponse
+     {
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->text('closing_tagline')->nullable()->change();
+         });
+     }
+ 
+     public function down(): void
+     {
+         Schema::table('products', function (Blueprint $table) {
Removed / Before Commit
- $formInstanceId = $product?->id ?? 'new';
- @endphp
- 
-   <div class="lg:col-span-3  py-5 ">
- <label class=" block text-sm font-semibold text-gray-700 mb-2">Short Description</label>
- <div id="editor-short_description-{{ $formInstanceId }}" class="rounded-2xl border border-gray-300 bg-white" style="min-height:90px" data-quill-editor data-max-length="300"></div>
- <textarea name="short_description" id="input-short_description-{{ $formInstanceId }}" class="hidden" data-quill-input>{{ old('short_description', $product?->short_description) }}</textarea>
- @enderror
- </div>
- 
-   <div class="lg:col-span-3 py-6 mt-5">
- <label class=" block text-sm font-semibold text-gray-700 mb-2">Description</label>
- <div id="editor-description-{{ $formInstanceId }}" class="rounded-2xl border border-gray-300 bg-white" style="min-height:130px" data-quill-editor></div>
- <textarea name="description" id="input-description-{{ $formInstanceId }}" class="hidden" data-quill-input>{{ old('description', $product?->description) }}</textarea>
- @enderror
- </div>
- 
-   <div class="lg:col-span-3 rounded-[24px] border border-gray-200 bg-white py-8 mt-8">
Added / After Commit
+ $formInstanceId = $product?->id ?? 'new';
+ @endphp
+ 
+   <div class="lg:col-span-3">
+ <label class=" block text-sm font-semibold text-gray-700 mb-2">Short Description</label>
+ <div id="editor-short_description-{{ $formInstanceId }}" class="rounded-2xl border border-gray-300 bg-white" style="min-height:90px" data-quill-editor data-max-length="300"></div>
+ <textarea name="short_description" id="input-short_description-{{ $formInstanceId }}" class="hidden" data-quill-input>{{ old('short_description', $product?->short_description) }}</textarea>
+ @enderror
+ </div>
+ 
+   <div class="lg:col-span-3 mt-[90px] mb-[70px]">
+ <label class=" block text-sm font-semibold text-gray-700 mb-2">Description</label>
+ <div id="editor-description-{{ $formInstanceId }}" class="rounded-2xl border border-gray-300 bg-white" style="min-height:130px" data-quill-editor></div>
+ <textarea name="description" id="input-description-{{ $formInstanceId }}" class="hidden" data-quill-input>{{ old('description', $product?->description) }}</textarea>
+ @enderror
+ </div>
+ 
+   <!-- <div class="lg:col-span-3 rounded-[24px] border border-gray-200 bg-white py-8 mt-8">
Removed / Before Commit
- <h1 class="text-2xl font-semibold text-[#0b3dba]">Products</h1>
- </div>
- <div class="flex items-center gap-3">
- <button type="button" id="importExcelBtn" class="inline-flex h-11 items-center justify-center gap-2 rounded-md border border-[#0b3dba] bg-white px-5 text-sm font-semibold text-[#0b3dba] shadow-sm transition hover:bg-[#eef4ff]">
- <i class="fa-solid fa-file-excel"></i>
- Import Excel
- </div>
- <div class="flex items-center justify-end gap-3 border-t border-gray-100 px-6 py-4">
- <button type="button" id="cancelImportBtn" class="rounded-lg border border-gray-200 px-5 py-2 text-sm font-medium text-gray-600 hover:bg-gray-50 transition">Cancel</button>
-       <button type="button" id="doImportBtn" class="inline-flex items-center gap-2 rounded-lg bg-[#0b3dba] px-5 py-2 text-sm font-semibold text-white hover:bg-blue-600 transition disabled:opacity-50" disabled>
- <i class="fa-solid fa-upload"></i>
- Import Now
- </button>
- 
- const addSelectedThumbnail = (preview, file) => {
- const imageUrl = URL.createObjectURL(file);
- const image = document.createElement('img');
- image.src = imageUrl;
Added / After Commit
+ <h1 class="text-2xl font-semibold text-[#0b3dba]">Products</h1>
+ </div>
+ <div class="flex items-center gap-3">
+     <a href="{{ route('products.sample') }}"
+       class="group inline-flex h-11 items-center justify-center gap-2 rounded-md border border-emerald-200 bg-emerald-50 px-5 text-sm font-semibold text-emerald-700 shadow-sm transition hover:border-emerald-300 hover:bg-emerald-100">
+       <i class="fa-solid fa-file-excel text-emerald-600"></i>
+       Download Sample Excel
+       <i class="fa-solid fa-download text-xs opacity-70 transition group-hover:translate-y-0.5"></i>
+     </a>
+ <button type="button" id="importExcelBtn" class="inline-flex h-11 items-center justify-center gap-2 rounded-md border border-[#0b3dba] bg-white px-5 text-sm font-semibold text-[#0b3dba] shadow-sm transition hover:bg-[#eef4ff]">
+ <i class="fa-solid fa-file-excel"></i>
+ Import Excel
+ </div>
+ <div class="flex items-center justify-end gap-3 border-t border-gray-100 px-6 py-4">
+ <button type="button" id="cancelImportBtn" class="rounded-lg border border-gray-200 px-5 py-2 text-sm font-medium text-gray-600 hover:bg-gray-50 transition">Cancel</button>
+       <button type="button" id="validateImportBtn" class="inline-flex items-center gap-2 rounded-lg border border-[#0b3dba] bg-white px-5 py-2 text-sm font-semibold text-[#0b3dba] hover:bg-[#eef4ff] transition disabled:opacity-50" disabled>
+         <i class="fa-solid fa-magnifying-glass"></i>
+         Validate
Removed / Before Commit
- </div>
- <span class="ml-2 rounded-2xl bg-[#eef4ff] px-3 py-1 text-sm font-semibold text-[#1a41b1]">{{ $serviceDetails->count() }} {{ $serviceDetails->count() === 1 ? 'Service' : 'Services' }}</span>
- </div>
-     <a href="{{ route('service-details.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 Service Detail
-     </a>
- </div>
- 
- <div class="overflow-x-auto px-4">
- previewDiv.classList.remove('hidden');
- });
- });
- </script>
- @endpush
Added / After Commit
+ </div>
+ <span class="ml-2 rounded-2xl bg-[#eef4ff] px-3 py-1 text-sm font-semibold text-[#1a41b1]">{{ $serviceDetails->count() }} {{ $serviceDetails->count() === 1 ? 'Service' : 'Services' }}</span>
+ </div>
+     <div class="flex items-center gap-3">
+       <a href="{{ route('service-details.sample') }}"
+         class="group inline-flex h-11 items-center justify-center gap-2 rounded-md border border-emerald-200 bg-emerald-50 px-5 text-sm font-semibold text-emerald-700 shadow-sm transition hover:border-emerald-300 hover:bg-emerald-100">
+         <i class="fa-solid fa-file-excel text-emerald-600"></i>
+         Download Sample Excel
+         <i class="fa-solid fa-download text-xs opacity-70 transition group-hover:translate-y-0.5"></i>
+       </a>
+       <button type="button" id="importServiceBtn"
+         class="inline-flex h-11 items-center justify-center gap-2 rounded-md border border-[#0b3dba] bg-white px-5 text-sm font-semibold text-[#0b3dba] shadow-sm transition hover:bg-[#eef4ff]">
+         <i class="fa-solid fa-file-import"></i>
+         Import Excel
+       </button>
+       <a href="{{ route('service-details.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>
Removed / Before Commit
- Route::delete('/product-types/{productType}', [AdminProductTypeController::class, 'destroy'])->name('product-types.destroy');
- Route::get('/products', [AdminProductController::class, 'index'])->name('products.index');
- Route::post('/products', [AdminProductController::class, 'store'])->name('products.store');
- Route::post('/products/import', [AdminProductController::class, 'import'])->name('products.import');
- Route::put('/products/{product}', [AdminProductController::class, 'update'])->name('products.update');
- Route::delete('/products/{product}', [AdminProductController::class, 'destroy'])->name('products.destroy');
- Route::put('/service-page', [AdminServiceController::class, 'update'])->name('service-page.update');
- 
- Route::get('/service-details/create', [AdminServiceDetailController::class, 'create'])->name('service-details.create');
- Route::post('/service-details', [AdminServiceDetailController::class, 'store'])->name('service-details.store');
- Route::get('/service-details/{serviceDetail}/edit', [AdminServiceDetailController::class, 'edit'])->name('service-details.edit');
- Route::put('/service-details/{serviceDetail}', [AdminServiceDetailController::class, 'update'])->name('service-details.update');
Added / After Commit
+ Route::delete('/product-types/{productType}', [AdminProductTypeController::class, 'destroy'])->name('product-types.destroy');
+ Route::get('/products', [AdminProductController::class, 'index'])->name('products.index');
+ Route::post('/products', [AdminProductController::class, 'store'])->name('products.store');
+     Route::get('/products/sample', [AdminProductController::class, 'sampleExcel'])->name('products.sample');
+ Route::post('/products/import', [AdminProductController::class, 'import'])->name('products.import');
+ Route::put('/products/{product}', [AdminProductController::class, 'update'])->name('products.update');
+ Route::delete('/products/{product}', [AdminProductController::class, 'destroy'])->name('products.destroy');
+ Route::put('/service-page', [AdminServiceController::class, 'update'])->name('service-page.update');
+ 
+ Route::get('/service-details/create', [AdminServiceDetailController::class, 'create'])->name('service-details.create');
+     Route::get('/service-details/sample', [AdminServiceDetailController::class, 'sampleExcel'])->name('service-details.sample');
+     Route::post('/service-details/import', [AdminServiceDetailController::class, 'import'])->name('service-details.import');
+ Route::post('/service-details', [AdminServiceDetailController::class, 'store'])->name('service-details.store');
+ Route::get('/service-details/{serviceDetail}/edit', [AdminServiceDetailController::class, 'edit'])->name('service-details.edit');
+ Route::put('/service-details/{serviceDetail}', [AdminServiceDetailController::class, 'update'])->name('service-details.update');