لینکهای مفید برای شرکت در مسابقه:
در طول مسابقه، میتوانید سوالهای خود را از قسمت «سؤال بپرسید» مطرح کنید.
محمدرضا و تیمش مشغول طراحی سامانهای برای مدیریت کیف پول دیجیتال بهنام دیجیوالِت هستند. در نسخهی اولیهی این سامانه قرار است قابلیتهای زیر وجود داشته باشد:
تیم محمدرضا ساختار برنامه را طراحی کردهاند و از شما میخواهند تا پیادهسازی آن را انجام دهید.
پروژهی اولیه را از این لینک دانلود کنید.
Wallet
)String
است.AdminWallet
)Wallet
ارثبری میکند و هیچ پیادهسازی اضافهای نسبت به مدل Wallet
ندارد.TransactionType
): این کلاس یک enum
است که بهترتیب شامل دو مقدار DEPOSIT
و WITHDRAWAL
است.DEPOSIT
هستند، بیانگر واریزهایی هستند که مقصد آنها، کیف پول فعلی است.WITHDRAWAL
هستند، بیانگر برداشتهایی هستند که از کیف پول به حساب بانکی صاحب کیف پول منتقل میشوند.TransactionStatus
): این کلاس یک enum
است که بهترتیب شامل سه مقدار CANCELED
، PENDING
و ACCEPTED
است.Transaction
)long id
: شناسهی تراکنشWallet wallet
: کیف پول مربوط به تراکنشTransactionType type
: نوع تراکنشBigDecimal amount
: مبلغ تراکنشDate createdAt
: زمان ایجاد تراکنشTransactionStatus status
: وضعیت تراکنش با مقدار اولیهی PENDING
Date updatedAt
: زمان تغییر وضعیت تراکنشupdatedAt
در کانستراکتور مقداردهی میشوند.setStatus
را طوری پیادهسازی کنید که با دریافت یک TransactionStatus
، وضعیت تراکنش را به وضعیت واردشده تغییر داده و مقدار پراپرتی updatedAt
را برابر با یک آبجکت جدید از نوع Date
قرار دهد.CrudRepository<T, ID>
T
(نوع مدل) و ID
(نوع شناسهی مدل) است.boolean add(T t)
: این متد، مدل را به مخزن اضافه میکند؛ به شرط آن که مدل از قبل در مخزن وجود نداشته باشد. اگر مدل از قبل در مخزن موجود باشد، مقدار false
و در غیر اینصورت، مقدار true
را برمیگرداند.List<T> getAll()
: این متد، لیست همهی مدلهای ذخیرهشده را بهترتیب درج برمیگرداند.T get(ID id)
: این متد، مدلی که شناسهی آن برابر با id
است را برمیگرداند. اگر چنین مدلی یافت نشود، مقدار null
را برمیگرداند.List<T> get(Predicate<T> predicate)
: این متد، لیست مدلهایی که شرایط دادهشده در predicate
را دارند بهترتیب درج برمیگرداند.TransactionRepository
CrudRepository
ارثبری میکند و صرفاً نوع تراکنشها (که Transaction
است) و نوع شناسهی آنها (که Long
است) را مشخص میکند.TransactionRepositoryImpl
TransactionRepository
را پیادهسازی میکند و تراکنشهای مربوط به همهی کیف پولها در آن ذخیره میشود.CrudRepository
پیادهسازی کنید.add
اگر مبلغ تراکنش کوچکتر یا مساوی صفر باشد، یک IllegalArgumentException
باید پرتاب شود.WalletService
addTransaction
را طوری پیادهسازی کنید که با دریافت یک تراکنش، با فراخوانی متد add
از transactionRepository
، آن را به لیست تراکنشها اضافه کند. این متد در صورتی که تراکنش از قبل موجود باشد، باید مقدار false
و در غیر اینصورت، باید مقدار true
را برگرداند.getTransactions(Wallet wallet)
را طوری پیادهسازی کنید که لیست همهی تراکنشهایی که مربوط به کیف پول ورودی هستند را بهترتیب درج برگرداند.getTransactions(Wallet wallet, Predicate<Transaction> predicate)
را طوری پیادهسازی کنید که لیست همهی تراکنشهایی که مربوط به کیف پول ورودی هستند و شرایط دادهشده در predicate
را دارند بهترتیب درج برگرداند.getBalance
را طوری پیادهسازی کنید که با دریافت یک کیف پول، موجودی حساب کیف پول را در قالب یک BigDecimal
برگرداند. موجودی حساب برابر با مجموع مبلغ DEPOSIT
های ACCEPTED
منهای مجموع مبلغ WITHDRAWAL
های ACCEPTED
است.setTransactionStatus
را طوری پیادهسازی کنید که با دریافت یک تراکنش و وضعیت جدید، در صورتی که وضعیت تراکنش PENDING
نبود یا وضعیت جدید برابر با PENDING
بود، مقدار false
را برگرداند. در غیر اینصورت، اگر تراکنش از نوع WITHDRAWAL
بود و موجودی کیف پول به اندازهی مبلغ تراکنش نبود، یک IllegalArgumentException
پرتاب شود. در غیر اینصورت، وضعیت تراکنش به وضعیت جدید تغییر کند، مقدار پراپرتی updatedAt
تراکنش بهروز شود و مقدار true
برگردانده شود.AdminWalletService
WalletService
ارثبری میکند.getTransactions(Predicate<Transaction> predicate)
را طوری پیادهسازی کنید که لیست همهی تراکنشهای مربوط به همهی کیف پولها که شرایط دادهشده در predicate
را دارند بهترتیب درج برگرداند.getAllTransactions
را طوری پیادهسازی کنید که لیست همهی تراکنشهای مربوط به همهی کیف پولها (همهی تراکنشهای موجود در مخزن) را بهترتیب درج برگرداند.Application
) اضافه کنید.با اجرای متد main
موجود در کلاس Application
، خروجی زیر مورد انتظار است:
پس از پیادهسازی موارد خواستهشده، یک فایل زیر آپلود کنید که وقتی آن را باز میکنیم، با ساختار زیر مواجه شویم (از سایر فایلها صرفنظر میشود):