refactor to Clean Architecture