In big project, a arch design is, each ability(Gameplay ability, GA) has an ID and a blueprint.
The mapping of ID to blueprint is stored in a table.
The ID, GA blueprint, mapping table are made by game designer. Game programmer write cpp to provide tool for blueprint.
Your player should know which ID to use when input comes.
After you input ID to your ability system, beside looking up in table, you can add additional check(should cast GA?), or additional hook(before cast, after cast).
You can write a sub system to do the check, for example you maintain a tag system, if the GA receiver tag is enemy then … (destory the obstacle).
A reference is GAS by UE. It is more complex than I say above.
But your project is a small project, so current design is ok.