Prune the upstream Mini/QR mobile subsystem from POS
Deploy Ladill POS / deploy (push) Successful in 33s

POS was forked from Ladill Mini and carried Mini's entire mobile/QR
subsystem (API, QR codes, wallet, payments, push, Afia) which polluted the
ladill_pos schema with 8 unused tables and left ~half the test suite red.

Remove the dead subsystem: Api/Mini/Qr/Public/Search/WellKnown controllers,
Mini/Qr/Afia/Notifications services, the 8 unused models, QrCodePolicy,
Support/Qr + Support/Events, the two mini: scheduled commands, the Mini/QR
view trees, and their (failing) tests. Empty routes/api.php (POS is web-only)
and strip dead schedules from routes/console.php.

Keep QrTeamMember — it is the platform team-membership model that POS's
SetActingAccount middleware and SSO login depend on for multi-account access.
Also keep notifications + personal_access_tokens (used by POS).

Drops 7 migrations (qr product/settings, mini_payments, push tokens); the 8
orphan tables are dropped from the live ladill_pos DB separately. Test suite
is green (8 passed) and all routes resolve.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
isaacclad
2026-06-24 00:08:16 +00:00
co-authored by Claude Opus 4.8
parent 57862acb47
commit 46b5091b1e
119 changed files with 3 additions and 15877 deletions
+2 -74
View File
@@ -1,76 +1,4 @@
<?php
use App\Http\Controllers\Api\AuthController;
use App\Http\Controllers\Api\MeController;
use App\Http\Controllers\Api\Mini\AccountController as MiniAccountController;
use App\Http\Controllers\Api\Mini\AfiaController as MiniAfiaController;
use App\Http\Controllers\Api\Mini\NotificationController as MiniNotificationController;
use App\Http\Controllers\Api\Mini\OverviewController as MiniOverviewController;
use App\Http\Controllers\Api\Mini\PushTokenController as MiniPushTokenController;
use App\Http\Controllers\Api\Mini\PaymentQrController as MiniPaymentQrController;
use App\Http\Controllers\Api\Mini\PaymentsController as MiniPaymentsController;
use App\Http\Controllers\Api\Mini\PayoutsController as MiniPayoutsController;
use App\Http\Controllers\Api\Mini\SupportController as MiniSupportController;
use App\Http\Controllers\Api\Mini\WalletController as MiniWalletController;
use App\Http\Controllers\Api\QrCodeController;
use Illuminate\Support\Facades\Route;
Route::prefix('v1')->group(function () {
// Mobile token auth (Ladill Mini Android). Public — proxies to the central
// Ladill identity API and issues a Sanctum token.
Route::post('/auth/login', [AuthController::class, 'login'])->middleware('throttle:10,1')->name('api.auth.login');
Route::post('/auth/register', [AuthController::class, 'register'])->middleware('throttle:10,1')->name('api.auth.register');
Route::middleware(['auth:sanctum', \App\Http\Middleware\SetActingAccount::class])->group(function () {
Route::post('/auth/logout', [AuthController::class, 'logout'])->name('api.auth.logout');
Route::get('/me', MeController::class);
Route::get('/qr-codes', [QrCodeController::class, 'index']);
Route::post('/qr-codes', [QrCodeController::class, 'store']);
Route::get('/qr-codes/{qrCode}', [QrCodeController::class, 'show'])->whereNumber('qrCode');
Route::patch('/qr-codes/{qrCode}', [QrCodeController::class, 'update'])->whereNumber('qrCode');
Route::get('/qr-codes/{qrCode}/analytics', [QrCodeController::class, 'analytics'])->whereNumber('qrCode');
// Ladill Mini — payments product.
Route::get('/mini/overview', MiniOverviewController::class)->name('api.mini.overview');
Route::get('/mini/notifications', [MiniNotificationController::class, 'index'])->name('api.mini.notifications.index');
Route::get('/mini/notifications/unread-count', [MiniNotificationController::class, 'unreadCount'])->name('api.mini.notifications.unread-count');
Route::post('/mini/notifications/{id}/read', [MiniNotificationController::class, 'markAsRead'])->name('api.mini.notifications.read');
Route::post('/mini/notifications/mark-all-read', [MiniNotificationController::class, 'markAllAsRead'])->name('api.mini.notifications.mark-all-read');
Route::post('/mini/push-token', [MiniPushTokenController::class, 'store'])->name('api.mini.push-token.store');
Route::delete('/mini/push-token', [MiniPushTokenController::class, 'destroy'])->name('api.mini.push-token.destroy');
Route::post('/mini/afia/chat', [MiniAfiaController::class, 'chat'])->middleware('throttle:30,1')->name('api.mini.afia.chat');
Route::get('/mini/payment-qrs', [MiniPaymentQrController::class, 'index'])->name('api.mini.payment-qrs.index');
Route::post('/mini/payment-qrs', [MiniPaymentQrController::class, 'store'])->name('api.mini.payment-qrs.store');
Route::get('/mini/payment-qrs/{paymentQr}', [MiniPaymentQrController::class, 'show'])->whereNumber('paymentQr')->name('api.mini.payment-qrs.show');
Route::patch('/mini/payment-qrs/{paymentQr}', [MiniPaymentQrController::class, 'update'])->whereNumber('paymentQr')->name('api.mini.payment-qrs.update');
Route::delete('/mini/payment-qrs/{paymentQr}', [MiniPaymentQrController::class, 'destroy'])->whereNumber('paymentQr')->name('api.mini.payment-qrs.destroy');
Route::get('/mini/payment-qrs/{paymentQr}/preview.png', [MiniPaymentQrController::class, 'preview'])->whereNumber('paymentQr')->name('api.mini.payment-qrs.preview');
Route::get('/mini/payments', [MiniPaymentsController::class, 'index'])->name('api.mini.payments.index');
Route::get('/mini/payouts', MiniPayoutsController::class)->name('api.mini.payouts');
// Account self-service (Settings, Wallet, Support) — keeps Mini usable
// entirely in-app without the website.
Route::get('/mini/account/settings', [MiniAccountController::class, 'settings'])->name('api.mini.account.settings');
Route::put('/mini/account/settings', [MiniAccountController::class, 'updateSettings'])->name('api.mini.account.settings.update');
Route::put('/mini/account/profile', [MiniAccountController::class, 'updateProfile'])->name('api.mini.account.profile');
Route::post('/mini/account/avatar', [MiniAccountController::class, 'uploadAvatar'])->name('api.mini.account.avatar');
Route::post('/mini/account/change-password', [MiniAccountController::class, 'changePassword'])->name('api.mini.account.change-password');
Route::get('/mini/wallet', [MiniWalletController::class, 'show'])->name('api.mini.wallet');
Route::post('/mini/wallet/topup', [MiniWalletController::class, 'topup'])->name('api.mini.wallet.topup');
Route::get('/mini/wallet/banks', [MiniWalletController::class, 'banks'])->name('api.mini.wallet.banks');
Route::get('/mini/wallet/payout-account', [MiniWalletController::class, 'payoutAccount'])->name('api.mini.wallet.payout-account');
Route::put('/mini/wallet/payout-account', [MiniWalletController::class, 'updatePayoutAccount'])->name('api.mini.wallet.payout-account.update');
Route::get('/mini/wallet/withdrawals', [MiniWalletController::class, 'withdrawals'])->name('api.mini.wallet.withdrawals');
Route::post('/mini/wallet/withdraw', [MiniWalletController::class, 'withdraw'])->name('api.mini.wallet.withdraw');
Route::match(['put', 'post'], '/mini/wallet/auto-withdraw', [MiniWalletController::class, 'updateAutoWithdraw'])->name('api.mini.wallet.auto-withdraw');
Route::get('/mini/support/tickets', [MiniSupportController::class, 'tickets'])->name('api.mini.support.tickets');
Route::post('/mini/support/tickets', [MiniSupportController::class, 'store'])->name('api.mini.support.tickets.store');
Route::get('/mini/support/tickets/{ticket}', [MiniSupportController::class, 'ticket'])->whereNumber('ticket')->name('api.mini.support.ticket');
});
});
// Ladill POS is a web-only in-store register; it exposes no JSON API.
// (The mobile/QR API surface from the upstream fork was removed.)