DRY is usually helpful if you don’t use it in situations where you have like 2 semi-different things. If they’re actually the same and you have 3 or more then the level of abstraction is worth it almost always.
To me, there are two classifications of DRY - one I find harmful, the other very useful.
First one resembles mathematical extractions, essentially you never allow a single chunk of code to be written twice and you create massive amounts of global util junk. This also creates some bad tight coupling.
The other is more logical, where you only extract logic in places you want to always change together. Simple and effective.