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 · 1506f478
This commit introduces multiple API controller improvements including validation enhancements for address input, refined cart item price and attribute handling, and a new OrderController for order creation and retrieval. Validation is done properly but could be expanded. Business value is high due to transactional improvements supporting order placement and cart management. Bug risk is moderate due to reliance on input data for pricing, attribute matching, and order population without extensive error handling or verification. Security is moderate but could be improved by sanitizing user provided addresses and validating inputs more strictly. Overall the work seems genuine and useful with some room for strengthening quality and security.
Quality
?
75%
Security
?
50%
Business Value
?
85%
Maintainability
?
68%
Issues & Suggested Fixes
?
1AI detects the issue
2Shows file, line, or evidence
3Suggests the fix to apply
Non Atomic Order Number Generation With Po...
Where
app/Http/Controllers/Api/OrderController.php:36-38
Issue / Evidence
Non-atomic order number generation with potential for race conditions
Suggested Fix
implement a unique constraint in database and handle collisions instead of looping
Missing Validation
Where
app/Http/Controllers/Api/OrderController.php:18-29
Issue / Evidence
Validation lacks detailed rules for nested billing_address
Suggested Fix
add explicit validation similar to shipping_address to improve data integrity
Potential Null Dereference When Product Is...
Where
app/Http/Controllers/Api/CartController.php:41-44
Issue / Evidence
Potential null dereference when product is not found
Suggested Fix
add null checks and error handling when retrieving product and attribute data to reduce bug risk
Attribute Matching Logic Could Be More Rob...
Where
app/Http/Controllers/Api/CartController.php:192-211
Issue / Evidence
Attribute matching logic could be more robust
Suggested Fix
consider enhancing comparison logic and handling edge cases for type and casing
Missing Validation
Where
app/Http/Controllers/Api/AddressController.php:49-50
Issue / Evidence
Address validation only includes nullable email
Suggested Fix
expand validation for other address fields to enforce consistency
Accessing Product Thumbnail Without Null S...
Where
app/Http/Controllers/Api/OrderController.php:131-132
Issue / Evidence
Accessing product thumbnail without null safety may cause errors
Suggested Fix
add null checks before accessing array indices
Input Fields Like Shipping, Tax, Discount...
Where
app/Http/Controllers/Api/OrderController.php:42-60
Issue / Evidence
Input fields like shipping, tax, discount are taken directly without sanitization or verification
Suggested Fix
add checks or sanitization to avoid data issues or injection
Code Change Preview · app/Http/Controllers/Api/AddressController.php
?
Removed / Before Commit
- use App\Http\Controllers\Controller; - use App\Models\Address; - use Illuminate\Http\Request; - use Illuminate\Http\JsonResponse; - - class AddressController extends Controller - { - $request->validate([ - 'full_name' => ['required', 'string'], - 'phone' => ['required', 'string'], - 'address_line1'=> ['required', 'string'], - 'city' => ['required', 'string'], - 'state' => ['required', 'string'], - } - - $address = Address::create([ - ...$request->only(['full_name','phone','address_line1','address_line2','landmark','city','state','pincode','country','address_type']), - 'customer_id' => $customerId,
Added / After Commit
+ use App\Http\Controllers\Controller; + use App\Models\Address; + use Illuminate\Http\Request; + + class AddressController extends Controller + { + $request->validate([ + 'full_name' => ['required', 'string'], + 'phone' => ['required', 'string'], + 'email' => ['nullable', 'email'], + 'address_line1'=> ['required', 'string'], + 'city' => ['required', 'string'], + 'state' => ['required', 'string'], + } + + $address = Address::create([ + ...$request->only(['full_name','phone','email','address_line1','address_line2','landmark','city','state','pincode','country','address_type']), + 'customer_id' => $customerId,
Removed / Before Commit
- ->where('attribute_name', $request->attribute_name) - ->first(); - - if ($existing) { - $existing->increment('quantity', $quantity); - $item = $existing->fresh('product.variant'); - } else { - $item = CartItem::create([ - 'customer_id' => $customerId, - 'product_id' => $request->product_id, - 'attribute_name' => $request->attribute_name, - 'attribute_value' => $request->attribute_value, - 'quantity' => $quantity, - ]); - $item->load('product.variant'); - } - $customerId = $request->user()->id; -
Added / After Commit
+ ->where('attribute_name', $request->attribute_name) + ->first(); + + // resolve variant_id, sku, price from product attributes + $product = Product::with('variant')->find($request->product_id); + $attrData = $this->findAttribute($product, $request->attribute_name, $request->attribute_value); + $price = (float) ($attrData['selling_price'] ?? 0); + + if ($existing) { + $existing->increment('quantity', $quantity); + $existing->update([ + 'price' => $price, + 'subtotal' => round($price * ($existing->quantity), 2), + 'sku' => $attrData['sku'] ?? $existing->sku, + ]); + $item = $existing->fresh('product.variant'); + } else { + $item = CartItem::create([
Removed / Before Commit
Added / After Commit
+ <?php + + namespace App\Http\Controllers\Api; + + use App\Http\Controllers\Controller; + use App\Models\Order; + use App\Models\CartItem; + use App\Models\Product; + use Illuminate\Http\JsonResponse; + use Illuminate\Http\Request; + use Illuminate\Support\Str; + + class OrderController extends Controller + { + public function store(Request $request): JsonResponse + { + $request->validate([ + 'shipping_address' => ['required', 'array'],
Removed / Before Commit
- class Address extends Model - { - protected $fillable = [ - 'customer_id', 'full_name', 'phone', 'address_line1', 'address_line2', - 'landmark', 'city', 'state', 'pincode', 'country', 'address_type', 'is_default', - ];
Added / After Commit
+ class Address extends Model + { + protected $fillable = [ + 'customer_id', 'full_name', 'phone', 'email', 'address_line1', 'address_line2', + 'landmark', 'city', 'state', 'pincode', 'country', 'address_type', 'is_default', + ];
Removed / Before Commit
- protected $fillable = [ - 'customer_id', - 'product_id', - 'attribute_name', - 'attribute_value', - 'quantity', - ]; - - public function product(): BelongsTo - { - return $this->belongsTo(Product::class); - } - }
Added / After Commit
+ protected $fillable = [ + 'customer_id', + 'product_id', + 'variant_id', + 'attribute_name', + 'attribute_value', + 'sku', + 'price', + 'quantity', + 'subtotal', + ]; + + public function product(): BelongsTo + { + return $this->belongsTo(Product::class); + } + + public function variant(): BelongsTo
Removed / Before Commit
Added / After Commit
+ <?php + + namespace App\Models; + + use Illuminate\Database\Eloquent\Model; + use Illuminate\Database\Eloquent\Relations\HasMany; + use Illuminate\Database\Eloquent\Relations\BelongsTo; + + class Order extends Model + { + protected $fillable = [ + 'order_number', + 'customer_id', + 'shipping_address_id', + 'billing_address_id', + 'shipping_address_json', + 'billing_address_json', + 'shipping_email',
Removed / Before Commit
Added / After Commit
+ <?php + + namespace App\Models; + + use Illuminate\Database\Eloquent\Model; + use Illuminate\Database\Eloquent\Relations\BelongsTo; + + class OrderItem extends Model + { + protected $fillable = [ + 'order_id', + 'product_id', + 'variant_id', + 'product_name', + 'variant_name', + 'attribute_name', + 'attribute_value', + 'sku',
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('addresses', function (Blueprint $table) { + $table->string('email')->nullable()->after('phone'); + }); + } + + public function down(): void + { + Schema::table('addresses', function (Blueprint $table) {
Removed / Before Commit
- \ No newline at end of file
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('cart_items', function (Blueprint $table) { + + $table->unsignedBigInteger('variant_id') + ->nullable() + ->after('product_id'); + + $table->string('sku') + ->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::create('orders', function (Blueprint $table) { + $table->id(); + $table->string('order_number')->unique(); + $table->foreignId('customer_id')->constrained('customers')->onDelete('cascade'); +
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('order_items', function (Blueprint $table) { + $table->id(); + $table->foreignId('order_id')->constrained('orders')->onDelete('cascade'); + + $table->unsignedBigInteger('product_id')->nullable();
Removed / Before Commit
- use App\Http\Controllers\Api\ServiceController; - use App\Http\Controllers\Api\ContactController; - use App\Http\Controllers\Api\AddressController; - - Route::post('/register', [AuthController::class, 'apiRegister'])->name('api.register'); - Route::post('/login', [AuthController::class, 'apiLogin'])->name('api.login'); - Route::delete('/addresses/{id}', [AddressController::class, 'destroy']); - Route::patch('/addresses/{id}/default', [AddressController::class, 'setDefault']); - - Route::get('/cart', [CartController::class, 'index']); - Route::post('/cart/add', [CartController::class, 'add']); - Route::post('/cart/merge', [CartController::class, 'merge']);
Added / After Commit
+ 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::post('/register', [AuthController::class, 'apiRegister'])->name('api.register'); + Route::post('/login', [AuthController::class, 'apiLogin'])->name('api.login'); + Route::delete('/addresses/{id}', [AddressController::class, 'destroy']); + Route::patch('/addresses/{id}/default', [AddressController::class, 'setDefault']); + + Route::post('/order', [OrderController::class, 'store']); + Route::get('/orders', [OrderController::class, 'index']); + Route::get('/orders/{id}', [OrderController::class, 'show']); + + Route::get('/cart', [CartController::class, 'index']); + Route::post('/cart/add', [CartController::class, 'add']); + Route::post('/cart/merge', [CartController::class, 'merge']);