این پروژه یک دستگاه فروش خودکار است که با استفاده از الگوی State و SAGA(orchestration) پیادهسازی شده است.
- PHP 8.0 یا بالاتر
- Composer
- Docker و Docker Compose
- PHPUnit
- کلون کردن پروژه:
git clone https://github.com/Mohamadmr/wallex.git
cd wallex
- نصب وابستگیها:
composer install
- کلون کردن پروژه:
git clone https://github.com/Mohamadmr/wallex.git
cd wallex
- ساخت و اجرای کانتینرها:
docker-compose up -d --build
پس از اجرا، پروژه روی پورت 8080 در دسترس خواهد بود: http://localhost:8080
wallex/
├── src/
│ ├── contracts/
│ │ ├── TransactionInterface.php
│ │ └── VendingMachineState.php
│ ├── exceptions/
│ │ ├── NotEnoughBalance.php
│ │ ├── NotEnoughCount.php
│ │ └── ProductNotFound.php
│ ├── states/
│ │ ├── DispensingState.php
│ │ ├── IDLEState.php
│ │ └── ProductSelectedState.php
│ ├── SAGAWorker.php
│ ├── Transaction.php
│ └── VendingMachine.php
├── tests/
│ ├── states/
│ │ └── IDLEStateTest.php
│ ├── SAGAWorkerTest.php
│ ├── TransactionTest.php
│ └── VendingMachineTest.php
├── public/
│ └── index.php
├── deployment/
│ └── nginx/
│ └── app.conf
├── doc/
│ └── design.md
├── docker-compose.yml
├── Dockerfile
├── composer.json
└── README.md
./vendor/bin/phpunit tests
docker-compose exec app ./vendor/bin/phpunit tests
مستندات طراحی پروژه در پوشه doc
قرار دارد. برای مشاهده نمودارها، میتوانید از ابزارهای پشتیبانی کننده Mermaid استفاده کنید.
پس از راهاندازی پروژه، میتوانید از API زیر استفاده کنید:
curl http://localhost:8080
$worker = new SAGAWorker();
$vendingMachine = $worker->getFirstIDLEVendingMachine();
try {
$vendingMachine->insertCoin(10);
$vendingMachine->selectProduct('soda_uid');
$vendingMachine->dispense();
} catch (ProductNotFound $exception) {
echo $exception->getMessage() . PHP_EOL;
echo 'Please get new product uid' . PHP_EOL;
} catch (NotEnoughCount|NotEnoughBalance $exception) {
echo $exception->getMessage() . PHP_EOL;
$vendingMachine->ejectCoin();
} finally {
echo 'Transaction completed' . PHP_EOL;
$vendingMachine->ejectCoin();
}
ProductNotFound
: زمانی که محصول مورد نظر یافت نشودNotEnoughCount
: زمانی که موجودی محصول کافی نباشدNotEnoughBalance
: زمانی که موجودی مالی کافی نباشد
- استفاده از قفل برای جلوگیری از تراکنشهای همزمان
- بررسی موجودی قبل از قفل کردن محصول
- آزاد کردن قفل در صورت خطا یا لغو تراکنش