feat: Implement Slack, Trello, and Courier (ShipLogic) integration
- Add 14 domain events for order lifecycle (OrderCreated, OrderPacked, ShipmentCreated, ParcelDelivered, etc.)
- Create SlackNotifierService with channels for orders, design, production, shipping, ops-alerts
- Create TrelloService to create cards, move cards between lists, attach files, check items
- Create CourierService to integrate with ShipLogic API for shipment creation and document retrieval
- Create PackingController to explicitly capture packing dimensions and weight
- Create ShippingController with multi-layer guards: packing validation, payment/approval verification, idempotency
- Create TrelloWebhookController to handle incoming Trello webhooks as intent signals
- Create CourierWebhookController to handle Shiplogic status updates
- Create event listeners for Slack notifications and Trello card updates
- Create EventServiceProvider to register all events and listeners
- Add database migration for packing, courier, and Trello data columns
- Create config files for slack, trello, and courier integration
- Update .env with integration secrets placeholders
- Add routes for /orders/{id}/pack, /orders/{id}/ship, /api/webhooks/trello, /api/webhooks/courier
Key architectural decisions:
- Packing is explicit ops action (not automatic from status)
- Shipment creation only after: Trello intent + packing confirmed + payment/approval rules met
- Courier API failures keep order in Ready to Ship state (safe retry)
- Trello and Slack are mirrors of backend state, not decision makers
- All side effects flow through event listeners, maintaining separation of concerns
This commit is contained in:
@@ -3,5 +3,14 @@
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Route;
|
||||
use App\Http\Controllers\OrderController;
|
||||
use App\Http\Controllers\TrelloWebhookController;
|
||||
use App\Http\Controllers\CourierWebhookController;
|
||||
|
||||
// Existing Yoco webhook
|
||||
Route::post('/webhook', [OrderController::class, 'yocoWebhook'])->name('yoco-webhook');
|
||||
|
||||
// Trello webhook
|
||||
Route::post('/webhooks/trello', [TrelloWebhookController::class, 'handle'])->name('trello-webhook');
|
||||
|
||||
// Courier webhook
|
||||
Route::post('/webhooks/courier', [CourierWebhookController::class, 'handle'])->name('courier-webhook');
|
||||
|
||||
Reference in New Issue
Block a user