├── cursor ├── upload.js └── index.js ├── test.txt ├── dont-forget-security ├── private │ └── password.txt ├── client │ ├── src │ │ ├── vite-env.d.ts │ │ ├── main.tsx │ │ └── App.css │ ├── tsconfig.json │ ├── vite.config.ts │ ├── .gitignore │ ├── index.html │ ├── eslint.config.js │ ├── tsconfig.node.json │ ├── package.json │ └── tsconfig.app.json ├── src │ ├── main │ │ ├── java │ │ │ └── org │ │ │ │ └── youngmonkeys │ │ │ │ └── dfs │ │ │ │ ├── permission │ │ │ │ ├── PermissionUser.java │ │ │ │ └── AdminsController.java │ │ │ │ ├── logger │ │ │ │ ├── LoggerAppender.java │ │ │ │ ├── LoggerFilter.java │ │ │ │ ├── LoggerDataSerializer.java │ │ │ │ ├── LoggerConsoleAppender.java │ │ │ │ ├── UserData.java │ │ │ │ ├── Main.java │ │ │ │ ├── UserDataSerializer.java │ │ │ │ └── DefaultDataFilter.java │ │ │ │ ├── validator │ │ │ │ ├── UserService.java │ │ │ │ ├── User.java │ │ │ │ ├── PasswordManager.java │ │ │ │ └── ChangeUserPasswordRequest.java │ │ │ │ ├── shell │ │ │ │ ├── curl │ │ │ │ └── Command.java │ │ │ │ ├── xss │ │ │ │ └── request │ │ │ │ │ └── ValidateHtmlRequest.java │ │ │ │ ├── ddos │ │ │ │ ├── DdosExampleStartup.java │ │ │ │ └── HomeController.java │ │ │ │ ├── DontForgetSecurityStartup.java │ │ │ │ ├── limit_request_rate │ │ │ │ ├── WebWhiteUriIpService.java │ │ │ │ ├── WebEzyDefenceSettingService.java │ │ │ │ ├── BlockingPeriod.java │ │ │ │ ├── LimitRequestRateController.java │ │ │ │ └── EzyActionFrameSecond.java │ │ │ │ ├── cors │ │ │ │ └── CorsController.java │ │ │ │ ├── properties │ │ │ │ └── EncryptedPropertiesReader.java │ │ │ │ ├── ssrf │ │ │ │ └── ApiAdminDataController.java │ │ │ │ ├── file_upload │ │ │ │ └── service │ │ │ │ │ └── SettingService.java │ │ │ │ ├── zeroday │ │ │ │ └── ZeroDayController.java │ │ │ │ └── clickjacking │ │ │ │ └── controller │ │ │ │ └── ClickjackingController.java │ │ └── resources │ │ │ ├── static │ │ │ ├── zeroday │ │ │ │ ├── HelloPayload.class │ │ │ │ └── HelloPayload.java │ │ │ └── hacking.js │ │ │ ├── application.properties │ │ │ ├── logback.xml │ │ │ └── templates │ │ │ └── xss.html │ └── test │ │ └── resources │ │ └── AllTests.tng.xml └── .gitignore ├── README.md ├── separation-of-concerns-ezyfox-server ├── chat │ ├── chat-common │ │ ├── src │ │ │ ├── main │ │ │ │ ├── resources │ │ │ │ │ └── chat-common-config.properties │ │ │ │ └── java │ │ │ │ │ └── org │ │ │ │ │ └── youngmonkeys │ │ │ │ │ └── chat │ │ │ │ │ └── common │ │ │ │ │ ├── constant │ │ │ │ │ └── CommonConstants.java │ │ │ │ │ └── service │ │ │ │ │ └── CommonService.java │ │ │ └── test │ │ │ │ ├── java │ │ │ │ └── org │ │ │ │ │ └── youngmonkeys │ │ │ │ │ └── chat │ │ │ │ │ └── common │ │ │ │ │ └── test │ │ │ │ │ └── CommonTest.java │ │ │ │ └── resources │ │ │ │ └── AllTests.tng.xml │ │ └── build.xml │ ├── chat-plugin │ │ ├── config │ │ │ └── config.properties │ │ ├── src │ │ │ ├── test │ │ │ │ ├── java │ │ │ │ │ └── org │ │ │ │ │ │ └── youngmonkeys │ │ │ │ │ │ └── chat │ │ │ │ │ │ └── plugin │ │ │ │ │ │ └── test │ │ │ │ │ │ └── PluginTest.java │ │ │ │ └── resources │ │ │ │ │ └── AllTests.tng.xml │ │ │ └── main │ │ │ │ └── java │ │ │ │ └── org │ │ │ │ └── youngmonkeys │ │ │ │ └── chat │ │ │ │ └── plugin │ │ │ │ ├── config │ │ │ │ └── PluginConfig.java │ │ │ │ ├── PluginEntryLoader.java │ │ │ │ └── service │ │ │ │ └── WelcomeService.java │ │ └── build.xml │ ├── chat-app-entry │ │ ├── config │ │ │ └── config.properties │ │ ├── src │ │ │ ├── test │ │ │ │ └── resources │ │ │ │ │ └── AllTests.tng.xml │ │ │ └── main │ │ │ │ └── java │ │ │ │ └── org │ │ │ │ └── youngmonkeys │ │ │ │ └── chat │ │ │ │ └── app │ │ │ │ └── AppEntryLoader.java │ │ ├── pom.xml │ │ └── build.xml │ ├── export.sh │ ├── export.bat │ ├── chat-app-api │ │ ├── src │ │ │ ├── main │ │ │ │ └── java │ │ │ │ │ └── org │ │ │ │ │ └── youngmonkeys │ │ │ │ │ └── chat │ │ │ │ │ └── app │ │ │ │ │ ├── constant │ │ │ │ │ ├── Errors.java │ │ │ │ │ └── Commands.java │ │ │ │ │ ├── request │ │ │ │ │ ├── GoRequest.java │ │ │ │ │ └── HelloRequest.java │ │ │ │ │ ├── config │ │ │ │ │ └── AppConfig.java │ │ │ │ │ ├── response │ │ │ │ │ ├── GoResponse.java │ │ │ │ │ └── HelloResponse.java │ │ │ │ │ ├── service │ │ │ │ │ └── GreetingService.java │ │ │ │ │ └── controller │ │ │ │ │ └── ServerReadyController.java │ │ │ └── test │ │ │ │ ├── java │ │ │ │ └── org │ │ │ │ │ └── youngmonkeys │ │ │ │ │ └── chat │ │ │ │ │ └── test │ │ │ │ │ └── ApiTest.java │ │ │ │ └── resources │ │ │ │ └── AllTests.tng.xml │ │ └── build.xml │ ├── build.sh │ ├── chat-startup │ │ ├── src │ │ │ ├── test │ │ │ │ └── resources │ │ │ │ │ └── AllTests.tng.xml │ │ │ └── main │ │ │ │ └── resources │ │ │ │ └── logback.xml │ │ ├── deploy │ │ │ ├── console.bat │ │ │ ├── console.sh │ │ │ └── stop-service.sh │ │ └── assembly.xml │ ├── build.bat │ └── build.xml └── game │ ├── game-common │ ├── src │ │ ├── main │ │ │ ├── resources │ │ │ │ └── game-common-config.properties │ │ │ └── java │ │ │ │ └── org │ │ │ │ └── youngmonkeys │ │ │ │ └── game │ │ │ │ └── common │ │ │ │ ├── constant │ │ │ │ └── CommonConstants.java │ │ │ │ └── service │ │ │ │ └── CommonService.java │ │ └── test │ │ │ ├── java │ │ │ └── org │ │ │ │ └── youngmonkeys │ │ │ │ └── game │ │ │ │ └── common │ │ │ │ └── test │ │ │ │ └── CommonTest.java │ │ │ └── resources │ │ │ └── AllTests.tng.xml │ └── build.xml │ ├── game-plugin │ ├── config │ │ └── config.properties │ ├── src │ │ ├── test │ │ │ ├── java │ │ │ │ └── org │ │ │ │ │ └── youngmonkeys │ │ │ │ │ └── game │ │ │ │ │ └── plugin │ │ │ │ │ └── test │ │ │ │ │ └── PluginTest.java │ │ │ └── resources │ │ │ │ └── AllTests.tng.xml │ │ └── main │ │ │ └── java │ │ │ └── org │ │ │ └── youngmonkeys │ │ │ └── game │ │ │ └── plugin │ │ │ ├── config │ │ │ └── PluginConfig.java │ │ │ ├── PluginEntryLoader.java │ │ │ └── service │ │ │ └── WelcomeService.java │ └── build.xml │ ├── game-app-entry │ ├── config │ │ └── config.properties │ ├── src │ │ ├── test │ │ │ └── resources │ │ │ │ └── AllTests.tng.xml │ │ └── main │ │ │ └── java │ │ │ └── org │ │ │ └── youngmonkeys │ │ │ └── game │ │ │ └── app │ │ │ └── AppEntryLoader.java │ ├── pom.xml │ └── build.xml │ ├── export.sh │ ├── export.bat │ ├── game-app-api │ ├── src │ │ ├── main │ │ │ └── java │ │ │ │ └── org │ │ │ │ └── youngmonkeys │ │ │ │ └── game │ │ │ │ └── app │ │ │ │ ├── constant │ │ │ │ ├── Errors.java │ │ │ │ └── Commands.java │ │ │ │ ├── request │ │ │ │ ├── GoRequest.java │ │ │ │ └── HelloRequest.java │ │ │ │ ├── config │ │ │ │ └── AppConfig.java │ │ │ │ ├── response │ │ │ │ ├── GoResponse.java │ │ │ │ └── HelloResponse.java │ │ │ │ └── service │ │ │ │ └── GreetingService.java │ │ └── test │ │ │ ├── java │ │ │ └── org │ │ │ │ └── youngmonkeys │ │ │ │ └── game │ │ │ │ └── test │ │ │ │ └── ApiTest.java │ │ │ └── resources │ │ │ └── AllTests.tng.xml │ └── build.xml │ ├── build.sh │ ├── game-startup │ ├── src │ │ ├── test │ │ │ └── resources │ │ │ │ └── AllTests.tng.xml │ │ └── main │ │ │ └── resources │ │ │ └── logback.xml │ ├── deploy │ │ ├── console.bat │ │ ├── console.sh │ │ └── stop-service.sh │ └── assembly.xml │ ├── build.bat │ └── build.xml ├── composition-over-inheritance ├── src │ ├── main │ │ └── java │ │ │ └── org │ │ │ └── youngmonkeys │ │ │ └── coi │ │ │ ├── HelloWorld.java │ │ │ ├── request │ │ │ └── UpdateUserRequest.java │ │ │ ├── model │ │ │ └── UserModel.java │ │ │ ├── response │ │ │ └── UserResponse.java │ │ │ ├── service │ │ │ └── PhoneNumberService.java │ │ │ └── controller │ │ │ └── api │ │ │ └── v2 │ │ │ └── BaseUserController.java │ └── test │ │ ├── resources │ │ ├── AllTests.tng.xml │ │ └── logback.xml │ │ └── java │ │ └── org │ │ └── youngmonkeys │ │ └── coi │ │ └── test │ │ └── util │ │ └── DataRandomUtil.java └── composition-over-inheritance.iml ├── refactoring-spring-boot ├── src │ ├── main │ │ ├── resources │ │ │ ├── application.properties │ │ │ └── logback.xml │ │ └── java │ │ │ └── org │ │ │ └── youngmonkeys │ │ │ └── refactoring │ │ │ └── v2 │ │ │ ├── service │ │ │ └── GreetService.java │ │ │ ├── RefactoringStartup.java │ │ │ ├── controller │ │ │ └── HomeController.java │ │ │ └── advice │ │ │ └── GlobalExceptionHandler.java │ └── test │ │ └── resources │ │ └── AllTests.tng.xml └── .gitignore ├── self-comment └── src │ ├── main │ └── java │ │ └── org │ │ └── youngmonkeys │ │ └── sc │ │ ├── v1 │ │ ├── entity │ │ │ └── Post.java │ │ ├── model │ │ │ └── PostModel.java │ │ ├── converter │ │ │ └── EntityToModelConverter.java │ │ ├── calculator │ │ │ └── Calculator.java │ │ └── repo │ │ │ └── PostRepository.java │ │ └── v2 │ │ └── repo │ │ └── PaginationPostRepository.java │ └── test │ └── resources │ └── AllTests.tng.xml ├── single-responsibility └── src │ ├── main │ └── java │ │ └── org │ │ └── youngmonkeys │ │ └── sr │ │ ├── v1 │ │ ├── model │ │ │ ├── User.java │ │ │ ├── RefreshToken.java │ │ │ ├── CustomUserDetails.java │ │ │ └── Authentication.java │ │ ├── exception │ │ │ ├── UserAuthException.java │ │ │ └── UserLoginException.java │ │ ├── security │ │ │ ├── SecurityContextHolder.java │ │ │ └── SecurityContext.java │ │ ├── request │ │ │ └── LoginRequest.java │ │ ├── provider │ │ │ └── TokenProvider.java │ │ ├── service │ │ │ └── UserService.java │ │ └── response │ │ │ └── JwtAuthenticationResponse.java │ │ ├── v2 │ │ ├── model │ │ │ └── Token.java │ │ ├── constants │ │ │ └── Constants.java │ │ ├── request │ │ │ └── UpdateAvatarRequest.java │ │ ├── annotation │ │ │ └── Username.java │ │ ├── service │ │ │ ├── AuthenticationService.java │ │ │ ├── TokenService.java │ │ │ └── UserService.java │ │ └── converter │ │ │ └── ModelToResponseConverter.java │ │ └── example │ │ ├── v2 │ │ ├── QAEngineer.java │ │ ├── ProjectManager.java │ │ └── Programmer.java │ │ └── v1 │ │ └── Programmer.java │ └── test │ └── resources │ └── AllTests.tng.xml ├── dependency-inversion ├── src │ ├── main │ │ └── java │ │ │ └── org │ │ │ └── youngmonkeys │ │ │ └── di │ │ │ ├── v2 │ │ │ ├── ioc │ │ │ │ ├── Component.java │ │ │ │ └── Main.java │ │ │ └── dependencies_injection │ │ │ │ ├── MyRepository.java │ │ │ │ ├── ApplicationStartup.java │ │ │ │ ├── MyController.java │ │ │ │ └── MyService.java │ │ │ ├── v1 │ │ │ ├── ioc │ │ │ │ ├── Library.java │ │ │ │ └── Main.java │ │ │ └── dependencies_injection │ │ │ │ ├── MyRepository.java │ │ │ │ ├── MyController.java │ │ │ │ ├── MyService.java │ │ │ │ └── ApplicationStartup.java │ │ │ └── scheduler │ │ │ ├── DoSomethingWorker.java │ │ │ └── CountDataWorker.java │ └── test │ │ └── resources │ │ └── AllTests.tng.xml └── pom.xml ├── interface-segregation ├── src │ ├── main │ │ └── java │ │ │ └── org │ │ │ └── youngmonkeys │ │ │ └── is │ │ │ ├── v2 │ │ │ ├── Watch.java │ │ │ ├── MechanicalWatch.java │ │ │ ├── SmartWatch.java │ │ │ ├── MechanicalWatchImpl.java │ │ │ └── SmartWatchImpl.java │ │ │ ├── v1 │ │ │ ├── Watch.java │ │ │ └── SmartWatch.java │ │ │ └── db │ │ │ ├── DatabaseRepository.java │ │ │ ├── MongodbRepository.java │ │ │ ├── JpaRepository.java │ │ │ └── SimpleMongodbRepository.java │ └── test │ │ └── resources │ │ └── AllTests.tng.xml └── pom.xml ├── document-your-code └── src │ ├── main │ └── java │ │ └── org │ │ └── youngmonkeys │ │ └── dyc │ │ ├── entity │ │ ├── PostType.java │ │ ├── PostStatus.java │ │ └── Post.java │ │ ├── pagination │ │ ├── StorageFilter.java │ │ ├── PostPaginationSortOrder.java │ │ ├── PostFilter.java │ │ ├── PostPaginationParameter.java │ │ ├── PostTypeFilter.java │ │ └── ParameterMapFetcher.java │ │ ├── model │ │ ├── PageToken.java │ │ ├── Continuation.java │ │ ├── PaginationModel.java │ │ └── PostModel.java │ │ ├── converter │ │ └── EntityToModelConverter.java │ │ ├── service │ │ └── DefaultPaginationService.java │ │ └── repo │ │ └── PaginationRepository.java │ └── test │ └── resources │ └── AllTests.tng.xml ├── clean-code ├── src │ ├── main │ │ └── java │ │ │ └── org │ │ │ └── youngmonkeys │ │ │ └── cc │ │ │ ├── v2 │ │ │ ├── entity │ │ │ │ ├── RoleName.java │ │ │ │ ├── UserRoleId.java │ │ │ │ ├── Role.java │ │ │ │ └── UserRole.java │ │ │ ├── model │ │ │ │ └── CreateUserModel.java │ │ │ ├── request │ │ │ │ └── RegistrationRequest.java │ │ │ ├── repo │ │ │ │ ├── RoleRepository.java │ │ │ │ ├── UserRepository.java │ │ │ │ └── UserRoleRepository.java │ │ │ ├── service │ │ │ │ └── AuthService.java │ │ │ └── converter │ │ │ │ ├── RequestToModelConverter.java │ │ │ │ └── ModelToEntityConverter.java │ │ │ └── v1 │ │ │ ├── event │ │ │ ├── ApplicationEventHandler.java │ │ │ └── ApplicationEvent.java │ │ │ ├── model │ │ │ └── RoleName.java │ │ │ ├── repo │ │ │ ├── RoleRepository.java │ │ │ └── UserRepository.java │ │ │ ├── exception │ │ │ └── UserRegistrationException.java │ │ │ └── service │ │ │ └── RoleService.java │ └── test │ │ └── resources │ │ └── AllTests.tng.xml └── clean-code.iml ├── separation-of-concerns └── src │ ├── main │ └── java │ │ └── org │ │ └── youngmonkeys │ │ └── soc │ │ └── v1 │ │ ├── Game1.java │ │ ├── Game2.java │ │ ├── Game3.java │ │ └── Main.java │ └── test │ └── resources │ └── AllTests.tng.xml ├── .gitignore ├── code-smell └── src │ ├── main │ └── java │ │ └── org │ │ └── youngmonkeys │ │ └── code_smell │ │ ├── constant │ │ └── UserType.java │ │ ├── repository │ │ └── UserRepository.java │ │ ├── entity │ │ └── UserEntity.java │ │ ├── request │ │ └── AddUserRequest.java │ │ ├── model │ │ └── SaveUserModel.java │ │ ├── service │ │ └── SettingService.java │ │ ├── LongMethodFixed.java │ │ ├── converter │ │ ├── ModelToEntityConverter.java │ │ └── RequestToModelConverter.java │ │ └── TooManyParameter.java │ └── test │ └── resources │ └── AllTests.tng.xml ├── sql-carefully ├── src │ ├── test │ │ ├── java │ │ │ └── com │ │ │ │ └── tvd12 │ │ │ │ └── ezydata │ │ │ │ └── example │ │ │ │ └── jpa │ │ │ │ └── test │ │ │ │ └── ExampleJpaApplicationTest.java │ │ └── resources │ │ │ └── AllTests.tng.xml │ └── main │ │ ├── java │ │ └── com │ │ │ └── tvd12 │ │ │ └── ezydata │ │ │ └── example │ │ │ └── jpa │ │ │ ├── exception │ │ │ ├── NotFoundException.java │ │ │ ├── BookNotFoundException.java │ │ │ ├── AuthorNotFoundException.java │ │ │ ├── DuplicatedBookException.java │ │ │ ├── CategoryNotFoundException.java │ │ │ ├── InvalidAuthorIdException.java │ │ │ ├── InvalidCategoryIdException.java │ │ │ └── DuplicatedCategoryException.java │ │ │ ├── data │ │ │ ├── AddAuthorData.java │ │ │ ├── AddCategoryData.java │ │ │ ├── AuthorData.java │ │ │ ├── CategoryData.java │ │ │ ├── AddBookData.java │ │ │ ├── BookData.java │ │ │ └── BookRawData.java │ │ │ ├── request │ │ │ ├── AddAuthorRequest.java │ │ │ ├── AddCategoryRequest.java │ │ │ └── AddBookRequest.java │ │ │ ├── response │ │ │ ├── AuthorResponse.java │ │ │ ├── CategoryResponse.java │ │ │ ├── BookRawResponse.java │ │ │ └── BookResponse.java │ │ │ ├── ExampleJpaApplication.java │ │ │ ├── result │ │ │ └── SumBookPriceResult.java │ │ │ ├── repository │ │ │ ├── AuthorRepository.java │ │ │ └── CategoryRepository.java │ │ │ ├── entity │ │ │ ├── CommonEntity.java │ │ │ ├── Author.java │ │ │ └── Category.java │ │ │ └── validator │ │ │ ├── BookValidator.java │ │ │ ├── AuthorValidator.java │ │ │ └── CategoryValidator.java │ │ └── resources │ │ ├── application.yaml │ │ └── logback.xml ├── scripts │ └── create-table-user.sql └── README.md ├── unit-test └── src │ ├── main │ └── java │ │ └── org │ │ └── youngmonkeys │ │ └── ut │ │ ├── Calculator.java │ │ └── VirtualMachine.java │ └── test │ ├── resources │ └── AllTests.tng.xml │ └── java │ └── org │ └── youngmonkeys │ └── ut │ └── test │ └── CalculatorTest.java ├── write-dry-code └── src │ ├── main │ └── java │ │ └── org │ │ └── youngmonkeys │ │ └── wdc │ │ ├── duplicated_logic │ │ └── v1 │ │ │ ├── entity │ │ │ ├── PostStatus.java │ │ │ └── Post.java │ │ │ ├── exception │ │ │ └── PostNotFoundException.java │ │ │ └── repository │ │ │ └── PostRepository.java │ │ ├── duplicated_method │ │ ├── v1 │ │ │ ├── model │ │ │ │ ├── AddPageModel.java │ │ │ │ └── AddPostModel.java │ │ │ ├── repository │ │ │ │ ├── PageRepository.java │ │ │ │ └── PostRepository.java │ │ │ ├── entity │ │ │ │ ├── Page.java │ │ │ │ └── Post.java │ │ │ ├── converter │ │ │ │ ├── PostModelToEntityConverter.java │ │ │ │ └── PageModelToEntityConverter.java │ │ │ └── service │ │ │ │ └── PageService.java │ │ └── v2 │ │ │ ├── service │ │ │ ├── PageService.java │ │ │ ├── PostService.java │ │ │ └── AbstractPostService.java │ │ │ └── converter │ │ │ └── ModelToEntityConverter.java │ │ └── duplicated_initiation │ │ ├── v1 │ │ ├── model │ │ │ └── UserModel.java │ │ ├── response │ │ │ └── UserResponse.java │ │ └── service │ │ │ └── UserService.java │ │ └── v2 │ │ └── converter │ │ └── ModelToResponseConverter.java │ └── test │ └── resources │ └── AllTests.tng.xml ├── keep-it-simple-stupid └── src │ ├── main │ └── java │ │ └── org │ │ └── youngmonkeys │ │ └── kiss │ │ ├── reduce_if_else │ │ ├── model │ │ │ ├── UserStatus.java │ │ │ └── UserModel.java │ │ ├── request │ │ │ └── AddPostRequest.java │ │ └── service │ │ │ ├── UserService.java │ │ │ └── PostService.java │ │ └── simplify_unit_testing │ │ ├── repo │ │ └── UserRepository.java │ │ ├── model │ │ └── UserModel.java │ │ ├── entity │ │ └── User.java │ │ └── converter │ │ └── EntityToModelConverter.java │ └── test │ └── resources │ └── AllTests.tng.xml ├── copilot-example ├── src │ ├── main │ │ └── java │ │ │ └── org │ │ │ └── youngmonkeys │ │ │ └── copilot │ │ │ └── example │ │ │ ├── Application.java │ │ │ ├── response │ │ │ └── LoginResponse.java │ │ │ ├── request │ │ │ └── LoginRequest.java │ │ │ ├── service │ │ │ └── AuthenticationService.java │ │ │ └── controller │ │ │ └── RegisterController.java │ └── test │ │ └── resources │ │ └── AllTests.tng.xml └── pom.xml ├── refactoring-spring-web-mvc ├── src │ ├── main │ │ ├── java │ │ │ └── org │ │ │ │ └── youngmonkeys │ │ │ │ └── refactoring │ │ │ │ └── v1 │ │ │ │ └── service │ │ │ │ └── GreetService.java │ │ └── webapp │ │ │ └── WEB-INF │ │ │ └── dispatcher-servlet.xml │ └── test │ │ └── resources │ │ └── AllTests.tng.xml └── .gitignore ├── you-arent-going-to-need-it └── src │ ├── main │ └── java │ │ └── org │ │ └── youngmonkeys │ │ └── yagni │ │ ├── v1 │ │ ├── dto │ │ │ ├── BaseDTO.java │ │ │ └── UserDTO.java │ │ ├── service │ │ │ └── UserService.java │ │ ├── controller │ │ │ └── BaseController.java │ │ └── converter │ │ │ ├── RequestToModelConverter.java │ │ │ └── ModelToResponseConverter.java │ │ └── v2 │ │ ├── request │ │ └── UpdateUserRequest.java │ │ ├── model │ │ ├── UserModel.java │ │ └── UpdateUserModel.java │ │ ├── response │ │ └── UserResponse.java │ │ └── service │ │ └── UserService.java │ └── test │ └── resources │ └── AllTests.tng.xml ├── open-close └── src │ ├── main │ └── java │ │ └── org │ │ └── youngmonkeys │ │ └── oc │ │ ├── v2 │ │ ├── response │ │ │ └── UserResponseV2.java │ │ └── converter │ │ │ └── ModelToResponseConverterV2.java │ │ └── v1 │ │ ├── model │ │ └── UserModel.java │ │ └── response │ │ └── UserResponse.java │ └── test │ └── resources │ └── AllTests.tng.xml ├── log-strategy └── src │ ├── main │ └── java │ │ └── org │ │ └── youngmonkeys │ │ └── ls │ │ ├── model │ │ └── UserModel.java │ │ ├── repo │ │ └── UserRepository.java │ │ ├── service │ │ ├── UserWalletService.java │ │ └── nio │ │ │ └── NioUserWalletService.java │ │ └── entity │ │ └── User.java │ └── test │ └── resources │ └── AllTests.tng.xml ├── liskov-substitution └── src │ ├── main │ └── java │ │ └── org │ │ └── youngmonkeys │ │ └── ls │ │ ├── paint │ │ ├── Position.java │ │ ├── Size.java │ │ ├── v1 │ │ │ ├── Rectangle.java │ │ │ ├── Shape.java │ │ │ ├── Square.java │ │ │ └── Paint.java │ │ └── v2 │ │ │ ├── Rectangle.java │ │ │ ├── Shape.java │ │ │ ├── Square.java │ │ │ └── Paint.java │ │ └── migration │ │ └── Migrator.java │ └── test │ └── resources │ └── AllTests.tng.xml └── hourly-scheduler └── src ├── test └── resources │ └── AllTests.tng.xml └── main └── java └── org └── youngmonkeys └── scheduler └── Worker.java /cursor/upload.js: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /test.txt: -------------------------------------------------------------------------------- 1 | This is a test file. 2 | -------------------------------------------------------------------------------- /dont-forget-security/private/password.txt : -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # programming-principles 2 | for Programming Principles book 3 | -------------------------------------------------------------------------------- /dont-forget-security/client/src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/chat/chat-common/src/main/resources/chat-common-config.properties: -------------------------------------------------------------------------------- 1 | hello=world 2 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/chat/chat-plugin/config/config.properties: -------------------------------------------------------------------------------- 1 | application.welcome_prefix=Welcome 2 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/game/game-common/src/main/resources/game-common-config.properties: -------------------------------------------------------------------------------- 1 | hello=world 2 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/game/game-plugin/config/config.properties: -------------------------------------------------------------------------------- 1 | application.welcome_prefix=Welcome 2 | -------------------------------------------------------------------------------- /composition-over-inheritance/src/main/java/org/youngmonkeys/coi/HelloWorld.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.coi; 2 | 3 | 4 | -------------------------------------------------------------------------------- /refactoring-spring-boot/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | spring.mvc.view.prefix=/WEB-INF/jsp/ 2 | spring.mvc.view.suffix=.jsp 3 | -------------------------------------------------------------------------------- /self-comment/src/main/java/org/youngmonkeys/sc/v1/entity/Post.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.sc.v1.entity; 2 | 3 | public class Post { 4 | } 5 | -------------------------------------------------------------------------------- /self-comment/src/main/java/org/youngmonkeys/sc/v1/model/PostModel.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.sc.v1.model; 2 | 3 | public class PostModel { 4 | } 5 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/chat/chat-app-entry/config/config.properties: -------------------------------------------------------------------------------- 1 | application.hello_prefix=Hello 2 | application.go_prefix=Come on 3 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/game/game-app-entry/config/config.properties: -------------------------------------------------------------------------------- 1 | application.hello_prefix=Hello 2 | application.go_prefix=Come on 3 | -------------------------------------------------------------------------------- /single-responsibility/src/main/java/org/youngmonkeys/sr/v1/model/User.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.sr.v1.model; 2 | 3 | public class User { 4 | } 5 | -------------------------------------------------------------------------------- /single-responsibility/src/main/java/org/youngmonkeys/sr/v2/model/Token.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.sr.v2.model; 2 | 3 | public class Token { 4 | } 5 | -------------------------------------------------------------------------------- /dependency-inversion/src/main/java/org/youngmonkeys/di/v2/ioc/Component.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.di.v2.ioc; 2 | 3 | public interface Component { 4 | } 5 | -------------------------------------------------------------------------------- /interface-segregation/src/main/java/org/youngmonkeys/is/v2/Watch.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.is.v2; 2 | 3 | public interface Watch { 4 | void watch(); 5 | } -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/chat/export.sh: -------------------------------------------------------------------------------- 1 | mvn clean install 2 | mvn -pl chat-startup -Denv.EZYFOX_SERVER_HOME=deploy -Pezyfox-deploy clean install 3 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/game/export.sh: -------------------------------------------------------------------------------- 1 | mvn clean install 2 | mvn -pl game-startup -Denv.EZYFOX_SERVER_HOME=deploy -Pezyfox-deploy clean install 3 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/chat/export.bat: -------------------------------------------------------------------------------- 1 | mvn clean install & ^ 2 | mvn -pl chat-startup -Denv.EZYFOX_SERVER_HOME=deploy -Pezyfox-deploy clean install 3 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/game/export.bat: -------------------------------------------------------------------------------- 1 | mvn clean install & ^ 2 | mvn -pl game-startup -Denv.EZYFOX_SERVER_HOME=deploy -Pezyfox-deploy clean install 3 | -------------------------------------------------------------------------------- /document-your-code/src/main/java/org/youngmonkeys/dyc/entity/PostType.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.dyc.entity; 2 | 3 | public enum PostType { 4 | POST, 5 | PAGE 6 | } 7 | -------------------------------------------------------------------------------- /clean-code/src/main/java/org/youngmonkeys/cc/v2/entity/RoleName.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.cc.v2.entity; 2 | 3 | public enum RoleName { 4 | ROLE_ADMIN, 5 | ROLE_USER 6 | } 7 | -------------------------------------------------------------------------------- /dont-forget-security/client/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "files": [], 3 | "references": [ 4 | { "path": "./tsconfig.app.json" }, 5 | { "path": "./tsconfig.node.json" } 6 | ] 7 | } 8 | -------------------------------------------------------------------------------- /separation-of-concerns/src/main/java/org/youngmonkeys/soc/v1/Game1.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.soc.v1; 2 | 3 | public class Game1 { 4 | 5 | public void startGame1() {} 6 | } 7 | -------------------------------------------------------------------------------- /separation-of-concerns/src/main/java/org/youngmonkeys/soc/v1/Game2.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.soc.v1; 2 | 3 | public class Game2 { 4 | 5 | public void startGame2() {} 6 | } 7 | -------------------------------------------------------------------------------- /separation-of-concerns/src/main/java/org/youngmonkeys/soc/v1/Game3.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.soc.v1; 2 | 3 | public class Game3 { 4 | 5 | public void startGame3() {} 6 | } 7 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | **.DS_Store 3 | .zip 4 | **.zip 5 | target/ 6 | **/target/ 7 | .idea/ 8 | **/.idea/ 9 | .settings/ 10 | **/.settings/ 11 | *.iml 12 | node-modules/ 13 | 14 | -------------------------------------------------------------------------------- /code-smell/src/main/java/org/youngmonkeys/code_smell/constant/UserType.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.code_smell.constant; 2 | 3 | public enum UserType { 4 | ADMIN, 5 | USER 6 | } 7 | -------------------------------------------------------------------------------- /document-your-code/src/main/java/org/youngmonkeys/dyc/entity/PostStatus.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.dyc.entity; 2 | 3 | public enum PostStatus { 4 | DRAFT, 5 | RELEASED 6 | } 7 | -------------------------------------------------------------------------------- /document-your-code/src/main/java/org/youngmonkeys/dyc/pagination/StorageFilter.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.dyc.pagination; 2 | 3 | public interface StorageFilter extends ParameterMapFetcher {} -------------------------------------------------------------------------------- /single-responsibility/src/main/java/org/youngmonkeys/sr/example/v2/QAEngineer.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.sr.example.v2; 2 | 3 | public class QAEngineer { 4 | public void test() {} 5 | } 6 | -------------------------------------------------------------------------------- /sql-carefully/src/test/java/com/tvd12/ezydata/example/jpa/test/ExampleJpaApplicationTest.java: -------------------------------------------------------------------------------- 1 | package com.tvd12.ezydata.example.jpa.test; 2 | 3 | public class ExampleJpaApplicationTest { 4 | } 5 | -------------------------------------------------------------------------------- /document-your-code/src/main/java/org/youngmonkeys/dyc/pagination/PostPaginationSortOrder.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.dyc.pagination; 2 | 3 | public enum PostPaginationSortOrder { 4 | 5 | ID_DESC 6 | } 7 | -------------------------------------------------------------------------------- /dont-forget-security/src/main/java/org/youngmonkeys/dfs/permission/PermissionUser.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.dfs.permission; 2 | 3 | public class PermissionUser { 4 | private String username; 5 | } 6 | -------------------------------------------------------------------------------- /dont-forget-security/src/main/resources/static/zeroday/HelloPayload.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tvd12/programming-principles/HEAD/dont-forget-security/src/main/resources/static/zeroday/HelloPayload.class -------------------------------------------------------------------------------- /unit-test/src/main/java/org/youngmonkeys/ut/Calculator.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.ut; 2 | 3 | public class Calculator { 4 | 5 | public int sum(int a, int b) { 6 | return a + b; 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /dont-forget-security/src/main/java/org/youngmonkeys/dfs/logger/LoggerAppender.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.dfs.logger; 2 | 3 | public interface LoggerAppender { 4 | 5 | void append(String message); 6 | } 7 | -------------------------------------------------------------------------------- /interface-segregation/src/main/java/org/youngmonkeys/is/v2/MechanicalWatch.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.is.v2; 2 | 3 | public interface MechanicalWatch extends Watch { 4 | void automaticWindingUpTheThread(); 5 | } -------------------------------------------------------------------------------- /dependency-inversion/src/main/java/org/youngmonkeys/di/v1/ioc/Library.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.di.v1.ioc; 2 | 3 | public class Library { 4 | public int sum(int a, int b) { 5 | return a + b; 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /dont-forget-security/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | resources.enable=true 2 | database_password=ENC(uvZ92aXCSlSbAAKo9rJYnXq9yE6kcAgdgSaS1yD4Tzw=) 3 | cors.enable=true 4 | cors.allowed_origins=http://localhost:5173 5 | -------------------------------------------------------------------------------- /write-dry-code/src/main/java/org/youngmonkeys/wdc/duplicated_logic/v1/entity/PostStatus.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.wdc.duplicated_logic.v1.entity; 2 | 3 | public enum PostStatus { 4 | DRAFT, 5 | PUBLISHED 6 | } 7 | -------------------------------------------------------------------------------- /document-your-code/src/main/java/org/youngmonkeys/dyc/pagination/PostFilter.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.dyc.pagination; 2 | 3 | public interface PostFilter extends StorageFilter { 4 | 5 | String matchingCondition(); 6 | } 7 | -------------------------------------------------------------------------------- /dont-forget-security/client/vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite' 2 | import react from '@vitejs/plugin-react' 3 | 4 | // https://vite.dev/config/ 5 | export default defineConfig({ 6 | plugins: [react()], 7 | }) 8 | -------------------------------------------------------------------------------- /dependency-inversion/src/main/java/org/youngmonkeys/di/v1/dependencies_injection/MyRepository.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.di.v1.dependencies_injection; 2 | 3 | public class MyRepository { 4 | 5 | public void doSomething() {} 6 | } 7 | -------------------------------------------------------------------------------- /dependency-inversion/src/main/java/org/youngmonkeys/di/v2/ioc/Main.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.di.v2.ioc; 2 | 3 | public class Main implements Component { 4 | public int sum(int a, int b) { 5 | return a + b; 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /single-responsibility/src/main/java/org/youngmonkeys/sr/v1/model/RefreshToken.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.sr.v1.model; 2 | 3 | import lombok.Getter; 4 | 5 | @Getter 6 | public class RefreshToken { 7 | private String token; 8 | } 9 | -------------------------------------------------------------------------------- /keep-it-simple-stupid/src/main/java/org/youngmonkeys/kiss/reduce_if_else/model/UserStatus.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.kiss.reduce_if_else.model; 2 | 3 | public enum UserStatus { 4 | ACTIVATED, 5 | BLOCKED, 6 | INACTIVATE 7 | } 8 | -------------------------------------------------------------------------------- /dont-forget-security/src/main/java/org/youngmonkeys/dfs/logger/LoggerFilter.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.dfs.logger; 2 | 3 | import java.util.Map; 4 | 5 | public interface LoggerFilter { 6 | Map filter(Object input); 7 | } 8 | -------------------------------------------------------------------------------- /single-responsibility/src/main/java/org/youngmonkeys/sr/v1/model/CustomUserDetails.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.sr.v1.model; 2 | 3 | import lombok.Getter; 4 | 5 | @Getter 6 | public class CustomUserDetails { 7 | private String username; 8 | } 9 | -------------------------------------------------------------------------------- /clean-code/src/main/java/org/youngmonkeys/cc/v1/event/ApplicationEventHandler.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.cc.v1.event; 2 | 3 | public interface ApplicationEventHandler { 4 | 5 | void handle(E event); 6 | 7 | Class getEventType(); 8 | } 9 | -------------------------------------------------------------------------------- /dont-forget-security/src/main/java/org/youngmonkeys/dfs/validator/UserService.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.dfs.validator; 2 | 3 | public class UserService { 4 | 5 | public User getUserByToken(String token) { 6 | return null; 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /single-responsibility/src/main/java/org/youngmonkeys/sr/example/v2/ProjectManager.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.sr.example.v2; 2 | 3 | public class ProjectManager { 4 | public void communicateWithCustomer() {} 5 | 6 | public void manageProject() {} 7 | } 8 | -------------------------------------------------------------------------------- /dont-forget-security/src/main/java/org/youngmonkeys/dfs/logger/LoggerDataSerializer.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.dfs.logger; 2 | 3 | import java.util.Map; 4 | 5 | public interface LoggerDataSerializer { 6 | 7 | Map serialize(T data); 8 | } 9 | -------------------------------------------------------------------------------- /dont-forget-security/src/main/java/org/youngmonkeys/dfs/shell/curl: -------------------------------------------------------------------------------- 1 | POST /shell HTTP/1.1 2 | Host: localhost:8080 3 | Content-Type: application/json 4 | Content-Length: 65 5 | 6 | { 7 | "command": "/bin/bash", 8 | "arguments": ["-c", "ls -la"] 9 | } 10 | -------------------------------------------------------------------------------- /dont-forget-security/src/main/java/org/youngmonkeys/dfs/validator/User.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.dfs.validator; 2 | 3 | import lombok.Getter; 4 | 5 | @Getter 6 | public class User { 7 | private String username; 8 | private String password; 9 | } 10 | -------------------------------------------------------------------------------- /copilot-example/src/main/java/org/youngmonkeys/copilot/example/Application.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.copilot.example; 2 | 3 | public class Application { 4 | public static void main(String[] args) { 5 | System.out.println("Hello world!"); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /cursor/index.js: -------------------------------------------------------------------------------- 1 | function createLeakyHandler() { 2 | const hugeObject = new Array(1000000).fill('leak'); // chiếm bộ nhớ lớn 3 | document.body.addEventListener('click', function handleClick() { 4 | console.log('Clicked!'); 5 | }); 6 | } 7 | 8 | createLeakyHandler(); -------------------------------------------------------------------------------- /single-responsibility/src/main/java/org/youngmonkeys/sr/v1/model/Authentication.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.sr.v1.model; 2 | 3 | public class Authentication { 4 | 5 | public CustomUserDetails getPrincipal() { 6 | return new CustomUserDetails(); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /single-responsibility/src/main/java/org/youngmonkeys/sr/v2/constants/Constants.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.sr.v2.constants; 2 | 3 | public final class Constants { 4 | 5 | public static final String COOKIE_NAME_ACCESS_TOKEN = "token"; 6 | 7 | private Constants() {} 8 | } 9 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/chat/chat-app-api/src/main/java/org/youngmonkeys/chat/app/constant/Errors.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.chat.app.constant; 2 | 3 | public final class Errors { 4 | 5 | public static final int UNKNOWN = 1; 6 | 7 | private Errors() {} 8 | } 9 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/chat/chat-app-api/src/test/java/org/youngmonkeys/chat/test/ApiTest.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.chat.test; 2 | 3 | import org.testng.annotations.Test; 4 | 5 | public class ApiTest { 6 | 7 | @Test 8 | public void test() {} 9 | } 10 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/game/game-app-api/src/main/java/org/youngmonkeys/game/app/constant/Errors.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.game.app.constant; 2 | 3 | public final class Errors { 4 | 5 | public static final int UNKNOWN = 1; 6 | 7 | private Errors() {} 8 | } 9 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/game/game-app-api/src/test/java/org/youngmonkeys/game/test/ApiTest.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.game.test; 2 | 3 | import org.testng.annotations.Test; 4 | 5 | public class ApiTest { 6 | 7 | @Test 8 | public void test() {} 9 | } 10 | -------------------------------------------------------------------------------- /code-smell/src/main/java/org/youngmonkeys/code_smell/repository/UserRepository.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.code_smell.repository; 2 | 3 | import org.youngmonkeys.code_smell.entity.UserEntity; 4 | 5 | public interface UserRepository { 6 | 7 | void saveUser(UserEntity entity); 8 | } 9 | -------------------------------------------------------------------------------- /dependency-inversion/src/main/java/org/youngmonkeys/di/v1/ioc/Main.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.di.v1.ioc; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | Library library = new Library(); 6 | System.out.println(library.sum(1, 2)); 7 | } 8 | } -------------------------------------------------------------------------------- /dont-forget-security/src/main/java/org/youngmonkeys/dfs/validator/PasswordManager.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.dfs.validator; 2 | 3 | public class PasswordManager { 4 | 5 | public boolean isMatchPassword(String password, String hashPassword) { 6 | return false; 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /refactoring-spring-web-mvc/src/main/java/org/youngmonkeys/refactoring/v1/service/GreetService.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.refactoring.v1.service; 2 | 3 | public class GreetService { 4 | 5 | public String greet(String name) { 6 | return "Greet " + name + "!"; 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /single-responsibility/src/main/java/org/youngmonkeys/sr/v1/exception/UserAuthException.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.sr.v1.exception; 2 | 3 | public class UserAuthException extends RuntimeException { 4 | 5 | public UserAuthException(String msg) { 6 | super(msg); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /sql-carefully/src/main/java/com/tvd12/ezydata/example/jpa/exception/NotFoundException.java: -------------------------------------------------------------------------------- 1 | package com.tvd12.ezydata.example.jpa.exception; 2 | 3 | public class NotFoundException extends RuntimeException { 4 | public NotFoundException(String msg) { 5 | super(msg); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /unit-test/src/test/resources/AllTests.tng.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /interface-segregation/src/main/java/org/youngmonkeys/is/v2/SmartWatch.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.is.v2; 2 | 3 | public interface SmartWatch extends Watch { 4 | void charge(); 5 | 6 | void installApp(); 7 | 8 | void openMediaPlayer(); 9 | 10 | void openPhoneCall(); 11 | } -------------------------------------------------------------------------------- /single-responsibility/src/main/java/org/youngmonkeys/sr/example/v2/Programmer.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.sr.example.v2; 2 | 3 | public class Programmer { 4 | public void analyzeRequirements() {} 5 | 6 | public void designSystem() {} 7 | 8 | public void coding() {} 9 | } 10 | -------------------------------------------------------------------------------- /single-responsibility/src/main/java/org/youngmonkeys/sr/v1/exception/UserLoginException.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.sr.v1.exception; 2 | 3 | public class UserLoginException extends RuntimeException { 4 | 5 | public UserLoginException(String msg) { 6 | super(msg); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /single-responsibility/src/main/java/org/youngmonkeys/sr/v1/security/SecurityContextHolder.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.sr.v1.security; 2 | 3 | public class SecurityContextHolder { 4 | 5 | public static SecurityContext getContext() { 6 | return new SecurityContext(); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /composition-over-inheritance/src/main/java/org/youngmonkeys/coi/request/UpdateUserRequest.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.coi.request; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | @Getter 7 | @Setter 8 | public class UpdateUserRequest { 9 | private String name; 10 | } 11 | -------------------------------------------------------------------------------- /document-your-code/src/main/java/org/youngmonkeys/dyc/model/PageToken.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.dyc.model; 2 | 3 | import lombok.Builder; 4 | import lombok.Getter; 5 | 6 | @Getter 7 | @Builder 8 | public class PageToken { 9 | private String next; 10 | private String prev; 11 | } 12 | -------------------------------------------------------------------------------- /dont-forget-security/src/test/resources/AllTests.tng.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /keep-it-simple-stupid/src/main/java/org/youngmonkeys/kiss/reduce_if_else/model/UserModel.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.kiss.reduce_if_else.model; 2 | 3 | import lombok.Getter; 4 | 5 | @Getter 6 | public class UserModel { 7 | private long userId; 8 | private UserStatus status; 9 | } 10 | -------------------------------------------------------------------------------- /sql-carefully/src/main/java/com/tvd12/ezydata/example/jpa/data/AddAuthorData.java: -------------------------------------------------------------------------------- 1 | package com.tvd12.ezydata.example.jpa.data; 2 | 3 | import lombok.Builder; 4 | import lombok.Getter; 5 | 6 | @Getter 7 | @Builder 8 | public class AddAuthorData { 9 | private final String authorName; 10 | } 11 | -------------------------------------------------------------------------------- /sql-carefully/src/main/java/com/tvd12/ezydata/example/jpa/request/AddAuthorRequest.java: -------------------------------------------------------------------------------- 1 | package com.tvd12.ezydata.example.jpa.request; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | @Getter 7 | @Setter 8 | public class AddAuthorRequest { 9 | private String authorName; 10 | } -------------------------------------------------------------------------------- /composition-over-inheritance/src/main/java/org/youngmonkeys/coi/model/UserModel.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.coi.model; 2 | 3 | import lombok.Builder; 4 | import lombok.Getter; 5 | 6 | @Builder 7 | @Getter 8 | public class UserModel { 9 | private long id; 10 | private String name; 11 | } 12 | -------------------------------------------------------------------------------- /dont-forget-security/src/main/java/org/youngmonkeys/dfs/shell/Command.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.dfs.shell; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | @Getter 7 | @Setter 8 | public class Command { 9 | private String command; 10 | private String[] arguments; 11 | } 12 | -------------------------------------------------------------------------------- /dont-forget-security/src/main/java/org/youngmonkeys/dfs/xss/request/ValidateHtmlRequest.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.dfs.xss.request; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | @Getter 7 | @Setter 8 | public class ValidateHtmlRequest { 9 | private String html; 10 | } 11 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/chat/chat-common/src/test/java/org/youngmonkeys/chat/common/test/CommonTest.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.chat.common.test; 2 | 3 | import org.testng.annotations.Test; 4 | 5 | public class CommonTest { 6 | 7 | @Test 8 | public void test() {} 9 | } 10 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/chat/chat-plugin/src/test/java/org/youngmonkeys/chat/plugin/test/PluginTest.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.chat.plugin.test; 2 | 3 | import org.testng.annotations.Test; 4 | 5 | public class PluginTest { 6 | 7 | @Test 8 | public void test() {} 9 | } 10 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/game/game-common/src/test/java/org/youngmonkeys/game/common/test/CommonTest.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.game.common.test; 2 | 3 | import org.testng.annotations.Test; 4 | 5 | public class CommonTest { 6 | 7 | @Test 8 | public void test() {} 9 | } 10 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/game/game-plugin/src/test/java/org/youngmonkeys/game/plugin/test/PluginTest.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.game.plugin.test; 2 | 3 | import org.testng.annotations.Test; 4 | 5 | public class PluginTest { 6 | 7 | @Test 8 | public void test() {} 9 | } 10 | -------------------------------------------------------------------------------- /separation-of-concerns/src/main/java/org/youngmonkeys/soc/v1/Main.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.soc.v1; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | new Game1().startGame1(); 6 | new Game2().startGame2(); 7 | new Game3().startGame3(); 8 | } 9 | } -------------------------------------------------------------------------------- /single-responsibility/src/main/java/org/youngmonkeys/sr/v2/request/UpdateAvatarRequest.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.sr.v2.request; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | @Getter 7 | @Setter 8 | public class UpdateAvatarRequest { 9 | private long newAvatarId; 10 | } 11 | -------------------------------------------------------------------------------- /sql-carefully/src/main/java/com/tvd12/ezydata/example/jpa/request/AddCategoryRequest.java: -------------------------------------------------------------------------------- 1 | package com.tvd12.ezydata.example.jpa.request; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | @Getter 7 | @Setter 8 | public class AddCategoryRequest { 9 | private String categoryName; 10 | } -------------------------------------------------------------------------------- /single-responsibility/src/main/java/org/youngmonkeys/sr/v1/security/SecurityContext.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.sr.v1.security; 2 | 3 | import org.youngmonkeys.sr.v1.model.Authentication; 4 | 5 | public class SecurityContext { 6 | 7 | public void setAuthentication(Authentication authentication) {} 8 | } 9 | -------------------------------------------------------------------------------- /sql-carefully/src/main/java/com/tvd12/ezydata/example/jpa/data/AddCategoryData.java: -------------------------------------------------------------------------------- 1 | package com.tvd12.ezydata.example.jpa.data; 2 | 3 | import lombok.Builder; 4 | import lombok.Getter; 5 | 6 | @Getter 7 | @Builder 8 | public class AddCategoryData { 9 | private final String categoryName; 10 | } 11 | -------------------------------------------------------------------------------- /sql-carefully/src/main/java/com/tvd12/ezydata/example/jpa/exception/BookNotFoundException.java: -------------------------------------------------------------------------------- 1 | package com.tvd12.ezydata.example.jpa.exception; 2 | 3 | public class BookNotFoundException extends NotFoundException { 4 | 5 | public BookNotFoundException(String msg) { 6 | super(msg); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /dont-forget-security/client/src/main.tsx: -------------------------------------------------------------------------------- 1 | import { StrictMode } from 'react' 2 | import { createRoot } from 'react-dom/client' 3 | import './index.css' 4 | import App from './App.tsx' 5 | 6 | createRoot(document.getElementById('root')!).render( 7 | 8 | 9 | , 10 | ) 11 | -------------------------------------------------------------------------------- /sql-carefully/src/main/java/com/tvd12/ezydata/example/jpa/exception/AuthorNotFoundException.java: -------------------------------------------------------------------------------- 1 | package com.tvd12.ezydata.example.jpa.exception; 2 | 3 | public class AuthorNotFoundException extends NotFoundException { 4 | 5 | public AuthorNotFoundException(String msg) { 6 | super(msg); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /sql-carefully/src/main/java/com/tvd12/ezydata/example/jpa/exception/DuplicatedBookException.java: -------------------------------------------------------------------------------- 1 | package com.tvd12.ezydata.example.jpa.exception; 2 | 3 | public class DuplicatedBookException extends IllegalArgumentException { 4 | public DuplicatedBookException(String msg) { 5 | super(msg); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /you-arent-going-to-need-it/src/main/java/org/youngmonkeys/yagni/v1/dto/BaseDTO.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.yagni.v1.dto; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | @Getter 7 | @Setter 8 | public class BaseDTO { 9 | private long createdAt; 10 | private long updatedAt; 11 | } 12 | -------------------------------------------------------------------------------- /copilot-example/src/main/java/org/youngmonkeys/copilot/example/response/LoginResponse.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.copilot.example.response; 2 | 3 | import lombok.Builder; 4 | import lombok.Getter; 5 | 6 | @Getter 7 | @Builder 8 | public class LoginResponse { 9 | private final String accessToken; 10 | } 11 | -------------------------------------------------------------------------------- /document-your-code/src/main/java/org/youngmonkeys/dyc/model/Continuation.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.dyc.model; 2 | 3 | import lombok.Builder; 4 | import lombok.Getter; 5 | 6 | @Getter 7 | @Builder 8 | public class Continuation { 9 | private boolean hasNext; 10 | private boolean hasPrevious; 11 | } 12 | -------------------------------------------------------------------------------- /single-responsibility/src/main/java/org/youngmonkeys/sr/v1/request/LoginRequest.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.sr.v1.request; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | @Getter 7 | @Setter 8 | public class LoginRequest { 9 | private String email; 10 | private String password; 11 | } 12 | -------------------------------------------------------------------------------- /sql-carefully/src/main/java/com/tvd12/ezydata/example/jpa/data/AuthorData.java: -------------------------------------------------------------------------------- 1 | package com.tvd12.ezydata.example.jpa.data; 2 | 3 | import lombok.Builder; 4 | import lombok.Getter; 5 | 6 | @Getter 7 | @Builder 8 | public class AuthorData { 9 | private final long id; 10 | private final String name; 11 | } 12 | -------------------------------------------------------------------------------- /sql-carefully/src/main/java/com/tvd12/ezydata/example/jpa/exception/CategoryNotFoundException.java: -------------------------------------------------------------------------------- 1 | package com.tvd12.ezydata.example.jpa.exception; 2 | 3 | public class CategoryNotFoundException extends NotFoundException { 4 | 5 | public CategoryNotFoundException(String msg) { 6 | super(msg); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /sql-carefully/src/main/java/com/tvd12/ezydata/example/jpa/exception/InvalidAuthorIdException.java: -------------------------------------------------------------------------------- 1 | package com.tvd12.ezydata.example.jpa.exception; 2 | 3 | public class InvalidAuthorIdException extends IllegalArgumentException { 4 | public InvalidAuthorIdException(String msg) { 5 | super(msg); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /dependency-inversion/src/main/java/org/youngmonkeys/di/v2/dependencies_injection/MyRepository.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.di.v2.dependencies_injection; 2 | 3 | import com.tvd12.ezyfox.bean.annotation.EzySingleton; 4 | 5 | @EzySingleton 6 | public class MyRepository { 7 | 8 | public void doSomething() {} 9 | } 10 | -------------------------------------------------------------------------------- /open-close/src/main/java/org/youngmonkeys/oc/v2/response/UserResponseV2.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.oc.v2.response; 2 | 3 | import lombok.Builder; 4 | import lombok.Getter; 5 | 6 | @Getter 7 | @Builder 8 | public class UserResponseV2 { 9 | private String displayName; 10 | private String avatarUrl; 11 | } 12 | -------------------------------------------------------------------------------- /sql-carefully/src/main/java/com/tvd12/ezydata/example/jpa/data/CategoryData.java: -------------------------------------------------------------------------------- 1 | package com.tvd12.ezydata.example.jpa.data; 2 | 3 | import lombok.Builder; 4 | import lombok.Getter; 5 | 6 | @Getter 7 | @Builder 8 | public class CategoryData { 9 | private final long id; 10 | private final String name; 11 | } 12 | -------------------------------------------------------------------------------- /sql-carefully/src/main/java/com/tvd12/ezydata/example/jpa/exception/InvalidCategoryIdException.java: -------------------------------------------------------------------------------- 1 | package com.tvd12.ezydata.example.jpa.exception; 2 | 3 | public class InvalidCategoryIdException extends IllegalArgumentException { 4 | public InvalidCategoryIdException(String msg) { 5 | super(msg); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /dont-forget-security/src/main/java/org/youngmonkeys/dfs/logger/LoggerConsoleAppender.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.dfs.logger; 2 | 3 | public class LoggerConsoleAppender implements LoggerAppender { 4 | 5 | @Override 6 | public void append(String message) { 7 | System.out.println(message); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /interface-segregation/src/main/java/org/youngmonkeys/is/v2/MechanicalWatchImpl.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.is.v2; 2 | 3 | public class MechanicalWatchImpl implements MechanicalWatch { 4 | 5 | @Override 6 | public void watch() {} 7 | 8 | @Override 9 | public void automaticWindingUpTheThread() {} 10 | } 11 | -------------------------------------------------------------------------------- /log-strategy/src/main/java/org/youngmonkeys/ls/model/UserModel.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.ls.model; 2 | 3 | import lombok.Builder; 4 | import lombok.Getter; 5 | 6 | @Getter 7 | @Builder 8 | public class UserModel { 9 | private long id; 10 | private String username; 11 | private String displayName; 12 | } 13 | -------------------------------------------------------------------------------- /sql-carefully/src/main/java/com/tvd12/ezydata/example/jpa/exception/DuplicatedCategoryException.java: -------------------------------------------------------------------------------- 1 | package com.tvd12.ezydata.example.jpa.exception; 2 | 3 | public class DuplicatedCategoryException extends IllegalArgumentException { 4 | public DuplicatedCategoryException(String msg) { 5 | super(msg); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /write-dry-code/src/main/java/org/youngmonkeys/wdc/duplicated_logic/v1/exception/PostNotFoundException.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.wdc.duplicated_logic.v1.exception; 2 | 3 | public class PostNotFoundException extends RuntimeException { 4 | 5 | public PostNotFoundException(String msg) { 6 | super(msg); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /single-responsibility/src/main/java/org/youngmonkeys/sr/v1/provider/TokenProvider.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.sr.v1.provider; 2 | 3 | import com.tvd12.ezyfox.bean.annotation.EzySingleton; 4 | 5 | @EzySingleton 6 | public class TokenProvider { 7 | public long getExpiryDuration() { 8 | return 0L; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /clean-code/src/main/java/org/youngmonkeys/cc/v2/model/CreateUserModel.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.cc.v2.model; 2 | 3 | import lombok.Builder; 4 | import lombok.Getter; 5 | 6 | @Getter 7 | @Builder 8 | public class CreateUserModel { 9 | private String username; 10 | private String email; 11 | private String password; 12 | } -------------------------------------------------------------------------------- /copilot-example/src/main/java/org/youngmonkeys/copilot/example/request/LoginRequest.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.copilot.example.request; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | @Getter 7 | @Setter 8 | public class LoginRequest { 9 | private String username; 10 | private String password; 11 | } 12 | -------------------------------------------------------------------------------- /sql-carefully/src/main/java/com/tvd12/ezydata/example/jpa/response/AuthorResponse.java: -------------------------------------------------------------------------------- 1 | package com.tvd12.ezydata.example.jpa.response; 2 | 3 | import lombok.Builder; 4 | import lombok.Getter; 5 | 6 | @Getter 7 | @Builder 8 | public class AuthorResponse { 9 | private final long id; 10 | private final String name; 11 | } 12 | -------------------------------------------------------------------------------- /sql-carefully/src/main/java/com/tvd12/ezydata/example/jpa/response/CategoryResponse.java: -------------------------------------------------------------------------------- 1 | package com.tvd12.ezydata.example.jpa.response; 2 | 3 | import lombok.Builder; 4 | import lombok.Getter; 5 | 6 | @Getter 7 | @Builder 8 | public class CategoryResponse { 9 | private final long id; 10 | private final String name; 11 | } 12 | -------------------------------------------------------------------------------- /write-dry-code/src/main/java/org/youngmonkeys/wdc/duplicated_method/v1/model/AddPageModel.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.wdc.duplicated_method.v1.model; 2 | 3 | import lombok.Getter; 4 | 5 | @Getter 6 | public class AddPageModel { 7 | private String title; 8 | private String content; 9 | private long categoryId; 10 | } 11 | -------------------------------------------------------------------------------- /write-dry-code/src/main/java/org/youngmonkeys/wdc/duplicated_method/v1/model/AddPostModel.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.wdc.duplicated_method.v1.model; 2 | 3 | import lombok.Getter; 4 | 5 | @Getter 6 | public class AddPostModel { 7 | private String title; 8 | private String content; 9 | private long categoryId; 10 | } 11 | -------------------------------------------------------------------------------- /sql-carefully/scripts/create-table-user.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE IF NOT EXISTS `jpa_example_user` ( 2 | `userId` INT AUTO_INCREMENT, 3 | `password` VARCHAR(45), 4 | `fullName` VARCHAR(45), 5 | `type` VARCHAR(45), 6 | `email` VARCHAR(45), 7 | PRIMARY KEY (`userId`) 8 | ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -------------------------------------------------------------------------------- /keep-it-simple-stupid/src/main/java/org/youngmonkeys/kiss/reduce_if_else/request/AddPostRequest.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.kiss.reduce_if_else.request; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | @Getter 7 | @Setter 8 | public class AddPostRequest { 9 | private String title; 10 | private String content; 11 | } 12 | -------------------------------------------------------------------------------- /liskov-substitution/src/main/java/org/youngmonkeys/ls/paint/Position.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.ls.paint; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | import lombok.ToString; 6 | 7 | @Getter 8 | @ToString 9 | @AllArgsConstructor 10 | public class Position { 11 | private int x; 12 | private int y; 13 | } 14 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/chat/chat-app-api/src/main/java/org/youngmonkeys/chat/app/constant/Commands.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.chat.app.constant; 2 | 3 | public final class Commands { 4 | 5 | public static final String HELLO = "hello"; 6 | public static final String GO = "go"; 7 | 8 | private Commands() {} 9 | } 10 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/game/game-app-api/src/main/java/org/youngmonkeys/game/app/constant/Commands.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.game.app.constant; 2 | 3 | public final class Commands { 4 | 5 | public static final String HELLO = "hello"; 6 | public static final String GO = "go"; 7 | 8 | private Commands() {} 9 | } 10 | -------------------------------------------------------------------------------- /sql-carefully/src/main/resources/application.yaml: -------------------------------------------------------------------------------- 1 | server: 2 | port: 8080 3 | datasource: 4 | jdbcUrl: jdbc:mysql://root:12345678@localhost:3306/test 5 | driverClassName: com.mysql.cj.jdbc.Driver 6 | hibernate: 7 | show_sql: true 8 | format_sql: true 9 | dialect: org.hibernate.dialect.MySQLDialect 10 | hbm2ddl: 11 | auto: update -------------------------------------------------------------------------------- /you-arent-going-to-need-it/src/main/java/org/youngmonkeys/yagni/v2/request/UpdateUserRequest.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.yagni.v2.request; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | @Getter 7 | @Setter 8 | public class UpdateUserRequest { 9 | private String displayName; 10 | private String avatarUrl; 11 | } 12 | -------------------------------------------------------------------------------- /dont-forget-security/src/main/java/org/youngmonkeys/dfs/logger/UserData.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.dfs.logger; 2 | 3 | import lombok.Builder; 4 | import lombok.Getter; 5 | 6 | @Getter 7 | @Builder 8 | public class UserData { 9 | private final long id; 10 | private final String username; 11 | private final String password; 12 | } 13 | -------------------------------------------------------------------------------- /liskov-substitution/src/main/java/org/youngmonkeys/ls/paint/Size.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.ls.paint; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | import lombok.ToString; 6 | 7 | @Getter 8 | @ToString 9 | @AllArgsConstructor 10 | public class Size { 11 | private int width; 12 | private int height; 13 | } 14 | -------------------------------------------------------------------------------- /composition-over-inheritance/src/main/java/org/youngmonkeys/coi/response/UserResponse.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.coi.response; 2 | 3 | import lombok.Builder; 4 | import lombok.Getter; 5 | 6 | @Builder 7 | @Getter 8 | public class UserResponse { 9 | private long id; 10 | private String name; 11 | 12 | private String phoneNumber; 13 | } 14 | -------------------------------------------------------------------------------- /dependency-inversion/src/main/java/org/youngmonkeys/di/scheduler/DoSomethingWorker.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.di.scheduler; 2 | 3 | import org.youngmonkeys.scheduler.Worker; 4 | 5 | public class DoSomethingWorker extends Worker { 6 | @Override 7 | protected void doRun() { 8 | System.out.println("do something"); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /interface-segregation/src/main/java/org/youngmonkeys/is/v1/Watch.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.is.v1; 2 | 3 | public interface Watch { 4 | 5 | void watch(); 6 | 7 | void automaticWindingUpTheThread(); 8 | 9 | void charge(); 10 | 11 | void installApp(); 12 | 13 | void openMediaPlayer(); 14 | 15 | void openPhoneCall(); 16 | } -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/chat/build.sh: -------------------------------------------------------------------------------- 1 | #export EZYFOX_SERVER_HOME= 2 | mvn -pl . clean install 3 | mvn -pl chat-common -Pexport clean install 4 | mvn -pl chat-app-api -Pexport clean install 5 | mvn -pl chat-app-entry -Pexport clean install 6 | mvn -pl chat-plugin -Pexport clean install 7 | cp chat-zone-settings.xml $EZYFOX_SERVER_HOME/settings/zones/ 8 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/chat/chat-app-api/src/test/resources/AllTests.tng.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/chat/chat-startup/src/test/resources/AllTests.tng.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/game/build.sh: -------------------------------------------------------------------------------- 1 | #export EZYFOX_SERVER_HOME= 2 | mvn -pl . clean install 3 | mvn -pl game-common -Pexport clean install 4 | mvn -pl game-app-api -Pexport clean install 5 | mvn -pl game-app-entry -Pexport clean install 6 | mvn -pl game-plugin -Pexport clean install 7 | cp game-zone-settings.xml $EZYFOX_SERVER_HOME/settings/zones/ 8 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/game/game-app-api/src/test/resources/AllTests.tng.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/game/game-startup/src/test/resources/AllTests.tng.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /you-arent-going-to-need-it/src/main/java/org/youngmonkeys/yagni/v2/model/UserModel.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.yagni.v2.model; 2 | 3 | import lombok.Builder; 4 | import lombok.Getter; 5 | 6 | @Builder 7 | @Getter 8 | public class UserModel { 9 | private long userId; 10 | private String displayName; 11 | private String avatarUrl; 12 | } 13 | -------------------------------------------------------------------------------- /clean-code/src/main/java/org/youngmonkeys/cc/v2/entity/UserRoleId.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.cc.v2.entity; 2 | 3 | import java.io.Serializable; 4 | 5 | import lombok.Getter; 6 | import lombok.Setter; 7 | 8 | @Getter 9 | @Setter 10 | public class UserRoleId implements Serializable { 11 | private long userId; 12 | private long roleId; 13 | } 14 | -------------------------------------------------------------------------------- /refactoring-spring-boot/src/main/java/org/youngmonkeys/refactoring/v2/service/GreetService.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.refactoring.v2.service; 2 | 3 | import org.springframework.stereotype.Service; 4 | 5 | @Service 6 | public class GreetService { 7 | 8 | public String greet(String name) { 9 | return "Greet " + name + "!"; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/chat/chat-common/src/main/java/org/youngmonkeys/chat/common/constant/CommonConstants.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.chat.common.constant; 2 | 3 | public final class CommonConstants { 4 | 5 | public static final String PLUGIN_PROPERTIES = "org.youngmonkeys.chat.PluginProperties"; 6 | 7 | private CommonConstants() {} 8 | } 9 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/chat/chat-common/src/test/resources/AllTests.tng.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/game/game-common/src/main/java/org/youngmonkeys/game/common/constant/CommonConstants.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.game.common.constant; 2 | 3 | public final class CommonConstants { 4 | 5 | public static final String PLUGIN_PROPERTIES = "org.youngmonkeys.game.PluginProperties"; 6 | 7 | private CommonConstants() {} 8 | } 9 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/game/game-common/src/test/resources/AllTests.tng.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /you-arent-going-to-need-it/src/main/java/org/youngmonkeys/yagni/v1/dto/UserDTO.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.yagni.v1.dto; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | @Getter 7 | @Setter 8 | public class UserDTO extends BaseDTO { 9 | private long userId; 10 | private String displayName; 11 | private String avatarUrl; 12 | } 13 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/chat/chat-app-api/src/main/java/org/youngmonkeys/chat/app/request/GoRequest.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.chat.app.request; 2 | 3 | import com.tvd12.ezyfox.binding.annotation.EzyObjectBinding; 4 | import lombok.Data; 5 | 6 | @Data 7 | @EzyObjectBinding 8 | public class GoRequest { 9 | private String nickName; 10 | } 11 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/chat/chat-app-entry/src/test/resources/AllTests.tng.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/chat/chat-plugin/src/test/resources/AllTests.tng.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/game/game-app-api/src/main/java/org/youngmonkeys/game/app/request/GoRequest.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.game.app.request; 2 | 3 | import com.tvd12.ezyfox.binding.annotation.EzyObjectBinding; 4 | import lombok.Data; 5 | 6 | @Data 7 | @EzyObjectBinding 8 | public class GoRequest { 9 | private String nickName; 10 | } 11 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/game/game-app-entry/src/test/resources/AllTests.tng.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/game/game-plugin/src/test/resources/AllTests.tng.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /clean-code/src/main/java/org/youngmonkeys/cc/v1/model/RoleName.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.cc.v1.model; 2 | 3 | /** 4 | * The enum Role role. 5 | */ 6 | public enum RoleName { 7 | 8 | /** 9 | * Role admin authority role. 10 | */ 11 | ROLE_ADMIN, 12 | 13 | /** 14 | * Role user authority role. 15 | */ 16 | ROLE_USER 17 | } 18 | -------------------------------------------------------------------------------- /clean-code/src/test/resources/AllTests.tng.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /code-smell/src/test/resources/AllTests.tng.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /interface-segregation/src/main/java/org/youngmonkeys/is/db/DatabaseRepository.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.is.db; 2 | 3 | import java.util.Collection; 4 | 5 | public interface DatabaseRepository { 6 | 7 | void save(E entity); 8 | 9 | void save(Collection entities); 10 | 11 | E findById(I id); 12 | 13 | void deleteById(I id); 14 | } 15 | -------------------------------------------------------------------------------- /keep-it-simple-stupid/src/main/java/org/youngmonkeys/kiss/simplify_unit_testing/repo/UserRepository.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.kiss.simplify_unit_testing.repo; 2 | 3 | import java.util.List; 4 | 5 | import org.youngmonkeys.kiss.simplify_unit_testing.entity.User; 6 | 7 | public interface UserRepository { 8 | 9 | List findByIdIn(List ids); 10 | } 11 | -------------------------------------------------------------------------------- /liskov-substitution/src/main/java/org/youngmonkeys/ls/paint/v1/Rectangle.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.ls.paint.v1; 2 | 3 | import org.youngmonkeys.ls.paint.Position; 4 | import org.youngmonkeys.ls.paint.Size; 5 | 6 | public class Rectangle extends Shape { 7 | public Rectangle(Position position, Size size) { 8 | super(position, size); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /liskov-substitution/src/main/java/org/youngmonkeys/ls/paint/v2/Rectangle.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.ls.paint.v2; 2 | 3 | import org.youngmonkeys.ls.paint.Position; 4 | import org.youngmonkeys.ls.paint.Size; 5 | 6 | public class Rectangle extends Shape { 7 | public Rectangle(Position position, Size size) { 8 | super(position, size); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /log-strategy/src/test/resources/AllTests.tng.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/chat/chat-app-api/src/main/java/org/youngmonkeys/chat/app/request/HelloRequest.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.chat.app.request; 2 | 3 | import com.tvd12.ezyfox.binding.annotation.EzyObjectBinding; 4 | import lombok.Data; 5 | 6 | @Data 7 | @EzyObjectBinding 8 | public class HelloRequest { 9 | private String nickName; 10 | } 11 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/game/game-app-api/src/main/java/org/youngmonkeys/game/app/request/HelloRequest.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.game.app.request; 2 | 3 | import com.tvd12.ezyfox.binding.annotation.EzyObjectBinding; 4 | import lombok.Data; 5 | 6 | @Data 7 | @EzyObjectBinding 8 | public class HelloRequest { 9 | private String nickName; 10 | } 11 | -------------------------------------------------------------------------------- /write-dry-code/src/main/java/org/youngmonkeys/wdc/duplicated_initiation/v1/model/UserModel.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.wdc.duplicated_initiation.v1.model; 2 | 3 | import lombok.Getter; 4 | 5 | @Getter 6 | public class UserModel { 7 | private long id; 8 | private String uuid; 9 | private String displayName; 10 | private String profileUrl; 11 | } 12 | -------------------------------------------------------------------------------- /you-arent-going-to-need-it/src/main/java/org/youngmonkeys/yagni/v2/response/UserResponse.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.yagni.v2.response; 2 | 3 | import lombok.Builder; 4 | import lombok.Getter; 5 | 6 | @Builder 7 | @Getter 8 | public class UserResponse { 9 | private long userId; 10 | private String displayName; 11 | private String avatarUrl; 12 | } 13 | -------------------------------------------------------------------------------- /copilot-example/src/test/resources/AllTests.tng.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /document-your-code/src/main/java/org/youngmonkeys/dyc/pagination/PostPaginationParameter.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.dyc.pagination; 2 | 3 | public interface PostPaginationParameter extends PaginationParameter { 4 | String paginationCondition(boolean nextPage); 5 | 6 | String orderBy(boolean nextPage); 7 | 8 | PostPaginationSortOrder sortOrder(); 9 | } 10 | -------------------------------------------------------------------------------- /code-smell/src/main/java/org/youngmonkeys/code_smell/entity/UserEntity.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.code_smell.entity; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | @Getter 7 | @Setter 8 | public class UserEntity { 9 | private String username; 10 | private String password; 11 | private String displayName; 12 | private String email; 13 | } 14 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/chat/build.bat: -------------------------------------------------------------------------------- 1 | :: set EZYFOX_SERVER_HOME= 2 | mvn -pl . clean install & ^ 3 | mvn -pl chat-common -Pexport clean install & ^ 4 | mvn -pl chat-app-api -Pexport clean install & ^ 5 | mvn -pl chat-app-entry -Pexport clean install & ^ 6 | mvn -pl chat-plugin -Pexport clean install & ^ 7 | copy chat-zone-settings.xml %EZYFOX_SERVER_HOME%/settings/zones/ 8 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/chat/chat-startup/deploy/console.bat: -------------------------------------------------------------------------------- 1 | 2 | @echo off 3 | set "ezyclasspath=lib\*;settings\*;common\*;apps\common\*;apps\resources\*" 4 | for /D %%d in (plugins\*) do ( 5 | call set "ezyclasspath=%%ezyclasspath%%;%%d\* 6 | ) 7 | echo classpath = %ezyclasspath% 8 | 9 | java %1 -cp %ezyclasspath% org.youngmonkeys.chat.ApplicationStartup 10 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/chat/chat-startup/deploy/console.sh: -------------------------------------------------------------------------------- 1 | 2 | #!/bin/sh 3 | 4 | EZYFOX_SERVER_HOME="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" 5 | echo 'current dir: ' $EZYFOX_SERVER_HOME 6 | CLASSPATH="lib/*:settings/*:common/*:apps/common/*:apps/resources/*" 7 | echo 'classpath: ' $CLASSPATH 8 | java $1 -cp $CLASSPATH org.youngmonkeys.chat.ApplicationStartup 9 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/game/build.bat: -------------------------------------------------------------------------------- 1 | :: set EZYFOX_SERVER_HOME= 2 | mvn -pl . clean install & ^ 3 | mvn -pl game-common -Pexport clean install & ^ 4 | mvn -pl game-app-api -Pexport clean install & ^ 5 | mvn -pl game-app-entry -Pexport clean install & ^ 6 | mvn -pl game-plugin -Pexport clean install & ^ 7 | copy game-zone-settings.xml %EZYFOX_SERVER_HOME%/settings/zones/ 8 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/game/game-startup/deploy/console.bat: -------------------------------------------------------------------------------- 1 | 2 | @echo off 3 | set "ezyclasspath=lib\*;settings\*;common\*;apps\common\*;apps\resources\*" 4 | for /D %%d in (plugins\*) do ( 5 | call set "ezyclasspath=%%ezyclasspath%%;%%d\* 6 | ) 7 | echo classpath = %ezyclasspath% 8 | 9 | java %1 -cp %ezyclasspath% org.youngmonkeys.game.ApplicationStartup 10 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/game/game-startup/deploy/console.sh: -------------------------------------------------------------------------------- 1 | 2 | #!/bin/sh 3 | 4 | EZYFOX_SERVER_HOME="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" 5 | echo 'current dir: ' $EZYFOX_SERVER_HOME 6 | CLASSPATH="lib/*:settings/*:common/*:apps/common/*:apps/resources/*" 7 | echo 'classpath: ' $CLASSPATH 8 | java $1 -cp $CLASSPATH org.youngmonkeys.game.ApplicationStartup 9 | -------------------------------------------------------------------------------- /separation-of-concerns/src/test/resources/AllTests.tng.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /single-responsibility/src/test/resources/AllTests.tng.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /clean-code/src/main/java/org/youngmonkeys/cc/v2/request/RegistrationRequest.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.cc.v2.request; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | @Getter 7 | @Setter 8 | public class RegistrationRequest { 9 | private String username; 10 | private String email; 11 | private String password; 12 | private boolean registerAsAdmin; 13 | } -------------------------------------------------------------------------------- /code-smell/src/main/java/org/youngmonkeys/code_smell/request/AddUserRequest.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.code_smell.request; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | @Getter 7 | @Setter 8 | public class AddUserRequest { 9 | private String username; 10 | private String password; 11 | private String displayName; 12 | private String email; 13 | } 14 | -------------------------------------------------------------------------------- /composition-over-inheritance/src/test/resources/AllTests.tng.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /log-strategy/src/main/java/org/youngmonkeys/ls/repo/UserRepository.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.ls.repo; 2 | 3 | import org.youngmonkeys.ls.entity.User; 4 | 5 | import com.tvd12.ezydata.database.EzyDatabaseRepository; 6 | import com.tvd12.ezyfox.database.annotation.EzyRepository; 7 | 8 | @EzyRepository 9 | public interface UserRepository extends EzyDatabaseRepository {} 10 | -------------------------------------------------------------------------------- /write-dry-code/src/main/java/org/youngmonkeys/wdc/duplicated_logic/v1/entity/Post.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.wdc.duplicated_logic.v1.entity; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | @Getter 7 | @Setter 8 | public class Post { 9 | private long id; 10 | private String title; 11 | private String content; 12 | private PostStatus status; 13 | } 14 | -------------------------------------------------------------------------------- /clean-code/src/main/java/org/youngmonkeys/cc/v1/repo/RoleRepository.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.cc.v1.repo; 2 | 3 | import org.youngmonkeys.cc.v1.model.Role; 4 | 5 | import com.tvd12.ezydata.database.EzyDatabaseRepository; 6 | import com.tvd12.ezyfox.database.annotation.EzyRepository; 7 | 8 | @EzyRepository 9 | public interface RoleRepository extends EzyDatabaseRepository {} 10 | -------------------------------------------------------------------------------- /clean-code/src/main/java/org/youngmonkeys/cc/v1/repo/UserRepository.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.cc.v1.repo; 2 | 3 | import org.youngmonkeys.cc.v1.model.User; 4 | 5 | import com.tvd12.ezydata.database.EzyDatabaseRepository; 6 | import com.tvd12.ezyfox.database.annotation.EzyRepository; 7 | 8 | @EzyRepository 9 | public interface UserRepository extends EzyDatabaseRepository {} 10 | -------------------------------------------------------------------------------- /dependency-inversion/src/main/java/org/youngmonkeys/di/v1/dependencies_injection/MyController.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.di.v1.dependencies_injection; 2 | 3 | import lombok.AllArgsConstructor; 4 | 5 | @AllArgsConstructor 6 | public class MyController { 7 | private final MyService service; 8 | 9 | public void doSomething() { 10 | service.doSomething(); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /single-responsibility/src/main/java/org/youngmonkeys/sr/v1/service/UserService.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.sr.v1.service; 2 | 3 | import org.youngmonkeys.sr.v1.model.User; 4 | 5 | import com.tvd12.ezyhttp.server.core.annotation.Service; 6 | 7 | @Service 8 | public class UserService { 9 | 10 | public User getUser(String username) { 11 | return new User(); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /write-dry-code/src/main/java/org/youngmonkeys/wdc/duplicated_initiation/v1/response/UserResponse.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.wdc.duplicated_initiation.v1.response; 2 | 3 | import lombok.Builder; 4 | import lombok.Getter; 5 | 6 | @Getter 7 | @Builder 8 | public class UserResponse { 9 | private String uuid; 10 | private String displayName; 11 | private String profileUrl; 12 | } 13 | -------------------------------------------------------------------------------- /clean-code/clean-code.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /clean-code/src/main/java/org/youngmonkeys/cc/v2/repo/RoleRepository.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.cc.v2.repo; 2 | 3 | import org.youngmonkeys.cc.v2.entity.Role; 4 | 5 | import com.tvd12.ezydata.database.EzyDatabaseRepository; 6 | import com.tvd12.ezyfox.database.annotation.EzyRepository; 7 | 8 | @EzyRepository 9 | public interface RoleRepository extends EzyDatabaseRepository {} 10 | -------------------------------------------------------------------------------- /clean-code/src/main/java/org/youngmonkeys/cc/v2/repo/UserRepository.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.cc.v2.repo; 2 | 3 | import org.youngmonkeys.cc.v2.entity.User; 4 | 5 | import com.tvd12.ezydata.database.EzyDatabaseRepository; 6 | import com.tvd12.ezyfox.database.annotation.EzyRepository; 7 | 8 | @EzyRepository 9 | public interface UserRepository extends EzyDatabaseRepository {} 10 | -------------------------------------------------------------------------------- /dont-forget-security/client/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | -------------------------------------------------------------------------------- /dont-forget-security/src/main/java/org/youngmonkeys/dfs/ddos/DdosExampleStartup.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.dfs.ddos; 2 | 3 | import com.tvd12.ezyhttp.server.boot.EzyHttpApplicationBootstrap; 4 | 5 | public class DdosExampleStartup { 6 | 7 | public static void main(String[] args) throws Exception { 8 | EzyHttpApplicationBootstrap.start(DdosExampleStartup.class); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /open-close/src/test/resources/AllTests.tng.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/chat/chat-plugin/src/main/java/org/youngmonkeys/chat/plugin/config/PluginConfig.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.chat.plugin.config; 2 | 3 | import com.tvd12.ezyfox.bean.annotation.EzyPropertiesBean; 4 | import lombok.Data; 5 | 6 | @Data 7 | @EzyPropertiesBean(prefix = "application") 8 | public class PluginConfig { 9 | private String welcomePrefix; 10 | } 11 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/game/game-plugin/src/main/java/org/youngmonkeys/game/plugin/config/PluginConfig.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.game.plugin.config; 2 | 3 | import com.tvd12.ezyfox.bean.annotation.EzyPropertiesBean; 4 | import lombok.Data; 5 | 6 | @Data 7 | @EzyPropertiesBean(prefix = "application") 8 | public class PluginConfig { 9 | private String welcomePrefix; 10 | } 11 | -------------------------------------------------------------------------------- /dependency-inversion/src/main/java/org/youngmonkeys/di/v1/dependencies_injection/MyService.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.di.v1.dependencies_injection; 2 | 3 | import lombok.AllArgsConstructor; 4 | 5 | @AllArgsConstructor 6 | public class MyService { 7 | 8 | private final MyRepository repository; 9 | 10 | public void doSomething() { 11 | repository.doSomething(); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /keep-it-simple-stupid/src/main/java/org/youngmonkeys/kiss/simplify_unit_testing/model/UserModel.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.kiss.simplify_unit_testing.model; 2 | 3 | import lombok.Builder; 4 | import lombok.EqualsAndHashCode; 5 | import lombok.Getter; 6 | 7 | @Getter 8 | @Builder 9 | @EqualsAndHashCode 10 | public class UserModel { 11 | private long id; 12 | private String username; 13 | } 14 | -------------------------------------------------------------------------------- /log-strategy/src/main/java/org/youngmonkeys/ls/service/UserWalletService.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.ls.service; 2 | 3 | import com.tvd12.ezyhttp.server.core.annotation.Service; 4 | 5 | import io.reactivex.rxjava3.core.Single; 6 | 7 | @Service 8 | public class UserWalletService { 9 | 10 | public Single getUserMoney(long userId) { 11 | return Single.just(0L); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /self-comment/src/test/resources/AllTests.tng.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /sql-carefully/src/main/java/com/tvd12/ezydata/example/jpa/ExampleJpaApplication.java: -------------------------------------------------------------------------------- 1 | package com.tvd12.ezydata.example.jpa; 2 | 3 | import com.tvd12.ezyhttp.server.boot.EzyHttpApplicationBootstrap; 4 | 5 | public class ExampleJpaApplication { 6 | public static void main(String[] args) throws Exception { 7 | EzyHttpApplicationBootstrap.start(ExampleJpaApplication.class); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /sql-carefully/src/test/resources/AllTests.tng.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /write-dry-code/src/test/resources/AllTests.tng.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /code-smell/src/main/java/org/youngmonkeys/code_smell/model/SaveUserModel.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.code_smell.model; 2 | 3 | import lombok.Builder; 4 | import lombok.Getter; 5 | 6 | @Getter 7 | @Builder 8 | public class SaveUserModel { 9 | private final String username; 10 | private final String password; 11 | private final String displayName; 12 | private final String email; 13 | } 14 | -------------------------------------------------------------------------------- /dependency-inversion/src/test/resources/AllTests.tng.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /document-your-code/src/test/resources/AllTests.tng.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /dont-forget-security/src/main/java/org/youngmonkeys/dfs/DontForgetSecurityStartup.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.dfs; 2 | 3 | import com.tvd12.ezyhttp.server.boot.EzyHttpApplicationBootstrap; 4 | 5 | public class DontForgetSecurityStartup { 6 | 7 | public static void main(String[] args) throws Exception { 8 | EzyHttpApplicationBootstrap.start(DontForgetSecurityStartup.class); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /hourly-scheduler/src/test/resources/AllTests.tng.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /interface-segregation/src/main/java/org/youngmonkeys/is/db/MongodbRepository.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.is.db; 2 | 3 | import java.util.List; 4 | 5 | public interface MongodbRepository extends DatabaseRepository { 6 | 7 | long increment(String field, long value); 8 | 9 | List aggregateListWithQuery( 10 | String query, 11 | Class result 12 | ); 13 | } 14 | -------------------------------------------------------------------------------- /liskov-substitution/src/test/resources/AllTests.tng.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /write-dry-code/src/main/java/org/youngmonkeys/wdc/duplicated_method/v1/repository/PageRepository.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.wdc.duplicated_method.v1.repository; 2 | 3 | import org.youngmonkeys.wdc.duplicated_method.v1.entity.Page; 4 | 5 | import com.tvd12.ezyfox.bean.annotation.EzySingleton; 6 | 7 | @EzySingleton 8 | public class PageRepository { 9 | 10 | public void save(Page entity) {} 11 | } 12 | -------------------------------------------------------------------------------- /write-dry-code/src/main/java/org/youngmonkeys/wdc/duplicated_method/v1/repository/PostRepository.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.wdc.duplicated_method.v1.repository; 2 | 3 | import org.youngmonkeys.wdc.duplicated_method.v1.entity.Post; 4 | 5 | import com.tvd12.ezyfox.bean.annotation.EzySingleton; 6 | 7 | @EzySingleton 8 | public class PostRepository { 9 | 10 | public void save(Post entity) {} 11 | } 12 | -------------------------------------------------------------------------------- /you-arent-going-to-need-it/src/main/java/org/youngmonkeys/yagni/v2/model/UpdateUserModel.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.yagni.v2.model; 2 | 3 | import org.youngmonkeys.yagni.v1.dto.BaseDTO; 4 | 5 | import lombok.Builder; 6 | import lombok.Getter; 7 | 8 | @Builder 9 | @Getter 10 | public class UpdateUserModel extends BaseDTO { 11 | private String displayName; 12 | private String avatarUrl; 13 | } 14 | -------------------------------------------------------------------------------- /clean-code/src/main/java/org/youngmonkeys/cc/v2/repo/UserRoleRepository.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.cc.v2.repo; 2 | 3 | import org.youngmonkeys.cc.v2.entity.UserRole; 4 | 5 | import com.tvd12.ezydata.database.EzyDatabaseRepository; 6 | import com.tvd12.ezyfox.database.annotation.EzyRepository; 7 | 8 | @EzyRepository 9 | public interface UserRoleRepository extends EzyDatabaseRepository {} 10 | -------------------------------------------------------------------------------- /interface-segregation/src/test/resources/AllTests.tng.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /keep-it-simple-stupid/src/test/resources/AllTests.tng.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /liskov-substitution/src/main/java/org/youngmonkeys/ls/paint/v1/Shape.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.ls.paint.v1; 2 | 3 | import org.youngmonkeys.ls.paint.Position; 4 | import org.youngmonkeys.ls.paint.Size; 5 | 6 | import lombok.AllArgsConstructor; 7 | import lombok.Getter; 8 | 9 | @Getter 10 | @AllArgsConstructor 11 | public class Shape { 12 | private Position position; 13 | private Size size; 14 | } 15 | -------------------------------------------------------------------------------- /refactoring-spring-boot/src/test/resources/AllTests.tng.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /single-responsibility/src/main/java/org/youngmonkeys/sr/v1/response/JwtAuthenticationResponse.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.sr.v1.response; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | 6 | @Getter 7 | @AllArgsConstructor 8 | public class JwtAuthenticationResponse { 9 | private String jwtToken; 10 | private String refreshToken; 11 | private long expiryDuration; 12 | } 13 | -------------------------------------------------------------------------------- /dependency-inversion/src/main/java/org/youngmonkeys/di/scheduler/CountDataWorker.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.di.scheduler; 2 | 3 | import org.youngmonkeys.scheduler.Worker; 4 | 5 | public class CountDataWorker extends Worker { 6 | 7 | @Override 8 | protected void doRun() { 9 | System.out.println( 10 | "data count is: " + System.currentTimeMillis() 11 | ); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /dont-forget-security/src/main/java/org/youngmonkeys/dfs/validator/ChangeUserPasswordRequest.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.dfs.validator; 2 | 3 | 4 | import lombok.Getter; 5 | import lombok.Setter; 6 | 7 | @Getter 8 | @Setter 9 | public class ChangeUserPasswordRequest { 10 | private String token; 11 | private String username; 12 | private String oldPassword; 13 | private String newPassword; 14 | } 15 | -------------------------------------------------------------------------------- /log-strategy/src/main/java/org/youngmonkeys/ls/service/nio/NioUserWalletService.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.ls.service.nio; 2 | 3 | import com.tvd12.ezyhttp.server.core.annotation.Service; 4 | 5 | import io.reactivex.rxjava3.core.Single; 6 | 7 | @Service 8 | public class NioUserWalletService { 9 | 10 | public Single getUserMoney(long userId) { 11 | return Single.just(0L); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /refactoring-spring-web-mvc/src/test/resources/AllTests.tng.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /sql-carefully/README.md: -------------------------------------------------------------------------------- 1 | # ezydata-jpa-example 2 | 3 | an example use ezydata-jp 4 | 5 | ### Setup 6 | 7 | Please take a look `tables.sql` file to get the scripts: 8 | 9 | 1. Create a database named `test` 10 | 2. Add user: `root/12345678` to `test` database 11 | 3. Create tables 12 | 13 | ### Run 14 | 15 | 1. Run main method in class `ExampleJpaApplication` 16 | 2. Use `curl` command in `commands.sh` to call APIs -------------------------------------------------------------------------------- /sql-carefully/src/main/java/com/tvd12/ezydata/example/jpa/result/SumBookPriceResult.java: -------------------------------------------------------------------------------- 1 | package com.tvd12.ezydata.example.jpa.result; 2 | 3 | import com.tvd12.ezyfox.database.annotation.EzyQueryResult; 4 | import lombok.Getter; 5 | import lombok.Setter; 6 | 7 | import java.math.BigDecimal; 8 | 9 | @Getter 10 | @Setter 11 | @EzyQueryResult 12 | public class SumBookPriceResult { 13 | private BigDecimal sum; 14 | } -------------------------------------------------------------------------------- /you-arent-going-to-need-it/src/test/resources/AllTests.tng.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /copilot-example/src/main/java/org/youngmonkeys/copilot/example/service/AuthenticationService.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.copilot.example.service; 2 | 3 | import com.tvd12.ezyhttp.server.core.annotation.Service; 4 | 5 | @Service 6 | public class AuthenticationService { 7 | 8 | public String authenticate(String username, String password) { 9 | return "mocked-access-token-for-" + username; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/chat/chat-app-api/src/main/java/org/youngmonkeys/chat/app/config/AppConfig.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.chat.app.config; 2 | 3 | import com.tvd12.ezyfox.bean.annotation.EzyPropertiesBean; 4 | import lombok.Data; 5 | 6 | @Data 7 | @EzyPropertiesBean(prefix = "application") 8 | public class AppConfig { 9 | private String helloPrefix; 10 | private String goPrefix; 11 | } 12 | 13 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/game/game-app-api/src/main/java/org/youngmonkeys/game/app/config/AppConfig.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.game.app.config; 2 | 3 | import com.tvd12.ezyfox.bean.annotation.EzyPropertiesBean; 4 | import lombok.Data; 5 | 6 | @Data 7 | @EzyPropertiesBean(prefix = "application") 8 | public class AppConfig { 9 | private String helloPrefix; 10 | private String goPrefix; 11 | } 12 | 13 | -------------------------------------------------------------------------------- /single-responsibility/src/main/java/org/youngmonkeys/sr/v2/annotation/Username.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.sr.v2.annotation; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | @Retention(RetentionPolicy.RUNTIME) 9 | @Target({ ElementType.PARAMETER }) 10 | public @interface Username {} -------------------------------------------------------------------------------- /single-responsibility/src/main/java/org/youngmonkeys/sr/v2/service/AuthenticationService.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.sr.v2.service; 2 | 3 | import org.youngmonkeys.sr.v1.model.Authentication; 4 | 5 | public class AuthenticationService { 6 | 7 | public Authentication authenticateUser( 8 | String email, 9 | String password 10 | ) { 11 | return new Authentication(); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /sql-carefully/src/main/java/com/tvd12/ezydata/example/jpa/repository/AuthorRepository.java: -------------------------------------------------------------------------------- 1 | package com.tvd12.ezydata.example.jpa.repository; 2 | 3 | import com.tvd12.ezydata.database.EzyDatabaseRepository; 4 | import com.tvd12.ezydata.example.jpa.entity.Author; 5 | import com.tvd12.ezyfox.database.annotation.EzyRepository; 6 | 7 | @EzyRepository 8 | public interface AuthorRepository extends EzyDatabaseRepository { 9 | } -------------------------------------------------------------------------------- /code-smell/src/main/java/org/youngmonkeys/code_smell/service/SettingService.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.code_smell.service; 2 | 3 | import com.tvd12.ezyhttp.server.core.annotation.Service; 4 | 5 | @Service 6 | public class SettingService { 7 | 8 | public int getDefaultConnectTimeout() { 9 | return 5000; 10 | } 11 | 12 | public int getDefaultReadTimeout() { 13 | return 5000; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /composition-over-inheritance/src/test/resources/logback.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} %msg%n 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /dont-forget-security/src/main/java/org/youngmonkeys/dfs/limit_request_rate/WebWhiteUriIpService.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.dfs.limit_request_rate; 2 | 3 | import com.tvd12.ezyhttp.server.core.annotation.Service; 4 | 5 | import java.util.List; 6 | 7 | @Service 8 | public class WebWhiteUriIpService { 9 | 10 | public boolean isInWhileList(List uris, String ip) { 11 | return false; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/chat/chat-app-api/src/main/java/org/youngmonkeys/chat/app/response/GoResponse.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.chat.app.response; 2 | 3 | import com.tvd12.ezyfox.binding.annotation.EzyObjectBinding; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Data; 6 | 7 | @Data 8 | @AllArgsConstructor 9 | @EzyObjectBinding 10 | public class GoResponse { 11 | private String message; 12 | } 13 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/game/game-app-api/src/main/java/org/youngmonkeys/game/app/response/GoResponse.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.game.app.response; 2 | 3 | import com.tvd12.ezyfox.binding.annotation.EzyObjectBinding; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Data; 6 | 7 | @Data 8 | @AllArgsConstructor 9 | @EzyObjectBinding 10 | public class GoResponse { 11 | private String message; 12 | } 13 | -------------------------------------------------------------------------------- /single-responsibility/src/main/java/org/youngmonkeys/sr/example/v1/Programmer.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.sr.example.v1; 2 | 3 | public class Programmer { 4 | public void communicateWithCustomer() {} 5 | 6 | public void manageProject() {} 7 | 8 | public void analyzeRequirements() {} 9 | 10 | public void designSystem() {} 11 | 12 | public void coding() {} 13 | 14 | public void test() {} 15 | } 16 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/chat/chat-app-api/src/main/java/org/youngmonkeys/chat/app/response/HelloResponse.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.chat.app.response; 2 | 3 | import com.tvd12.ezyfox.binding.annotation.EzyObjectBinding; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Data; 6 | 7 | @Data 8 | @AllArgsConstructor 9 | @EzyObjectBinding 10 | public class HelloResponse { 11 | private String message; 12 | } 13 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/game/game-app-api/src/main/java/org/youngmonkeys/game/app/response/HelloResponse.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.game.app.response; 2 | 3 | import com.tvd12.ezyfox.binding.annotation.EzyObjectBinding; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Data; 6 | 7 | @Data 8 | @AllArgsConstructor 9 | @EzyObjectBinding 10 | public class HelloResponse { 11 | private String message; 12 | } 13 | -------------------------------------------------------------------------------- /composition-over-inheritance/composition-over-inheritance.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /document-your-code/src/main/java/org/youngmonkeys/dyc/pagination/PostTypeFilter.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.dyc.pagination; 2 | 3 | import lombok.Builder; 4 | import lombok.Getter; 5 | 6 | @Getter 7 | @Builder 8 | public class PostTypeFilter implements PostFilter { 9 | 10 | private String postType; 11 | 12 | @Override 13 | public String matchingCondition() { 14 | return "e.postType = :postType"; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /keep-it-simple-stupid/src/main/java/org/youngmonkeys/kiss/reduce_if_else/service/UserService.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.kiss.reduce_if_else.service; 2 | 3 | import org.youngmonkeys.kiss.reduce_if_else.model.UserModel; 4 | 5 | import com.tvd12.ezyhttp.server.core.annotation.Service; 6 | 7 | @Service 8 | public class UserService { 9 | 10 | public UserModel getUserById(long userId) { 11 | return new UserModel(); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /sql-carefully/src/main/java/com/tvd12/ezydata/example/jpa/entity/CommonEntity.java: -------------------------------------------------------------------------------- 1 | package com.tvd12.ezydata.example.jpa.entity; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | import javax.persistence.MappedSuperclass; 7 | import java.time.LocalDateTime; 8 | 9 | @Setter 10 | @Getter 11 | @MappedSuperclass 12 | public class CommonEntity { 13 | private LocalDateTime createdTime; 14 | private LocalDateTime updatedTime; 15 | } 16 | -------------------------------------------------------------------------------- /sql-carefully/src/main/resources/logback.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} %msg%n 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /document-your-code/src/main/java/org/youngmonkeys/dyc/model/PaginationModel.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.dyc.model; 2 | 3 | import java.util.List; 4 | 5 | import lombok.Builder; 6 | import lombok.Getter; 7 | 8 | @Getter 9 | @Builder 10 | public class PaginationModel { 11 | 12 | private List items; 13 | private PageToken pageToken; 14 | private Continuation continuation; 15 | private int count; 16 | private long total; 17 | } 18 | -------------------------------------------------------------------------------- /dont-forget-security/client/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Vite + React + TS 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /keep-it-simple-stupid/src/main/java/org/youngmonkeys/kiss/simplify_unit_testing/entity/User.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.kiss.simplify_unit_testing.entity; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | import lombok.Setter; 7 | 8 | @Getter 9 | @Setter 10 | @AllArgsConstructor 11 | @NoArgsConstructor 12 | public class User { 13 | private long id; 14 | private String username; 15 | } 16 | -------------------------------------------------------------------------------- /dont-forget-security/src/main/java/org/youngmonkeys/dfs/ddos/HomeController.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.dfs.ddos; 2 | 3 | import com.tvd12.ezyhttp.server.core.annotation.Controller; 4 | import com.tvd12.ezyhttp.server.core.annotation.DoGet; 5 | 6 | @Controller 7 | public class HomeController { 8 | 9 | @DoGet("/") 10 | public String home() throws Exception { 11 | Thread.sleep(Integer.MAX_VALUE); 12 | return "home"; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /hourly-scheduler/src/main/java/org/youngmonkeys/scheduler/Worker.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.scheduler; 2 | 3 | import com.tvd12.ezyfox.util.EzyLoggable; 4 | 5 | public abstract class Worker extends EzyLoggable { 6 | 7 | public final void run() { 8 | try { 9 | doRun(); 10 | } catch (Exception e) { 11 | logger.warn("run worker error", e); 12 | } 13 | } 14 | 15 | protected abstract void doRun(); 16 | } 17 | -------------------------------------------------------------------------------- /open-close/src/main/java/org/youngmonkeys/oc/v1/model/UserModel.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.oc.v1.model; 2 | 3 | import lombok.Builder; 4 | import lombok.Getter; 5 | 6 | @Getter 7 | @Builder 8 | public class UserModel { 9 | private String username; 10 | private String email; 11 | private String fullName; 12 | private long birthDay; 13 | private String phoneNumber; 14 | private String nickName; 15 | private String avatarUrl; 16 | } 17 | -------------------------------------------------------------------------------- /self-comment/src/main/java/org/youngmonkeys/sc/v1/converter/EntityToModelConverter.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.sc.v1.converter; 2 | 3 | import org.youngmonkeys.sc.v1.entity.Post; 4 | import org.youngmonkeys.sc.v1.model.PostModel; 5 | 6 | import com.tvd12.ezyfox.bean.annotation.EzySingleton; 7 | 8 | @EzySingleton 9 | public class EntityToModelConverter { 10 | 11 | public PostModel toModel(Post post) { 12 | return new PostModel(); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /you-arent-going-to-need-it/src/main/java/org/youngmonkeys/yagni/v1/service/UserService.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.yagni.v1.service; 2 | 3 | import org.youngmonkeys.yagni.v1.dto.UserDTO; 4 | 5 | import com.tvd12.ezyhttp.server.core.annotation.Service; 6 | 7 | @Service 8 | public class UserService { 9 | 10 | public UserDTO getUserById(long userId) { 11 | return new UserDTO(); 12 | } 13 | 14 | public void updateUser(UserDTO user) {} 15 | } 16 | -------------------------------------------------------------------------------- /dependency-inversion/src/main/java/org/youngmonkeys/di/v2/dependencies_injection/ApplicationStartup.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.di.v2.dependencies_injection; 2 | 3 | import com.tvd12.ezyhttp.server.boot.EzyHttpApplicationBootstrap; 4 | 5 | public class ApplicationStartup { 6 | 7 | public static void main(String[] args) throws Exception { 8 | EzyHttpApplicationBootstrap.start( 9 | ApplicationStartup.class 10 | ); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /dont-forget-security/src/main/java/org/youngmonkeys/dfs/limit_request_rate/WebEzyDefenceSettingService.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.dfs.limit_request_rate; 2 | 3 | import com.tvd12.ezyhttp.server.core.annotation.Service; 4 | 5 | @Service 6 | public class WebEzyDefenceSettingService { 7 | 8 | public long getIpBlockingDuration() { 9 | return 5 * 1000; 10 | } 11 | 12 | public long getMaxRequestPerSecondPerIp() { 13 | return 3; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /interface-segregation/src/main/java/org/youngmonkeys/is/v2/SmartWatchImpl.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.is.v2; 2 | 3 | public class SmartWatchImpl implements SmartWatch { 4 | @Override 5 | public void watch() {} 6 | 7 | @Override 8 | public void charge() {} 9 | 10 | @Override 11 | public void installApp() {} 12 | 13 | @Override 14 | public void openMediaPlayer() {} 15 | 16 | @Override 17 | public void openPhoneCall() {} 18 | } 19 | -------------------------------------------------------------------------------- /single-responsibility/src/main/java/org/youngmonkeys/sr/v2/service/TokenService.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.sr.v2.service; 2 | 3 | import org.youngmonkeys.sr.v1.model.Authentication; 4 | import org.youngmonkeys.sr.v2.model.Token; 5 | 6 | import com.tvd12.ezyhttp.server.core.annotation.Service; 7 | 8 | @Service 9 | public class TokenService { 10 | 11 | public Token createUserToken(Authentication authentication) { 12 | return new Token(); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /dependency-inversion/src/main/java/org/youngmonkeys/di/v2/dependencies_injection/MyController.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.di.v2.dependencies_injection; 2 | 3 | import com.tvd12.ezyhttp.server.core.annotation.Controller; 4 | 5 | import lombok.AllArgsConstructor; 6 | 7 | @Controller 8 | @AllArgsConstructor 9 | public class MyController { 10 | private final MyService service; 11 | 12 | public void doSomething() { 13 | service.doSomething(); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /dependency-inversion/src/main/java/org/youngmonkeys/di/v2/dependencies_injection/MyService.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.di.v2.dependencies_injection; 2 | 3 | import com.tvd12.ezyhttp.server.core.annotation.Service; 4 | 5 | import lombok.AllArgsConstructor; 6 | 7 | @Service 8 | @AllArgsConstructor 9 | public class MyService { 10 | 11 | private final MyRepository repository; 12 | 13 | public void doSomething() { 14 | repository.doSomething(); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /open-close/src/main/java/org/youngmonkeys/oc/v1/response/UserResponse.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.oc.v1.response; 2 | 3 | import lombok.Builder; 4 | import lombok.Getter; 5 | 6 | @Getter 7 | @Builder 8 | public class UserResponse { 9 | private String username; 10 | private String email; 11 | private String fullName; 12 | private long birthDay; 13 | private String phoneNumber; 14 | private String displayName; 15 | private String avatarUrl; 16 | } 17 | -------------------------------------------------------------------------------- /dont-forget-security/src/main/resources/logback.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | %d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /dependency-inversion/src/main/java/org/youngmonkeys/di/v1/dependencies_injection/ApplicationStartup.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.di.v1.dependencies_injection; 2 | 3 | public class ApplicationStartup { 4 | 5 | public static void main(String[] args) { 6 | MyRepository repository = new MyRepository(); 7 | MyService service = new MyService(repository); 8 | MyController controller = new MyController(service); 9 | controller.doSomething(); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /liskov-substitution/src/main/java/org/youngmonkeys/ls/migration/Migrator.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.ls.migration; 2 | 3 | import com.tvd12.ezyfox.util.EzyLoggable; 4 | 5 | public abstract class Migrator extends EzyLoggable { 6 | 7 | public final void migrate() { 8 | try { 9 | doMigrate(); 10 | } catch (Exception e) { 11 | logger.warn("migrate error", e); 12 | } 13 | } 14 | 15 | protected abstract void doMigrate(); 16 | } 17 | -------------------------------------------------------------------------------- /refactoring-spring-boot/src/main/resources/logback.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | %d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/chat/chat-startup/src/main/resources/logback.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} %msg%n 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/game/game-startup/src/main/resources/logback.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} %msg%n 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /sql-carefully/src/main/java/com/tvd12/ezydata/example/jpa/repository/CategoryRepository.java: -------------------------------------------------------------------------------- 1 | package com.tvd12.ezydata.example.jpa.repository; 2 | 3 | import com.tvd12.ezydata.database.EzyDatabaseRepository; 4 | import com.tvd12.ezydata.example.jpa.entity.Category; 5 | import com.tvd12.ezyfox.database.annotation.EzyRepository; 6 | 7 | @EzyRepository 8 | public interface CategoryRepository extends EzyDatabaseRepository { 9 | 10 | Category findByName(String name); 11 | } -------------------------------------------------------------------------------- /document-your-code/src/main/java/org/youngmonkeys/dyc/model/PostModel.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.dyc.model; 2 | 3 | import org.youngmonkeys.dyc.entity.PostStatus; 4 | import org.youngmonkeys.dyc.entity.PostType; 5 | 6 | import lombok.Builder; 7 | import lombok.Getter; 8 | 9 | @Getter 10 | @Builder 11 | public class PostModel { 12 | private long id; 13 | private String title; 14 | private String content; 15 | private PostType type; 16 | private PostStatus status; 17 | } 18 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/chat/chat-common/build.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/chat/chat-plugin/src/main/java/org/youngmonkeys/chat/plugin/PluginEntryLoader.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.chat.plugin; 2 | 3 | import com.tvd12.ezyfoxserver.ext.EzyAbstractPluginEntryLoader; 4 | import com.tvd12.ezyfoxserver.ext.EzyPluginEntry; 5 | 6 | public class PluginEntryLoader extends EzyAbstractPluginEntryLoader { 7 | 8 | @Override 9 | public EzyPluginEntry load() throws Exception { 10 | return new PluginEntry(); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/game/game-common/build.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/game/game-plugin/src/main/java/org/youngmonkeys/game/plugin/PluginEntryLoader.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.game.plugin; 2 | 3 | import com.tvd12.ezyfoxserver.ext.EzyAbstractPluginEntryLoader; 4 | import com.tvd12.ezyfoxserver.ext.EzyPluginEntry; 5 | 6 | public class PluginEntryLoader extends EzyAbstractPluginEntryLoader { 7 | 8 | @Override 9 | public EzyPluginEntry load() throws Exception { 10 | return new PluginEntry(); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /write-dry-code/src/main/java/org/youngmonkeys/wdc/duplicated_logic/v1/repository/PostRepository.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.wdc.duplicated_logic.v1.repository; 2 | 3 | import org.youngmonkeys.wdc.duplicated_logic.v1.entity.Post; 4 | 5 | import com.tvd12.ezyfox.bean.annotation.EzySingleton; 6 | 7 | @EzySingleton 8 | public class PostRepository { 9 | 10 | public void save(Post entity) {} 11 | 12 | public Post findById(long id) { 13 | return new Post(); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /clean-code/src/main/java/org/youngmonkeys/cc/v1/event/ApplicationEvent.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.cc.v1.event; 2 | 3 | import org.youngmonkeys.cc.v1.model.User; 4 | 5 | public class ApplicationEvent { 6 | 7 | private User user; 8 | 9 | public ApplicationEvent(User user) { 10 | this.user = user; 11 | } 12 | 13 | public User getUser() { 14 | return user; 15 | } 16 | 17 | public void setUser(User user) { 18 | this.user = user; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /liskov-substitution/src/main/java/org/youngmonkeys/ls/paint/v2/Shape.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.ls.paint.v2; 2 | 3 | import org.youngmonkeys.ls.paint.Position; 4 | import org.youngmonkeys.ls.paint.Size; 5 | 6 | import lombok.AllArgsConstructor; 7 | import lombok.Getter; 8 | 9 | @Getter 10 | @AllArgsConstructor 11 | public abstract class Shape { 12 | private Position position; 13 | private Size size; 14 | 15 | public boolean isValid() { 16 | return true; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/chat/chat-app-api/build.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/game/game-app-api/build.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /document-your-code/src/main/java/org/youngmonkeys/dyc/pagination/ParameterMapFetcher.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.dyc.pagination; 2 | 3 | import static org.youngmonkeys.dyc.util.ReflectionObjects.getObjectProperties; 4 | 5 | import java.util.Map; 6 | 7 | import com.fasterxml.jackson.annotation.JsonIgnore; 8 | 9 | public interface ParameterMapFetcher { 10 | 11 | @JsonIgnore 12 | default Map getParameters() { 13 | return getObjectProperties(this); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /liskov-substitution/src/main/java/org/youngmonkeys/ls/paint/v2/Square.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.ls.paint.v2; 2 | 3 | import org.youngmonkeys.ls.paint.Position; 4 | import org.youngmonkeys.ls.paint.Size; 5 | 6 | public class Square extends Shape { 7 | public Square(Position position, Size size) { 8 | super(position, size); 9 | } 10 | 11 | @Override 12 | public boolean isValid() { 13 | return getSize().getWidth() == 14 | getSize().getHeight(); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/chat/chat-common/src/main/java/org/youngmonkeys/chat/common/service/CommonService.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.chat.common.service; 2 | 3 | import com.tvd12.ezyfox.bean.annotation.EzySingleton; 4 | 5 | @EzySingleton 6 | public class CommonService { 7 | 8 | public String hello(String prefix, String who) { 9 | return prefix + who + "!"; 10 | } 11 | 12 | public String go(String prefix, String who) { 13 | return prefix + who + "!"; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/game/game-common/src/main/java/org/youngmonkeys/game/common/service/CommonService.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.game.common.service; 2 | 3 | import com.tvd12.ezyfox.bean.annotation.EzySingleton; 4 | 5 | @EzySingleton 6 | public class CommonService { 7 | 8 | public String hello(String prefix, String who) { 9 | return prefix + who + "!"; 10 | } 11 | 12 | public String go(String prefix, String who) { 13 | return prefix + who + "!"; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/chat/chat-startup/assembly.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | bin 4 | false 5 | 6 | dir 7 | 8 | 9 | 10 | 11 | true 12 | lib 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/game/game-startup/assembly.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | bin 4 | false 5 | 6 | dir 7 | 8 | 9 | 10 | 11 | true 12 | lib 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /you-arent-going-to-need-it/src/main/java/org/youngmonkeys/yagni/v2/service/UserService.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.yagni.v2.service; 2 | 3 | import org.youngmonkeys.yagni.v2.model.UpdateUserModel; 4 | import org.youngmonkeys.yagni.v2.model.UserModel; 5 | 6 | public class UserService { 7 | 8 | public UserModel getUserById(long userId) { 9 | return UserModel 10 | .builder() 11 | .build(); 12 | } 13 | 14 | public void updateUser(long userId, UpdateUserModel model) {} 15 | } 16 | -------------------------------------------------------------------------------- /clean-code/src/main/java/org/youngmonkeys/cc/v1/exception/UserRegistrationException.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.cc.v1.exception; 2 | 3 | public class UserRegistrationException extends RuntimeException { 4 | 5 | private final String user; 6 | private final String message; 7 | 8 | public UserRegistrationException(String user, String message) { 9 | super(String.format("Failed to register User[%s] : '%s'", user, message)); 10 | this.user = user; 11 | this.message = message; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /interface-segregation/src/main/java/org/youngmonkeys/is/db/JpaRepository.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.is.db; 2 | 3 | import java.util.Collection; 4 | 5 | public class JpaRepository implements DatabaseRepository { 6 | @Override 7 | public void save(E entity) {} 8 | 9 | @Override 10 | public void save(Collection entities) {} 11 | 12 | @Override 13 | public E findById(I id) { 14 | return null; 15 | } 16 | 17 | @Override 18 | public void deleteById(I id) { 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /dont-forget-security/src/main/java/org/youngmonkeys/dfs/logger/Main.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.dfs.logger; 2 | 3 | public class Main { 4 | 5 | public static void main(String[] args) { 6 | Logger logger = LoggerFactory.getInstance() 7 | .getLogger("test"); 8 | logger.info( 9 | "xin chao", 10 | UserData.builder() 11 | .id(1) 12 | .username("abc") 13 | .password("def") 14 | .build() 15 | ); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /keep-it-simple-stupid/src/main/java/org/youngmonkeys/kiss/reduce_if_else/service/PostService.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.kiss.reduce_if_else.service; 2 | 3 | import com.tvd12.ezyhttp.server.core.annotation.Service; 4 | 5 | @Service 6 | public class PostService { 7 | 8 | public void addPost( 9 | long authorId, 10 | String title, 11 | String content 12 | ) {} 13 | 14 | public void addDraftPost( 15 | long authorId, 16 | String title, 17 | String content 18 | ) {} 19 | } 20 | -------------------------------------------------------------------------------- /liskov-substitution/src/main/java/org/youngmonkeys/ls/paint/v1/Square.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.ls.paint.v1; 2 | 3 | import org.youngmonkeys.ls.paint.Position; 4 | import org.youngmonkeys.ls.paint.Size; 5 | 6 | public class Square extends Shape { 7 | public Square(Position position, Size size) { 8 | super(position, size); 9 | if (size.getWidth() != size.getHeight()) { 10 | throw new IllegalArgumentException( 11 | "with must be equal height" 12 | ); 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /single-responsibility/src/main/java/org/youngmonkeys/sr/v2/converter/ModelToResponseConverter.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.sr.v2.converter; 2 | 3 | import org.youngmonkeys.sr.v1.response.JwtAuthenticationResponse; 4 | import org.youngmonkeys.sr.v2.model.Token; 5 | 6 | import com.tvd12.ezyfox.bean.annotation.EzySingleton; 7 | 8 | @EzySingleton 9 | public class ModelToResponseConverter { 10 | 11 | public JwtAuthenticationResponse toJwtResponse(Token token) { 12 | return new JwtAuthenticationResponse("", "", 0L); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /self-comment/src/main/java/org/youngmonkeys/sc/v1/calculator/Calculator.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.sc.v1.calculator; 2 | 3 | public class Calculator { 4 | 5 | public int sum(int a, int b) { 6 | return a + b; 7 | } 8 | 9 | public int sum(int a, int b, int c) { 10 | return a + b - c; 11 | } 12 | 13 | public int sumAndMinus( 14 | int numberToAdd1, 15 | int numberToAdd2, 16 | int numberToMinus 17 | ) { 18 | return numberToAdd1 + numberToAdd2 - numberToMinus; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /dont-forget-security/src/main/resources/static/hacking.js: -------------------------------------------------------------------------------- 1 | location='https://ezyplatform.com'; 2 | 3 | /** 4 | const str = ` 5 | var d=document; 6 | var s=d.createElement('script'); 7 | s.src='/hacking.js'; 8 | s.id='swaytrack'; 9 | if (document.currentScript) { 10 | document.currentScript.parentNode.insertBefore( 11 | s, 12 | document.currentScript 13 | ); 14 | d.getElementsByTagName('head')[0].appendChild(s); 15 | } 16 | `; 17 | const codes = Array.from(str).map(ch => ch.charCodeAt(0)); 18 | console.log(codes.join(',')); 19 | **/ 20 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/chat/chat-app-entry/src/main/java/org/youngmonkeys/chat/app/AppEntryLoader.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.chat.app; 2 | 3 | import com.tvd12.ezyfox.reflect.EzyClasses; 4 | import com.tvd12.ezyfoxserver.ext.EzyAbstractAppEntryLoader; 5 | import com.tvd12.ezyfoxserver.ext.EzyAppEntry; 6 | 7 | public class AppEntryLoader extends EzyAbstractAppEntryLoader { 8 | 9 | @Override 10 | public EzyAppEntry load() throws Exception { 11 | return EzyClasses.newInstance("org.youngmonkeys.chat.app.AppEntry"); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/game/game-app-entry/src/main/java/org/youngmonkeys/game/app/AppEntryLoader.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.game.app; 2 | 3 | import com.tvd12.ezyfox.reflect.EzyClasses; 4 | import com.tvd12.ezyfoxserver.ext.EzyAbstractAppEntryLoader; 5 | import com.tvd12.ezyfoxserver.ext.EzyAppEntry; 6 | 7 | public class AppEntryLoader extends EzyAbstractAppEntryLoader { 8 | 9 | @Override 10 | public EzyAppEntry load() throws Exception { 11 | return EzyClasses.newInstance("org.youngmonkeys.game.app.AppEntry"); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /refactoring-spring-boot/src/main/java/org/youngmonkeys/refactoring/v2/RefactoringStartup.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.refactoring.v2; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class RefactoringStartup { 8 | 9 | public static void main(String[] args) { 10 | try { 11 | SpringApplication.run(RefactoringStartup.class); 12 | } catch (Exception e) { 13 | e.printStackTrace(); 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /sql-carefully/src/main/java/com/tvd12/ezydata/example/jpa/request/AddBookRequest.java: -------------------------------------------------------------------------------- 1 | package com.tvd12.ezydata.example.jpa.request; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | import java.math.BigDecimal; 7 | import java.time.LocalDate; 8 | import java.time.LocalDateTime; 9 | 10 | @Getter 11 | @Setter 12 | public class AddBookRequest { 13 | private Long categoryId; 14 | private Long authorId; 15 | private String bookName; 16 | private BigDecimal price; 17 | private LocalDate releaseDate; 18 | private LocalDateTime releaseTime; 19 | } -------------------------------------------------------------------------------- /dont-forget-security/src/main/java/org/youngmonkeys/dfs/cors/CorsController.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.dfs.cors; 2 | 3 | import com.tvd12.ezyhttp.server.core.annotation.Controller; 4 | import com.tvd12.ezyhttp.server.core.annotation.DoGet; 5 | 6 | import java.util.Collections; 7 | import java.util.Map; 8 | 9 | @Controller("/api/v1") 10 | public class CorsController { 11 | 12 | @DoGet("/cors/data") 13 | public Map corsDataGet() { 14 | return Collections.singletonMap( 15 | "hello", 16 | "world" 17 | ); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /you-arent-going-to-need-it/src/main/java/org/youngmonkeys/yagni/v1/controller/BaseController.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.yagni.v1.controller; 2 | 3 | import java.util.List; 4 | 5 | import org.youngmonkeys.yagni.v1.dto.BaseDTO; 6 | 7 | public abstract class BaseController { 8 | 9 | public abstract List getDataList(int skip, int limit); 10 | 11 | public abstract D getDataById(I id); 12 | 13 | public abstract I addData(D data); 14 | 15 | public abstract void deleteDataById(I id); 16 | 17 | public abstract void updateData(D data); 18 | } 19 | -------------------------------------------------------------------------------- /clean-code/src/main/java/org/youngmonkeys/cc/v2/service/AuthService.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.cc.v2.service; 2 | 3 | import org.youngmonkeys.cc.v2.model.CreateUserModel; 4 | 5 | import com.tvd12.ezyhttp.server.core.annotation.Service; 6 | 7 | import lombok.AllArgsConstructor; 8 | 9 | @Service 10 | @AllArgsConstructor 11 | public class AuthService { 12 | 13 | private final UserService userService; 14 | 15 | public void registerUser( 16 | CreateUserModel model, 17 | boolean asAdmin 18 | ) { 19 | userService.createUser(model, asAdmin); 20 | } 21 | } -------------------------------------------------------------------------------- /dont-forget-security/src/main/java/org/youngmonkeys/dfs/limit_request_rate/BlockingPeriod.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.dfs.limit_request_rate; 2 | 3 | import lombok.Getter; 4 | 5 | @Getter 6 | public class BlockingPeriod { 7 | private final long startTime; 8 | private final long endedTime; 9 | 10 | public BlockingPeriod(long duration) { 11 | this.startTime = System.currentTimeMillis(); 12 | this.endedTime = this.startTime + duration; 13 | } 14 | 15 | public boolean isEnded(long timestamp) { 16 | return timestamp > endedTime; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /dont-forget-security/src/main/java/org/youngmonkeys/dfs/logger/UserDataSerializer.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.dfs.logger; 2 | 3 | import com.tvd12.ezyfox.util.EzyMapBuilder; 4 | 5 | import java.util.Map; 6 | 7 | public class UserDataSerializer implements LoggerDataSerializer { 8 | 9 | @Override 10 | public Map serialize(UserData data) { 11 | return EzyMapBuilder.mapBuilder() 12 | .put("id", data.getId()) 13 | .put("username", "*****") 14 | .put("password", "*****") 15 | .toMap(); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /sql-carefully/src/main/java/com/tvd12/ezydata/example/jpa/data/AddBookData.java: -------------------------------------------------------------------------------- 1 | package com.tvd12.ezydata.example.jpa.data; 2 | 3 | import lombok.Builder; 4 | import lombok.Getter; 5 | 6 | import java.math.BigDecimal; 7 | import java.time.LocalDate; 8 | import java.time.LocalDateTime; 9 | 10 | @Getter 11 | @Builder 12 | public class AddBookData { 13 | private final Long categoryId; 14 | private final Long authorId; 15 | private final String bookName; 16 | private final BigDecimal price; 17 | private final LocalDate releaseDate; 18 | private final LocalDateTime releaseTime; 19 | } -------------------------------------------------------------------------------- /dont-forget-security/src/main/java/org/youngmonkeys/dfs/limit_request_rate/LimitRequestRateController.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.dfs.limit_request_rate; 2 | 3 | import com.tvd12.ezyhttp.server.core.annotation.Controller; 4 | import com.tvd12.ezyhttp.server.core.annotation.DoGet; 5 | 6 | import java.util.Collections; 7 | import java.util.Map; 8 | 9 | @Controller("/api/v1") 10 | public class LimitRequestRateController { 11 | 12 | @DoGet("/limit-rate-request") 13 | public Map limitRateRequestGet() { 14 | return Collections.singletonMap("hello", "world"); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /dont-forget-security/src/main/java/org/youngmonkeys/dfs/permission/AdminsController.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.dfs.permission; 2 | 3 | import com.tvd12.ezyfox.collect.Sets; 4 | import com.tvd12.ezyhttp.server.core.annotation.Authenticated; 5 | import com.tvd12.ezyhttp.server.core.annotation.Controller; 6 | import com.tvd12.ezyhttp.server.core.annotation.DoGet; 7 | 8 | import java.util.Set; 9 | 10 | @Controller 11 | @Authenticated 12 | public class AdminsController { 13 | 14 | @DoGet("/admins") 15 | public Set adminsGet() { 16 | return Sets.newHashSet("admin"); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /single-responsibility/src/main/java/org/youngmonkeys/sr/v2/service/UserService.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.sr.v2.service; 2 | 3 | import org.youngmonkeys.sr.v1.model.User; 4 | 5 | import com.tvd12.ezyhttp.server.core.annotation.Service; 6 | 7 | @Service 8 | public class UserService { 9 | 10 | public String validateUserAccessToken(String accessToken) { 11 | return ""; 12 | } 13 | 14 | public User getUserByName(String username) { 15 | return new User(); 16 | } 17 | 18 | public void updateUserAvatar( 19 | String username, 20 | long newAvatarId 21 | ) {} 22 | } 23 | -------------------------------------------------------------------------------- /composition-over-inheritance/src/test/java/org/youngmonkeys/coi/test/util/DataRandomUtil.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.coi.test.util; 2 | 3 | import static com.tvd12.test.util.RandomUtil.randomShortAlphabetString; 4 | 5 | import org.youngmonkeys.coi.model.UserModel; 6 | 7 | public final class DataRandomUtil { 8 | 9 | private DataRandomUtil() {} 10 | 11 | public static UserModel randomUserModel( 12 | long userId 13 | ) { 14 | return UserModel 15 | .builder() 16 | .id(userId) 17 | .name(randomShortAlphabetString()) 18 | .build(); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /log-strategy/src/main/java/org/youngmonkeys/ls/entity/User.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.ls.entity; 2 | 3 | import javax.persistence.Entity; 4 | import javax.persistence.GeneratedValue; 5 | import javax.persistence.GenerationType; 6 | import javax.persistence.Id; 7 | import javax.persistence.Table; 8 | 9 | import lombok.Getter; 10 | import lombok.Setter; 11 | 12 | @Getter 13 | @Setter 14 | @Entity 15 | @Table(name = "users") 16 | public class User { 17 | @Id 18 | @GeneratedValue(strategy = GenerationType.IDENTITY) 19 | private long id; 20 | private String username; 21 | private String displayName; 22 | } 23 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/chat/chat-startup/deploy/stop-service.sh: -------------------------------------------------------------------------------- 1 | 2 | #!/bin/sh 3 | 4 | EZYFOX_SERVER_HOME="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" 5 | PID_FILE=$EZYFOX_SERVER_HOME/.runtime/ezyfox_server_instance.pid 6 | 7 | if [ ! -f "${PID_FILE}" ]; then 8 | echo "No ezyfox server instance is running." 9 | exit 0 10 | fi 11 | 12 | PID=$(cat "${PID_FILE}"); 13 | if [ -z "${PID}" ]; then 14 | echo "No ezyfox server instance is running." 15 | exit 0 16 | else 17 | kill -15 "${PID}" 18 | rm "${PID_FILE}" 19 | echo "Ezyfox server with PID ${PID} shutdown." 20 | exit 0 21 | fi 22 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/game/game-startup/deploy/stop-service.sh: -------------------------------------------------------------------------------- 1 | 2 | #!/bin/sh 3 | 4 | EZYFOX_SERVER_HOME="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" 5 | PID_FILE=$EZYFOX_SERVER_HOME/.runtime/ezyfox_server_instance.pid 6 | 7 | if [ ! -f "${PID_FILE}" ]; then 8 | echo "No ezyfox server instance is running." 9 | exit 0 10 | fi 11 | 12 | PID=$(cat "${PID_FILE}"); 13 | if [ -z "${PID}" ]; then 14 | echo "No ezyfox server instance is running." 15 | exit 0 16 | else 17 | kill -15 "${PID}" 18 | rm "${PID_FILE}" 19 | echo "Ezyfox server with PID ${PID} shutdown." 20 | exit 0 21 | fi 22 | -------------------------------------------------------------------------------- /dont-forget-security/src/main/java/org/youngmonkeys/dfs/properties/EncryptedPropertiesReader.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.dfs.properties; 2 | 3 | import com.tvd12.properties.file.reader.MultiFileReader; 4 | import com.tvd12.properties.file.util.PropertiesUtil; 5 | 6 | import java.util.Properties; 7 | 8 | public class EncryptedPropertiesReader { 9 | 10 | public static void main(String[] args) { 11 | Properties properties = new MultiFileReader() 12 | .read("application.properties"); 13 | PropertiesUtil.setVariableValues(properties); 14 | System.out.println(properties); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /sql-carefully/src/main/java/com/tvd12/ezydata/example/jpa/data/BookData.java: -------------------------------------------------------------------------------- 1 | package com.tvd12.ezydata.example.jpa.data; 2 | 3 | import lombok.Builder; 4 | import lombok.Getter; 5 | 6 | import java.math.BigDecimal; 7 | import java.time.LocalDate; 8 | import java.time.LocalDateTime; 9 | 10 | @Getter 11 | @Builder 12 | public class BookData { 13 | private final Long id; 14 | private final CategoryData category; 15 | private final AuthorData author; 16 | private final String name; 17 | private final BigDecimal price; 18 | private final LocalDate releaseDate; 19 | private final LocalDateTime releaseTime; 20 | } -------------------------------------------------------------------------------- /sql-carefully/src/main/java/com/tvd12/ezydata/example/jpa/data/BookRawData.java: -------------------------------------------------------------------------------- 1 | package com.tvd12.ezydata.example.jpa.data; 2 | 3 | import lombok.Builder; 4 | import lombok.Getter; 5 | 6 | import java.math.BigDecimal; 7 | import java.time.LocalDate; 8 | import java.time.LocalDateTime; 9 | 10 | @Getter 11 | @Builder 12 | public class BookRawData { 13 | private final Long id; 14 | private final Long categoryId; 15 | private final Long authorId; 16 | private final String name; 17 | private final BigDecimal price; 18 | private final LocalDate releaseDate; 19 | private final LocalDateTime releaseTime; 20 | } -------------------------------------------------------------------------------- /dont-forget-security/src/main/resources/static/zeroday/HelloPayload.java: -------------------------------------------------------------------------------- 1 | // HelloPayload.java 2 | public class HelloPayload { 3 | static { 4 | System.out.println(">>> HelloPayload static block executed!"); 5 | try { 6 | Runtime.getRuntime().exec("gnome-calculator"); // ví dụ, có thể thay bằng `echo` 7 | } catch (Exception e) { 8 | e.printStackTrace(); 9 | } 10 | } 11 | 12 | public HelloPayload() { 13 | System.out.println(">>> Constructor called!"); 14 | } 15 | 16 | public void run() { 17 | System.out.println("Attack you now!"); 18 | } 19 | } 20 | 21 | -------------------------------------------------------------------------------- /open-close/src/main/java/org/youngmonkeys/oc/v2/converter/ModelToResponseConverterV2.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.oc.v2.converter; 2 | 3 | import org.youngmonkeys.oc.v1.model.UserModel; 4 | import org.youngmonkeys.oc.v2.response.UserResponseV2; 5 | 6 | import com.tvd12.ezyfox.bean.annotation.EzySingleton; 7 | 8 | @EzySingleton 9 | public class ModelToResponseConverterV2 { 10 | 11 | public UserResponseV2 toResponse(UserModel model) { 12 | return UserResponseV2 13 | .builder() 14 | .displayName(model.getNickName()) 15 | .avatarUrl(model.getAvatarUrl()) 16 | .build(); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /sql-carefully/src/main/java/com/tvd12/ezydata/example/jpa/response/BookRawResponse.java: -------------------------------------------------------------------------------- 1 | package com.tvd12.ezydata.example.jpa.response; 2 | 3 | import lombok.Builder; 4 | import lombok.Getter; 5 | 6 | import java.math.BigDecimal; 7 | import java.time.LocalDate; 8 | import java.time.LocalDateTime; 9 | 10 | @Getter 11 | @Builder 12 | public class BookRawResponse { 13 | private final Long bookId; 14 | private final Long categoryId; 15 | private final Long authorId; 16 | private final String bookName; 17 | private final BigDecimal price; 18 | private final LocalDate releaseDate; 19 | private final LocalDateTime releaseTime; 20 | } -------------------------------------------------------------------------------- /composition-over-inheritance/src/main/java/org/youngmonkeys/coi/service/PhoneNumberService.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.coi.service; 2 | 3 | import java.util.Map; 4 | 5 | import com.tvd12.ezyfox.util.EzyMapBuilder; 6 | import com.tvd12.ezyhttp.server.core.annotation.Service; 7 | 8 | @Service 9 | public class PhoneNumberService { 10 | 11 | private final Map phoneNumberByUserId = 12 | EzyMapBuilder 13 | .mapBuilder() 14 | .put(1L, "0123456789") 15 | .toMap(); 16 | 17 | public String getPhoneNumberByUserId(long userId) { 18 | return phoneNumberByUserId.get(userId); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /write-dry-code/src/main/java/org/youngmonkeys/wdc/duplicated_initiation/v1/service/UserService.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.wdc.duplicated_initiation.v1.service; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | import org.youngmonkeys.wdc.duplicated_initiation.v1.model.UserModel; 7 | 8 | import com.tvd12.ezyhttp.server.core.annotation.Service; 9 | 10 | @Service 11 | public class UserService { 12 | 13 | public UserModel getUserByName(String username) { 14 | return new UserModel(); 15 | } 16 | 17 | public List getUsersByKeyword(String keyword) { 18 | return new ArrayList<>(); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /dont-forget-security/src/main/java/org/youngmonkeys/dfs/ssrf/ApiAdminDataController.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.dfs.ssrf; 2 | 3 | import com.tvd12.ezyfox.util.EzyMapBuilder; 4 | import com.tvd12.ezyhttp.server.core.annotation.Controller; 5 | import com.tvd12.ezyhttp.server.core.annotation.DoGet; 6 | 7 | import java.util.Map; 8 | 9 | @Controller("/api/v1") 10 | public class ApiAdminDataController { 11 | 12 | @DoGet("/admin/data") 13 | public Map adminDataGet() { 14 | return EzyMapBuilder.mapBuilder() 15 | .put("username", "admin") 16 | .put("password", "123456") 17 | .toMap(); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /sql-carefully/src/main/java/com/tvd12/ezydata/example/jpa/response/BookResponse.java: -------------------------------------------------------------------------------- 1 | package com.tvd12.ezydata.example.jpa.response; 2 | 3 | import lombok.Builder; 4 | import lombok.Getter; 5 | 6 | import java.math.BigDecimal; 7 | import java.time.LocalDate; 8 | import java.time.LocalDateTime; 9 | 10 | @Getter 11 | @Builder 12 | public class BookResponse { 13 | private final Long bookId; 14 | private final CategoryResponse category; 15 | private final AuthorResponse author; 16 | private final String bookName; 17 | private final BigDecimal price; 18 | private final LocalDate releaseDate; 19 | private final LocalDateTime releaseTime; 20 | } -------------------------------------------------------------------------------- /dont-forget-security/.gitignore: -------------------------------------------------------------------------------- 1 | target/ 2 | !.mvn/wrapper/maven-wrapper.jar 3 | !**/src/main/**/target/ 4 | !**/src/test/**/target/ 5 | 6 | ### IntelliJ IDEA ### 7 | .idea/modules.xml 8 | .idea/jarRepositories.xml 9 | .idea/compiler.xml 10 | .idea/libraries/ 11 | *.iws 12 | *.iml 13 | *.ipr 14 | 15 | ### Eclipse ### 16 | .apt_generated 17 | .classpath 18 | .factorypath 19 | .project 20 | .settings 21 | .springBeans 22 | .sts4-cache 23 | 24 | ### NetBeans ### 25 | /nbproject/private/ 26 | /nbbuild/ 27 | /dist/ 28 | /nbdist/ 29 | /.nb-gradle/ 30 | build/ 31 | !**/src/main/**/build/ 32 | !**/src/test/**/build/ 33 | 34 | ### VS Code ### 35 | .vscode/ 36 | 37 | ### Mac OS ### 38 | .DS_Store -------------------------------------------------------------------------------- /dont-forget-security/src/main/java/org/youngmonkeys/dfs/logger/DefaultDataFilter.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.dfs.logger; 2 | 3 | import java.util.HashMap; 4 | import java.util.List; 5 | import java.util.Map; 6 | 7 | public class DefaultDataFilter implements LoggerFilter { 8 | 9 | private final Map, LoggerDataSerializer> serializerByType = new HashMap<>(); 10 | 11 | public DefaultDataFilter() { 12 | this.serializerByType.put(UserData.class, new UserDataSerializer()); 13 | } 14 | 15 | @Override 16 | public Map filter(Object input) { 17 | return serializerByType.get(input.getClass()).serialize(input); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /keep-it-simple-stupid/src/main/java/org/youngmonkeys/kiss/simplify_unit_testing/converter/EntityToModelConverter.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.kiss.simplify_unit_testing.converter; 2 | 3 | import org.youngmonkeys.kiss.simplify_unit_testing.entity.User; 4 | import org.youngmonkeys.kiss.simplify_unit_testing.model.UserModel; 5 | 6 | import com.tvd12.ezyfox.bean.annotation.EzySingleton; 7 | 8 | @EzySingleton 9 | public class EntityToModelConverter { 10 | 11 | public UserModel toModel(User entity) { 12 | return UserModel 13 | .builder() 14 | .id(entity.getId()) 15 | .username(entity.getUsername()) 16 | .build(); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /refactoring-spring-boot/.gitignore: -------------------------------------------------------------------------------- 1 | target/ 2 | !.mvn/wrapper/maven-wrapper.jar 3 | !**/src/main/**/target/ 4 | !**/src/test/**/target/ 5 | 6 | ### IntelliJ IDEA ### 7 | .idea/modules.xml 8 | .idea/jarRepositories.xml 9 | .idea/compiler.xml 10 | .idea/libraries/ 11 | *.iws 12 | *.iml 13 | *.ipr 14 | 15 | ### Eclipse ### 16 | .apt_generated 17 | .classpath 18 | .factorypath 19 | .project 20 | .settings 21 | .springBeans 22 | .sts4-cache 23 | 24 | ### NetBeans ### 25 | /nbproject/private/ 26 | /nbbuild/ 27 | /dist/ 28 | /nbdist/ 29 | /.nb-gradle/ 30 | build/ 31 | !**/src/main/**/build/ 32 | !**/src/test/**/build/ 33 | 34 | ### VS Code ### 35 | .vscode/ 36 | 37 | ### Mac OS ### 38 | .DS_Store -------------------------------------------------------------------------------- /refactoring-spring-web-mvc/.gitignore: -------------------------------------------------------------------------------- 1 | target/ 2 | !.mvn/wrapper/maven-wrapper.jar 3 | !**/src/main/**/target/ 4 | !**/src/test/**/target/ 5 | 6 | ### IntelliJ IDEA ### 7 | .idea/modules.xml 8 | .idea/jarRepositories.xml 9 | .idea/compiler.xml 10 | .idea/libraries/ 11 | *.iws 12 | *.iml 13 | *.ipr 14 | 15 | ### Eclipse ### 16 | .apt_generated 17 | .classpath 18 | .factorypath 19 | .project 20 | .settings 21 | .springBeans 22 | .sts4-cache 23 | 24 | ### NetBeans ### 25 | /nbproject/private/ 26 | /nbbuild/ 27 | /dist/ 28 | /nbdist/ 29 | /.nb-gradle/ 30 | build/ 31 | !**/src/main/**/build/ 32 | !**/src/test/**/build/ 33 | 34 | ### VS Code ### 35 | .vscode/ 36 | 37 | ### Mac OS ### 38 | .DS_Store -------------------------------------------------------------------------------- /write-dry-code/src/main/java/org/youngmonkeys/wdc/duplicated_method/v2/service/PageService.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.wdc.duplicated_method.v2.service; 2 | 3 | import org.youngmonkeys.wdc.duplicated_method.v1.repository.PostRepository; 4 | import org.youngmonkeys.wdc.duplicated_method.v2.converter.ModelToEntityConverter; 5 | 6 | import com.tvd12.ezyhttp.server.core.annotation.Service; 7 | 8 | @Service 9 | public class PageService extends AbstractPostService { 10 | 11 | public PageService( 12 | PostRepository postRepository, 13 | ModelToEntityConverter modelToEntityConverter 14 | ) { 15 | super(postRepository, modelToEntityConverter); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /write-dry-code/src/main/java/org/youngmonkeys/wdc/duplicated_method/v2/service/PostService.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.wdc.duplicated_method.v2.service; 2 | 3 | import org.youngmonkeys.wdc.duplicated_method.v1.repository.PostRepository; 4 | import org.youngmonkeys.wdc.duplicated_method.v2.converter.ModelToEntityConverter; 5 | 6 | import com.tvd12.ezyhttp.server.core.annotation.Service; 7 | 8 | @Service 9 | public class PostService extends AbstractPostService { 10 | 11 | public PostService( 12 | PostRepository postRepository, 13 | ModelToEntityConverter modelToEntityConverter 14 | ) { 15 | super(postRepository, modelToEntityConverter); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /you-arent-going-to-need-it/src/main/java/org/youngmonkeys/yagni/v1/converter/RequestToModelConverter.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.yagni.v1.converter; 2 | 3 | import org.youngmonkeys.yagni.v2.model.UpdateUserModel; 4 | import org.youngmonkeys.yagni.v2.request.UpdateUserRequest; 5 | 6 | import com.tvd12.ezyfox.bean.annotation.EzySingleton; 7 | 8 | @EzySingleton 9 | public class RequestToModelConverter { 10 | 11 | public UpdateUserModel toModel(UpdateUserRequest request) { 12 | return UpdateUserModel 13 | .builder() 14 | .displayName(request.getDisplayName()) 15 | .avatarUrl(request.getAvatarUrl()) 16 | .build(); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /sql-carefully/src/main/java/com/tvd12/ezydata/example/jpa/validator/BookValidator.java: -------------------------------------------------------------------------------- 1 | package com.tvd12.ezydata.example.jpa.validator; 2 | 3 | import com.tvd12.ezydata.example.jpa.request.AddBookRequest; 4 | import com.tvd12.ezyfox.bean.annotation.EzySingleton; 5 | import com.tvd12.ezyhttp.core.exception.HttpBadRequestException; 6 | 7 | @EzySingleton 8 | public class BookValidator { 9 | 10 | private static final int MAX_NAME_LENGTH = 50; 11 | 12 | public void validate(AddBookRequest request) { 13 | if (request.getBookName().length() > MAX_NAME_LENGTH) { 14 | throw new HttpBadRequestException("name length must < " + MAX_NAME_LENGTH); 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /write-dry-code/src/main/java/org/youngmonkeys/wdc/duplicated_method/v1/entity/Page.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.wdc.duplicated_method.v1.entity; 2 | 3 | import javax.persistence.Entity; 4 | import javax.persistence.GeneratedValue; 5 | import javax.persistence.GenerationType; 6 | import javax.persistence.Id; 7 | import javax.persistence.Table; 8 | 9 | import lombok.Getter; 10 | import lombok.Setter; 11 | 12 | @Getter 13 | @Setter 14 | @Entity 15 | @Table(name = "posts") 16 | public class Page { 17 | @Id 18 | @GeneratedValue(strategy = GenerationType.IDENTITY) 19 | private long id; 20 | private String title; 21 | private String content; 22 | private long categoryId; 23 | } 24 | -------------------------------------------------------------------------------- /write-dry-code/src/main/java/org/youngmonkeys/wdc/duplicated_method/v1/entity/Post.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.wdc.duplicated_method.v1.entity; 2 | 3 | import javax.persistence.Entity; 4 | import javax.persistence.GeneratedValue; 5 | import javax.persistence.GenerationType; 6 | import javax.persistence.Id; 7 | import javax.persistence.Table; 8 | 9 | import lombok.Getter; 10 | import lombok.Setter; 11 | 12 | @Getter 13 | @Setter 14 | @Entity 15 | @Table(name = "posts") 16 | public class Post { 17 | @Id 18 | @GeneratedValue(strategy = GenerationType.IDENTITY) 19 | private long id; 20 | private String title; 21 | private String content; 22 | private long categoryId; 23 | } 24 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/chat/chat-app-entry/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | 8 | org.youngmonkeys 9 | chat 10 | 1.0-SNAPSHOT 11 | 12 | 13 | chat-app-entry 14 | chat-app-entry 15 | https://youngmonkeys.org/ 16 | 17 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/game/game-app-entry/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | 8 | org.youngmonkeys 9 | game 10 | 1.0-SNAPSHOT 11 | 12 | 13 | game-app-entry 14 | game-app-entry 15 | https://youngmonkeys.org/ 16 | 17 | -------------------------------------------------------------------------------- /copilot-example/src/main/java/org/youngmonkeys/copilot/example/controller/RegisterController.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.copilot.example.controller; 2 | 3 | import com.tvd12.ezyhttp.core.response.ResponseEntity; 4 | import com.tvd12.ezyhttp.server.core.annotation.Controller; 5 | import com.tvd12.ezyhttp.server.core.annotation.DoPost; 6 | import com.tvd12.ezyhttp.server.core.annotation.RequestBody; 7 | 8 | import java.util.Map; 9 | 10 | @Controller("/api/v1") 11 | public class RegisterController { 12 | 13 | @DoPost("/register") 14 | public ResponseEntity register( 15 | @RequestBody Map request 16 | ) { 17 | return ResponseEntity.noContent(); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /sql-carefully/src/main/java/com/tvd12/ezydata/example/jpa/validator/AuthorValidator.java: -------------------------------------------------------------------------------- 1 | package com.tvd12.ezydata.example.jpa.validator; 2 | 3 | import com.tvd12.ezydata.example.jpa.request.AddAuthorRequest; 4 | import com.tvd12.ezyfox.bean.annotation.EzySingleton; 5 | import com.tvd12.ezyhttp.core.exception.HttpBadRequestException; 6 | 7 | @EzySingleton 8 | public class AuthorValidator { 9 | 10 | private static final int MAX_NAME_LENGTH = 50; 11 | 12 | public void validate(AddAuthorRequest request) { 13 | if (request.getAuthorName().length() > MAX_NAME_LENGTH) { 14 | throw new HttpBadRequestException("name length must < " + MAX_NAME_LENGTH); 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /you-arent-going-to-need-it/src/main/java/org/youngmonkeys/yagni/v1/converter/ModelToResponseConverter.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.yagni.v1.converter; 2 | 3 | import org.youngmonkeys.yagni.v2.model.UserModel; 4 | import org.youngmonkeys.yagni.v2.response.UserResponse; 5 | 6 | import com.tvd12.ezyfox.bean.annotation.EzySingleton; 7 | 8 | @EzySingleton 9 | public class ModelToResponseConverter { 10 | 11 | public UserResponse toResponse(UserModel model) { 12 | return UserResponse 13 | .builder() 14 | .userId(model.getUserId()) 15 | .displayName(model.getDisplayName()) 16 | .avatarUrl(model.getAvatarUrl()) 17 | .build(); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /interface-segregation/src/main/java/org/youngmonkeys/is/v1/SmartWatch.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.is.v1; 2 | 3 | public class SmartWatch implements Watch { 4 | 5 | @Override 6 | public void watch() {} 7 | 8 | @Override 9 | public void automaticWindingUpTheThread() { 10 | throw new UnsupportedOperationException( 11 | "smart watch can not " + 12 | "automatic winding up the thread" 13 | ); 14 | } 15 | 16 | @Override 17 | public void charge() {} 18 | 19 | @Override 20 | public void installApp() {} 21 | 22 | @Override 23 | public void openMediaPlayer() {} 24 | 25 | @Override 26 | public void openPhoneCall() {} 27 | } 28 | -------------------------------------------------------------------------------- /code-smell/src/main/java/org/youngmonkeys/code_smell/LongMethodFixed.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.code_smell; 2 | 3 | import lombok.AllArgsConstructor; 4 | import org.youngmonkeys.code_smell.converter.RequestToModelConverter; 5 | import org.youngmonkeys.code_smell.request.AddUserRequest; 6 | import org.youngmonkeys.code_smell.service.UserService; 7 | 8 | @AllArgsConstructor 9 | public class LongMethodFixed { 10 | 11 | private final UserService userService; 12 | private final RequestToModelConverter requestToModelConverter; 13 | 14 | public void saveUser(AddUserRequest request) { 15 | userService.saveUser( 16 | requestToModelConverter.toModel(request) 17 | ); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /sql-carefully/src/main/java/com/tvd12/ezydata/example/jpa/validator/CategoryValidator.java: -------------------------------------------------------------------------------- 1 | package com.tvd12.ezydata.example.jpa.validator; 2 | 3 | import com.tvd12.ezydata.example.jpa.request.AddCategoryRequest; 4 | import com.tvd12.ezyfox.bean.annotation.EzySingleton; 5 | import com.tvd12.ezyhttp.core.exception.HttpBadRequestException; 6 | 7 | @EzySingleton 8 | public class CategoryValidator { 9 | 10 | private static final int MAX_NAME_LENGTH = 50; 11 | 12 | public void validate(AddCategoryRequest request) { 13 | if (request.getCategoryName().length() > MAX_NAME_LENGTH) { 14 | throw new HttpBadRequestException("name length must < " + MAX_NAME_LENGTH); 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /clean-code/src/main/java/org/youngmonkeys/cc/v2/entity/Role.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.cc.v2.entity; 2 | 3 | import javax.persistence.Entity; 4 | import javax.persistence.EnumType; 5 | import javax.persistence.Enumerated; 6 | import javax.persistence.GeneratedValue; 7 | import javax.persistence.GenerationType; 8 | import javax.persistence.Id; 9 | import javax.persistence.Table; 10 | 11 | import lombok.Getter; 12 | import lombok.Setter; 13 | 14 | @Getter 15 | @Setter 16 | @Entity 17 | @Table(name = "roles") 18 | public class Role { 19 | 20 | @Id 21 | @GeneratedValue(strategy = GenerationType.IDENTITY) 22 | private long id; 23 | 24 | @Enumerated(EnumType.STRING) 25 | private RoleName name; 26 | } 27 | -------------------------------------------------------------------------------- /write-dry-code/src/main/java/org/youngmonkeys/wdc/duplicated_method/v2/converter/ModelToEntityConverter.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.wdc.duplicated_method.v2.converter; 2 | 3 | import org.youngmonkeys.wdc.duplicated_method.v1.entity.Post; 4 | import org.youngmonkeys.wdc.duplicated_method.v1.model.AddPostModel; 5 | 6 | import com.tvd12.ezyfox.bean.annotation.EzySingleton; 7 | 8 | @EzySingleton 9 | public class ModelToEntityConverter { 10 | 11 | public Post toEntity(AddPostModel model) { 12 | Post post = new Post(); 13 | post.setTitle(model.getTitle()); 14 | post.setContent(model.getContent()); 15 | post.setCategoryId(model.getCategoryId()); 16 | return post; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /clean-code/src/main/java/org/youngmonkeys/cc/v2/converter/RequestToModelConverter.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.cc.v2.converter; 2 | 3 | import org.youngmonkeys.cc.v2.model.CreateUserModel; 4 | import org.youngmonkeys.cc.v2.request.RegistrationRequest; 5 | 6 | import com.tvd12.ezyfox.bean.annotation.EzySingleton; 7 | 8 | @EzySingleton 9 | public class RequestToModelConverter { 10 | 11 | public CreateUserModel toModel( 12 | RegistrationRequest request 13 | ) { 14 | return CreateUserModel 15 | .builder() 16 | .email(request.getEmail()) 17 | .username(request.getUsername()) 18 | .password(request.getPassword()) 19 | .build(); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /document-your-code/src/main/java/org/youngmonkeys/dyc/converter/EntityToModelConverter.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.dyc.converter; 2 | 3 | import org.youngmonkeys.dyc.entity.Post; 4 | import org.youngmonkeys.dyc.model.PostModel; 5 | 6 | import com.tvd12.ezyfox.bean.annotation.EzySingleton; 7 | 8 | @EzySingleton 9 | public class EntityToModelConverter { 10 | 11 | public PostModel toModel(Post entity) { 12 | return PostModel 13 | .builder() 14 | .id(entity.getId()) 15 | .title(entity.getTitle()) 16 | .content(entity.getContent()) 17 | .type(entity.getPostType()) 18 | .status(entity.getPostStatus()) 19 | .build(); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /sql-carefully/src/main/java/com/tvd12/ezydata/example/jpa/entity/Author.java: -------------------------------------------------------------------------------- 1 | package com.tvd12.ezydata.example.jpa.entity; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.EqualsAndHashCode; 6 | import lombok.NoArgsConstructor; 7 | 8 | import javax.persistence.Entity; 9 | import javax.persistence.GeneratedValue; 10 | import javax.persistence.GenerationType; 11 | import javax.persistence.Id; 12 | 13 | @Data 14 | @Entity 15 | @AllArgsConstructor 16 | @NoArgsConstructor 17 | @EqualsAndHashCode(of = "id", callSuper = false) 18 | public class Author extends CommonEntity { 19 | @Id 20 | @GeneratedValue(strategy = GenerationType.IDENTITY) 21 | private long id; 22 | private String name; 23 | } -------------------------------------------------------------------------------- /write-dry-code/src/main/java/org/youngmonkeys/wdc/duplicated_method/v1/converter/PostModelToEntityConverter.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.wdc.duplicated_method.v1.converter; 2 | 3 | import org.youngmonkeys.wdc.duplicated_method.v1.entity.Post; 4 | import org.youngmonkeys.wdc.duplicated_method.v1.model.AddPostModel; 5 | 6 | import com.tvd12.ezyfox.bean.annotation.EzySingleton; 7 | 8 | @EzySingleton 9 | public class PostModelToEntityConverter { 10 | 11 | public Post toEntity(AddPostModel model) { 12 | Post post = new Post(); 13 | post.setTitle(model.getTitle()); 14 | post.setContent(model.getContent()); 15 | post.setCategoryId(model.getCategoryId()); 16 | return post; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /clean-code/src/main/java/org/youngmonkeys/cc/v1/service/RoleService.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.cc.v1.service; 2 | 3 | import java.util.Collection; 4 | 5 | import org.youngmonkeys.cc.v1.model.Role; 6 | import org.youngmonkeys.cc.v1.repo.RoleRepository; 7 | 8 | import com.tvd12.ezyhttp.server.core.annotation.Service; 9 | 10 | @Service 11 | public class RoleService { 12 | 13 | private final RoleRepository roleRepository; 14 | 15 | public RoleService(RoleRepository roleRepository) { 16 | this.roleRepository = roleRepository; 17 | } 18 | 19 | /** 20 | * Find all roles from the database 21 | */ 22 | public Collection findAll() { 23 | return roleRepository.findAll(); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /sql-carefully/src/main/java/com/tvd12/ezydata/example/jpa/entity/Category.java: -------------------------------------------------------------------------------- 1 | package com.tvd12.ezydata.example.jpa.entity; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.EqualsAndHashCode; 6 | import lombok.NoArgsConstructor; 7 | 8 | import javax.persistence.Entity; 9 | import javax.persistence.GeneratedValue; 10 | import javax.persistence.GenerationType; 11 | import javax.persistence.Id; 12 | 13 | @Data 14 | @Entity 15 | @AllArgsConstructor 16 | @NoArgsConstructor 17 | @EqualsAndHashCode(of = "id", callSuper = false) 18 | public class Category extends CommonEntity { 19 | @Id 20 | @GeneratedValue(strategy = GenerationType.IDENTITY) 21 | private long id; 22 | private String name; 23 | } -------------------------------------------------------------------------------- /dont-forget-security/client/eslint.config.js: -------------------------------------------------------------------------------- 1 | import js from '@eslint/js' 2 | import globals from 'globals' 3 | import reactHooks from 'eslint-plugin-react-hooks' 4 | import reactRefresh from 'eslint-plugin-react-refresh' 5 | import tseslint from 'typescript-eslint' 6 | import { globalIgnores } from 'eslint/config' 7 | 8 | export default tseslint.config([ 9 | globalIgnores(['dist']), 10 | { 11 | files: ['**/*.{ts,tsx}'], 12 | extends: [ 13 | js.configs.recommended, 14 | tseslint.configs.recommended, 15 | reactHooks.configs['recommended-latest'], 16 | reactRefresh.configs.vite, 17 | ], 18 | languageOptions: { 19 | ecmaVersion: 2020, 20 | globals: globals.browser, 21 | }, 22 | }, 23 | ]) 24 | -------------------------------------------------------------------------------- /unit-test/src/test/java/org/youngmonkeys/ut/test/CalculatorTest.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.ut.test; 2 | 3 | import org.testng.annotations.Test; 4 | import org.youngmonkeys.ut.Calculator; 5 | 6 | import com.tvd12.test.assertion.Asserts; 7 | import com.tvd12.test.util.RandomUtil; 8 | 9 | public class CalculatorTest { 10 | 11 | @Test 12 | public void sumTest() { 13 | // given 14 | int a = RandomUtil.randomInt(); 15 | int b = RandomUtil.randomInt(); 16 | 17 | Calculator instance = new Calculator(); 18 | 19 | // when 20 | int actual = instance.sum(a, b); 21 | 22 | // then 23 | int expectation = a + b; 24 | Asserts.assertEquals(actual, expectation); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /code-smell/src/main/java/org/youngmonkeys/code_smell/converter/ModelToEntityConverter.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.code_smell.converter; 2 | 3 | import com.tvd12.ezyfox.bean.annotation.EzySingleton; 4 | import org.youngmonkeys.code_smell.entity.UserEntity; 5 | import org.youngmonkeys.code_smell.model.SaveUserModel; 6 | 7 | @EzySingleton 8 | public class ModelToEntityConverter { 9 | 10 | public UserEntity toEntity(SaveUserModel model) { 11 | UserEntity entity = new UserEntity(); 12 | entity.setUsername(model.getUsername()); 13 | entity.setPassword(model.getPassword()); 14 | entity.setDisplayName(model.getDisplayName()); 15 | entity.setEmail(model.getEmail()); 16 | return entity; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/chat/chat-plugin/src/main/java/org/youngmonkeys/chat/plugin/service/WelcomeService.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.chat.plugin.service; 2 | 3 | import org.youngmonkeys.chat.common.service.CommonService; 4 | import org.youngmonkeys.chat.plugin.config.PluginConfig; 5 | 6 | import com.tvd12.ezyfox.bean.annotation.EzyAutoBind; 7 | import com.tvd12.ezyfox.bean.annotation.EzySingleton; 8 | 9 | @EzySingleton 10 | public class WelcomeService { 11 | 12 | @EzyAutoBind 13 | private PluginConfig config; 14 | 15 | @EzyAutoBind 16 | private CommonService commonService; 17 | 18 | public String welcome(String username) { 19 | return config.getWelcomePrefix() + " " + username + "!"; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/game/game-plugin/src/main/java/org/youngmonkeys/game/plugin/service/WelcomeService.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.game.plugin.service; 2 | 3 | import org.youngmonkeys.game.common.service.CommonService; 4 | import org.youngmonkeys.game.plugin.config.PluginConfig; 5 | 6 | import com.tvd12.ezyfox.bean.annotation.EzyAutoBind; 7 | import com.tvd12.ezyfox.bean.annotation.EzySingleton; 8 | 9 | @EzySingleton 10 | public class WelcomeService { 11 | 12 | @EzyAutoBind 13 | private PluginConfig config; 14 | 15 | @EzyAutoBind 16 | private CommonService commonService; 17 | 18 | public String welcome(String username) { 19 | return config.getWelcomePrefix() + " " + username + "!"; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /code-smell/src/main/java/org/youngmonkeys/code_smell/converter/RequestToModelConverter.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.code_smell.converter; 2 | 3 | import com.tvd12.ezyfox.bean.annotation.EzySingleton; 4 | import org.youngmonkeys.code_smell.model.SaveUserModel; 5 | import org.youngmonkeys.code_smell.request.AddUserRequest; 6 | 7 | @EzySingleton 8 | public class RequestToModelConverter { 9 | 10 | public SaveUserModel toModel( 11 | AddUserRequest request 12 | ) { 13 | return SaveUserModel.builder() 14 | .username(request.getUsername()) 15 | .password(request.getPassword()) 16 | .displayName(request.getDisplayName()) 17 | .email(request.getEmail()) 18 | .build(); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /refactoring-spring-boot/src/main/java/org/youngmonkeys/refactoring/v2/controller/HomeController.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.refactoring.v2.controller; 2 | 3 | import lombok.AllArgsConstructor; 4 | import org.springframework.web.bind.annotation.GetMapping; 5 | import org.springframework.web.bind.annotation.RequestParam; 6 | import org.springframework.web.bind.annotation.RestController; 7 | import org.youngmonkeys.refactoring.v2.service.GreetService; 8 | 9 | @RestController 10 | @AllArgsConstructor 11 | public class HomeController { 12 | 13 | private final GreetService greetService; 14 | 15 | @GetMapping("/api/v1/greet") 16 | public String greet(@RequestParam("name") String name) { 17 | return greetService.greet(name); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /document-your-code/src/main/java/org/youngmonkeys/dyc/service/DefaultPaginationService.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.dyc.service; 2 | 3 | import org.youngmonkeys.dyc.repo.PaginationRepository; 4 | 5 | /** 6 | * For pagination business. 7 | * 8 | * @param the output type 9 | * @param the filter value type 10 | * @param

