Gdzie w DDD walidować uprawnienia użytkownika?
Przykład, mam encje wishlist
ktora posiada liste gift
- tylko tworca wishlsity moze dodac nowy prezent
- kazdy moze dodac propozycje prezentu
- tylko tworca wishlisty moze akceptowac propozycje prezentu
- tylko tworca wishlisty badz osoba ktora dodala propozycje moze ja usunac
- itp, itd
Generalnie wiekszosc operacji na encji wishlist
wymaga sprawdzenia kto ja wykonuje, wiec efektywnie wszystkie jej funkcje potrzebuja dostac userId
by zrobic chociaz cos takiego
fun addGift(userId: UserId, title: Title): AcceptedGift {
require(userId == createdBy) { "User not authorized" }
val gift = AcceptedGift(title,userId)
gifts.add(gift)
return gift
}
A w serwisie aplikacyjnym,
@Service
class GiftAddingService(
private val userProvider: UserProvider,
private val wishlistRepository: WishlistRepository) {
fun addGift(wishlistId: WishlistId, title: Title): Wishlist {
val user = userProvider.getLoggedUser()
val wishlist = wishlistRepository.findById(wishlistId)
wishlist.addGift(user.userId, title)
return wishlistRepository.save(wishlist)
}
}
Alternatywa to przeniesienie tej logiki wlasnie do serwisu aplikacyjnego i pozbycie sie tego z warstwy domeny:
fun addGift(wishlistId: WishlistId, title: Title): Wishlist {
val user = userProvider.getLoggedUser()
val wishlist = wishlistRepository.findById(wishlistId)
require(user.userId == wishlist.createdBy) { "User not authorized" }
wishlist.addGift(user.userId, title)
return wishlistRepository.save(wishlist)
}
Pytanie ktore podejscie jest lepsze? Tak jak wspomniałem, są reguły nieco bardziej skomplikowane jak prosty check czy userId == createdBy