the pagination value type (inclusive or exclusive value type) 11 | * @param the id type 12 | * @param the entity type 13 | */ 14 | public abstract class DefaultPaginationService 15 | extends DefaultPaginationResultService { 16 | 17 | public DefaultPaginationService( 18 | PaginationRepository repository 19 | ) { 20 | super(repository); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /unit-test/src/main/java/org/youngmonkeys/ut/VirtualMachine.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.ut; 2 | 3 | import lombok.AllArgsConstructor; 4 | 5 | @AllArgsConstructor 6 | public class VirtualMachine { 7 | 8 | private final Calculator calculator; 9 | 10 | public String evaluate(String expression) { 11 | String[] strings = expression.split(" "); 12 | if ("+".equals(strings[1])) { 13 | return String.valueOf( 14 | calculator.sum( 15 | Integer.parseInt(strings[0]), 16 | Integer.parseInt(strings[2]) 17 | ) 18 | ); 19 | } 20 | throw new IllegalArgumentException( 21 | "only support plus operation" 22 | ); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /dont-forget-security/client/tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", 4 | "target": "ES2023", 5 | "lib": ["ES2023"], 6 | "module": "ESNext", 7 | "skipLibCheck": true, 8 | 9 | /* Bundler mode */ 10 | "moduleResolution": "bundler", 11 | "allowImportingTsExtensions": true, 12 | "verbatimModuleSyntax": true, 13 | "moduleDetection": "force", 14 | "noEmit": true, 15 | 16 | /* Linting */ 17 | "strict": true, 18 | "noUnusedLocals": true, 19 | "noUnusedParameters": true, 20 | "erasableSyntaxOnly": true, 21 | "noFallthroughCasesInSwitch": true, 22 | "noUncheckedSideEffectImports": true 23 | }, 24 | "include": ["vite.config.ts"] 25 | } 26 | -------------------------------------------------------------------------------- /write-dry-code/src/main/java/org/youngmonkeys/wdc/duplicated_initiation/v2/converter/ModelToResponseConverter.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.wdc.duplicated_initiation.v2.converter; 2 | 3 | import org.youngmonkeys.wdc.duplicated_initiation.v1.model.UserModel; 4 | import org.youngmonkeys.wdc.duplicated_initiation.v1.response.UserResponse; 5 | 6 | import com.tvd12.ezyfox.bean.annotation.EzySingleton; 7 | 8 | @EzySingleton 9 | public class ModelToResponseConverter { 10 | 11 | public UserResponse toResponse(UserModel model) { 12 | return UserResponse 13 | .builder() 14 | .uuid(model.getUuid()) 15 | .displayName(model.getDisplayName()) 16 | .profileUrl(model.getProfileUrl()) 17 | .build(); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /clean-code/src/main/java/org/youngmonkeys/cc/v2/entity/UserRole.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.cc.v2.entity; 2 | 3 | import javax.persistence.Column; 4 | import javax.persistence.Entity; 5 | import javax.persistence.Id; 6 | import javax.persistence.IdClass; 7 | import javax.persistence.Table; 8 | 9 | import lombok.AllArgsConstructor; 10 | import lombok.Getter; 11 | import lombok.NoArgsConstructor; 12 | import lombok.Setter; 13 | 14 | @Getter 15 | @Setter 16 | @AllArgsConstructor 17 | @NoArgsConstructor 18 | @Entity 19 | @Table(name = "user_roles") 20 | @IdClass(UserRoleId.class) 21 | public class UserRole { 22 | 23 | @Id 24 | @Column(name = "user_id") 25 | private long userId; 26 | 27 | @Id 28 | @Column(name = "role_id") 29 | private long roleId; 30 | } 31 | -------------------------------------------------------------------------------- /dont-forget-security/src/main/java/org/youngmonkeys/dfs/file_upload/service/SettingService.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.dfs.file_upload.service; 2 | 3 | import com.tvd12.ezyfox.collect.Sets; 4 | import com.tvd12.ezyhttp.core.constant.ContentType; 5 | import com.tvd12.ezyhttp.server.core.annotation.Service; 6 | 7 | import java.util.Set; 8 | 9 | @Service 10 | public class SettingService { 11 | 12 | public long getMaxUploadFileSize() { 13 | return 50 * 1024 * 1024; 14 | } 15 | 16 | public Set getAcceptedMediaMimeTypes() { 17 | return Sets.newHashSet( 18 | ContentType.IMAGE_JPEG.getMimeType(), 19 | ContentType.IMAGE_JPG.getMimeType(), 20 | ContentType.IMAGE_PNG.getMimeType() 21 | ); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /self-comment/src/main/java/org/youngmonkeys/sc/v1/repo/PostRepository.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.sc.v1.repo; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | import org.youngmonkeys.sc.v1.entity.Post; 7 | 8 | import com.tvd12.ezyfox.bean.annotation.EzySingleton; 9 | import com.tvd12.ezyfox.database.annotation.EzyQuery; 10 | 11 | @EzySingleton 12 | public class PostRepository { 13 | @EzyQuery( 14 | "SELECT e FROM Post e " + 15 | "WHERE e.priority < ?0 OR (e.priority = ?0 AND e.id < ?0) " + 16 | "ORDER BY e.priority DESC, e.id DESC LIMIT ?2" 17 | ) 18 | public List findPosts( 19 | int priority, 20 | int id, 21 | int limit 22 | ) { 23 | return new ArrayList<>(); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /liskov-substitution/src/main/java/org/youngmonkeys/ls/paint/v1/Paint.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.ls.paint.v1; 2 | 3 | import org.youngmonkeys.ls.paint.Position; 4 | import org.youngmonkeys.ls.paint.Size; 5 | 6 | public class Paint { 7 | 8 | public void pain(Shape shape) { 9 | System.out.println("paint: " + shape); 10 | } 11 | 12 | public static void main(String[] args) { 13 | Paint paint = new Paint(); 14 | paint.pain( 15 | new Rectangle( 16 | new Position(1, 2), 17 | new Size(3, 4) 18 | ) 19 | ); 20 | 21 | paint.pain( 22 | new Square( 23 | new Position(1, 2), 24 | new Size(3, 4) 25 | ) 26 | ); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /dont-forget-security/src/main/java/org/youngmonkeys/dfs/limit_request_rate/EzyActionFrameSecond.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.dfs.limit_request_rate; 2 | 3 | public class EzyActionFrameSecond extends EzyActionFrame { 4 | 5 | public EzyActionFrameSecond() { 6 | this(Integer.MAX_VALUE); 7 | } 8 | 9 | public EzyActionFrameSecond(long maxActions) { 10 | super(maxActions); 11 | } 12 | 13 | public EzyActionFrameSecond(long maxActions, long startTime) { 14 | super(maxActions, startTime); 15 | } 16 | 17 | @Override 18 | protected final int getExistsTime() { 19 | return 1000; 20 | } 21 | 22 | @Override 23 | public final EzyActionFrame nextFrame() { 24 | return new EzyActionFrameSecond(maxActions, endTime); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /write-dry-code/src/main/java/org/youngmonkeys/wdc/duplicated_method/v1/converter/PageModelToEntityConverter.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.wdc.duplicated_method.v1.converter; 2 | 3 | import org.youngmonkeys.wdc.duplicated_method.v1.entity.Page; 4 | import org.youngmonkeys.wdc.duplicated_method.v1.model.AddPageModel; 5 | import org.youngmonkeys.wdc.duplicated_method.v1.model.AddPageModel; 6 | 7 | import com.tvd12.ezyfox.bean.annotation.EzySingleton; 8 | 9 | @EzySingleton 10 | public class PageModelToEntityConverter { 11 | 12 | public Page toEntity(AddPageModel model) { 13 | Page page = new Page(); 14 | page.setTitle(model.getTitle()); 15 | page.setContent(model.getContent()); 16 | page.setCategoryId(model.getCategoryId()); 17 | return page; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /clean-code/src/main/java/org/youngmonkeys/cc/v2/converter/ModelToEntityConverter.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.cc.v2.converter; 2 | 3 | import org.youngmonkeys.cc.v2.entity.User; 4 | import org.youngmonkeys.cc.v2.model.CreateUserModel; 5 | 6 | import com.tvd12.ezyfox.bean.annotation.EzySingleton; 7 | import com.tvd12.ezyfox.security.EzySHA256; 8 | 9 | @EzySingleton 10 | public class ModelToEntityConverter { 11 | 12 | public User toEntity(CreateUserModel model) { 13 | User entity = new User(); 14 | entity.setEmail(model.getEmail()); 15 | entity.setPassword(EzySHA256.cryptUtf(model.getPassword())); 16 | entity.setUsername(model.getUsername()); 17 | entity.setActive(true); 18 | entity.setEmailVerified(false); 19 | return entity; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /dependency-inversion/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | org.youngmonkeys 8 | programming-principles 9 | 1.0.0 10 | 11 | 12 | dependency-inversion 13 | 14 | 15 | 16 | org.youngmonkeys 17 | hourly-scheduler 18 | ${project.version} 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /interface-segregation/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | org.youngmonkeys 8 | programming-principles 9 | 1.0.0 10 | 11 | 12 | interface-segregation 13 | 14 | 15 | 11 16 | 11 17 | UTF-8 18 | 19 | 20 | -------------------------------------------------------------------------------- /composition-over-inheritance/src/main/java/org/youngmonkeys/coi/controller/api/v2/BaseUserController.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.coi.controller.api.v2; 2 | 3 | import org.youngmonkeys.coi.converter.ModelToResponseConverter; 4 | import org.youngmonkeys.coi.model.UserModel; 5 | import org.youngmonkeys.coi.response.UserResponse; 6 | import org.youngmonkeys.coi.service.UserService; 7 | 8 | import lombok.AllArgsConstructor; 9 | 10 | @AllArgsConstructor 11 | public class BaseUserController { 12 | 13 | protected UserService userService; 14 | protected ModelToResponseConverter responseConverter; 15 | 16 | protected UserResponse getUserByIdToResponse( 17 | long userId 18 | ) { 19 | UserModel user = userService.getUserById(userId); 20 | return responseConverter.toResponse(user); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /dont-forget-security/client/src/App.css: -------------------------------------------------------------------------------- 1 | #root { 2 | max-width: 1280px; 3 | margin: 0 auto; 4 | padding: 2rem; 5 | text-align: center; 6 | } 7 | 8 | .logo { 9 | height: 6em; 10 | padding: 1.5em; 11 | will-change: filter; 12 | transition: filter 300ms; 13 | } 14 | .logo:hover { 15 | filter: drop-shadow(0 0 2em #646cffaa); 16 | } 17 | .logo.react:hover { 18 | filter: drop-shadow(0 0 2em #61dafbaa); 19 | } 20 | 21 | @keyframes logo-spin { 22 | from { 23 | transform: rotate(0deg); 24 | } 25 | to { 26 | transform: rotate(360deg); 27 | } 28 | } 29 | 30 | @media (prefers-reduced-motion: no-preference) { 31 | a:nth-of-type(2) .logo { 32 | animation: logo-spin infinite 20s linear; 33 | } 34 | } 35 | 36 | .card { 37 | padding: 2em; 38 | } 39 | 40 | .read-the-docs { 41 | color: #888; 42 | } 43 | -------------------------------------------------------------------------------- /interface-segregation/src/main/java/org/youngmonkeys/is/db/SimpleMongodbRepository.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.is.db; 2 | 3 | import java.util.Collection; 4 | import java.util.List; 5 | 6 | public class SimpleMongodbRepository implements MongodbRepository { 7 | @Override 8 | public void save(E entity) {} 9 | 10 | @Override 11 | public void save(Collection entities) {} 12 | 13 | @Override 14 | public E findById(I id) { 15 | return null; 16 | } 17 | 18 | @Override 19 | public void deleteById(I id) {} 20 | 21 | @Override 22 | public long increment(String field, long value) { 23 | return 0; 24 | } 25 | 26 | @Override 27 | public List aggregateListWithQuery(String query, Class result) { 28 | return null; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /dont-forget-security/client/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "client", 3 | "private": true, 4 | "version": "0.0.0", 5 | "type": "module", 6 | "scripts": { 7 | "dev": "vite", 8 | "build": "tsc -b && vite build", 9 | "lint": "eslint .", 10 | "preview": "vite preview" 11 | }, 12 | "dependencies": { 13 | "react": "^19.1.0", 14 | "react-dom": "^19.1.0" 15 | }, 16 | "devDependencies": { 17 | "@eslint/js": "^9.30.1", 18 | "@types/react": "^19.1.8", 19 | "@types/react-dom": "^19.1.6", 20 | "@vitejs/plugin-react": "^4.6.0", 21 | "eslint": "^9.30.1", 22 | "eslint-plugin-react-hooks": "^5.2.0", 23 | "eslint-plugin-react-refresh": "^0.4.20", 24 | "globals": "^16.3.0", 25 | "typescript": "~5.8.3", 26 | "typescript-eslint": "^8.35.1", 27 | "vite": "^7.0.4" 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /dont-forget-security/src/main/java/org/youngmonkeys/dfs/zeroday/ZeroDayController.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.dfs.zeroday; 2 | 3 | import com.tvd12.ezyhttp.core.response.ResponseEntity; 4 | import com.tvd12.ezyhttp.server.core.annotation.Controller; 5 | import com.tvd12.ezyhttp.server.core.annotation.DoGet; 6 | import com.tvd12.ezyhttp.server.core.annotation.RequestParam; 7 | 8 | @Controller 9 | public class ZeroDayController { 10 | 11 | private final Logger logger = new Logger(); 12 | 13 | @DoGet("/zeroday") 14 | public ResponseEntity zerodayGet( 15 | @RequestParam("fileUrl") String fileUrl 16 | ) throws Exception { 17 | logger.info(fileUrl); 18 | return ResponseEntity.builder() 19 | .body("fileContent") 20 | .textPlain() 21 | .build(); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /liskov-substitution/src/main/java/org/youngmonkeys/ls/paint/v2/Paint.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.ls.paint.v2; 2 | 3 | import org.youngmonkeys.ls.paint.Position; 4 | import org.youngmonkeys.ls.paint.Size; 5 | 6 | public class Paint { 7 | public void pain(Shape shape) { 8 | if (shape.isValid()) { 9 | System.out.println("paint: " + shape); 10 | } 11 | } 12 | 13 | public static void main(String[] args) { 14 | Paint paint = new Paint(); 15 | paint.pain( 16 | new Rectangle( 17 | new Position(1, 2), 18 | new Size(3, 4) 19 | ) 20 | ); 21 | 22 | paint.pain( 23 | new Square( 24 | new Position(1, 2), 25 | new Size(3, 4) 26 | ) 27 | ); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /document-your-code/src/main/java/org/youngmonkeys/dyc/entity/Post.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.dyc.entity; 2 | 3 | import javax.persistence.Column; 4 | import javax.persistence.Entity; 5 | import javax.persistence.EnumType; 6 | import javax.persistence.Enumerated; 7 | import javax.persistence.Id; 8 | import javax.persistence.Table; 9 | 10 | import lombok.Getter; 11 | import lombok.Setter; 12 | 13 | @Getter 14 | @Setter 15 | @Entity 16 | @Table(name = "posts") 17 | public class Post { 18 | @Id 19 | private long id; 20 | 21 | private String title; 22 | 23 | private String content; 24 | 25 | @Column(name = "post_type") 26 | @Enumerated(EnumType.STRING) 27 | private PostType postType; 28 | 29 | @Column(name = "post_status") 30 | @Enumerated(EnumType.STRING) 31 | private PostStatus postStatus; 32 | } 33 | -------------------------------------------------------------------------------- /self-comment/src/main/java/org/youngmonkeys/sc/v2/repo/PaginationPostRepository.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.sc.v2.repo; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | import org.youngmonkeys.sc.v1.entity.Post; 7 | 8 | import com.tvd12.ezyfox.bean.annotation.EzySingleton; 9 | import com.tvd12.ezyfox.database.annotation.EzyQuery; 10 | 11 | @EzySingleton 12 | public class PaginationPostRepository { 13 | @EzyQuery( 14 | "SELECT e FROM Post e " + 15 | "WHERE e.priority < ?0 OR (e.priority = ?0 AND e.id < ?0) " + 16 | "ORDER BY e.priority DESC, e.id DESC LIMIT ?2" 17 | ) 18 | public List findPostsByPriorityDescAndIdDesc( 19 | int priorityInclusive, 20 | int idExclusive, 21 | int limit 22 | ) { 23 | return new ArrayList<>(); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /code-smell/src/main/java/org/youngmonkeys/code_smell/TooManyParameter.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.code_smell; 2 | 3 | import lombok.AllArgsConstructor; 4 | import org.youngmonkeys.code_smell.entity.UserEntity; 5 | import org.youngmonkeys.code_smell.repository.UserRepository; 6 | 7 | @AllArgsConstructor 8 | public class TooManyParameter { 9 | 10 | private final UserRepository userRepository; 11 | 12 | public void saveUser( 13 | String username, 14 | String password, 15 | String displayName, 16 | String email 17 | ) { 18 | UserEntity entity = new UserEntity(); 19 | entity.setUsername(username); 20 | entity.setPassword(password); 21 | entity.setDisplayName(displayName); 22 | entity.setEmail(email); 23 | userRepository.saveUser(entity); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/chat/chat-plugin/build.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/game/game-plugin/build.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /dont-forget-security/client/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", 4 | "target": "ES2022", 5 | "useDefineForClassFields": true, 6 | "lib": ["ES2022", "DOM", "DOM.Iterable"], 7 | "module": "ESNext", 8 | "skipLibCheck": true, 9 | 10 | /* Bundler mode */ 11 | "moduleResolution": "bundler", 12 | "allowImportingTsExtensions": true, 13 | "verbatimModuleSyntax": true, 14 | "moduleDetection": "force", 15 | "noEmit": true, 16 | "jsx": "react-jsx", 17 | 18 | /* Linting */ 19 | "strict": true, 20 | "noUnusedLocals": true, 21 | "noUnusedParameters": true, 22 | "erasableSyntaxOnly": true, 23 | "noFallthroughCasesInSwitch": true, 24 | "noUncheckedSideEffectImports": true 25 | }, 26 | "include": ["src"] 27 | } 28 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/chat/chat-app-api/src/main/java/org/youngmonkeys/chat/app/service/GreetingService.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.chat.app.service; 2 | 3 | import org.youngmonkeys.chat.app.config.AppConfig; 4 | import org.youngmonkeys.chat.common.service.CommonService; 5 | 6 | import com.tvd12.ezyfox.bean.annotation.EzyAutoBind; 7 | import com.tvd12.ezyfox.bean.annotation.EzySingleton; 8 | 9 | @EzySingleton 10 | public class GreetingService { 11 | 12 | @EzyAutoBind 13 | private AppConfig appConfig; 14 | 15 | @EzyAutoBind 16 | private CommonService commonService; 17 | 18 | public String hello(String nickName) { 19 | return appConfig.getHelloPrefix() + " " + nickName + "!"; 20 | } 21 | 22 | public String go(String nickName) { 23 | return appConfig.getGoPrefix() + " " + nickName + "!"; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/game/game-app-api/src/main/java/org/youngmonkeys/game/app/service/GreetingService.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.game.app.service; 2 | 3 | import org.youngmonkeys.game.app.config.AppConfig; 4 | import org.youngmonkeys.game.common.service.CommonService; 5 | 6 | import com.tvd12.ezyfox.bean.annotation.EzyAutoBind; 7 | import com.tvd12.ezyfox.bean.annotation.EzySingleton; 8 | 9 | @EzySingleton 10 | public class GreetingService { 11 | 12 | @EzyAutoBind 13 | private AppConfig appConfig; 14 | 15 | @EzyAutoBind 16 | private CommonService commonService; 17 | 18 | public String hello(String nickName) { 19 | return appConfig.getHelloPrefix() + " " + nickName + "!"; 20 | } 21 | 22 | public String go(String nickName) { 23 | return appConfig.getGoPrefix() + " " + nickName + "!"; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/chat/chat-app-entry/build.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/game/game-app-entry/build.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /refactoring-spring-boot/src/main/java/org/youngmonkeys/refactoring/v2/advice/GlobalExceptionHandler.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.refactoring.v2.advice; 2 | 3 | import org.slf4j.Logger; 4 | import org.slf4j.LoggerFactory; 5 | import org.springframework.http.ResponseEntity; 6 | import org.springframework.web.bind.annotation.ControllerAdvice; 7 | import org.springframework.web.bind.annotation.ExceptionHandler; 8 | 9 | @ControllerAdvice 10 | public class GlobalExceptionHandler { 11 | 12 | private final Logger logger = 13 | LoggerFactory.getLogger(GlobalExceptionHandler.class); 14 | 15 | @ExceptionHandler(Exception.class) 16 | public ResponseEntity handle(Exception e) { 17 | logger.info("internal server error", e); 18 | return ResponseEntity 19 | .internalServerError() 20 | .body(e.getMessage()); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /dont-forget-security/src/main/java/org/youngmonkeys/dfs/clickjacking/controller/ClickjackingController.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.dfs.clickjacking.controller; 2 | 3 | import com.tvd12.ezyfox.util.EzyLoggable; 4 | import com.tvd12.ezyhttp.server.core.annotation.Controller; 5 | import com.tvd12.ezyhttp.server.core.annotation.DoPost; 6 | import com.tvd12.ezyhttp.server.core.annotation.RequestParam; 7 | import com.tvd12.ezyhttp.server.core.view.Redirect; 8 | 9 | @Controller 10 | public class ClickjackingController extends EzyLoggable { 11 | 12 | @DoPost("/clickjacking/transfer") 13 | public Redirect csrfTransferPost( 14 | @RequestParam("value") String value, 15 | @RequestParam("to") String to 16 | ) { 17 | logger.info("clickjacking: user has just transfer: {} to: {}", value, to); 18 | return Redirect.to("/clickjacking.html"); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /copilot-example/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | org.youngmonkeys 8 | programming-principles 9 | 1.0.0 10 | 11 | 12 | org.example 13 | copilot-example 14 | 15 | 16 | 17 | com.tvd12 18 | ezyhttp-server-boot 19 | ${ezy.http.version} 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /write-dry-code/src/main/java/org/youngmonkeys/wdc/duplicated_method/v1/service/PageService.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.wdc.duplicated_method.v1.service; 2 | 3 | import org.youngmonkeys.wdc.duplicated_method.v1.converter.PageModelToEntityConverter; 4 | import org.youngmonkeys.wdc.duplicated_method.v1.model.AddPageModel; 5 | import org.youngmonkeys.wdc.duplicated_method.v1.repository.PageRepository; 6 | 7 | import com.tvd12.ezyhttp.server.core.annotation.Service; 8 | 9 | import lombok.AllArgsConstructor; 10 | 11 | @Service 12 | @AllArgsConstructor 13 | public class PageService { 14 | 15 | private final PageRepository pageRepository; 16 | private final PageModelToEntityConverter pageModelToEntityConverter; 17 | 18 | public void addPage(AddPageModel model) { 19 | pageRepository.save( 20 | pageModelToEntityConverter.toEntity(model) 21 | ); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /write-dry-code/src/main/java/org/youngmonkeys/wdc/duplicated_method/v2/service/AbstractPostService.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.wdc.duplicated_method.v2.service; 2 | 3 | import org.youngmonkeys.wdc.duplicated_method.v1.model.AddPostModel; 4 | import org.youngmonkeys.wdc.duplicated_method.v1.repository.PostRepository; 5 | import org.youngmonkeys.wdc.duplicated_method.v2.converter.ModelToEntityConverter; 6 | 7 | import com.tvd12.ezyhttp.server.core.annotation.Service; 8 | 9 | import lombok.AllArgsConstructor; 10 | 11 | @Service 12 | @AllArgsConstructor 13 | public class AbstractPostService { 14 | 15 | private final PostRepository postRepository; 16 | private final ModelToEntityConverter modelToEntityConverter; 17 | 18 | public void addPost(AddPostModel model) { 19 | postRepository.save( 20 | modelToEntityConverter.toEntity(model) 21 | ); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /dont-forget-security/src/main/resources/templates/xss.html: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | XSS 8 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /document-your-code/src/main/java/org/youngmonkeys/dyc/repo/PaginationRepository.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.dyc.repo; 2 | 3 | import com.tvd12.ezyfox.reflect.EzyGenerics; 4 | 5 | /** 6 | * For pagination business. 7 | * 8 | * @param the filter value type 9 | * @param

the pagination value type (inclusive or exclusive value type) 10 | * @param the id type 11 | * @param the entity type 12 | */ 13 | public class PaginationRepository 14 | extends PaginationResultRepository { 15 | 16 | @Override 17 | protected Class getResultType() { 18 | return getEntityType(); 19 | } 20 | 21 | @SuppressWarnings("unchecked") 22 | @Override 23 | protected Class getEntityType() { 24 | return EzyGenerics.getGenericClassArguments( 25 | getClass().getGenericSuperclass(), 26 | 4 27 | )[3]; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /refactoring-spring-web-mvc/src/main/webapp/WEB-INF/dispatcher-servlet.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/chat/build.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/game/build.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /separation-of-concerns-ezyfox-server/chat/chat-app-api/src/main/java/org/youngmonkeys/chat/app/controller/ServerReadyController.java: -------------------------------------------------------------------------------- 1 | package org.youngmonkeys.chat.app.controller; 2 | 3 | import com.tvd12.ezyfox.bean.annotation.EzySingleton; 4 | import com.tvd12.ezyfox.core.annotation.EzyEventHandler; 5 | import com.tvd12.ezyfoxserver.context.EzyAppContext; 6 | import com.tvd12.ezyfoxserver.controller.EzyAbstractAppEventController; 7 | import com.tvd12.ezyfoxserver.event.EzyServerReadyEvent; 8 | 9 | import static com.tvd12.ezyfoxserver.constant.EzyEventNames.SERVER_READY; 10 | 11 | @EzySingleton 12 | @EzyEventHandler(SERVER_READY) // refer EzyEventType 13 | public class ServerReadyController 14 | extends EzyAbstractAppEventController { 15 | 16 | @Override 17 | public void handle(EzyAppContext ctx, EzyServerReadyEvent event) { 18 | logger.info("chat app: fire custom app ready"); 19 | } 20 | } 21 | --------------------------------------------------------------------------------