├── .github └── CODEOWNERS ├── loggingdemo ├── src │ └── main │ │ ├── resources │ │ ├── application.properties │ │ └── logback-spring.xml │ │ └── java │ │ └── com │ │ └── betterjavacode │ │ └── loggingdemo │ │ ├── LoggingdemoApplication.java │ │ └── controller │ │ └── CompanyController.java ├── settings.gradle ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties └── build.gradle ├── kafkademo ├── settings.gradle ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── src │ ├── test │ │ └── java │ │ │ └── com │ │ │ └── betterjavacode │ │ │ └── kafkademo │ │ │ └── KafkademoApplicationTests.java │ └── main │ │ ├── java │ │ └── com │ │ │ └── betterjavacode │ │ │ └── kafkademo │ │ │ ├── KafkademoApplication.java │ │ │ ├── consumers │ │ │ └── KafkaConsumer.java │ │ │ ├── producers │ │ │ └── KafkaProducer.java │ │ │ └── resource │ │ │ └── KafkaRestController.java │ │ └── resources │ │ └── application.yml ├── build.gradle └── README.md ├── retrydemo ├── settings.gradle ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── src │ └── main │ │ ├── resources │ │ └── application.properties │ │ └── java │ │ └── com │ │ └── betterjavacode │ │ └── retrydemo │ │ ├── daos │ │ └── CompanyRepository.java │ │ ├── RetrydemoApplication.java │ │ ├── models │ │ └── Company.java │ │ ├── controllers │ │ └── CompanyController.java │ │ └── dtos │ │ └── CompanyDto.java └── build.gradle ├── cognitodemo ├── settings.gradle ├── src │ └── main │ │ ├── resources │ │ ├── sssstore.p12 │ │ └── templates │ │ │ └── index.html │ │ └── java │ │ └── com │ │ └── betterjavacode │ │ └── cognitodemo │ │ ├── CognitodemoApplication.java │ │ ├── ServletInitializer.java │ │ ├── controllers │ │ └── MainController.java │ │ └── config │ │ ├── SecurityConfig.java │ │ └── CustomLogoutSuccessHandler.java ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties └── build.gradle ├── dynamodbdemo ├── settings.gradle ├── src │ ├── main │ │ ├── resources │ │ │ └── application.properties │ │ └── java │ │ │ └── com │ │ │ └── betterjavacode │ │ │ └── dynamodbdemo │ │ │ ├── repositories │ │ │ └── CompanyRepository.java │ │ │ ├── DynamodbdemoApplication.java │ │ │ ├── services │ │ │ └── CompanyService.java │ │ │ ├── models │ │ │ └── Company.java │ │ │ ├── controllers │ │ │ └── CompanyController.java │ │ │ └── config │ │ │ └── ApplicationConfig.java │ └── test │ │ └── java │ │ └── com │ │ └── betterjavacode │ │ └── dynamodbdemo │ │ └── DynamodbdemoApplicationTests.java ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties └── build.gradle ├── messagesender ├── settings.gradle ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── src │ ├── main │ │ ├── resources │ │ │ └── application.properties │ │ └── java │ │ │ └── com │ │ │ └── betterjavacode │ │ │ └── messagesender │ │ │ ├── MessagesenderApplication.java │ │ │ ├── config │ │ │ └── JmsConfig.java │ │ │ └── controller │ │ │ └── MessageController.java │ └── test │ │ └── java │ │ └── com │ │ └── betterjavacode │ │ └── messagesender │ │ └── MessagesenderApplicationTests.java └── build.gradle ├── messagereceiver ├── settings.gradle ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── src │ ├── main │ │ ├── resources │ │ │ └── application.properties │ │ └── java │ │ │ └── com │ │ │ └── betterjavacode │ │ │ └── messagereceiver │ │ │ ├── MessagereceiverApplication.java │ │ │ └── consumers │ │ │ └── MessageConsumer.java │ └── test │ │ └── java │ │ └── com │ │ └── betterjavacode │ │ └── messagereceiver │ │ └── MessagereceiverApplicationTests.java └── build.gradle ├── modelmapperdemo ├── settings.gradle ├── src │ └── main │ │ ├── java │ │ └── com │ │ │ └── betterjavacode │ │ │ └── modelmapperdemo │ │ │ ├── service │ │ │ └── IOrderService.java │ │ │ ├── repositories │ │ │ ├── CustomerRepository.java │ │ │ ├── OrderRepository.java │ │ │ └── AddressRepository.java │ │ │ ├── ModelmapperdemoApplication.java │ │ │ └── models │ │ │ ├── Order.java │ │ │ └── Customer.java │ │ └── resources │ │ └── application.properties ├── SQLScript └── build.gradle ├── todolistkeycloaksaml ├── settings.gradle ├── sssstore.p12 ├── samlKeystore.jks ├── src │ └── main │ │ ├── resources │ │ ├── sssstore.p12 │ │ ├── templates │ │ │ ├── login.html │ │ │ └── signupconfirmation.html │ │ └── credentials │ │ │ └── idp.cer │ │ └── java │ │ └── com │ │ └── betterjavacode │ │ └── sss │ │ └── todolist │ │ ├── utils │ │ └── StringUtils.java │ │ ├── repositories │ │ └── UsersRepository.java │ │ ├── TodolistApplication.java │ │ ├── ServletInitializer.java │ │ ├── exceptions │ │ └── CustomOAuth2AuthenticationException.java │ │ ├── managers │ │ └── UsersManager.java │ │ ├── security │ │ └── CustomLogoutSuccessHandler.java │ │ └── dtos │ │ └── UserDto.java ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── README.md └── build.gradle ├── elasticsearchdemo ├── settings.gradle ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── src │ ├── test │ │ └── java │ │ │ └── com │ │ │ └── betterjavacode │ │ │ └── elasticsearchdemo │ │ │ └── ElasticsearchdemoApplicationTests.java │ └── main │ │ └── java │ │ └── com │ │ └── betterjavacode │ │ └── elasticsearchdemo │ │ ├── ElasticsearchdemoApplication.java │ │ ├── repositories │ │ └── LogDataRepository.java │ │ ├── services │ │ └── LogDataService.java │ │ ├── config │ │ └── ElasticsearchClientConfiguration.java │ │ └── controllers │ │ └── LogDataController.java └── build.gradle ├── twofactorauthdemo ├── settings.gradle ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── src │ └── main │ │ ├── java │ │ └── com │ │ │ └── betterjavacode │ │ │ └── twofactorauthdemo │ │ │ ├── services │ │ │ ├── EmailService.java │ │ │ ├── SecureTokenService.java │ │ │ ├── impl │ │ │ │ └── EmailServiceImpl.java │ │ │ └── UserService.java │ │ │ ├── managers │ │ │ ├── MfaTokenManager.java │ │ │ └── impl │ │ │ │ └── MfaTokenManagerImpl.java │ │ │ ├── TwofactorauthdemoApplication.java │ │ │ ├── repositories │ │ │ ├── UserRepository.java │ │ │ └── SecureTokenRepository.java │ │ │ ├── controllers │ │ │ └── HomePageController.java │ │ │ ├── exceptions │ │ │ ├── InvalidTokenException.java │ │ │ ├── UnknownIdentifierException.java │ │ │ └── UserAlreadyExistsException.java │ │ │ ├── config │ │ │ ├── web │ │ │ │ ├── CustomWebAuthenticationDetailsSource.java │ │ │ │ └── CustomWebAuthenticationDetails.java │ │ │ └── handlers │ │ │ │ ├── LoginAuthenticationFailureHandler.java │ │ │ │ └── CustomAccessDeniedHandler.java │ │ │ ├── dtos │ │ │ ├── MfaTokenDto.java │ │ │ ├── ResetPasswordDto.java │ │ │ └── UserDto.java │ │ │ ├── context │ │ │ └── AccountVerificationEmailContext.java │ │ │ └── models │ │ │ └── SecureToken.java │ │ └── resources │ │ ├── static │ │ └── js │ │ │ └── common.js │ │ ├── application.properties │ │ ├── templates │ │ └── core │ │ │ └── head.html │ │ └── message.properties └── build.gradle ├── bullqueuedemo ├── .prettierrc ├── data.csv ├── tsconfig.build.json ├── test │ ├── jest-e2e.json │ └── app.e2e-spec.ts ├── src │ ├── main.ts │ ├── prisma.service.ts │ ├── bull-board-queue.ts │ ├── app.controller.spec.ts │ ├── file-upload.processor.ts │ ├── user.service.ts │ ├── merge-data.processor.ts │ ├── bull-board-controller.ts │ └── app.module.ts ├── prisma │ ├── migrations │ │ └── 20220422191119_init │ │ │ └── migration.sql │ └── schema.prisma ├── .env ├── tsconfig.json └── .eslintrc.js ├── springcloudfunctiondemo ├── settings.gradle ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties └── src │ └── main │ ├── resources │ └── application.properties │ └── java │ └── com │ └── betterjavacode │ └── springcloudfunctiondemo │ ├── repositories │ └── CustomerRepository.java │ ├── SpringcloudfunctiondemoApplication.java │ └── functions │ ├── CustomerFunction.java │ ├── CustomerSupplier.java │ └── CustomerConsumer.java ├── nestjs-event-emitter-demo ├── .prettierrc ├── nest-cli.json ├── tsconfig.build.json ├── prisma │ ├── migrations │ │ ├── migration_lock.toml │ │ ├── 20231210183421_create_intial_db │ │ │ └── migration.sql │ │ └── 20231210184153_add_internal_event_table │ │ │ └── migration.sql │ └── schema.prisma ├── src │ ├── events │ │ └── file-uploaded.event.ts │ ├── app.service.ts │ ├── app.controller.ts │ ├── entities │ │ └── fileEntity.entity.ts │ ├── common │ │ └── prisma.service.ts │ ├── main.ts │ ├── app.controller.spec.ts │ ├── controllers │ │ └── file.controller.ts │ ├── listeners │ │ └── file-uploaded.listener.ts │ └── app.module.ts ├── test │ ├── jest-e2e.json │ └── app.e2e-spec.ts ├── .gitignore ├── tsconfig.json ├── .env.example ├── .eslintrc.js └── .env ├── nestjspassportdemo ├── backend │ ├── .prettierrc │ ├── src │ │ ├── users │ │ │ ├── entities │ │ │ │ ├── entity.ts │ │ │ │ └── user.entity.ts │ │ │ ├── local.auth.guard.ts │ │ │ ├── request-user.ts │ │ │ ├── user-sign.dto.ts │ │ │ ├── dtos │ │ │ │ └── create-user.dto.ts │ │ │ ├── users.module.ts │ │ │ ├── users.service.spec.ts │ │ │ ├── users.controller.spec.ts │ │ │ ├── users.controller.ts │ │ │ └── users.service.ts │ │ ├── auth │ │ │ ├── auth.controller.ts │ │ │ ├── saml2.strategy.ts │ │ │ ├── auth.service.spec.ts │ │ │ ├── auth.module.ts │ │ │ ├── auth.controller.spec.ts │ │ │ ├── local.strategy.ts │ │ │ └── auth.service.ts │ │ ├── main.ts │ │ ├── common │ │ │ ├── prisma.module.ts │ │ │ └── prisma.service.ts │ │ └── app.module.ts │ ├── nest-cli.json │ ├── tsconfig.build.json │ ├── prisma │ │ ├── migrations │ │ │ ├── migration_lock.toml │ │ │ ├── 20220905031242_update_id_uuid │ │ │ │ └── migration.sql │ │ │ ├── 20220904220209_create_user_table │ │ │ │ └── migration.sql │ │ │ └── 20220904223319_add_password_user │ │ │ │ └── migration.sql │ │ └── schema.prisma │ ├── test │ │ ├── jest-e2e.json │ │ └── app.e2e-spec.ts │ ├── .gitignore │ ├── tsconfig.json │ └── .eslintrc.js ├── ui │ ├── public │ │ ├── robots.txt │ │ ├── favicon.ico │ │ ├── logo192.png │ │ ├── logo512.png │ │ ├── manifest.json │ │ └── index.html │ ├── src │ │ ├── index.js │ │ ├── setupTests.js │ │ ├── App.test.js │ │ ├── App.js │ │ ├── index.css │ │ ├── reportWebVitals.js │ │ ├── App.css │ │ └── components │ │ │ └── Home │ │ │ └── Home.js │ └── package.json └── README.md ├── pubsubdemo ├── set_vars.cmd ├── package.json ├── consumerapp │ ├── package.json │ └── index.js └── index.js ├── scale-bull-demo └── scale-bull-jobs-app │ ├── .prettierrc │ ├── tsconfig.build.json │ ├── src │ ├── app.service.ts │ ├── worker │ │ ├── worker.module.ts │ │ └── main.ts │ ├── main.ts │ ├── file-read │ │ ├── file-data.processor.ts │ │ └── file-data.module.ts │ ├── app.controller.spec.ts │ ├── file-upload │ │ ├── file-upload.processor.ts │ │ └── file-upload.module.ts │ ├── app.controller.ts │ └── app.module.ts │ ├── nest-cli.json │ ├── test │ ├── jest-e2e.json │ └── app.e2e-spec.ts │ ├── tsconfig.json │ ├── .eslintrc.js │ ├── seed-data.py │ ├── .gitignore │ ├── employee_data_2.csv │ └── csv │ └── b56b8997d534e6c2630903d4b023df61 ├── healthcheckdemo ├── tsconfig.build.json ├── src │ ├── app.service.ts │ ├── main.ts │ ├── prisma.service.ts │ ├── health │ │ ├── health.module.ts │ │ ├── health.controller.spec.ts │ │ ├── prismaorm.health.ts │ │ └── health.controller.ts │ ├── app.module.ts │ ├── app.controller.spec.ts │ ├── app.controller.ts │ └── user.service.ts ├── test │ ├── jest-e2e.json │ └── app.e2e-spec.ts ├── .env ├── tsconfig.json └── prisma │ ├── schema.prisma │ └── migrations │ └── 20220409153220_add_user_and_post_tables │ └── migration.sql ├── keycloak-extensions ├── customKeycloakProtocolMapper │ └── src │ │ └── main │ │ └── resources │ │ └── META-INF │ │ └── services │ │ └── org.keycloak.protocol.ProtocolMapper └── KeycloakDocker │ ├── providers │ └── customKeycloakProtocolMapper-1.0-SNAPSHOT.jar │ └── docker-compose.yml └── README.md /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | # CODEOWNERS 2 | /*.* @yogsma -------------------------------------------------------------------------------- /loggingdemo/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /kafkademo/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'kafkademo' 2 | -------------------------------------------------------------------------------- /retrydemo/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'retrydemo' 2 | -------------------------------------------------------------------------------- /cognitodemo/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'cognitodemo' 2 | -------------------------------------------------------------------------------- /dynamodbdemo/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'dynamodbdemo' 2 | -------------------------------------------------------------------------------- /loggingdemo/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'loggingdemo' 2 | -------------------------------------------------------------------------------- /messagesender/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'messagesender' 2 | -------------------------------------------------------------------------------- /messagereceiver/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'messagereceiver' 2 | -------------------------------------------------------------------------------- /modelmapperdemo/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'modelmapperdemo' 2 | -------------------------------------------------------------------------------- /todolistkeycloaksaml/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'todolist' 2 | -------------------------------------------------------------------------------- /elasticsearchdemo/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'elasticsearchdemo' 2 | -------------------------------------------------------------------------------- /twofactorauthdemo/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'twofactorauthdemo' 2 | -------------------------------------------------------------------------------- /bullqueuedemo/.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "singleQuote": true, 3 | "trailingComma": "all" 4 | } -------------------------------------------------------------------------------- /springcloudfunctiondemo/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'springcloudfunctiondemo' 2 | -------------------------------------------------------------------------------- /nestjs-event-emitter-demo/.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "singleQuote": true, 3 | "trailingComma": "all" 4 | } -------------------------------------------------------------------------------- /nestjspassportdemo/backend/.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "singleQuote": true, 3 | "trailingComma": "all" 4 | } -------------------------------------------------------------------------------- /dynamodbdemo/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | amazon.aws.accesskey= 2 | amazon.aws.secretkey= 3 | -------------------------------------------------------------------------------- /nestjspassportdemo/backend/src/users/entities/entity.ts: -------------------------------------------------------------------------------- 1 | export interface Entity { 2 | id: string 3 | } -------------------------------------------------------------------------------- /pubsubdemo/set_vars.cmd: -------------------------------------------------------------------------------- 1 | set PUBSUB_EMULATOR_HOST=localhost:8085 2 | set PUBSUB_PROJECT_ID=pubsubdemo 3 | -------------------------------------------------------------------------------- /scale-bull-demo/scale-bull-jobs-app/.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "singleQuote": true, 3 | "trailingComma": "all" 4 | } -------------------------------------------------------------------------------- /nestjspassportdemo/ui/public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /nestjs-event-emitter-demo/nest-cli.json: -------------------------------------------------------------------------------- 1 | { 2 | "collection": "@nestjs/schematics", 3 | "sourceRoot": "src" 4 | } 5 | -------------------------------------------------------------------------------- /nestjspassportdemo/backend/nest-cli.json: -------------------------------------------------------------------------------- 1 | { 2 | "collection": "@nestjs/schematics", 3 | "sourceRoot": "src" 4 | } 5 | -------------------------------------------------------------------------------- /todolistkeycloaksaml/sssstore.p12: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yogsma/betterjavacode/HEAD/todolistkeycloaksaml/sssstore.p12 -------------------------------------------------------------------------------- /todolistkeycloaksaml/samlKeystore.jks: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yogsma/betterjavacode/HEAD/todolistkeycloaksaml/samlKeystore.jks -------------------------------------------------------------------------------- /nestjspassportdemo/ui/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yogsma/betterjavacode/HEAD/nestjspassportdemo/ui/public/favicon.ico -------------------------------------------------------------------------------- /nestjspassportdemo/ui/public/logo192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yogsma/betterjavacode/HEAD/nestjspassportdemo/ui/public/logo192.png -------------------------------------------------------------------------------- /nestjspassportdemo/ui/public/logo512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yogsma/betterjavacode/HEAD/nestjspassportdemo/ui/public/logo512.png -------------------------------------------------------------------------------- /bullqueuedemo/data.csv: -------------------------------------------------------------------------------- 1 | id,email,first_name,last_name 2 | 5,stupid.people@email.com, stupid, people 3 | 6,whatever@gmail.com, whatever, sowhat -------------------------------------------------------------------------------- /cognitodemo/src/main/resources/sssstore.p12: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yogsma/betterjavacode/HEAD/cognitodemo/src/main/resources/sssstore.p12 -------------------------------------------------------------------------------- /kafkademo/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yogsma/betterjavacode/HEAD/kafkademo/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /retrydemo/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yogsma/betterjavacode/HEAD/retrydemo/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /bullqueuedemo/tsconfig.build.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "exclude": ["node_modules", "test", "dist", "**/*spec.ts"] 4 | } 5 | -------------------------------------------------------------------------------- /cognitodemo/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yogsma/betterjavacode/HEAD/cognitodemo/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /healthcheckdemo/tsconfig.build.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "exclude": ["node_modules", "test", "dist", "**/*spec.ts"] 4 | } 5 | -------------------------------------------------------------------------------- /loggingdemo/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yogsma/betterjavacode/HEAD/loggingdemo/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /dynamodbdemo/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yogsma/betterjavacode/HEAD/dynamodbdemo/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /messagesender/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yogsma/betterjavacode/HEAD/messagesender/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /messagereceiver/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yogsma/betterjavacode/HEAD/messagereceiver/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /nestjs-event-emitter-demo/tsconfig.build.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "exclude": ["node_modules", "test", "dist", "**/*spec.ts"] 4 | } 5 | -------------------------------------------------------------------------------- /elasticsearchdemo/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yogsma/betterjavacode/HEAD/elasticsearchdemo/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /nestjspassportdemo/backend/tsconfig.build.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "exclude": ["node_modules", "test", "dist", "**/*spec.ts"] 4 | } 5 | -------------------------------------------------------------------------------- /todolistkeycloaksaml/src/main/resources/sssstore.p12: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yogsma/betterjavacode/HEAD/todolistkeycloaksaml/src/main/resources/sssstore.p12 -------------------------------------------------------------------------------- /twofactorauthdemo/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yogsma/betterjavacode/HEAD/twofactorauthdemo/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /keycloak-extensions/customKeycloakProtocolMapper/src/main/resources/META-INF/services/org.keycloak.protocol.ProtocolMapper: -------------------------------------------------------------------------------- 1 | com.betterjavacode.CustomOIDCProtocolMapper -------------------------------------------------------------------------------- /scale-bull-demo/scale-bull-jobs-app/tsconfig.build.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "exclude": ["node_modules", "test", "dist", "**/*spec.ts"] 4 | } 5 | -------------------------------------------------------------------------------- /todolistkeycloaksaml/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yogsma/betterjavacode/HEAD/todolistkeycloaksaml/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /springcloudfunctiondemo/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yogsma/betterjavacode/HEAD/springcloudfunctiondemo/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /messagesender/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | spring.activemq.broker-url=tcp://localhost:61616 2 | spring.activemq.user=admin 3 | spring.activemq.password=admin 4 | -------------------------------------------------------------------------------- /todolistkeycloaksaml/src/main/resources/templates/login.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yogsma/betterjavacode/HEAD/todolistkeycloaksaml/src/main/resources/templates/login.html -------------------------------------------------------------------------------- /nestjs-event-emitter-demo/prisma/migrations/migration_lock.toml: -------------------------------------------------------------------------------- 1 | # Please do not edit this file manually 2 | # It should be added in your version-control system (i.e. Git) 3 | provider = "mysql" -------------------------------------------------------------------------------- /nestjspassportdemo/backend/prisma/migrations/migration_lock.toml: -------------------------------------------------------------------------------- 1 | # Please do not edit this file manually 2 | # It should be added in your version-control system (i.e. Git) 3 | provider = "mysql" -------------------------------------------------------------------------------- /messagereceiver/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | server.port=8081 2 | spring.activemq.broker-url=tcp://localhost:61616 3 | spring.activemq.user=admin 4 | spring.activemq.password=admin 5 | -------------------------------------------------------------------------------- /nestjs-event-emitter-demo/src/events/file-uploaded.event.ts: -------------------------------------------------------------------------------- 1 | export class FileUploadedEvent { 2 | id: string; 3 | fileName: string; 4 | fileUrl: string; 5 | fileEntityId: number; 6 | } -------------------------------------------------------------------------------- /todolistkeycloaksaml/src/main/resources/templates/signupconfirmation.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yogsma/betterjavacode/HEAD/todolistkeycloaksaml/src/main/resources/templates/signupconfirmation.html -------------------------------------------------------------------------------- /healthcheckdemo/src/app.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@nestjs/common'; 2 | 3 | @Injectable() 4 | export class AppService { 5 | getHello(): string { 6 | return 'Hello World!'; 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /nestjs-event-emitter-demo/src/app.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@nestjs/common'; 2 | 3 | @Injectable() 4 | export class AppService { 5 | getHello(): string { 6 | return 'Hello World!'; 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /scale-bull-demo/scale-bull-jobs-app/src/app.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@nestjs/common'; 2 | 3 | @Injectable() 4 | export class AppService { 5 | getHello(): string { 6 | return 'Hello World!'; 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /keycloak-extensions/KeycloakDocker/providers/customKeycloakProtocolMapper-1.0-SNAPSHOT.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yogsma/betterjavacode/HEAD/keycloak-extensions/KeycloakDocker/providers/customKeycloakProtocolMapper-1.0-SNAPSHOT.jar -------------------------------------------------------------------------------- /scale-bull-demo/scale-bull-jobs-app/nest-cli.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/nest-cli", 3 | "collection": "@nestjs/schematics", 4 | "sourceRoot": "src", 5 | "compilerOptions": { 6 | "deleteOutDir": true 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /scale-bull-demo/scale-bull-jobs-app/src/worker/worker.module.ts: -------------------------------------------------------------------------------- 1 | import { Module } from "@nestjs/common"; 2 | 3 | 4 | 5 | @Module({ 6 | imports: [], 7 | controllers: [], 8 | providers: [], 9 | }) 10 | export class WorkerModule {} -------------------------------------------------------------------------------- /nestjspassportdemo/backend/src/users/local.auth.guard.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from "@nestjs/common"; 2 | import { AuthGuard } from "@nestjs/passport"; 3 | 4 | @Injectable() 5 | export class LocalAuthGuard extends AuthGuard('local') { 6 | 7 | } -------------------------------------------------------------------------------- /bullqueuedemo/test/jest-e2e.json: -------------------------------------------------------------------------------- 1 | { 2 | "moduleFileExtensions": ["js", "json", "ts"], 3 | "rootDir": ".", 4 | "testEnvironment": "node", 5 | "testRegex": ".e2e-spec.ts$", 6 | "transform": { 7 | "^.+\\.(t|j)s$": "ts-jest" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /healthcheckdemo/test/jest-e2e.json: -------------------------------------------------------------------------------- 1 | { 2 | "moduleFileExtensions": ["js", "json", "ts"], 3 | "rootDir": ".", 4 | "testEnvironment": "node", 5 | "testRegex": ".e2e-spec.ts$", 6 | "transform": { 7 | "^.+\\.(t|j)s$": "ts-jest" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /bullqueuedemo/src/main.ts: -------------------------------------------------------------------------------- 1 | import { NestFactory } from '@nestjs/core'; 2 | import { AppModule } from './app.module'; 3 | 4 | async function bootstrap() { 5 | const app = await NestFactory.create(AppModule); 6 | await app.listen(3000); 7 | } 8 | bootstrap(); 9 | -------------------------------------------------------------------------------- /kafkademo/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.1.1-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /loggingdemo/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /nestjs-event-emitter-demo/test/jest-e2e.json: -------------------------------------------------------------------------------- 1 | { 2 | "moduleFileExtensions": ["js", "json", "ts"], 3 | "rootDir": ".", 4 | "testEnvironment": "node", 5 | "testRegex": ".e2e-spec.ts$", 6 | "transform": { 7 | "^.+\\.(t|j)s$": "ts-jest" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /nestjspassportdemo/backend/src/users/request-user.ts: -------------------------------------------------------------------------------- 1 | import { Request } from 'express'; 2 | import { User } from './entities/user.entity'; 3 | 4 | 5 | interface RequestWithUser extends Request { 6 | user: User; 7 | } 8 | 9 | export default RequestWithUser; -------------------------------------------------------------------------------- /retrydemo/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.3-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /cognitodemo/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.3-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /dynamodbdemo/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.1.1-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /messagereceiver/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.1.1-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /messagesender/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.1.1-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /nestjspassportdemo/backend/test/jest-e2e.json: -------------------------------------------------------------------------------- 1 | { 2 | "moduleFileExtensions": ["js", "json", "ts"], 3 | "rootDir": ".", 4 | "testEnvironment": "node", 5 | "testRegex": ".e2e-spec.ts$", 6 | "transform": { 7 | "^.+\\.(t|j)s$": "ts-jest" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /elasticsearchdemo/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.1.1-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /nestjspassportdemo/README.md: -------------------------------------------------------------------------------- 1 | This is a sample application to demonstrate SAML Single Sign On. 2 | - UI - frontend application code - using REACT 3 | - Backend - backend application code - using NestJS 4 | 5 | UI -> Load Balancer -> Controller -> Service -> Repository -> database -------------------------------------------------------------------------------- /nestjspassportdemo/ui/src/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom'; 3 | import App from './App'; 4 | 5 | 6 | ReactDOM.render( 7 | 8 | 9 | , 10 | document.getElementById('root') 11 | ); -------------------------------------------------------------------------------- /scale-bull-demo/scale-bull-jobs-app/test/jest-e2e.json: -------------------------------------------------------------------------------- 1 | { 2 | "moduleFileExtensions": ["js", "json", "ts"], 3 | "rootDir": ".", 4 | "testEnvironment": "node", 5 | "testRegex": ".e2e-spec.ts$", 6 | "transform": { 7 | "^.+\\.(t|j)s$": "ts-jest" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /todolistkeycloaksaml/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /twofactorauthdemo/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /nestjspassportdemo/backend/src/auth/auth.controller.ts: -------------------------------------------------------------------------------- 1 | import { Controller } from '@nestjs/common'; 2 | import { AuthService } from './auth.service'; 3 | 4 | @Controller('auth') 5 | export class AuthController { 6 | constructor(private readonly authService: AuthService) {} 7 | } 8 | -------------------------------------------------------------------------------- /scale-bull-demo/scale-bull-jobs-app/src/main.ts: -------------------------------------------------------------------------------- 1 | import { NestFactory } from '@nestjs/core'; 2 | import { AppModule } from './app.module'; 3 | 4 | async function bootstrap() { 5 | const app = await NestFactory.create(AppModule); 6 | await app.listen(3000); 7 | } 8 | bootstrap(); 9 | -------------------------------------------------------------------------------- /springcloudfunctiondemo/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.2-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /nestjspassportdemo/backend/src/users/user-sign.dto.ts: -------------------------------------------------------------------------------- 1 | import { IsNotEmpty, IsString } from "class-validator"; 2 | 3 | export class UserSignDto { 4 | @IsString() 5 | @IsNotEmpty() 6 | email: string; 7 | 8 | @IsNotEmpty() 9 | password: string; 10 | } -------------------------------------------------------------------------------- /nestjspassportdemo/ui/src/setupTests.js: -------------------------------------------------------------------------------- 1 | // jest-dom adds custom jest matchers for asserting on DOM nodes. 2 | // allows you to do things like: 3 | // expect(element).toHaveTextContent(/react/i) 4 | // learn more: https://github.com/testing-library/jest-dom 5 | import '@testing-library/jest-dom'; 6 | -------------------------------------------------------------------------------- /nestjspassportdemo/backend/src/main.ts: -------------------------------------------------------------------------------- 1 | import { NestFactory } from '@nestjs/core'; 2 | import { AppModule } from './app.module'; 3 | 4 | async function bootstrap() { 5 | const app = await NestFactory.create(AppModule); 6 | app.enableCors(); 7 | await app.listen(3000); 8 | } 9 | bootstrap(); 10 | -------------------------------------------------------------------------------- /nestjspassportdemo/ui/src/App.test.js: -------------------------------------------------------------------------------- 1 | import { render, screen } from '@testing-library/react'; 2 | import App from './App'; 3 | 4 | test('renders learn react link', () => { 5 | render(); 6 | const linkElement = screen.getByText(/learn react/i); 7 | expect(linkElement).toBeInTheDocument(); 8 | }); 9 | -------------------------------------------------------------------------------- /springcloudfunctiondemo/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | spring.cloud.function.definition=customerConsumer 2 | spring.datasource.url=jdbc:h2:mem:customerdb 3 | spring.datasource.driverClassName=org.h2.Driver 4 | spring.datasource.username=sa 5 | spring.datasource.password= 6 | spring.jpa.hibernate.ddl-auto=create 7 | -------------------------------------------------------------------------------- /todolistkeycloaksaml/src/main/java/com/betterjavacode/sss/todolist/utils/StringUtils.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.sss.todolist.utils; 2 | 3 | public class StringUtils 4 | { 5 | public static boolean isNullOrEmpty(String str) 6 | { 7 | return (str == null || str.equals("")); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /nestjspassportdemo/backend/src/common/prisma.module.ts: -------------------------------------------------------------------------------- 1 | import { Module } from "@nestjs/common"; 2 | import { PrismaService } from "./prisma.service"; 3 | 4 | @Module({ 5 | imports: [], 6 | controllers: [], 7 | providers: [PrismaService], 8 | exports: [PrismaService] 9 | }) 10 | export class PrismaModule{} -------------------------------------------------------------------------------- /kafkademo/src/test/java/com/betterjavacode/kafkademo/KafkademoApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.kafkademo; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import org.springframework.boot.test.context.SpringBootTest; 5 | 6 | @SpringBootTest 7 | class KafkademoApplicationTests { 8 | 9 | @Test 10 | void contextLoads() 11 | { 12 | } 13 | 14 | } 15 | -------------------------------------------------------------------------------- /nestjspassportdemo/ui/src/App.js: -------------------------------------------------------------------------------- 1 | 2 | import { useState } from "react"; 3 | import Index from "./components/index"; 4 | 5 | function App() { 6 | const [isLoggedIn, setLoggedIn ] = useState(false); 7 | 8 | return ( 9 | <> 10 | 11 | 12 | 13 | ); 14 | } 15 | 16 | export default App; -------------------------------------------------------------------------------- /nestjs-event-emitter-demo/src/app.controller.ts: -------------------------------------------------------------------------------- 1 | import { Controller, Get } from '@nestjs/common'; 2 | import { AppService } from './app.service'; 3 | 4 | @Controller() 5 | export class AppController { 6 | constructor(private readonly appService: AppService) {} 7 | 8 | @Get() 9 | getHello(): string { 10 | return this.appService.getHello(); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /dynamodbdemo/src/test/java/com/betterjavacode/dynamodbdemo/DynamodbdemoApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.dynamodbdemo; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import org.springframework.boot.test.context.SpringBootTest; 5 | 6 | @SpringBootTest 7 | class DynamodbdemoApplicationTests { 8 | 9 | @Test 10 | void contextLoads() { 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /messagesender/src/test/java/com/betterjavacode/messagesender/MessagesenderApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.messagesender; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import org.springframework.boot.test.context.SpringBootTest; 5 | 6 | @SpringBootTest 7 | class MessagesenderApplicationTests { 8 | 9 | @Test 10 | void contextLoads() { 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /messagereceiver/src/test/java/com/betterjavacode/messagereceiver/MessagereceiverApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.messagereceiver; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import org.springframework.boot.test.context.SpringBootTest; 5 | 6 | @SpringBootTest 7 | class MessagereceiverApplicationTests { 8 | 9 | @Test 10 | void contextLoads() { 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /pubsubdemo/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "pubsubdemo", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "Yogesh Mali", 10 | "license": "ISC", 11 | "dependencies": { 12 | "@google-cloud/pubsub": "^2.18.4", 13 | "dotenv": "~4.0.0" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /elasticsearchdemo/src/test/java/com/betterjavacode/elasticsearchdemo/ElasticsearchdemoApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.elasticsearchdemo; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import org.springframework.boot.test.context.SpringBootTest; 5 | 6 | @SpringBootTest 7 | class ElasticsearchdemoApplicationTests { 8 | 9 | @Test 10 | void contextLoads() { 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /modelmapperdemo/src/main/java/com/betterjavacode/modelmapperdemo/service/IOrderService.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.modelmapperdemo.service; 2 | 3 | import com.betterjavacode.modelmapperdemo.models.Order; 4 | 5 | import java.util.List; 6 | 7 | public interface IOrderService 8 | { 9 | Order createOrder(Order order); 10 | 11 | List getAllOrdersForCustomer(long customerId); 12 | } 13 | -------------------------------------------------------------------------------- /nestjs-event-emitter-demo/src/entities/fileEntity.entity.ts: -------------------------------------------------------------------------------- 1 | export class FileEntity { 2 | public id: number; 3 | public fileName: string; 4 | public fileUrl: string; 5 | public key: string; 6 | 7 | constructor(fileName: string, fileUrl: string, key: string){ 8 | this.fileName = fileName; 9 | this.fileUrl = fileUrl; 10 | this.key = key; 11 | } 12 | 13 | } -------------------------------------------------------------------------------- /nestjspassportdemo/backend/prisma/migrations/20220905031242_update_id_uuid/migration.sql: -------------------------------------------------------------------------------- 1 | /* 2 | Warnings: 3 | 4 | - The primary key for the `user` table will be changed. If it partially fails, the table could be left without primary key constraint. 5 | 6 | */ 7 | -- AlterTable 8 | ALTER TABLE `user` DROP PRIMARY KEY, 9 | MODIFY `id` VARCHAR(191) NOT NULL, 10 | ADD PRIMARY KEY (`id`); 11 | -------------------------------------------------------------------------------- /pubsubdemo/consumerapp/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "consumerapp", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "Yogesh Mali", 10 | "license": "ISC", 11 | "dependencies": { 12 | "@google-cloud/pubsub": "^2.18.4", 13 | "dotenv": "^10.0.0" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /bullqueuedemo/prisma/migrations/20220422191119_init/migration.sql: -------------------------------------------------------------------------------- 1 | -- CreateTable 2 | CREATE TABLE `User` ( 3 | `id` INTEGER NOT NULL AUTO_INCREMENT, 4 | `email` VARCHAR(191) NOT NULL, 5 | `first_name` VARCHAR(191) NOT NULL, 6 | `last_name` VARCHAR(191) NULL, 7 | 8 | UNIQUE INDEX `User_email_key`(`email`), 9 | PRIMARY KEY (`id`) 10 | ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; 11 | -------------------------------------------------------------------------------- /springcloudfunctiondemo/src/main/java/com/betterjavacode/springcloudfunctiondemo/repositories/CustomerRepository.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.springcloudfunctiondemo.repositories; 2 | 3 | import com.betterjavacode.springcloudfunctiondemo.models.Customer; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | 6 | public interface CustomerRepository extends JpaRepository 7 | { 8 | } 9 | -------------------------------------------------------------------------------- /healthcheckdemo/src/main.ts: -------------------------------------------------------------------------------- 1 | import { NestFactory } from '@nestjs/core'; 2 | import { AppModule } from './app.module'; 3 | import { PrismaService } from './prisma.service'; 4 | 5 | async function bootstrap() { 6 | const app = await NestFactory.create(AppModule); 7 | const prismaService = app.get(PrismaService); 8 | await prismaService.enableShutdownHooks(app) 9 | await app.listen(3000); 10 | } 11 | bootstrap(); 12 | -------------------------------------------------------------------------------- /todolistkeycloaksaml/src/main/java/com/betterjavacode/sss/todolist/repositories/UsersRepository.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.sss.todolist.repositories; 2 | 3 | import com.betterjavacode.sss.todolist.models.Users; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | 6 | public interface UsersRepository extends JpaRepository 7 | { 8 | Users findUserByEmail (String email); 9 | } 10 | -------------------------------------------------------------------------------- /twofactorauthdemo/src/main/java/com/betterjavacode/twofactorauthdemo/services/EmailService.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.twofactorauthdemo.services; 2 | 3 | 4 | import com.betterjavacode.twofactorauthdemo.context.AbstractEmailContext; 5 | 6 | import javax.mail.MessagingException; 7 | 8 | public interface EmailService 9 | { 10 | void sendMail(final AbstractEmailContext email) throws MessagingException; 11 | } 12 | -------------------------------------------------------------------------------- /retrydemo/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | spring.datasource.url=jdbc:mysql://127.0.0.1/retrydemo?autoReconnect=true&useSSL=false 2 | spring.datasource.username = root 3 | spring.datasource.password=********* 4 | spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver 5 | spring.jpa.show-sql=true 6 | spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect 7 | spring.datasource.hikari.connection-test-query=SELECT 1 8 | -------------------------------------------------------------------------------- /nestjspassportdemo/backend/prisma/migrations/20220904220209_create_user_table/migration.sql: -------------------------------------------------------------------------------- 1 | -- CreateTable 2 | CREATE TABLE `User` ( 3 | `id` INTEGER NOT NULL AUTO_INCREMENT, 4 | `email` VARCHAR(191) NOT NULL, 5 | `first_name` VARCHAR(191) NOT NULL, 6 | `last_name` VARCHAR(191) NULL, 7 | 8 | UNIQUE INDEX `User_email_key`(`email`), 9 | PRIMARY KEY (`id`) 10 | ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; 11 | -------------------------------------------------------------------------------- /nestjspassportdemo/backend/src/users/dtos/create-user.dto.ts: -------------------------------------------------------------------------------- 1 | import { IsAlphanumeric, IsNotEmpty, IsString } from "class-validator"; 2 | 3 | 4 | export class CreateUserDto{ 5 | @IsString() 6 | @IsNotEmpty() 7 | email: string; 8 | 9 | @IsString() 10 | @IsNotEmpty() 11 | firstName: string; 12 | 13 | lastName: string; 14 | 15 | @IsNotEmpty() 16 | @IsAlphanumeric() 17 | password: string; 18 | } -------------------------------------------------------------------------------- /modelmapperdemo/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | spring.datasource.url=jdbc:mysql://127.0.0.1/modelmapperdemo?autoReconnect=true&useSSL=false 2 | spring.datasource.username = root 3 | spring.datasource.password=******** 4 | spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver 5 | spring.jpa.show-sql=true 6 | spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect 7 | spring.datasource.hikari.connection-test-query=SELECT 1 8 | -------------------------------------------------------------------------------- /nestjspassportdemo/ui/src/index.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0; 3 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 4 | 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', 5 | sans-serif; 6 | -webkit-font-smoothing: antialiased; 7 | -moz-osx-font-smoothing: grayscale; 8 | } 9 | 10 | code { 11 | font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', 12 | monospace; 13 | } 14 | -------------------------------------------------------------------------------- /kafkademo/src/main/java/com/betterjavacode/kafkademo/KafkademoApplication.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.kafkademo; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class KafkademoApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(KafkademoApplication.class, args); 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /nestjspassportdemo/backend/src/auth/saml2.strategy.ts: -------------------------------------------------------------------------------- 1 | /* import { Injectable } from "@nestjs/common"; 2 | import { PassportStrategy } from "@nestjs/passport"; 3 | import { MultiSamlStrategy } from "passport-saml/lib/passport-saml"; 4 | 5 | import { SamlStrategy } from "passport-saml"; 6 | 7 | 8 | @Injectable() 9 | export class Saml2Strategy extends PassportStrategy(MultiSamlStrategy, 'saml') { 10 | constructor() { 11 | 12 | } 13 | } */ -------------------------------------------------------------------------------- /nestjspassportdemo/ui/src/reportWebVitals.js: -------------------------------------------------------------------------------- 1 | const reportWebVitals = onPerfEntry => { 2 | if (onPerfEntry && onPerfEntry instanceof Function) { 3 | import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => { 4 | getCLS(onPerfEntry); 5 | getFID(onPerfEntry); 6 | getFCP(onPerfEntry); 7 | getLCP(onPerfEntry); 8 | getTTFB(onPerfEntry); 9 | }); 10 | } 11 | }; 12 | 13 | export default reportWebVitals; 14 | -------------------------------------------------------------------------------- /twofactorauthdemo/src/main/java/com/betterjavacode/twofactorauthdemo/managers/MfaTokenManager.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.twofactorauthdemo.managers; 2 | 3 | import dev.samstevens.totp.exceptions.QrGenerationException; 4 | 5 | public interface MfaTokenManager 6 | { 7 | String generateSecretKey(); 8 | String getQRCode(final String secret) throws QrGenerationException; 9 | boolean verifyTotp(final String code, final String secret); 10 | } 11 | -------------------------------------------------------------------------------- /dynamodbdemo/src/main/java/com/betterjavacode/dynamodbdemo/repositories/CompanyRepository.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.dynamodbdemo.repositories; 2 | 3 | import com.betterjavacode.dynamodbdemo.models.Company; 4 | import org.socialsignin.spring.data.dynamodb.repository.EnableScan; 5 | import org.springframework.data.repository.CrudRepository; 6 | 7 | @EnableScan 8 | public interface CompanyRepository extends CrudRepository 9 | { 10 | } 11 | -------------------------------------------------------------------------------- /dynamodbdemo/src/main/java/com/betterjavacode/dynamodbdemo/DynamodbdemoApplication.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.dynamodbdemo; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class DynamodbdemoApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(DynamodbdemoApplication.class, args); 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /todolistkeycloaksaml/src/main/java/com/betterjavacode/sss/todolist/TodolistApplication.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.sss.todolist; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | 8 | public class TodolistApplication 9 | { 10 | public static void main(String[] args) 11 | { 12 | SpringApplication.run(TodolistApplication.class, args); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /cognitodemo/src/main/java/com/betterjavacode/cognitodemo/CognitodemoApplication.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.cognitodemo; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class CognitodemoApplication 8 | { 9 | 10 | public static void main(String[] args) 11 | { 12 | SpringApplication.run(CognitodemoApplication.class, args); 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /messagesender/src/main/java/com/betterjavacode/messagesender/MessagesenderApplication.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.messagesender; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class MessagesenderApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(MessagesenderApplication.class, args); 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /messagereceiver/src/main/java/com/betterjavacode/messagereceiver/MessagereceiverApplication.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.messagereceiver; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class MessagereceiverApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(MessagereceiverApplication.class, args); 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /bullqueuedemo/prisma/schema.prisma: -------------------------------------------------------------------------------- 1 | // This is your Prisma schema file, 2 | // learn more about it in the docs: https://pris.ly/d/prisma-schema 3 | 4 | generator client { 5 | provider = "prisma-client-js" 6 | engineType = "binary" 7 | } 8 | 9 | datasource db { 10 | provider = "mysql" 11 | url = env("DATABASE_URL") 12 | } 13 | 14 | 15 | model User { 16 | id Int @default(autoincrement()) @id 17 | email String @unique 18 | first_name String 19 | last_name String? 20 | } -------------------------------------------------------------------------------- /bullqueuedemo/src/prisma.service.ts: -------------------------------------------------------------------------------- 1 | import { INestApplication, Injectable, OnModuleInit } from '@nestjs/common'; 2 | import { PrismaClient } from '@prisma/client'; 3 | 4 | @Injectable() 5 | export class PrismaService extends PrismaClient implements OnModuleInit { 6 | async onModuleInit() { 7 | await this.$connect(); 8 | } 9 | 10 | async enableShutdownHooks(app: INestApplication) { 11 | this.$on('beforeExit', async () => { 12 | await app.close(); 13 | }); 14 | } 15 | } -------------------------------------------------------------------------------- /elasticsearchdemo/src/main/java/com/betterjavacode/elasticsearchdemo/ElasticsearchdemoApplication.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.elasticsearchdemo; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class ElasticsearchdemoApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(ElasticsearchdemoApplication.class, args); 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /twofactorauthdemo/src/main/java/com/betterjavacode/twofactorauthdemo/TwofactorauthdemoApplication.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.twofactorauthdemo; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class TwofactorauthdemoApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(TwofactorauthdemoApplication.class, args); 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /healthcheckdemo/src/prisma.service.ts: -------------------------------------------------------------------------------- 1 | import { INestApplication, Injectable, OnModuleInit } from '@nestjs/common'; 2 | import { PrismaClient } from '@prisma/client'; 3 | 4 | @Injectable() 5 | export class PrismaService extends PrismaClient implements OnModuleInit { 6 | async onModuleInit() { 7 | await this.$connect(); 8 | } 9 | 10 | async enableShutdownHooks(app: INestApplication) { 11 | this.$on('beforeExit', async () => { 12 | await app.close(); 13 | }); 14 | } 15 | } -------------------------------------------------------------------------------- /nestjs-event-emitter-demo/prisma/migrations/20231210183421_create_intial_db/migration.sql: -------------------------------------------------------------------------------- 1 | -- CreateTable 2 | CREATE TABLE `FileEntity` ( 3 | `id` INTEGER NOT NULL AUTO_INCREMENT, 4 | `fileName` VARCHAR(191) NOT NULL, 5 | `fileUrl` VARCHAR(191) NOT NULL, 6 | `key` VARCHAR(191) NOT NULL, 7 | `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), 8 | `updatedAt` DATETIME(3) NOT NULL, 9 | 10 | PRIMARY KEY (`id`) 11 | ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; 12 | -------------------------------------------------------------------------------- /nestjs-event-emitter-demo/src/common/prisma.service.ts: -------------------------------------------------------------------------------- 1 | import { INestApplication, Injectable, OnModuleInit } from '@nestjs/common'; 2 | import { PrismaClient } from '@prisma/client'; 3 | 4 | @Injectable() 5 | export class PrismaService extends PrismaClient implements OnModuleInit { 6 | async onModuleInit() { 7 | await this.$connect(); 8 | } 9 | 10 | async enableShutdownHooks(app: INestApplication) { 11 | this.$on('beforeExit', async () => { 12 | await app.close(); 13 | }); 14 | } 15 | } -------------------------------------------------------------------------------- /retrydemo/src/main/java/com/betterjavacode/retrydemo/daos/CompanyRepository.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.retrydemo.daos; 2 | 3 | import com.betterjavacode.retrydemo.models.Company; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | import org.springframework.stereotype.Repository; 6 | 7 | import java.util.List; 8 | 9 | 10 | @Repository 11 | public interface CompanyRepository extends JpaRepository 12 | { 13 | 14 | List findAllByName (String name); 15 | } 16 | -------------------------------------------------------------------------------- /modelmapperdemo/src/main/java/com/betterjavacode/modelmapperdemo/repositories/CustomerRepository.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.modelmapperdemo.repositories; 2 | 3 | import com.betterjavacode.modelmapperdemo.models.Customer; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | import org.springframework.data.repository.query.Param; 6 | 7 | public interface CustomerRepository extends JpaRepository 8 | { 9 | Customer findCustomerByEmail(@Param("email") String email); 10 | } 11 | -------------------------------------------------------------------------------- /twofactorauthdemo/src/main/java/com/betterjavacode/twofactorauthdemo/repositories/UserRepository.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.twofactorauthdemo.repositories; 2 | 3 | import com.betterjavacode.twofactorauthdemo.models.UserEntity; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | import org.springframework.stereotype.Repository; 6 | 7 | @Repository 8 | public interface UserRepository extends JpaRepository 9 | { 10 | UserEntity findByEmail(String email); 11 | } 12 | -------------------------------------------------------------------------------- /nestjspassportdemo/backend/src/users/users.module.ts: -------------------------------------------------------------------------------- 1 | import { Module } from '@nestjs/common'; 2 | import { UsersService } from './users.service'; 3 | import { UsersController } from './users.controller'; 4 | import { PrismaModule } from 'src/common/prisma.module'; 5 | import { UserRepository } from './user.repository'; 6 | 7 | @Module({ 8 | imports: [PrismaModule], 9 | controllers: [UsersController], 10 | providers: [UsersService, UserRepository], 11 | exports: [UsersService] 12 | }) 13 | export class UsersModule {} 14 | -------------------------------------------------------------------------------- /messagesender/src/main/java/com/betterjavacode/messagesender/config/JmsConfig.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.messagesender.config; 2 | 3 | import org.apache.activemq.command.ActiveMQQueue; 4 | import org.springframework.context.annotation.Bean; 5 | import org.springframework.context.annotation.Configuration; 6 | 7 | import javax.jms.Queue; 8 | 9 | @Configuration 10 | public class JmsConfig 11 | { 12 | @Bean 13 | public Queue queue() 14 | { 15 | return new ActiveMQQueue("demo-queue"); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /healthcheckdemo/src/health/health.module.ts: -------------------------------------------------------------------------------- 1 | import { Module } from '@nestjs/common'; 2 | import { TerminusModule } from '@nestjs/terminus'; 3 | import { PrismaService } from 'src/prisma.service'; 4 | 5 | import { HealthController } from './health.controller'; 6 | import { PrismaOrmHealthIndicator } from './prismaorm.health'; 7 | 8 | @Module({ 9 | imports: [ 10 | TerminusModule, 11 | ], 12 | controllers: [HealthController], 13 | providers: [ PrismaOrmHealthIndicator, PrismaService] 14 | }) 15 | export class HealthModule {} -------------------------------------------------------------------------------- /twofactorauthdemo/src/main/java/com/betterjavacode/twofactorauthdemo/controllers/HomePageController.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.twofactorauthdemo.controllers; 2 | 3 | import org.springframework.stereotype.Controller; 4 | import org.springframework.web.bind.annotation.GetMapping; 5 | import org.springframework.web.bind.annotation.RequestMapping; 6 | 7 | @RequestMapping("/home") 8 | @Controller 9 | public class HomePageController 10 | { 11 | @GetMapping 12 | public String geHome(){ 13 | return "home"; 14 | } 15 | } -------------------------------------------------------------------------------- /cognitodemo/src/main/java/com/betterjavacode/cognitodemo/ServletInitializer.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.cognitodemo; 2 | 3 | import org.springframework.boot.builder.SpringApplicationBuilder; 4 | import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; 5 | 6 | public class ServletInitializer extends SpringBootServletInitializer { 7 | 8 | @Override 9 | protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { 10 | return application.sources(CognitodemoApplication.class); 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /healthcheckdemo/.env: -------------------------------------------------------------------------------- 1 | # Environment variables declared in this file are automatically made available to Prisma. 2 | # See the documentation for more detail: https://pris.ly/d/prisma-schema#accessing-environment-variables-from-the-schema 3 | 4 | # Prisma supports the native connection string format for PostgreSQL, MySQL, SQLite, SQL Server, MongoDB and CockroachDB (Preview). 5 | # See the documentation for all the connection string options: https://pris.ly/d/connection-strings 6 | 7 | DATABASE_URL="mysql://user:password@localhost:3306/healthcheckdemo?schema=public" -------------------------------------------------------------------------------- /scale-bull-demo/scale-bull-jobs-app/src/file-read/file-data.processor.ts: -------------------------------------------------------------------------------- 1 | import { Process, Processor } from "@nestjs/bull"; 2 | import { Job } from "bull"; 3 | 4 | 5 | @Processor('file-data-queue') 6 | export class FileDataProcessor{ 7 | 8 | 9 | @Process('process-data') 10 | async processFile(job: Job) { 11 | const data = job.data; 12 | 13 | console.log('processing data for a single user'); 14 | console.log(data); 15 | 16 | // To-Do add some processing like inserting this data in DB 17 | } 18 | 19 | } -------------------------------------------------------------------------------- /loggingdemo/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'org.springframework.boot' version '2.6.0' 3 | id 'io.spring.dependency-management' version '1.0.11.RELEASE' 4 | id 'java' 5 | } 6 | 7 | group = 'com.betterjavacode' 8 | version = '0.0.1-SNAPSHOT' 9 | sourceCompatibility = '1.8' 10 | 11 | repositories { 12 | mavenCentral() 13 | } 14 | 15 | dependencies { 16 | implementation 'org.springframework.boot:spring-boot-starter-web' 17 | testImplementation 'org.springframework.boot:spring-boot-starter-test' 18 | } 19 | 20 | test { 21 | useJUnitPlatform() 22 | } 23 | -------------------------------------------------------------------------------- /nestjs-event-emitter-demo/prisma/migrations/20231210184153_add_internal_event_table/migration.sql: -------------------------------------------------------------------------------- 1 | -- CreateTable 2 | CREATE TABLE `InternalEvent` ( 3 | `id` VARCHAR(191) NOT NULL, 4 | `eventName` VARCHAR(191) NOT NULL, 5 | `eventStatus` ENUM('PENDING', 'PROCESSED', 'IGNORED', 'PUBLISHED') NOT NULL, 6 | `eventPayload` JSON NOT NULL, 7 | `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), 8 | `updatedAt` DATETIME(3) NOT NULL, 9 | 10 | PRIMARY KEY (`id`) 11 | ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; 12 | -------------------------------------------------------------------------------- /twofactorauthdemo/src/main/java/com/betterjavacode/twofactorauthdemo/exceptions/InvalidTokenException.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.twofactorauthdemo.exceptions; 2 | 3 | public class InvalidTokenException extends Exception 4 | { 5 | public InvalidTokenException() { 6 | super(); 7 | } 8 | 9 | 10 | public InvalidTokenException(String message) { 11 | super(message); 12 | } 13 | 14 | 15 | public InvalidTokenException(String message, Throwable cause) { 16 | super(message, cause); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /twofactorauthdemo/src/main/java/com/betterjavacode/twofactorauthdemo/services/SecureTokenService.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.twofactorauthdemo.services; 2 | 3 | import com.betterjavacode.twofactorauthdemo.models.SecureToken; 4 | 5 | public interface SecureTokenService 6 | { 7 | SecureToken createSecureToken(); 8 | void saveSecureToken(final SecureToken secureToken); 9 | SecureToken findByToken(final String token); 10 | void removeToken(final SecureToken secureToken); 11 | void removeTokenByToken(final String token); 12 | } 13 | -------------------------------------------------------------------------------- /nestjspassportdemo/backend/src/app.module.ts: -------------------------------------------------------------------------------- 1 | import { Module } from '@nestjs/common'; 2 | import { ConfigModule } from '@nestjs/config'; 3 | import { PrismaModule } from './common/prisma.module'; 4 | import { UsersModule } from './users/users.module'; 5 | import { AuthModule } from './auth/auth.module'; 6 | 7 | @Module({ 8 | imports: [ 9 | ConfigModule.forRoot({ 10 | isGlobal: true 11 | }), 12 | UsersModule, 13 | PrismaModule, 14 | AuthModule 15 | ], 16 | controllers: [], 17 | providers: [], 18 | }) 19 | export class AppModule {} 20 | -------------------------------------------------------------------------------- /nestjspassportdemo/backend/src/auth/auth.service.spec.ts: -------------------------------------------------------------------------------- 1 | import { Test, TestingModule } from '@nestjs/testing'; 2 | import { AuthService } from './auth.service'; 3 | 4 | describe('AuthService', () => { 5 | let service: AuthService; 6 | 7 | beforeEach(async () => { 8 | const module: TestingModule = await Test.createTestingModule({ 9 | providers: [AuthService], 10 | }).compile(); 11 | 12 | service = module.get(AuthService); 13 | }); 14 | 15 | it('should be defined', () => { 16 | expect(service).toBeDefined(); 17 | }); 18 | }); 19 | -------------------------------------------------------------------------------- /springcloudfunctiondemo/src/main/java/com/betterjavacode/springcloudfunctiondemo/SpringcloudfunctiondemoApplication.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.springcloudfunctiondemo; 2 | 3 | import org.springframework.boot.autoconfigure.SpringBootApplication; 4 | import org.springframework.cloud.function.context.FunctionalSpringApplication; 5 | 6 | @SpringBootApplication 7 | public class SpringcloudfunctiondemoApplication { 8 | 9 | public static void main(String[] args) { 10 | FunctionalSpringApplication.run(SpringcloudfunctiondemoApplication.class, args); 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /todolistkeycloaksaml/src/main/java/com/betterjavacode/sss/todolist/ServletInitializer.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.sss.todolist; 2 | 3 | import org.springframework.boot.builder.SpringApplicationBuilder; 4 | import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; 5 | 6 | public class ServletInitializer extends SpringBootServletInitializer 7 | { 8 | 9 | @Override 10 | protected SpringApplicationBuilder configure(SpringApplicationBuilder application) 11 | { 12 | return application.sources(TodolistApplication.class); 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /nestjs-event-emitter-demo/.gitignore: -------------------------------------------------------------------------------- 1 | # compiled output 2 | /dist 3 | /node_modules 4 | 5 | # Logs 6 | logs 7 | *.log 8 | npm-debug.log* 9 | pnpm-debug.log* 10 | yarn-debug.log* 11 | yarn-error.log* 12 | lerna-debug.log* 13 | 14 | # OS 15 | .DS_Store 16 | 17 | # Tests 18 | /coverage 19 | /.nyc_output 20 | 21 | # IDEs and editors 22 | /.idea 23 | .project 24 | .classpath 25 | .c9/ 26 | *.launch 27 | .settings/ 28 | *.sublime-workspace 29 | 30 | # IDE - VSCode 31 | .vscode/* 32 | !.vscode/settings.json 33 | !.vscode/tasks.json 34 | !.vscode/launch.json 35 | !.vscode/extensions.json -------------------------------------------------------------------------------- /elasticsearchdemo/src/main/java/com/betterjavacode/elasticsearchdemo/repositories/LogDataRepository.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.elasticsearchdemo.repositories; 2 | 3 | import com.betterjavacode.elasticsearchdemo.models.LogData; 4 | import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; 5 | 6 | import java.util.List; 7 | 8 | public interface LogDataRepository extends ElasticsearchRepository 9 | { 10 | List findByHost(String host); 11 | 12 | List findByMessageContaining(String message); 13 | } 14 | -------------------------------------------------------------------------------- /nestjspassportdemo/backend/.gitignore: -------------------------------------------------------------------------------- 1 | # compiled output 2 | /dist 3 | /node_modules 4 | 5 | # Logs 6 | logs 7 | *.log 8 | npm-debug.log* 9 | pnpm-debug.log* 10 | yarn-debug.log* 11 | yarn-error.log* 12 | lerna-debug.log* 13 | 14 | # OS 15 | .DS_Store 16 | 17 | # Tests 18 | /coverage 19 | /.nyc_output 20 | 21 | # IDEs and editors 22 | /.idea 23 | .project 24 | .classpath 25 | .c9/ 26 | *.launch 27 | .settings/ 28 | *.sublime-workspace 29 | 30 | # IDE - VSCode 31 | .vscode/* 32 | !.vscode/settings.json 33 | !.vscode/tasks.json 34 | !.vscode/launch.json 35 | !.vscode/extensions.json -------------------------------------------------------------------------------- /nestjspassportdemo/backend/src/users/users.service.spec.ts: -------------------------------------------------------------------------------- 1 | import { Test, TestingModule } from '@nestjs/testing'; 2 | import { UsersService } from './users.service'; 3 | 4 | describe('UsersService', () => { 5 | let service: UsersService; 6 | 7 | beforeEach(async () => { 8 | const module: TestingModule = await Test.createTestingModule({ 9 | providers: [UsersService], 10 | }).compile(); 11 | 12 | service = module.get(UsersService); 13 | }); 14 | 15 | it('should be defined', () => { 16 | expect(service).toBeDefined(); 17 | }); 18 | }); 19 | -------------------------------------------------------------------------------- /twofactorauthdemo/src/main/java/com/betterjavacode/twofactorauthdemo/repositories/SecureTokenRepository.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.twofactorauthdemo.repositories; 2 | 3 | import com.betterjavacode.twofactorauthdemo.models.SecureToken; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | import org.springframework.stereotype.Repository; 6 | 7 | @Repository 8 | public interface SecureTokenRepository extends JpaRepository 9 | { 10 | SecureToken findByToken(final String token); 11 | Long removeByToken(String token); 12 | } 13 | -------------------------------------------------------------------------------- /twofactorauthdemo/src/main/java/com/betterjavacode/twofactorauthdemo/exceptions/UnknownIdentifierException.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.twofactorauthdemo.exceptions; 2 | 3 | public class UnknownIdentifierException extends Exception 4 | { 5 | public UnknownIdentifierException() { 6 | super(); 7 | } 8 | 9 | 10 | public UnknownIdentifierException(String message) { 11 | super(message); 12 | } 13 | 14 | 15 | public UnknownIdentifierException(String message, Throwable cause) { 16 | super(message, cause); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /twofactorauthdemo/src/main/java/com/betterjavacode/twofactorauthdemo/exceptions/UserAlreadyExistsException.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.twofactorauthdemo.exceptions; 2 | 3 | public class UserAlreadyExistsException extends Exception 4 | { 5 | public UserAlreadyExistsException() { 6 | super(); 7 | } 8 | 9 | 10 | public UserAlreadyExistsException(String message) { 11 | super(message); 12 | } 13 | 14 | 15 | public UserAlreadyExistsException(String message, Throwable cause) { 16 | super(message, cause); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /modelmapperdemo/src/main/java/com/betterjavacode/modelmapperdemo/repositories/OrderRepository.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.modelmapperdemo.repositories; 2 | 3 | import com.betterjavacode.modelmapperdemo.models.Customer; 4 | import com.betterjavacode.modelmapperdemo.models.Order; 5 | import org.springframework.data.jpa.repository.JpaRepository; 6 | import org.springframework.stereotype.Repository; 7 | import java.util.List; 8 | 9 | @Repository 10 | public interface OrderRepository extends JpaRepository 11 | { 12 | List findAllByCustomer (Customer customer); 13 | } 14 | -------------------------------------------------------------------------------- /nestjspassportdemo/backend/prisma/schema.prisma: -------------------------------------------------------------------------------- 1 | // This is your Prisma schema file, 2 | // learn more about it in the docs: https://pris.ly/d/prisma-schema 3 | 4 | generator client { 5 | provider = "prisma-client-js" 6 | } 7 | 8 | datasource db { 9 | provider = "mysql" 10 | url = env("DATABASE_URL") 11 | } 12 | 13 | model User { 14 | id String @id @default(uuid()) 15 | email String @unique 16 | first_name String 17 | last_name String? 18 | password String 19 | createdAt DateTime @default(now()) 20 | updatedAt DateTime @updatedAt 21 | } 22 | -------------------------------------------------------------------------------- /todolistkeycloaksaml/src/main/java/com/betterjavacode/sss/todolist/exceptions/CustomOAuth2AuthenticationException.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.sss.todolist.exceptions; 2 | 3 | import org.springframework.security.core.AuthenticationException; 4 | 5 | public class CustomOAuth2AuthenticationException extends AuthenticationException 6 | { 7 | public CustomOAuth2AuthenticationException (String msg, Throwable t) 8 | { 9 | super(msg, t); 10 | } 11 | 12 | public CustomOAuth2AuthenticationException(String msg) 13 | { 14 | super(msg); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /nestjspassportdemo/backend/src/common/prisma.service.ts: -------------------------------------------------------------------------------- 1 | import { INestApplication, Injectable, OnModuleInit } from '@nestjs/common'; 2 | import { PrismaClient } from '@prisma/client'; 3 | 4 | @Injectable() 5 | export class PrismaService extends PrismaClient implements OnModuleInit { 6 | async onModuleInit() { 7 | await this.$connect(); 8 | } 9 | 10 | async enableShutdownHooks(app: INestApplication) { 11 | this.$on('beforeExit', async () => { 12 | await app.close(); 13 | }); 14 | } 15 | 16 | async onModuleDestroy() { 17 | await this.$disconnect(); 18 | } 19 | } -------------------------------------------------------------------------------- /healthcheckdemo/src/health/health.controller.spec.ts: -------------------------------------------------------------------------------- 1 | import { Test, TestingModule } from '@nestjs/testing'; 2 | import { HealthController } from './health.controller'; 3 | 4 | describe('HealthController', () => { 5 | let controller: HealthController; 6 | 7 | beforeEach(async () => { 8 | const module: TestingModule = await Test.createTestingModule({ 9 | controllers: [HealthController], 10 | }).compile(); 11 | 12 | controller = module.get(HealthController); 13 | }); 14 | 15 | it('should be defined', () => { 16 | expect(controller).toBeDefined(); 17 | }); 18 | }); 19 | -------------------------------------------------------------------------------- /nestjspassportdemo/backend/prisma/migrations/20220904223319_add_password_user/migration.sql: -------------------------------------------------------------------------------- 1 | /* 2 | Warnings: 3 | 4 | - Added the required column `password` to the `User` table without a default value. This is not possible if the table is not empty. 5 | - Added the required column `updatedAt` to the `User` table without a default value. This is not possible if the table is not empty. 6 | 7 | */ 8 | -- AlterTable 9 | ALTER TABLE `user` ADD COLUMN `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), 10 | ADD COLUMN `password` VARCHAR(191) NOT NULL, 11 | ADD COLUMN `updatedAt` DATETIME(3) NOT NULL; 12 | -------------------------------------------------------------------------------- /nestjspassportdemo/backend/src/auth/auth.module.ts: -------------------------------------------------------------------------------- 1 | import { Module } from '@nestjs/common'; 2 | import { AuthService } from './auth.service'; 3 | import { AuthController } from './auth.controller'; 4 | import { UsersModule } from 'src/users/users.module'; 5 | import { PrismaModule } from 'src/common/prisma.module'; 6 | import { LocalStrategy } from './local.strategy'; 7 | import { PassportModule } from '@nestjs/passport'; 8 | 9 | @Module({ 10 | imports: [UsersModule, PrismaModule, PassportModule], 11 | controllers: [AuthController], 12 | providers: [AuthService, LocalStrategy] 13 | }) 14 | export class AuthModule {} 15 | -------------------------------------------------------------------------------- /cognitodemo/src/main/java/com/betterjavacode/cognitodemo/controllers/MainController.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.cognitodemo.controllers; 2 | 3 | import org.springframework.stereotype.Controller; 4 | import org.springframework.ui.Model; 5 | import org.springframework.web.bind.annotation.GetMapping; 6 | 7 | import java.security.Principal; 8 | 9 | @Controller 10 | public class MainController 11 | { 12 | @GetMapping("/") 13 | public String home(Model model, Principal principal) 14 | { 15 | model.addAttribute("username", principal.getName()); 16 | return "index"; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /messagesender/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'org.springframework.boot' version '2.5.4' 3 | id 'io.spring.dependency-management' version '1.0.11.RELEASE' 4 | id 'java' 5 | } 6 | 7 | group = 'com.betterjavacode' 8 | version = '0.0.1-SNAPSHOT' 9 | sourceCompatibility = '1.8' 10 | 11 | repositories { 12 | mavenCentral() 13 | } 14 | 15 | dependencies { 16 | implementation 'org.springframework.boot:spring-boot-starter-activemq' 17 | implementation 'org.springframework.boot:spring-boot-starter-web' 18 | testImplementation 'org.springframework.boot:spring-boot-starter-test' 19 | } 20 | 21 | test { 22 | useJUnitPlatform() 23 | } 24 | -------------------------------------------------------------------------------- /messagereceiver/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'org.springframework.boot' version '2.5.4' 3 | id 'io.spring.dependency-management' version '1.0.11.RELEASE' 4 | id 'java' 5 | } 6 | 7 | group = 'com.betterjavacode' 8 | version = '0.0.1-SNAPSHOT' 9 | sourceCompatibility = '1.8' 10 | 11 | repositories { 12 | mavenCentral() 13 | } 14 | 15 | dependencies { 16 | implementation 'org.springframework.boot:spring-boot-starter-activemq' 17 | implementation 'org.springframework.boot:spring-boot-starter-web' 18 | testImplementation 'org.springframework.boot:spring-boot-starter-test' 19 | } 20 | 21 | test { 22 | useJUnitPlatform() 23 | } 24 | -------------------------------------------------------------------------------- /nestjs-event-emitter-demo/src/main.ts: -------------------------------------------------------------------------------- 1 | import { NestFactory } from '@nestjs/core'; 2 | import { AppModule } from './app.module'; 3 | import { ConfigService } from '@nestjs/config'; 4 | import { config } from 'aws-sdk'; 5 | 6 | async function bootstrap() { 7 | const app = await NestFactory.create(AppModule); 8 | 9 | const configService = app.get((ConfigService)); 10 | config.update({ 11 | accessKeyId: configService.get('AWS_ACCESS_KEY_ID'), 12 | secretAccessKey: configService.get('AWS_SECRET_ACCESS_KEY'), 13 | region: configService.get('AWS_REGION'), 14 | }); 15 | await app.listen(3000); 16 | } 17 | bootstrap(); 18 | -------------------------------------------------------------------------------- /nestjspassportdemo/ui/public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "React App", 3 | "name": "Create React App Sample", 4 | "icons": [ 5 | { 6 | "src": "favicon.ico", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | }, 10 | { 11 | "src": "logo192.png", 12 | "type": "image/png", 13 | "sizes": "192x192" 14 | }, 15 | { 16 | "src": "logo512.png", 17 | "type": "image/png", 18 | "sizes": "512x512" 19 | } 20 | ], 21 | "start_url": ".", 22 | "display": "standalone", 23 | "theme_color": "#000000", 24 | "background_color": "#ffffff" 25 | } 26 | -------------------------------------------------------------------------------- /healthcheckdemo/src/app.module.ts: -------------------------------------------------------------------------------- 1 | import { Module } from '@nestjs/common'; 2 | import { PrismaClient } from '@prisma/client'; 3 | import { AppController } from './app.controller'; 4 | import { AppService } from './app.service'; 5 | import { UserService } from './user.service'; 6 | import { HealthModule } from './health/health.module'; 7 | import { HttpModule } from '@nestjs/axios'; 8 | import { PrismaService } from './prisma.service'; 9 | 10 | @Module({ 11 | imports: [HealthModule, HttpModule], 12 | controllers: [AppController], 13 | providers: [AppService, UserService, PrismaClient, PrismaService,], 14 | }) 15 | export class AppModule {} 16 | -------------------------------------------------------------------------------- /bullqueuedemo/.env: -------------------------------------------------------------------------------- 1 | REDIS_HOST=localhost 2 | REDIS_PORT=6379 3 | 4 | # This was inserted by `prisma init`: 5 | # Environment variables declared in this file are automatically made available to Prisma. 6 | # See the documentation for more detail: https://pris.ly/d/prisma-schema#accessing-environment-variables-from-the-schema 7 | 8 | # Prisma supports the native connection string format for PostgreSQL, MySQL, SQLite, SQL Server, MongoDB and CockroachDB (Preview). 9 | # See the documentation for all the connection string options: https://pris.ly/d/connection-strings 10 | 11 | DATABASE_URL="mysql://user:password@localhost:3306/bullqueuedemo?schema=public" -------------------------------------------------------------------------------- /twofactorauthdemo/src/main/java/com/betterjavacode/twofactorauthdemo/services/impl/EmailServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.twofactorauthdemo.services.impl; 2 | 3 | import com.betterjavacode.twofactorauthdemo.context.AbstractEmailContext; 4 | import com.betterjavacode.twofactorauthdemo.services.EmailService; 5 | import org.springframework.stereotype.Service; 6 | 7 | import javax.mail.MessagingException; 8 | 9 | @Service 10 | public class EmailServiceImpl implements EmailService 11 | { 12 | @Override 13 | public void sendMail (AbstractEmailContext email) throws MessagingException 14 | { 15 | 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /bullqueuedemo/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "declaration": true, 5 | "removeComments": true, 6 | "emitDecoratorMetadata": true, 7 | "experimentalDecorators": true, 8 | "allowSyntheticDefaultImports": true, 9 | "target": "es2017", 10 | "sourceMap": true, 11 | "outDir": "./dist", 12 | "baseUrl": "./", 13 | "incremental": true, 14 | "skipLibCheck": true, 15 | "strictNullChecks": false, 16 | "noImplicitAny": false, 17 | "strictBindCallApply": false, 18 | "forceConsistentCasingInFileNames": false, 19 | "noFallthroughCasesInSwitch": false 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /healthcheckdemo/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "declaration": true, 5 | "removeComments": true, 6 | "emitDecoratorMetadata": true, 7 | "experimentalDecorators": true, 8 | "allowSyntheticDefaultImports": true, 9 | "target": "es2017", 10 | "sourceMap": true, 11 | "outDir": "./dist", 12 | "baseUrl": "./", 13 | "incremental": true, 14 | "skipLibCheck": true, 15 | "strictNullChecks": false, 16 | "noImplicitAny": false, 17 | "strictBindCallApply": false, 18 | "forceConsistentCasingInFileNames": false, 19 | "noFallthroughCasesInSwitch": false 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /dynamodbdemo/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'org.springframework.boot' version '2.5.3' 3 | id 'io.spring.dependency-management' version '1.0.11.RELEASE' 4 | id 'java' 5 | } 6 | 7 | group = 'com.betterjavacode' 8 | version = '0.0.1-SNAPSHOT' 9 | sourceCompatibility = '1.8' 10 | 11 | repositories { 12 | mavenCentral() 13 | } 14 | 15 | dependencies { 16 | implementation 'org.springframework.boot:spring-boot-starter-web' 17 | implementation 'io.github.boostchicken:spring-data-dynamodb:5.2.5' 18 | implementation 'junit:junit:4.13.1' 19 | testImplementation 'org.springframework.boot:spring-boot-starter-test' 20 | } 21 | 22 | test { 23 | useJUnitPlatform() 24 | } 25 | -------------------------------------------------------------------------------- /modelmapperdemo/SQLScript: -------------------------------------------------------------------------------- 1 | create database modelmapperdemo; 2 | use modelmapperdemo; 3 | create table customer (id int not null auto_increment, firstName varchar(255) not null, lastName varchar(255) not null, email varchar(255) not null, primary key(id)); 4 | create table address (id int not null auto_increment, street varchar(255), city varchar(255), state varchar(255), country varchar(255), zipcode int, primary key(id)); 5 | create table orders (id int not null auto_increment, orderItem varchar(255) not null, description varchar(255), customer_id int, address_id int, primary key(id), foreign key(customer_id) references customer(id), foreign key(addressI_id) references address(id)); -------------------------------------------------------------------------------- /nestjs-event-emitter-demo/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "declaration": true, 5 | "removeComments": true, 6 | "emitDecoratorMetadata": true, 7 | "experimentalDecorators": true, 8 | "allowSyntheticDefaultImports": true, 9 | "target": "es2017", 10 | "sourceMap": true, 11 | "outDir": "./dist", 12 | "baseUrl": "./", 13 | "incremental": true, 14 | "skipLibCheck": true, 15 | "strictNullChecks": false, 16 | "noImplicitAny": false, 17 | "strictBindCallApply": false, 18 | "forceConsistentCasingInFileNames": false, 19 | "noFallthroughCasesInSwitch": false 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /nestjspassportdemo/backend/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "declaration": true, 5 | "removeComments": true, 6 | "emitDecoratorMetadata": true, 7 | "experimentalDecorators": true, 8 | "allowSyntheticDefaultImports": true, 9 | "target": "es2017", 10 | "sourceMap": true, 11 | "outDir": "./dist", 12 | "baseUrl": "./", 13 | "incremental": true, 14 | "skipLibCheck": true, 15 | "strictNullChecks": false, 16 | "noImplicitAny": false, 17 | "strictBindCallApply": false, 18 | "forceConsistentCasingInFileNames": false, 19 | "noFallthroughCasesInSwitch": false 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /scale-bull-demo/scale-bull-jobs-app/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "declaration": true, 5 | "removeComments": true, 6 | "emitDecoratorMetadata": true, 7 | "experimentalDecorators": true, 8 | "allowSyntheticDefaultImports": true, 9 | "target": "ES2021", 10 | "sourceMap": true, 11 | "outDir": "./dist", 12 | "baseUrl": "./", 13 | "incremental": true, 14 | "skipLibCheck": true, 15 | "strictNullChecks": false, 16 | "noImplicitAny": false, 17 | "strictBindCallApply": false, 18 | "forceConsistentCasingInFileNames": false, 19 | "noFallthroughCasesInSwitch": false 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /bullqueuedemo/src/bull-board-queue.ts: -------------------------------------------------------------------------------- 1 | import { BaseAdapter } from '@bull-board/api/dist/src/queueAdapters/base'; 2 | import { Injectable } from '@nestjs/common'; 3 | import { Queue } from 'bullmq'; 4 | import { BullMQAdapter } from '@bull-board/api/bullMQAdapter'; 5 | 6 | 7 | @Injectable() 8 | export class BullBoardQueue {} 9 | 10 | export const queuePool: Set = new Set(); 11 | 12 | export const getBullBoardQueues = (): BaseAdapter[] => { 13 | const bullBoardQueues = [...queuePool].reduce((acc: BaseAdapter[], val) => { 14 | acc.push(new BullMQAdapter(val)) 15 | return acc 16 | }, []); 17 | 18 | return bullBoardQueues 19 | } -------------------------------------------------------------------------------- /kafkademo/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'org.springframework.boot' version '2.5.2' 3 | id 'io.spring.dependency-management' version '1.0.11.RELEASE' 4 | id 'java' 5 | } 6 | 7 | group = 'com.betterjavacode' 8 | version = '0.0.1-SNAPSHOT' 9 | sourceCompatibility = '1.8' 10 | 11 | repositories { 12 | mavenCentral() 13 | } 14 | 15 | dependencies { 16 | implementation 'org.springframework.boot:spring-boot-starter-web' 17 | implementation 'org.springframework.kafka:spring-kafka' 18 | testImplementation 'org.springframework.boot:spring-boot-starter-test' 19 | testImplementation 'org.springframework.kafka:spring-kafka-test' 20 | } 21 | 22 | test { 23 | useJUnitPlatform() 24 | } 25 | -------------------------------------------------------------------------------- /nestjspassportdemo/backend/src/auth/auth.controller.spec.ts: -------------------------------------------------------------------------------- 1 | import { Test, TestingModule } from '@nestjs/testing'; 2 | import { AuthController } from './auth.controller'; 3 | import { AuthService } from './auth.service'; 4 | 5 | describe('AuthController', () => { 6 | let controller: AuthController; 7 | 8 | beforeEach(async () => { 9 | const module: TestingModule = await Test.createTestingModule({ 10 | controllers: [AuthController], 11 | providers: [AuthService], 12 | }).compile(); 13 | 14 | controller = module.get(AuthController); 15 | }); 16 | 17 | it('should be defined', () => { 18 | expect(controller).toBeDefined(); 19 | }); 20 | }); 21 | -------------------------------------------------------------------------------- /cognitodemo/src/main/resources/templates/index.html: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | Cognito Demo 8 | 9 | 10 |
11 |

OAuth 2.0 Spring Security Cognito Demo

12 |
13 |
14 | Hello, ! 15 |
16 | Logout 17 |
18 |
19 | 20 | -------------------------------------------------------------------------------- /kafkademo/src/main/java/com/betterjavacode/kafkademo/consumers/KafkaConsumer.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.kafkademo.consumers; 2 | 3 | import org.slf4j.Logger; 4 | import org.slf4j.LoggerFactory; 5 | import org.springframework.kafka.annotation.KafkaListener; 6 | import org.springframework.stereotype.Service; 7 | 8 | @Service 9 | public class KafkaConsumer 10 | { 11 | private final Logger logger = LoggerFactory.getLogger(KafkaConsumer.class); 12 | 13 | @KafkaListener(topics = "companies", groupId = "group_id") 14 | public void consume(String company) 15 | { 16 | logger.info(String.format("Incoming Message - Consuming -> %s", company)); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /nestjspassportdemo/backend/src/users/users.controller.spec.ts: -------------------------------------------------------------------------------- 1 | import { Test, TestingModule } from '@nestjs/testing'; 2 | import { UsersController } from './users.controller'; 3 | import { UsersService } from './users.service'; 4 | 5 | describe('UsersController', () => { 6 | let controller: UsersController; 7 | 8 | beforeEach(async () => { 9 | const module: TestingModule = await Test.createTestingModule({ 10 | controllers: [UsersController], 11 | providers: [UsersService], 12 | }).compile(); 13 | 14 | controller = module.get(UsersController); 15 | }); 16 | 17 | it('should be defined', () => { 18 | expect(controller).toBeDefined(); 19 | }); 20 | }); 21 | -------------------------------------------------------------------------------- /nestjs-event-emitter-demo/.env.example: -------------------------------------------------------------------------------- 1 | AWS_REGION=us-east-1 2 | AWS_ACCESS_KEY_ID= 3 | AWS_SECRET_ACCESS_KEY= 4 | AWS_BUCKET_NAME= 5 | 6 | # This was inserted by `prisma init`: 7 | # Environment variables declared in this file are automatically made available to Prisma. 8 | # See the documentation for more detail: https://pris.ly/d/prisma-schema#accessing-environment-variables-from-the-schema 9 | 10 | # Prisma supports the native connection string format for PostgreSQL, MySQL, SQLite, SQL Server, MongoDB and CockroachDB. 11 | # See the documentation for all the connection string options: https://pris.ly/d/connection-strings 12 | 13 | DATABASE_URL="mysql://username:password@localhost:3306/eventemitterdemo?schema=public" -------------------------------------------------------------------------------- /elasticsearchdemo/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'org.springframework.boot' version '2.5.4' 3 | id 'io.spring.dependency-management' version '1.0.11.RELEASE' 4 | id 'java' 5 | } 6 | 7 | group = 'com.betterjavacode' 8 | version = '0.0.1-SNAPSHOT' 9 | sourceCompatibility = '1.8' 10 | 11 | repositories { 12 | mavenCentral() 13 | } 14 | 15 | dependencies { 16 | implementation 'org.springframework.boot:spring-boot-starter-data-elasticsearch' 17 | implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' 18 | implementation 'org.springframework.boot:spring-boot-starter-web' 19 | testImplementation 'org.springframework.boot:spring-boot-starter-test' 20 | } 21 | 22 | test { 23 | useJUnitPlatform() 24 | } 25 | -------------------------------------------------------------------------------- /kafkademo/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | server: 2 | port: 9000 3 | spring: 4 | kafka: 5 | consumer: 6 | bootstrap-servers: localhost:9092 7 | group-id: group_id 8 | auto-offset-reset: earliest 9 | key-deserializer: org.apache.kafka.common.serialization.StringDeserializer 10 | value-deserializer: org.apache.kafka.common.serialization.StringDeserializer 11 | properties: 12 | spring.json.trusted.packages: "com.betterjavacode.kafkademo.model" 13 | producer: 14 | bootstrap-servers: localhost:9092 15 | key-serializer: org.apache.kafka.common.serialization.StringSerializer 16 | value-serializer: org.springframework.kafka.support.serializer.JsonSerializer -------------------------------------------------------------------------------- /nestjspassportdemo/backend/src/auth/local.strategy.ts: -------------------------------------------------------------------------------- 1 | import { Injectable, } from "@nestjs/common"; 2 | import { PassportStrategy } from '@nestjs/passport'; 3 | import { Strategy } from 'passport-local'; 4 | import { User } from "src/users/entities/user.entity"; 5 | import { AuthService } from "./auth.service"; 6 | 7 | @Injectable() 8 | export class LocalStrategy extends PassportStrategy(Strategy) { 9 | constructor(private readonly authService: AuthService) { 10 | super({ 11 | usernameField: 'email' 12 | }); 13 | } 14 | 15 | async validate(email: string, password: string): Promise { 16 | return this.authService.getAuthenticatedUser(email, password); 17 | } 18 | } -------------------------------------------------------------------------------- /modelmapperdemo/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'org.springframework.boot' version '2.4.4' 3 | id 'io.spring.dependency-management' version '1.0.11.RELEASE' 4 | id 'java' 5 | } 6 | 7 | group = 'com.betterjavacode' 8 | version = '0.0.1-SNAPSHOT' 9 | sourceCompatibility = '1.8' 10 | 11 | repositories { 12 | mavenCentral() 13 | } 14 | 15 | dependencies { 16 | implementation 'org.springframework.boot:spring-boot-starter-data-jpa' 17 | implementation 'org.springframework.boot:spring-boot-starter-web' 18 | implementation 'org.modelmapper:modelmapper:2.3.0' 19 | runtimeOnly 'mysql:mysql-connector-java' 20 | testImplementation 'org.springframework.boot:spring-boot-starter-test' 21 | } 22 | 23 | test { 24 | useJUnitPlatform() 25 | } 26 | -------------------------------------------------------------------------------- /bullqueuedemo/src/app.controller.spec.ts: -------------------------------------------------------------------------------- 1 | import { Test, TestingModule } from '@nestjs/testing'; 2 | import { AppController } from './app.controller'; 3 | import { UserService } from './user.service'; 4 | 5 | describe('AppController', () => { 6 | let appController: AppController; 7 | 8 | beforeEach(async () => { 9 | const app: TestingModule = await Test.createTestingModule({ 10 | controllers: [AppController], 11 | providers: [UserService], 12 | }).compile(); 13 | 14 | appController = app.get(AppController); 15 | }); 16 | 17 | describe('root', () => { 18 | it('should return "Hello World!"', () => { 19 | expect(appController.getHello()).toBe('Hello World!'); 20 | }); 21 | }); 22 | }); 23 | -------------------------------------------------------------------------------- /healthcheckdemo/prisma/schema.prisma: -------------------------------------------------------------------------------- 1 | // This is your Prisma schema file, 2 | // learn more about it in the docs: https://pris.ly/d/prisma-schema 3 | 4 | generator client { 5 | provider = "prisma-client-js" 6 | engineType = "binary" 7 | } 8 | 9 | datasource db { 10 | provider = "mysql" 11 | url = env("DATABASE_URL") 12 | } 13 | 14 | model User { 15 | id Int @default(autoincrement()) @id 16 | email String @unique 17 | name String? 18 | posts Post[] 19 | } 20 | 21 | model Post { 22 | id Int @default(autoincrement()) @id 23 | title String 24 | content String? 25 | published Boolean? @default(false) 26 | author User? @relation(fields: [authorId], references: [id]) 27 | authorId Int? 28 | } -------------------------------------------------------------------------------- /healthcheckdemo/src/app.controller.spec.ts: -------------------------------------------------------------------------------- 1 | import { Test, TestingModule } from '@nestjs/testing'; 2 | import { AppController } from './app.controller'; 3 | import { AppService } from './app.service'; 4 | 5 | describe('AppController', () => { 6 | let appController: AppController; 7 | 8 | beforeEach(async () => { 9 | const app: TestingModule = await Test.createTestingModule({ 10 | controllers: [AppController], 11 | providers: [AppService], 12 | }).compile(); 13 | 14 | appController = app.get(AppController); 15 | }); 16 | 17 | describe('root', () => { 18 | it('should return "Hello World!"', () => { 19 | expect(appController.getHello()).toBe('Hello World!'); 20 | }); 21 | }); 22 | }); 23 | -------------------------------------------------------------------------------- /healthcheckdemo/src/app.controller.ts: -------------------------------------------------------------------------------- 1 | import { Body, Controller, Get, Post } from '@nestjs/common'; 2 | import { AppService } from './app.service'; 3 | import { UserService } from './user.service'; 4 | import { User as UserModel } from '@prisma/client'; 5 | 6 | @Controller() 7 | export class AppController { 8 | constructor(private readonly appService: AppService, 9 | private readonly userService: UserService) {} 10 | 11 | 12 | @Post('user') 13 | async signUpUser( 14 | @Body() userData: {first_name: string, last_name? : string, email: string}, 15 | ): Promise { 16 | return this.userService.createUser(userData); 17 | } 18 | @Get() 19 | getHello(): string { 20 | return this.appService.getHello(); 21 | } 22 | } -------------------------------------------------------------------------------- /modelmapperdemo/src/main/java/com/betterjavacode/modelmapperdemo/repositories/AddressRepository.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.modelmapperdemo.repositories; 2 | 3 | import com.betterjavacode.modelmapperdemo.models.Address; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | import org.springframework.data.repository.query.Param; 6 | import org.springframework.stereotype.Repository; 7 | 8 | @Repository 9 | public interface AddressRepository extends JpaRepository 10 | { 11 | Address findByStreetAndCityAndState(@Param("street") String street, 12 | @Param("city") String city, 13 | @Param("state") String state); 14 | 15 | } 16 | -------------------------------------------------------------------------------- /bullqueuedemo/.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | parser: '@typescript-eslint/parser', 3 | parserOptions: { 4 | project: 'tsconfig.json', 5 | sourceType: 'module', 6 | }, 7 | plugins: ['@typescript-eslint/eslint-plugin'], 8 | extends: [ 9 | 'plugin:@typescript-eslint/recommended', 10 | 'plugin:prettier/recommended', 11 | ], 12 | root: true, 13 | env: { 14 | node: true, 15 | jest: true, 16 | }, 17 | ignorePatterns: ['.eslintrc.js'], 18 | rules: { 19 | '@typescript-eslint/interface-name-prefix': 'off', 20 | '@typescript-eslint/explicit-function-return-type': 'off', 21 | '@typescript-eslint/explicit-module-boundary-types': 'off', 22 | '@typescript-eslint/no-explicit-any': 'off', 23 | }, 24 | }; 25 | -------------------------------------------------------------------------------- /loggingdemo/src/main/java/com/betterjavacode/loggingdemo/LoggingdemoApplication.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.loggingdemo; 2 | 3 | import org.slf4j.Logger; 4 | import org.slf4j.LoggerFactory; 5 | import org.springframework.boot.SpringApplication; 6 | import org.springframework.boot.autoconfigure.SpringBootApplication; 7 | 8 | @SpringBootApplication 9 | public class LoggingdemoApplication { 10 | 11 | private static final Logger LOGGER = LoggerFactory.getLogger(LoggingdemoApplication.class); 12 | 13 | public static void main(String[] args) { 14 | LOGGER.info("Before starting the application........"); 15 | SpringApplication.run(LoggingdemoApplication.class, args); 16 | LOGGER.info("After starting the application........."); 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /nestjs-event-emitter-demo/src/app.controller.spec.ts: -------------------------------------------------------------------------------- 1 | import { Test, TestingModule } from '@nestjs/testing'; 2 | import { AppController } from './app.controller'; 3 | import { AppService } from './app.service'; 4 | 5 | describe('AppController', () => { 6 | let appController: AppController; 7 | 8 | beforeEach(async () => { 9 | const app: TestingModule = await Test.createTestingModule({ 10 | controllers: [AppController], 11 | providers: [AppService], 12 | }).compile(); 13 | 14 | appController = app.get(AppController); 15 | }); 16 | 17 | describe('root', () => { 18 | it('should return "Hello World!"', () => { 19 | expect(appController.getHello()).toBe('Hello World!'); 20 | }); 21 | }); 22 | }); 23 | -------------------------------------------------------------------------------- /bullqueuedemo/test/app.e2e-spec.ts: -------------------------------------------------------------------------------- 1 | import { Test, TestingModule } from '@nestjs/testing'; 2 | import { INestApplication } from '@nestjs/common'; 3 | import * as request from 'supertest'; 4 | import { AppModule } from './../src/app.module'; 5 | 6 | describe('AppController (e2e)', () => { 7 | let app: INestApplication; 8 | 9 | beforeEach(async () => { 10 | const moduleFixture: TestingModule = await Test.createTestingModule({ 11 | imports: [AppModule], 12 | }).compile(); 13 | 14 | app = moduleFixture.createNestApplication(); 15 | await app.init(); 16 | }); 17 | 18 | it('/ (GET)', () => { 19 | return request(app.getHttpServer()) 20 | .get('/') 21 | .expect(200) 22 | .expect('Hello World!'); 23 | }); 24 | }); 25 | -------------------------------------------------------------------------------- /healthcheckdemo/test/app.e2e-spec.ts: -------------------------------------------------------------------------------- 1 | import { Test, TestingModule } from '@nestjs/testing'; 2 | import { INestApplication } from '@nestjs/common'; 3 | import * as request from 'supertest'; 4 | import { AppModule } from './../src/app.module'; 5 | 6 | describe('AppController (e2e)', () => { 7 | let app: INestApplication; 8 | 9 | beforeEach(async () => { 10 | const moduleFixture: TestingModule = await Test.createTestingModule({ 11 | imports: [AppModule], 12 | }).compile(); 13 | 14 | app = moduleFixture.createNestApplication(); 15 | await app.init(); 16 | }); 17 | 18 | it('/ (GET)', () => { 19 | return request(app.getHttpServer()) 20 | .get('/') 21 | .expect(200) 22 | .expect('Hello World!'); 23 | }); 24 | }); 25 | -------------------------------------------------------------------------------- /nestjspassportdemo/ui/src/App.css: -------------------------------------------------------------------------------- 1 | .App { 2 | text-align: center; 3 | } 4 | 5 | .App-logo { 6 | height: 40vmin; 7 | pointer-events: none; 8 | } 9 | 10 | @media (prefers-reduced-motion: no-preference) { 11 | .App-logo { 12 | animation: App-logo-spin infinite 20s linear; 13 | } 14 | } 15 | 16 | .App-header { 17 | background-color: #282c34; 18 | min-height: 100vh; 19 | display: flex; 20 | flex-direction: column; 21 | align-items: center; 22 | justify-content: center; 23 | font-size: calc(10px + 2vmin); 24 | color: white; 25 | } 26 | 27 | .App-link { 28 | color: #61dafb; 29 | } 30 | 31 | @keyframes App-logo-spin { 32 | from { 33 | transform: rotate(0deg); 34 | } 35 | to { 36 | transform: rotate(360deg); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /nestjspassportdemo/ui/src/components/Home/Home.js: -------------------------------------------------------------------------------- 1 | import { useEffect, useState } from "react"; 2 | import { useNavigate } from "react-router-dom" 3 | 4 | const Home = () => { 5 | let navigate = useNavigate(); 6 | const [authenticated, setauthenticated] = useState(null); 7 | useEffect(() => { 8 | const loggedInUser = localStorage.getItem('authenticated'); 9 | if (loggedInUser) { 10 | setauthenticated(loggedInUser); 11 | } 12 | }, []); 13 | if (!authenticated) { 14 | navigate("/"); 15 | } else { 16 | return ( 17 |
18 |

Welcome to your Dashboard

19 |
20 | ); 21 | } 22 | 23 | }; 24 | export default Home; -------------------------------------------------------------------------------- /nestjs-event-emitter-demo/.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | parser: '@typescript-eslint/parser', 3 | parserOptions: { 4 | project: 'tsconfig.json', 5 | sourceType: 'module', 6 | }, 7 | plugins: ['@typescript-eslint/eslint-plugin'], 8 | extends: [ 9 | 'plugin:@typescript-eslint/recommended', 10 | 'plugin:prettier/recommended', 11 | ], 12 | root: true, 13 | env: { 14 | node: true, 15 | jest: true, 16 | }, 17 | ignorePatterns: ['.eslintrc.js'], 18 | rules: { 19 | '@typescript-eslint/interface-name-prefix': 'off', 20 | '@typescript-eslint/explicit-function-return-type': 'off', 21 | '@typescript-eslint/explicit-module-boundary-types': 'off', 22 | '@typescript-eslint/no-explicit-any': 'off', 23 | }, 24 | }; 25 | -------------------------------------------------------------------------------- /nestjspassportdemo/backend/.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | parser: '@typescript-eslint/parser', 3 | parserOptions: { 4 | project: 'tsconfig.json', 5 | sourceType: 'module', 6 | }, 7 | plugins: ['@typescript-eslint/eslint-plugin'], 8 | extends: [ 9 | 'plugin:@typescript-eslint/recommended', 10 | 'plugin:prettier/recommended', 11 | ], 12 | root: true, 13 | env: { 14 | node: true, 15 | jest: true, 16 | }, 17 | ignorePatterns: ['.eslintrc.js'], 18 | rules: { 19 | '@typescript-eslint/interface-name-prefix': 'off', 20 | '@typescript-eslint/explicit-function-return-type': 'off', 21 | '@typescript-eslint/explicit-module-boundary-types': 'off', 22 | '@typescript-eslint/no-explicit-any': 'off', 23 | }, 24 | }; 25 | -------------------------------------------------------------------------------- /scale-bull-demo/scale-bull-jobs-app/src/app.controller.spec.ts: -------------------------------------------------------------------------------- 1 | import { Test, TestingModule } from '@nestjs/testing'; 2 | import { AppController } from './app.controller'; 3 | import { AppService } from './app.service'; 4 | 5 | describe('AppController', () => { 6 | let appController: AppController; 7 | 8 | beforeEach(async () => { 9 | const app: TestingModule = await Test.createTestingModule({ 10 | controllers: [AppController], 11 | providers: [AppService], 12 | }).compile(); 13 | 14 | appController = app.get(AppController); 15 | }); 16 | 17 | describe('root', () => { 18 | it('should return "Hello World!"', () => { 19 | expect(appController.getHello()).toBe('Hello World!'); 20 | }); 21 | }); 22 | }); 23 | -------------------------------------------------------------------------------- /nestjs-event-emitter-demo/test/app.e2e-spec.ts: -------------------------------------------------------------------------------- 1 | import { Test, TestingModule } from '@nestjs/testing'; 2 | import { INestApplication } from '@nestjs/common'; 3 | import * as request from 'supertest'; 4 | import { AppModule } from './../src/app.module'; 5 | 6 | describe('AppController (e2e)', () => { 7 | let app: INestApplication; 8 | 9 | beforeEach(async () => { 10 | const moduleFixture: TestingModule = await Test.createTestingModule({ 11 | imports: [AppModule], 12 | }).compile(); 13 | 14 | app = moduleFixture.createNestApplication(); 15 | await app.init(); 16 | }); 17 | 18 | it('/ (GET)', () => { 19 | return request(app.getHttpServer()) 20 | .get('/') 21 | .expect(200) 22 | .expect('Hello World!'); 23 | }); 24 | }); 25 | -------------------------------------------------------------------------------- /nestjspassportdemo/backend/test/app.e2e-spec.ts: -------------------------------------------------------------------------------- 1 | import { Test, TestingModule } from '@nestjs/testing'; 2 | import { INestApplication } from '@nestjs/common'; 3 | import * as request from 'supertest'; 4 | import { AppModule } from './../src/app.module'; 5 | 6 | describe('AppController (e2e)', () => { 7 | let app: INestApplication; 8 | 9 | beforeEach(async () => { 10 | const moduleFixture: TestingModule = await Test.createTestingModule({ 11 | imports: [AppModule], 12 | }).compile(); 13 | 14 | app = moduleFixture.createNestApplication(); 15 | await app.init(); 16 | }); 17 | 18 | it('/ (GET)', () => { 19 | return request(app.getHttpServer()) 20 | .get('/') 21 | .expect(200) 22 | .expect('Hello World!'); 23 | }); 24 | }); 25 | -------------------------------------------------------------------------------- /nestjs-event-emitter-demo/.env: -------------------------------------------------------------------------------- 1 | AWS_REGION=us-east-1 2 | AWS_ACCESS_KEY_ID=********************** 3 | AWS_SECRET_ACCESS_KEY=************************ 4 | AWS_BUCKET_NAME='nestjsfileuploaddemo2' 5 | 6 | # This was inserted by `prisma init`: 7 | # Environment variables declared in this file are automatically made available to Prisma. 8 | # See the documentation for more detail: https://pris.ly/d/prisma-schema#accessing-environment-variables-from-the-schema 9 | 10 | # Prisma supports the native connection string format for PostgreSQL, MySQL, SQLite, SQL Server, MongoDB and CockroachDB. 11 | # See the documentation for all the connection string options: https://pris.ly/d/connection-strings 12 | 13 | DATABASE_URL="mysql://username:password@localhost:3306/eventemitterdemo?schema=public" -------------------------------------------------------------------------------- /scale-bull-demo/scale-bull-jobs-app/test/app.e2e-spec.ts: -------------------------------------------------------------------------------- 1 | import { Test, TestingModule } from '@nestjs/testing'; 2 | import { INestApplication } from '@nestjs/common'; 3 | import * as request from 'supertest'; 4 | import { AppModule } from './../src/app.module'; 5 | 6 | describe('AppController (e2e)', () => { 7 | let app: INestApplication; 8 | 9 | beforeEach(async () => { 10 | const moduleFixture: TestingModule = await Test.createTestingModule({ 11 | imports: [AppModule], 12 | }).compile(); 13 | 14 | app = moduleFixture.createNestApplication(); 15 | await app.init(); 16 | }); 17 | 18 | it('/ (GET)', () => { 19 | return request(app.getHttpServer()) 20 | .get('/') 21 | .expect(200) 22 | .expect('Hello World!'); 23 | }); 24 | }); 25 | -------------------------------------------------------------------------------- /kafkademo/README.md: -------------------------------------------------------------------------------- 1 | A demo Kafka application 2 | 3 | # Getting Started 4 | This is a demo application to show how we can use Kafka in a Spring Boot application. 5 | 6 | # How to Use 7 | - Clone the repository. 8 | - Build the code `gradlew clean build` 9 | - cd ./build/libs 10 | - java -jar kafkademo-0.0.1-SNAPSHOT.jar 11 | - Now Use Postman or Insomnia to send a REST call to endpoint `http://localhost:9000/v1/kafka/send` 12 | - Sample JSON Payload 13 | `{ 14 | "name": "Microsoft Inc", 15 | "type": "INC", 16 | "noOfemployees" : 43000, 17 | "ceo": "Satya Nadella", 18 | "city": "Seattle", 19 | "state": "Washington" 20 | }` 21 | - Assuming you were running Kafka Server already and had created a topic called `companies`, 22 | this should work as it is. -------------------------------------------------------------------------------- /messagereceiver/src/main/java/com/betterjavacode/messagereceiver/consumers/MessageConsumer.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.messagereceiver.consumers; 2 | 3 | import org.slf4j.Logger; 4 | import org.slf4j.LoggerFactory; 5 | import org.springframework.jms.annotation.EnableJms; 6 | import org.springframework.jms.annotation.JmsListener; 7 | import org.springframework.stereotype.Component; 8 | 9 | @Component 10 | @EnableJms 11 | public class MessageConsumer 12 | { 13 | private final Logger logger = LoggerFactory.getLogger(MessageConsumer.class); 14 | 15 | @JmsListener(destination = "demo-queue") 16 | public void receiveMessage(String message) 17 | { 18 | // TO -DO 19 | logger.info("Received a message = {}", message); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /scale-bull-demo/scale-bull-jobs-app/.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | parser: '@typescript-eslint/parser', 3 | parserOptions: { 4 | project: 'tsconfig.json', 5 | tsconfigRootDir: __dirname, 6 | sourceType: 'module', 7 | }, 8 | plugins: ['@typescript-eslint/eslint-plugin'], 9 | extends: [ 10 | 'plugin:@typescript-eslint/recommended', 11 | 'plugin:prettier/recommended', 12 | ], 13 | root: true, 14 | env: { 15 | node: true, 16 | jest: true, 17 | }, 18 | ignorePatterns: ['.eslintrc.js'], 19 | rules: { 20 | '@typescript-eslint/interface-name-prefix': 'off', 21 | '@typescript-eslint/explicit-function-return-type': 'off', 22 | '@typescript-eslint/explicit-module-boundary-types': 'off', 23 | '@typescript-eslint/no-explicit-any': 'off', 24 | }, 25 | }; 26 | -------------------------------------------------------------------------------- /healthcheckdemo/src/health/prismaorm.health.ts: -------------------------------------------------------------------------------- 1 | import { Injectable, InternalServerErrorException } from "@nestjs/common"; 2 | import { HealthIndicator, HealthIndicatorResult } from "@nestjs/terminus"; 3 | import { PrismaService } from "src/prisma.service"; 4 | 5 | 6 | @Injectable() 7 | export class PrismaOrmHealthIndicator extends HealthIndicator { 8 | constructor(private readonly prismaService: PrismaService) { 9 | super(); 10 | } 11 | 12 | async pingCheck(databaseName: string): Promise { 13 | try { 14 | await this.prismaService.$queryRaw`SELECT 1`; 15 | return this.getStatus(databaseName, true); 16 | } catch (e) { 17 | throw new InternalServerErrorException('Prisma check failed', e); 18 | } 19 | } 20 | } -------------------------------------------------------------------------------- /nestjs-event-emitter-demo/src/controllers/file.controller.ts: -------------------------------------------------------------------------------- 1 | import { Controller, Post, UploadedFile, UseInterceptors } from "@nestjs/common"; 2 | import { FileInterceptor } from "@nestjs/platform-express"; 3 | import { FileUploadService } from "src/services/fileupload.service"; 4 | import { Express } from 'express'; 5 | 6 | 7 | 8 | @Controller('/v1/api/fileUpload') 9 | export class FileController { 10 | constructor(private fileUploadService: FileUploadService) {} 11 | 12 | @Post() 13 | @UseInterceptors(FileInterceptor('file')) 14 | async uploadFile(@UploadedFile() file: Express.Multer.File): Promise { 15 | const uploadedFile = await this.fileUploadService.uploadFile(file.buffer, file.originalname); 16 | console.log('File has been uploaded,', uploadedFile.fileName); 17 | } 18 | 19 | } -------------------------------------------------------------------------------- /twofactorauthdemo/src/main/java/com/betterjavacode/twofactorauthdemo/config/web/CustomWebAuthenticationDetailsSource.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.twofactorauthdemo.config.web; 2 | 3 | import org.springframework.security.authentication.AuthenticationDetailsSource; 4 | import org.springframework.security.web.authentication.WebAuthenticationDetails; 5 | import org.springframework.stereotype.Component; 6 | 7 | import javax.servlet.http.HttpServletRequest; 8 | 9 | @Component 10 | public class CustomWebAuthenticationDetailsSource implements AuthenticationDetailsSource 11 | { 12 | @Override 13 | public WebAuthenticationDetails buildDetails (HttpServletRequest context) 14 | { 15 | return new CustomWebAuthenticationDetails(context); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /twofactorauthdemo/src/main/resources/static/js/common.js: -------------------------------------------------------------------------------- 1 | $(function () { 2 | var token = $("meta[name='_csrf']").attr("content"); 3 | var header = $("meta[name='_csrf_header']").attr("content"); 4 | $(document).ajaxSend(function(e, xhr, options) { 5 | xhr.setRequestHeader(header, token); 6 | }); 7 | 8 | 9 | 10 | $('#resetPassword').on('click', function (e) { 11 | alert("jhsdgfhgsdhfg"); 12 | e.preventDefault(); 13 | e.stopPropagation(); 14 | var $form = $( this); 15 | $.ajax({ 16 | type: 'POST', 17 | url: $(this).attr("action"), 18 | data: $(this).serialize(), 19 | success: function(data) { 20 | $('div#ack').empty().append(data); 21 | 22 | } 23 | 24 | }); 25 | 26 | e.preventDefault(); 27 | return false; 28 | }); 29 | }); -------------------------------------------------------------------------------- /scale-bull-demo/scale-bull-jobs-app/src/file-upload/file-upload.processor.ts: -------------------------------------------------------------------------------- 1 | import { InjectQueue, Process, Processor } from "@nestjs/bull"; 2 | import { Job, Queue } from "bull"; 3 | 4 | const csv = require('csvtojson'); 5 | 6 | @Processor('file-upload-queue') 7 | export class FileUploadProcessor{ 8 | 9 | constructor(@InjectQueue('file-data-queue') private fileDataQueue: Queue) {} 10 | 11 | @Process('process-file') 12 | async processFile(job: Job) { 13 | const file = job.data.file; 14 | const filePath = file.path; 15 | const userData = await csv().fromFile(filePath); 16 | 17 | await this.fileDataQueue.addBulk(userData.map(user => ({ 18 | name: 'process-data', 19 | data: user 20 | }))); 21 | 22 | console.log('file uploaded successfully'); 23 | } 24 | 25 | } -------------------------------------------------------------------------------- /modelmapperdemo/src/main/java/com/betterjavacode/modelmapperdemo/ModelmapperdemoApplication.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.modelmapperdemo; 2 | 3 | import org.modelmapper.ModelMapper; 4 | import org.springframework.boot.SpringApplication; 5 | import org.springframework.boot.autoconfigure.SpringBootApplication; 6 | import org.springframework.context.annotation.Bean; 7 | import org.springframework.data.jpa.repository.config.EnableJpaRepositories; 8 | 9 | @SpringBootApplication 10 | @EnableJpaRepositories(basePackages = "com.betterjavacode.modelmapperdemo") 11 | public class ModelmapperdemoApplication 12 | { 13 | 14 | public static void main(String[] args) 15 | { 16 | SpringApplication.run(ModelmapperdemoApplication.class, args); 17 | } 18 | 19 | @Bean 20 | public ModelMapper modelMapper() 21 | { 22 | return new ModelMapper(); 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /twofactorauthdemo/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | spring.jpa.generate-ddl=false 2 | spring.datasource.url=jdbc:mysql://localhost:3306/twofactorauth?useJDBCCompliantTimezoneShift=true\ 3 | &useLegacyDatetimeCode=false&serverTimezone=UTC 4 | spring.datasource.username=root 5 | spring.datasource.password=****** 6 | 7 | #disabling cache for the development purpose 8 | spring.template.cache=false 9 | spring.thymeleaf.cache=false 10 | 11 | #secure token configuration 12 | #60 * 60 * 8 // setting as 8 hours, 13 | jdj.secure.token.validity = 28800 14 | site.base.url.http=http://localhost:8080 15 | 16 | 17 | ########## SMTP configuration to send out emails ########## 18 | ####### Make sure to use the correct SMTP configurations ####### 19 | spring.mail.host=smtp.gmail.com 20 | spring.mail.port=587 21 | spring.mail.username=some-email 22 | spring.mail.password=****** -------------------------------------------------------------------------------- /nestjs-event-emitter-demo/prisma/schema.prisma: -------------------------------------------------------------------------------- 1 | // This is your Prisma schema file, 2 | // learn more about it in the docs: https://pris.ly/d/prisma-schema 3 | 4 | generator client { 5 | provider = "prisma-client-js" 6 | } 7 | 8 | datasource db { 9 | provider = "mysql" 10 | url = env("DATABASE_URL") 11 | } 12 | 13 | model FileEntity { 14 | id Int @default(autoincrement()) @id 15 | fileName String 16 | fileUrl String 17 | key String 18 | createdAt DateTime @default(now()) 19 | updatedAt DateTime @updatedAt 20 | } 21 | 22 | enum EventStatus { 23 | PENDING 24 | PROCESSED 25 | IGNORED 26 | PUBLISHED 27 | } 28 | 29 | model InternalEvent { 30 | id String @id @default(uuid()) 31 | eventName String 32 | eventStatus EventStatus 33 | eventPayload Json @db.Json 34 | createdAt DateTime @default(now()) 35 | updatedAt DateTime @updatedAt 36 | } 37 | -------------------------------------------------------------------------------- /twofactorauthdemo/src/main/java/com/betterjavacode/twofactorauthdemo/dtos/MfaTokenDto.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.twofactorauthdemo.dtos; 2 | 3 | import java.io.Serializable; 4 | 5 | public class MfaTokenDto implements Serializable 6 | { 7 | private String qrCode; 8 | private String mfaCode; 9 | 10 | public MfaTokenDto() { 11 | } 12 | 13 | public String getQrCode() { 14 | return qrCode; 15 | } 16 | 17 | public void setQrCode(String qrCode) { 18 | this.qrCode = qrCode; 19 | } 20 | 21 | public String getMfaCode() { 22 | return mfaCode; 23 | } 24 | 25 | public void setMfaCode(String mfaCode) { 26 | this.mfaCode = mfaCode; 27 | } 28 | 29 | public MfaTokenDto(String qrCode, String mfaCode) { 30 | this.qrCode = qrCode; 31 | this.mfaCode = mfaCode; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /healthcheckdemo/prisma/migrations/20220409153220_add_user_and_post_tables/migration.sql: -------------------------------------------------------------------------------- 1 | -- CreateTable 2 | CREATE TABLE `User` ( 3 | `id` INTEGER NOT NULL AUTO_INCREMENT, 4 | `email` VARCHAR(191) NOT NULL, 5 | `name` VARCHAR(191) NULL, 6 | 7 | UNIQUE INDEX `User_email_key`(`email`), 8 | PRIMARY KEY (`id`) 9 | ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; 10 | 11 | -- CreateTable 12 | CREATE TABLE `Post` ( 13 | `id` INTEGER NOT NULL AUTO_INCREMENT, 14 | `title` VARCHAR(191) NOT NULL, 15 | `content` VARCHAR(191) NULL, 16 | `published` BOOLEAN NULL DEFAULT false, 17 | `authorId` INTEGER NULL, 18 | 19 | PRIMARY KEY (`id`) 20 | ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; 21 | 22 | -- AddForeignKey 23 | ALTER TABLE `Post` ADD CONSTRAINT `Post_authorId_fkey` FOREIGN KEY (`authorId`) REFERENCES `User`(`id`) ON DELETE SET NULL ON UPDATE CASCADE; 24 | -------------------------------------------------------------------------------- /nestjspassportdemo/backend/src/users/entities/user.entity.ts: -------------------------------------------------------------------------------- 1 | import { uuid } from "uuidv4"; 2 | import { Entity } from "./entity"; 3 | 4 | export type CreateUserParams = { 5 | email: string, 6 | firstName: string, 7 | lastName: string, 8 | password: string, 9 | }; 10 | 11 | export class User implements Entity { 12 | static createNewUser(userParams: CreateUserParams): User { 13 | return new User( 14 | uuid(), 15 | userParams.email, 16 | userParams.firstName, 17 | userParams.lastName, 18 | userParams.password 19 | ); 20 | } 21 | 22 | constructor( 23 | public readonly id: string, 24 | public readonly email: string, 25 | public readonly firstName: string, 26 | public readonly lastName: string, 27 | public readonly password: string 28 | ) {} 29 | 30 | 31 | } -------------------------------------------------------------------------------- /cognitodemo/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'org.springframework.boot' version '2.4.4' 3 | id 'io.spring.dependency-management' version '1.0.11.RELEASE' 4 | id 'java' 5 | id 'war' 6 | } 7 | 8 | group = 'com.betterjavacode' 9 | version = '0.0.1-SNAPSHOT' 10 | sourceCompatibility = '1.8' 11 | 12 | repositories { 13 | mavenCentral() 14 | } 15 | 16 | dependencies { 17 | implementation 'org.springframework.boot:spring-boot-starter-security' 18 | implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' 19 | implementation 'org.springframework.boot:spring-boot-starter-web' 20 | implementation 'org.springframework.security:spring-security-oauth2-client' 21 | implementation 'org.springframework.security:spring-security-oauth2-jose' 22 | providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat' 23 | testImplementation 'org.springframework.boot:spring-boot-starter-test' 24 | } 25 | 26 | test { 27 | useJUnitPlatform() 28 | } 29 | -------------------------------------------------------------------------------- /scale-bull-demo/scale-bull-jobs-app/seed-data.py: -------------------------------------------------------------------------------- 1 | import csv 2 | import random 3 | from faker import Faker 4 | 5 | # Initialize Faker 6 | fake = Faker() 7 | 8 | # Number of records 9 | num_records = 10000 10 | 11 | # Generate CSV file 12 | filename = "employee_data.csv" 13 | 14 | with open(filename, 'w', newline='') as csvfile: 15 | fieldnames = ['employeeId', 'firstName', 'lastName', 'email'] 16 | writer = csv.DictWriter(csvfile, fieldnames=fieldnames) 17 | 18 | writer.writeheader() 19 | for i in range(num_records): 20 | first_name = fake.first_name() 21 | last_name = fake.last_name() 22 | writer.writerow({ 23 | 'employeeId': f'EMP{i+1:05d}', 24 | 'firstName': first_name, 25 | 'lastName': last_name, 26 | 'email': f'{first_name.lower()}.{last_name.lower()}@example.com' 27 | }) 28 | 29 | print(f"CSV file '{filename}' with {num_records} records has been generated.") -------------------------------------------------------------------------------- /kafkademo/src/main/java/com/betterjavacode/kafkademo/producers/KafkaProducer.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.kafkademo.producers; 2 | 3 | import com.betterjavacode.kafkademo.model.Company; 4 | import org.slf4j.Logger; 5 | import org.slf4j.LoggerFactory; 6 | import org.springframework.beans.factory.annotation.Autowired; 7 | import org.springframework.kafka.core.KafkaTemplate; 8 | import org.springframework.stereotype.Service; 9 | 10 | @Service 11 | public class KafkaProducer 12 | { 13 | private static final Logger logger = LoggerFactory.getLogger(KafkaProducer.class); 14 | private static final String topic = "companies"; 15 | 16 | @Autowired 17 | private KafkaTemplate kafkaTemplate; 18 | 19 | public void sendMessage(Company company) 20 | { 21 | logger.info(String.format("Outgoing Message - Producing -> %s", company)); 22 | this.kafkaTemplate.send(topic, company); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /kafkademo/src/main/java/com/betterjavacode/kafkademo/resource/KafkaRestController.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.kafkademo.resource; 2 | 3 | import com.betterjavacode.kafkademo.model.Company; 4 | import com.betterjavacode.kafkademo.producers.KafkaProducer; 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.web.bind.annotation.*; 7 | 8 | @RestController 9 | @RequestMapping(value = "/v1/kafka") 10 | public class KafkaRestController 11 | { 12 | private final KafkaProducer kafkaProducer; 13 | 14 | @Autowired 15 | public KafkaRestController(KafkaProducer kafkaProducer) 16 | { 17 | this.kafkaProducer = kafkaProducer; 18 | } 19 | 20 | @PostMapping(value = "/send", consumes={"application/json"}, produces = {"application/json"}) 21 | public void sendMessageToKafkaTopic(@RequestBody Company company) 22 | { 23 | this.kafkaProducer.sendMessage(company); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /messagesender/src/main/java/com/betterjavacode/messagesender/controller/MessageController.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.messagesender.controller; 2 | 3 | import org.springframework.beans.factory.annotation.Autowired; 4 | import org.springframework.http.HttpStatus; 5 | import org.springframework.http.ResponseEntity; 6 | import org.springframework.jms.core.JmsTemplate; 7 | import org.springframework.web.bind.annotation.*; 8 | 9 | import javax.jms.Queue; 10 | 11 | @RestController 12 | @RequestMapping("/v1/betterjavacode/api") 13 | public class MessageController 14 | { 15 | @Autowired 16 | private Queue queue; 17 | 18 | @Autowired 19 | private JmsTemplate jmsTemplate; 20 | 21 | @GetMapping("/message/") 22 | public ResponseEntity sendMessage(@RequestBody String message) 23 | { 24 | jmsTemplate.convertAndSend(queue, message); 25 | return new ResponseEntity(message, HttpStatus.OK); 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /scale-bull-demo/scale-bull-jobs-app/.gitignore: -------------------------------------------------------------------------------- 1 | # compiled output 2 | /dist 3 | /node_modules 4 | /build 5 | 6 | # Logs 7 | logs 8 | *.log 9 | npm-debug.log* 10 | pnpm-debug.log* 11 | yarn-debug.log* 12 | yarn-error.log* 13 | lerna-debug.log* 14 | 15 | # OS 16 | .DS_Store 17 | 18 | # Tests 19 | /coverage 20 | /.nyc_output 21 | 22 | # IDEs and editors 23 | /.idea 24 | .project 25 | .classpath 26 | .c9/ 27 | *.launch 28 | .settings/ 29 | *.sublime-workspace 30 | 31 | # IDE - VSCode 32 | .vscode/* 33 | !.vscode/settings.json 34 | !.vscode/tasks.json 35 | !.vscode/launch.json 36 | !.vscode/extensions.json 37 | 38 | # dotenv environment variable files 39 | .env 40 | .env.development.local 41 | .env.test.local 42 | .env.production.local 43 | .env.local 44 | 45 | # temp directory 46 | .temp 47 | .tmp 48 | 49 | # Runtime data 50 | pids 51 | *.pid 52 | *.seed 53 | *.pid.lock 54 | 55 | # Diagnostic reports (https://nodejs.org/api/report.html) 56 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 57 | -------------------------------------------------------------------------------- /scale-bull-demo/scale-bull-jobs-app/src/worker/main.ts: -------------------------------------------------------------------------------- 1 | import { NestFactory } from "@nestjs/core"; 2 | import { FileDataModule } from "src/file-read/file-data.module"; 3 | 4 | async function main() { 5 | const app = await NestFactory.createApplicationContext(FileDataModule, 6 | { 7 | bufferLogs: true, 8 | abortOnError: false, 9 | } 10 | ); 11 | app.enableShutdownHooks(); 12 | await app.init(); 13 | console.log(`Worker started`); 14 | 15 | process.on('SIGINT', async () => { 16 | console.log(`SIGINT signal received`); 17 | try { 18 | console.log('closing app...'); 19 | await app.close(); 20 | console.log(`Worker stopped`); 21 | } catch (error) { 22 | console.error(`Error during shutdown: ${error.message}`); 23 | 24 | } finally { 25 | console.log('exiting...'); 26 | process.exit(0); 27 | } 28 | }); 29 | } 30 | 31 | main(); -------------------------------------------------------------------------------- /nestjs-event-emitter-demo/src/listeners/file-uploaded.listener.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@nestjs/common'; 2 | import { OnEvent } from '@nestjs/event-emitter'; 3 | import { EventStatus } from '@prisma/client'; 4 | import { PrismaService } from 'src/common/prisma.service'; 5 | import { FileUploadedEvent } from 'src/events/file-uploaded.event'; 6 | 7 | @Injectable() 8 | export class FileUploadedListener { 9 | 10 | constructor(private prismaService: PrismaService){} 11 | 12 | @OnEvent('user.fileUploaded') 13 | async handleFileUploadedEvent(event: FileUploadedEvent) { 14 | 15 | console.log('File has been uploaded'); 16 | console.log(event); 17 | await this.prismaService.internalEvent.update( 18 | { 19 | where: { 20 | id: event.id, 21 | }, 22 | data: { 23 | eventStatus: EventStatus.PROCESSED, 24 | } 25 | } 26 | ); 27 | console.log('File will get processed'); 28 | 29 | } 30 | } -------------------------------------------------------------------------------- /todolistkeycloaksaml/README.md: -------------------------------------------------------------------------------- 1 | 2 | # Prerequisite 3 | - You should have keycloak downloaded before you can run keycloak. 4 | - You should have your JAVA_HOME set in path to run java -jar command 5 | 6 | # How to run this project 7 | 1. Build the project - On command line from project directory 8 | - gradlew clean build 9 | 10 | 2. Build command will create a executable jar file in ./build/libs directory 11 | - cd build/libs 12 | 13 | 3. Run the application 14 | - java -jar todolist-0.0.1-SNAPSHOT.war 15 | 16 | 4. Open another command line window to run keycloak application - 17 | - standalone.bat -Djboss.socket.binding.port-offset=100 18 | 19 | 5. Launch the application in browser 20 | - https://localhost:8743/login 21 | 22 | 6. Click the button 'Login with Keycloak SAML'. This will take you to keycloak login screen. 23 | 24 | 7. Enter credentials. 25 | username - sam.doe@gmail.com 26 | password - test123 27 | 28 | 8. You will be logged in and you will see To-Do List. 29 | -------------------------------------------------------------------------------- /springcloudfunctiondemo/src/main/java/com/betterjavacode/springcloudfunctiondemo/functions/CustomerFunction.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.springcloudfunctiondemo.functions; 2 | 3 | import com.betterjavacode.springcloudfunctiondemo.models.Customer; 4 | import com.betterjavacode.springcloudfunctiondemo.repositories.CustomerRepository; 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.stereotype.Component; 7 | 8 | import java.util.Optional; 9 | import java.util.function.Function; 10 | 11 | @Component 12 | public class CustomerFunction implements Function 13 | { 14 | @Autowired 15 | private CustomerRepository customerRepository; 16 | 17 | @Override 18 | public Customer apply (Long s) 19 | { 20 | Optional customerOptional = customerRepository.findById(s); 21 | if (customerOptional.isPresent()) { 22 | return customerOptional.get(); 23 | } 24 | return null; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /scale-bull-demo/scale-bull-jobs-app/employee_data_2.csv: -------------------------------------------------------------------------------- 1 | employeeId,firstName,lastName,email 2 | EMP00001,Brenda,Pitts,brenda.pitts@example.com 3 | EMP00002,Troy,Henderson,troy.henderson@example.com 4 | EMP00003,Mark,Bell,mark.bell@example.com 5 | EMP00004,Jenna,George,jenna.george@example.com 6 | EMP00005,Martin,Martinez,martin.martinez@example.com 7 | EMP00006,Paul,Rhodes,paul.rhodes@example.com 8 | EMP00007,Brent,Ward,brent.ward@example.com 9 | EMP00008,Mary,Gonzalez,mary.gonzalez@example.com 10 | EMP00009,Jennifer,Tucker,jennifer.tucker@example.com 11 | EMP00010,Kimberly,Morgan,kimberly.morgan@example.com 12 | EMP00011,Linda,King,linda.king@example.com 13 | EMP00012,Robert,Marquez,robert.marquez@example.com 14 | EMP00013,Ivan,Orozco,ivan.orozco@example.com 15 | EMP00014,Allison,Herrera,allison.herrera@example.com 16 | EMP00015,Megan,Lewis,megan.lewis@example.com 17 | EMP00016,James,Chase,james.chase@example.com 18 | EMP00017,Donald,Campbell,donald.campbell@example.com 19 | EMP00018,Katrina,Rodriguez,katrina.rodriguez@example.com 20 | EMP00019,Michael,Leach,michael.leach@example.com -------------------------------------------------------------------------------- /scale-bull-demo/scale-bull-jobs-app/csv/b56b8997d534e6c2630903d4b023df61: -------------------------------------------------------------------------------- 1 | employeeId,firstName,lastName,email 2 | EMP00001,Brenda,Pitts,brenda.pitts@example.com 3 | EMP00002,Troy,Henderson,troy.henderson@example.com 4 | EMP00003,Mark,Bell,mark.bell@example.com 5 | EMP00004,Jenna,George,jenna.george@example.com 6 | EMP00005,Martin,Martinez,martin.martinez@example.com 7 | EMP00006,Paul,Rhodes,paul.rhodes@example.com 8 | EMP00007,Brent,Ward,brent.ward@example.com 9 | EMP00008,Mary,Gonzalez,mary.gonzalez@example.com 10 | EMP00009,Jennifer,Tucker,jennifer.tucker@example.com 11 | EMP00010,Kimberly,Morgan,kimberly.morgan@example.com 12 | EMP00011,Linda,King,linda.king@example.com 13 | EMP00012,Robert,Marquez,robert.marquez@example.com 14 | EMP00013,Ivan,Orozco,ivan.orozco@example.com 15 | EMP00014,Allison,Herrera,allison.herrera@example.com 16 | EMP00015,Megan,Lewis,megan.lewis@example.com 17 | EMP00016,James,Chase,james.chase@example.com 18 | EMP00017,Donald,Campbell,donald.campbell@example.com 19 | EMP00018,Katrina,Rodriguez,katrina.rodriguez@example.com 20 | EMP00019,Michael,Leach,michael.leach@example.com -------------------------------------------------------------------------------- /bullqueuedemo/src/file-upload.processor.ts: -------------------------------------------------------------------------------- 1 | import { UserService } from "./user.service"; 2 | import { Job } from "bullmq"; 3 | import { Processor, WorkerHost } from "@nestjs/bullmq"; 4 | 5 | const csv = require('csvtojson'); 6 | 7 | @Processor('file-upload-queue') 8 | export class FileUploadProcessor extends WorkerHost{ 9 | 10 | constructor(private readonly userService: UserService){ 11 | super(); 12 | } 13 | 14 | async process(job: Job) { 15 | const file = job.data.file; 16 | const filePath = file.path; 17 | const userData = await csv().fromFile(filePath); 18 | 19 | console.log(userData); 20 | 21 | for(const user of userData) { 22 | const input = { 23 | email: user.email, 24 | first_name: user.first_name, 25 | last_name: user.last_name, 26 | }; 27 | const userCreated = await this.userService.createUser(input); 28 | console.log('User created -', userCreated.id ); 29 | } 30 | 31 | } 32 | 33 | } -------------------------------------------------------------------------------- /loggingdemo/src/main/java/com/betterjavacode/loggingdemo/controller/CompanyController.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.loggingdemo.controller; 2 | 3 | import org.slf4j.Logger; 4 | import org.slf4j.LoggerFactory; 5 | import org.springframework.web.bind.annotation.GetMapping; 6 | import org.springframework.web.bind.annotation.RequestMapping; 7 | import org.springframework.web.bind.annotation.RestController; 8 | 9 | import java.util.ArrayList; 10 | import java.util.List; 11 | 12 | @RestController 13 | @RequestMapping("/v1/companies") 14 | public class CompanyController 15 | { 16 | private static final Logger LOGGER = LoggerFactory.getLogger(CompanyController.class); 17 | @GetMapping 18 | public List getAllCompanies() 19 | { 20 | LOGGER.debug("Getting all companies"); 21 | 22 | List result = new ArrayList<>(); 23 | 24 | result.add("Google"); 25 | result.add("Alphabet"); 26 | result.add("SpaceX"); 27 | 28 | LOGGER.debug("Got all companies - {}", result); 29 | 30 | return result; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /retrydemo/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'org.springframework.boot' version '2.4.4' 3 | id 'io.spring.dependency-management' version '1.0.11.RELEASE' 4 | id 'java' 5 | } 6 | 7 | group = 'com.betterjavacode' 8 | version = '0.0.1-SNAPSHOT' 9 | sourceCompatibility = '1.8' 10 | 11 | repositories { 12 | mavenCentral() 13 | } 14 | 15 | ext { 16 | set('springCloudVersion', "2020.0.2") 17 | } 18 | 19 | dependencies { 20 | implementation 'org.springframework.boot:spring-boot-starter-data-jpa' 21 | implementation 'org.springframework.boot:spring-boot-starter-web' 22 | implementation 'org.springframework.cloud:spring-cloud-starter-circuitbreaker-resilience4j' 23 | implementation 'org.springframework.retry:spring-retry:1.3.1' 24 | implementation 'org.springframework:spring-aspects:5.3.5' 25 | runtimeOnly 'mysql:mysql-connector-java' 26 | testImplementation 'org.springframework.boot:spring-boot-starter-test' 27 | } 28 | 29 | dependencyManagement { 30 | imports { 31 | mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}" 32 | } 33 | } 34 | 35 | test { 36 | useJUnitPlatform() 37 | } 38 | -------------------------------------------------------------------------------- /todolistkeycloaksaml/src/main/resources/credentials/idp.cer: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIICrTCCAZUCBgF18d+ENDANBgkqhkiG9w0BAQsFADAaMRgwFgYDVQQDDA9Ub0Rv 3 | TGlzdFNBTUxBcHAwHhcNMjAxMTIyMjEzMDU4WhcNMzAxMTIyMjEzMjM4WjAaMRgw 4 | FgYDVQQDDA9Ub0RvTGlzdFNBTUxBcHAwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw 5 | ggEKAoIBAQDO5OkDC3pmsJ8o216x2eurug8cJsV5QgBn6bx8/xSbPjDuzorWJY+7 6 | SPsuBJRaLmu11VUh8AKgAIA6GOI462PablQmPo0TxDy250yNdKDs7+/FFQjvnNIu 7 | HIWshOvp5iLptCsCWtQ2O5AyfSzvxhEfm4gQVcTQXWYxuvmpc3vnaUpiFCuPi2uq 8 | VC1ndAhlZdOf/n2xbpZ1kUmZrNY8JL7Jo+efE3uq5JTyMEV1GtTfOcBWYNAOngs4 9 | CTUbB+4wFy1t0AxZojIxJkG1BImc4oQ2jtoEUsAYlhom2DdOWc965AdVo593XzZb 10 | W+42zMTcIWugcdlP7ScFL08EB/fWXeXvAgMBAAEwDQYJKoZIhvcNAQELBQADggEB 11 | AAtWrWo8UnbeDUM3UdTzITd1ysu0fjg0r+D1H9YwKJA1soRP5lkbwZrV1gIt5SNx 12 | gIqR31SmqvCQPDrEZwGTOZGKjNBxt+PtTntfyP2UXlTOJycKBWQQJHb0qgr7Nh+6 13 | bkCDnoJutBsZbCuEAaHmtKu0dzg9lOWpwXMMpDrauMXhraiIzj8tQ4wlsnsMTl1n 14 | /2GZ3xfdbbT9+Z1IBrbDPsd7X/L2+leYGvWZKbvRopSqZF66rFWCjPl9/vfoZGbZ 15 | 8oqlQtrJsXe5tH9AA08w+5FO9lnEpduTkiMKh2K+sVxw8aRu0M7xSsn+7wCk84Ec 16 | fEcjON7kckHv8vHz98HiHXY= 17 | -----END CERTIFICATE----- 18 | -------------------------------------------------------------------------------- /twofactorauthdemo/src/main/resources/templates/core/head.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Java Dev Journal | Registration Page 8 | 9 | 10 | 11 | 12 | 13 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /twofactorauthdemo/src/main/java/com/betterjavacode/twofactorauthdemo/dtos/ResetPasswordDto.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.twofactorauthdemo.dtos; 2 | 3 | public class ResetPasswordDto 4 | { 5 | private String email; 6 | private String token; 7 | private String password; 8 | private String repeatPassword; 9 | 10 | public String getEmail() { 11 | return email; 12 | } 13 | 14 | public void setEmail(String email) { 15 | this.email = email; 16 | } 17 | 18 | public String getToken() { 19 | return token; 20 | } 21 | 22 | public void setToken(String token) { 23 | this.token = token; 24 | } 25 | 26 | public String getPassword() { 27 | return password; 28 | } 29 | 30 | public void setPassword(String password) { 31 | this.password = password; 32 | } 33 | 34 | public String getRepeatPassword() { 35 | return repeatPassword; 36 | } 37 | 38 | public void setRepeatPassword(String repeatPassword) { 39 | this.repeatPassword = repeatPassword; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /bullqueuedemo/src/user.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@nestjs/common'; 2 | import { Prisma, User } from '@prisma/client'; 3 | import { PrismaService } from './prisma.service'; 4 | 5 | @Injectable() 6 | export class UserService { 7 | constructor(private prisma: PrismaService) {} 8 | 9 | async user( 10 | userWhereUniqueInput: Prisma.UserWhereUniqueInput, 11 | ): Promise { 12 | return this.prisma.user.findUnique({ 13 | where: userWhereUniqueInput, 14 | }); 15 | } 16 | 17 | async users(params: { 18 | skip?: number; 19 | take?: number; 20 | cursor?: Prisma.UserWhereUniqueInput; 21 | where?: Prisma.UserWhereInput; 22 | orderBy?: Prisma.UserOrderByWithRelationInput; 23 | }): Promise { 24 | const { skip, take, cursor, where, orderBy } = params; 25 | return this.prisma.user.findMany({ 26 | skip, 27 | take, 28 | cursor, 29 | where, 30 | orderBy, 31 | }); 32 | } 33 | 34 | async createUser(data: Prisma.UserCreateInput): Promise { 35 | return this.prisma.user.create({ 36 | data, 37 | }); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /springcloudfunctiondemo/src/main/java/com/betterjavacode/springcloudfunctiondemo/functions/CustomerSupplier.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.springcloudfunctiondemo.functions; 2 | 3 | import com.betterjavacode.springcloudfunctiondemo.models.Customer; 4 | import com.betterjavacode.springcloudfunctiondemo.repositories.CustomerRepository; 5 | import org.slf4j.Logger; 6 | import org.slf4j.LoggerFactory; 7 | import org.springframework.beans.factory.annotation.Autowired; 8 | import org.springframework.stereotype.Component; 9 | 10 | import java.util.List; 11 | import java.util.function.Supplier; 12 | 13 | @Component 14 | public class CustomerSupplier implements Supplier 15 | { 16 | public static final Logger LOGGER = LoggerFactory.getLogger(CustomerSupplier.class); 17 | 18 | @Autowired 19 | private CustomerRepository customerRepository; 20 | 21 | @Override 22 | public Customer get () 23 | { 24 | List customers = customerRepository.findAll(); 25 | LOGGER.info("Getting the customer of our choice - ", customers); 26 | return customers.get(0); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /nestjspassportdemo/backend/src/users/users.controller.ts: -------------------------------------------------------------------------------- 1 | import { Body, Controller, Get, HttpStatus, Param, Post, Req, Res, UseGuards } from '@nestjs/common'; 2 | import { response } from 'express'; 3 | import { CreateUserDto } from './dtos/create-user.dto'; 4 | import { LocalAuthGuard } from './local.auth.guard'; 5 | import RequestWithUser from './request-user'; 6 | import { UsersService } from './users.service'; 7 | 8 | @Controller('/api/v1/user') 9 | export class UsersController { 10 | constructor(private readonly usersService: UsersService) {} 11 | 12 | @Post('/signup') 13 | async create(@Res() response, @Body() createUserDto: CreateUserDto) { 14 | const user = await this.usersService.createUser(createUserDto); 15 | return response.status(HttpStatus.CREATED).json({ 16 | user 17 | }); 18 | } 19 | 20 | @UseGuards(LocalAuthGuard) 21 | @Post('/signin') 22 | async signIn(@Req() request: RequestWithUser) { 23 | const user = request.user; 24 | return user; 25 | 26 | } 27 | 28 | @Get('/:id') 29 | show(@Param('id') id: string) { 30 | return this.usersService.findById(id); 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /twofactorauthdemo/src/main/java/com/betterjavacode/twofactorauthdemo/dtos/UserDto.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.twofactorauthdemo.dtos; 2 | 3 | import java.io.Serializable; 4 | 5 | public class UserDto implements Serializable 6 | { 7 | private String firstName; 8 | private String lastName; 9 | private String email; 10 | private String password; 11 | 12 | public String getFirstName() { 13 | return firstName; 14 | } 15 | 16 | public void setFirstName(String firstName) { 17 | this.firstName = firstName; 18 | } 19 | 20 | public String getLastName() { 21 | return lastName; 22 | } 23 | 24 | public void setLastName(String lastName) { 25 | this.lastName = lastName; 26 | } 27 | 28 | public String getEmail() { 29 | return email; 30 | } 31 | 32 | public void setEmail(String email) { 33 | this.email = email; 34 | } 35 | 36 | public String getPassword() { 37 | return password; 38 | } 39 | 40 | public void setPassword(String password) { 41 | this.password = password; 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /scale-bull-demo/scale-bull-jobs-app/src/file-read/file-data.module.ts: -------------------------------------------------------------------------------- 1 | import { BullModule } from "@nestjs/bull"; 2 | import { Module } from "@nestjs/common"; 3 | import { FileDataProcessor } from "./file-data.processor"; 4 | import { ConfigModule, ConfigService } from "@nestjs/config"; 5 | 6 | 7 | @Module({ 8 | imports: [ 9 | ConfigModule.forRoot({ 10 | isGlobal: true, 11 | }), 12 | BullModule.forRootAsync({ 13 | imports: [ConfigModule], 14 | useFactory: async (configService: ConfigService) => ({ 15 | redis: { 16 | host: process.env.REDIS_HOST || configService.get('REDIS_HOST'), 17 | port: Number(process.env.REDIS_PORT || configService.get('REDIS_PORT')), 18 | }, 19 | }), 20 | inject: [ConfigService] 21 | }), 22 | BullModule.registerQueue({ 23 | name: 'file-data-queue', 24 | limiter: { 25 | max: 3, 26 | duration: 10000 27 | } 28 | }) 29 | ], 30 | providers: [FileDataProcessor] 31 | }) 32 | export class FileDataModule {} -------------------------------------------------------------------------------- /twofactorauthdemo/src/main/java/com/betterjavacode/twofactorauthdemo/config/handlers/LoginAuthenticationFailureHandler.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.twofactorauthdemo.config.handlers; 2 | 3 | import org.springframework.security.core.AuthenticationException; 4 | import org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler; 5 | 6 | import javax.servlet.ServletException; 7 | import javax.servlet.http.HttpServletRequest; 8 | import javax.servlet.http.HttpServletResponse; 9 | import java.io.IOException; 10 | 11 | public class LoginAuthenticationFailureHandler extends SimpleUrlAuthenticationFailureHandler 12 | { 13 | public static final String LAST_USERNAME_KEY = "LAST_USERNAME"; 14 | 15 | public void onAuthenticationFailure(HttpServletRequest request, 16 | HttpServletResponse response, AuthenticationException exception) 17 | throws IOException, ServletException 18 | { 19 | request.getSession().setAttribute(LAST_USERNAME_KEY, request.getParameter("username")); 20 | super.onAuthenticationFailure(request, response, exception); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Directory for https://betterjavacode.com blog 2 | 3 | - Spring Boot Connect with AWS Dynamo DB - https://betterjavacode.com/programming/spring-boot-connect-aws-dynamo-db 4 | - How to use Spring Security with SAML Protocol Binding - https://betterjavacode.com/programming/how-to-use-spring-security-with-saml-protocol-binding 5 | - Using Apache Kafka with Spring Boot - https://betterjavacode.com/kafka/using-apache-kafka-with-spring-boot 6 | - Spring Retry vs Resilience4j Retry - https://betterjavacode.com/programming/spring-retry-vs-resilience4j-retry 7 | - Conversion of Entity to DTO Using ModelMapper - https://betterjavacode.com/spring-boot/conversion-of-entity-to-dto-using-modelmapper 8 | - Example of Spring Boot Application Authentication with AWS Cognito - https://betterjavacode.com/programming/example-of-spring-boot-application-authentication-with-aws-cognito 9 | 10 | - Two Factor Authentication with Spring Security - Part I - https://betterjavacode.com/programming/two-factor-authentication-spring-security 11 | - Two Factor Authentication with Spring Security - Part II - https://betterjavacode.com/programming/two-factor-authentication-with-spring-security-2 12 | -------------------------------------------------------------------------------- /keycloak-extensions/KeycloakDocker/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: "3.8" 2 | 3 | services: 4 | postgres: 5 | image: postgres 6 | volumes: 7 | - postgres_data:/var/lib/postgresql/data 8 | environment: 9 | POSTGRES_DB: keycloak 10 | POSTGRES_USER: keycloak 11 | POSTGRES_PASSWORD: password 12 | networks: 13 | - common-network 14 | keycloak: 15 | image: quay.io/keycloak/keycloak:21.0.0 16 | ports: 17 | - "8180:8080" 18 | command: 19 | - start-dev 20 | environment: 21 | DB_VENDOR: POSTGRES 22 | DB_ADDR: postgres 23 | DB_DATABASE: keycloak 24 | DB_USER: keycloak 25 | DB_PASSWORD: password 26 | DB_SCHEMA: public 27 | KEYCLOAK_ADMIN: admin 28 | KEYCLOAK_ADMIN_PASSWORD: password 29 | volumes: 30 | - "./providers:/opt/keycloak/providers" 31 | - "./themes:/opt/keycloak/themes" 32 | depends_on: 33 | - postgres 34 | networks: 35 | - common-network 36 | networks: 37 | common-network: 38 | driver: bridge 39 | volumes: 40 | db-data: 41 | driver: local 42 | postgres_data: 43 | driver: local 44 | -------------------------------------------------------------------------------- /nestjs-event-emitter-demo/src/app.module.ts: -------------------------------------------------------------------------------- 1 | import { Module } from '@nestjs/common'; 2 | import { AppController } from './app.controller'; 3 | import { AppService } from './app.service'; 4 | import { FileController } from './controllers/file.controller'; 5 | import { PrismaService } from './common/prisma.service'; 6 | import { FileUploadService } from './services/fileupload.service'; 7 | import { ConfigModule } from '@nestjs/config'; 8 | import * as Joi from '@hapi/joi'; 9 | import { EventEmitterModule } from '@nestjs/event-emitter'; 10 | import { FileUploadedListener } from './listeners/file-uploaded.listener'; 11 | 12 | @Module({ 13 | imports: [ 14 | ConfigModule.forRoot({ 15 | validationSchema: Joi.object({ 16 | AWS_REGION: Joi.string().required(), 17 | AWS_ACCESS_KEY_ID: Joi.string().required(), 18 | AWS_SECRET_ACCESS_KEY: Joi.string().required(), 19 | AWS_BUCKET_NAME: Joi.string().required(), 20 | }) 21 | }), 22 | EventEmitterModule.forRoot() 23 | ], 24 | controllers: [AppController, FileController], 25 | providers: [AppService, PrismaService, FileUploadService, FileUploadedListener], 26 | }) 27 | export class AppModule {} 28 | -------------------------------------------------------------------------------- /twofactorauthdemo/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'java' 3 | id 'org.springframework.boot' version '2.7.5' 4 | id 'io.spring.dependency-management' version '1.0.15.RELEASE' 5 | } 6 | 7 | group = 'com.betterjavacode' 8 | version = '0.0.1-SNAPSHOT' 9 | sourceCompatibility = '1.8' 10 | 11 | repositories { 12 | mavenCentral() 13 | } 14 | 15 | dependencies { 16 | implementation 'org.springframework.boot:spring-boot-starter' 17 | implementation 'org.springframework.boot:spring-boot-starter-data-jpa' 18 | implementation 'org.springframework.boot:spring-boot-starter-security' 19 | implementation 'org.springframework.boot:spring-boot-starter-web' 20 | implementation 'dev.samstevens.totp:totp-spring-boot-starter:1.7.1' 21 | implementation 'org.springframework.boot:spring-boot-starter-mail' 22 | implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' 23 | implementation 'org.apache.commons:commons-lang3:3.11' 24 | runtimeOnly 'com.mysql:mysql-connector-j' 25 | testImplementation 'org.springframework.boot:spring-boot-starter-test' 26 | testImplementation 'org.springframework.security:spring-security-test' 27 | } 28 | 29 | tasks.named('test') { 30 | useJUnitPlatform() 31 | } 32 | -------------------------------------------------------------------------------- /twofactorauthdemo/src/main/java/com/betterjavacode/twofactorauthdemo/services/UserService.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.twofactorauthdemo.services; 2 | 3 | import com.betterjavacode.twofactorauthdemo.dtos.MfaTokenDto; 4 | import com.betterjavacode.twofactorauthdemo.dtos.UserDto; 5 | import com.betterjavacode.twofactorauthdemo.exceptions.InvalidTokenException; 6 | import com.betterjavacode.twofactorauthdemo.exceptions.UnknownIdentifierException; 7 | import com.betterjavacode.twofactorauthdemo.exceptions.UserAlreadyExistsException; 8 | import com.betterjavacode.twofactorauthdemo.models.UserEntity; 9 | import dev.samstevens.totp.exceptions.QrGenerationException; 10 | 11 | public interface UserService 12 | { 13 | void register(final UserDto user) throws UserAlreadyExistsException; 14 | boolean checkIfUserExist(final String email); 15 | void sendRegistrationConfirmationEmail(final UserEntity user); 16 | boolean verifyUser(final String token) throws InvalidTokenException; 17 | UserEntity getUserById(final String id) throws UnknownIdentifierException; 18 | MfaTokenDto mfaSetup(final String email) throws UnknownIdentifierException, QrGenerationException; 19 | } 20 | -------------------------------------------------------------------------------- /cognitodemo/src/main/java/com/betterjavacode/cognitodemo/config/SecurityConfig.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.cognitodemo.config; 2 | 3 | import org.springframework.beans.factory.annotation.Autowired; 4 | import org.springframework.context.annotation.Configuration; 5 | import org.springframework.security.config.annotation.web.builders.HttpSecurity; 6 | import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; 7 | 8 | @Configuration 9 | public class SecurityConfig extends WebSecurityConfigurerAdapter 10 | { 11 | @Autowired 12 | public CustomLogoutSuccessHandler customLogoutSuccessHandler; 13 | 14 | @Override 15 | protected void configure(HttpSecurity httpSecurity) throws Exception 16 | { 17 | httpSecurity.csrf() 18 | .and() 19 | .authorizeRequests() 20 | .anyRequest() 21 | .authenticated() 22 | .and() 23 | .oauth2Login() 24 | .and() 25 | .logout() 26 | .logoutUrl("/logout") 27 | .logoutSuccessHandler(customLogoutSuccessHandler) 28 | ; 29 | 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /bullqueuedemo/src/merge-data.processor.ts: -------------------------------------------------------------------------------- 1 | import { Job, Queue } from "bullmq"; 2 | import * as fs from 'fs'; 3 | import { Processor, WorkerHost } from "@nestjs/bullmq"; 4 | 5 | 6 | @Processor('merge-data-queue') 7 | export class MergeDataProcessor extends WorkerHost { 8 | 9 | async process(job: Job): Promise { 10 | const transformedChunks = await job.getChildrenValues(); 11 | const files = Object.values(transformedChunks).sort(); 12 | 13 | console.log('Start merging data into a single file', files); 14 | 15 | await this.mergeFiles( 16 | job.id, 17 | files, 18 | `./output/merged-${job.id}.csv` 19 | ); 20 | } 21 | 22 | async mergeFiles( 23 | jobId: string, 24 | files: string[], 25 | finalOutputFileName: string, 26 | ): Promise { 27 | 28 | const data = []; 29 | files.forEach( (file) => { 30 | const fileData = fs.readFileSync(file); 31 | data.push(fileData); 32 | }); 33 | fs.writeFile(finalOutputFileName, data.join("\r\n"), (err) => { 34 | console.log(err || 'done') 35 | }); 36 | } 37 | } -------------------------------------------------------------------------------- /nestjspassportdemo/backend/src/auth/auth.service.ts: -------------------------------------------------------------------------------- 1 | import { HttpException, HttpStatus, Injectable } from '@nestjs/common'; 2 | import * as bcrypt from 'bcryptjs'; 3 | import { User } from 'src/users/entities/user.entity'; 4 | import { UsersService } from 'src/users/users.service'; 5 | 6 | @Injectable() 7 | export class AuthService { 8 | 9 | constructor(private readonly userService: UsersService) {} 10 | 11 | async getAuthenticatedUser(email: string, password: string): Promise { 12 | try { 13 | const user = await this.userService.getByEmail(email); 14 | console.log(user); 15 | await this.validatePassword(password, user.password); 16 | return user; 17 | } catch (e) { 18 | throw new HttpException('Invalid Credentials', HttpStatus.BAD_REQUEST); 19 | } 20 | } 21 | 22 | async validatePassword(password: string, hashedPassword: string) { 23 | const passwordMatched = await bcrypt.compare( 24 | password, 25 | hashedPassword, 26 | ); 27 | 28 | if (!passwordMatched) { 29 | throw new HttpException('Invalid Credentials', HttpStatus.BAD_REQUEST); 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /todolistkeycloaksaml/src/main/java/com/betterjavacode/sss/todolist/managers/UsersManager.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.sss.todolist.managers; 2 | 3 | import com.betterjavacode.sss.todolist.dtos.UserDto; 4 | import com.betterjavacode.sss.todolist.models.Users; 5 | import com.betterjavacode.sss.todolist.repositories.UsersRepository; 6 | import org.springframework.beans.factory.annotation.Autowired; 7 | import org.springframework.stereotype.Component; 8 | 9 | @Component 10 | public class UsersManager 11 | { 12 | 13 | @Autowired 14 | private UsersRepository usersRepository; 15 | 16 | public UserDto createUser(UserDto userDto) 17 | { 18 | if(userDto == null) 19 | { 20 | throw new RuntimeException("User can not be null"); 21 | } 22 | Users user = new Users(); 23 | user.setEmail(userDto.getEmail()); 24 | user.setFirstName(userDto.getFirstName()); 25 | user.setLastName(userDto.getLastName()); 26 | user.setPassword(userDto.getPassword()); 27 | user.setRole(userDto.getRole()); 28 | user.setEnabled(userDto.isEnabled()); 29 | Users savedUser = usersRepository.save(user); 30 | 31 | return userDto; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /nestjspassportdemo/backend/src/users/users.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@nestjs/common'; 2 | import { PrismaService } from 'src/common/prisma.service'; 3 | import { CreateUserDto } from './dtos/create-user.dto'; 4 | import * as bcrypt from 'bcryptjs'; 5 | import { UserRepository } from './user.repository'; 6 | import { User } from './entities/user.entity'; 7 | 8 | @Injectable() 9 | export class UsersService { 10 | constructor(private readonly prismaService: PrismaService, private readonly userRepository: UserRepository) {} 11 | 12 | async createUser(user: CreateUserDto) { 13 | const hashedPassword = await bcrypt.hash(user.password, 12); 14 | 15 | const userToBeCreated = User.createNewUser({ 16 | firstName: user.firstName, 17 | lastName: user.lastName, 18 | email: user.email, 19 | password: hashedPassword, 20 | }); 21 | return await this.userRepository.save(userToBeCreated); 22 | } 23 | 24 | async findById(id: string) { 25 | return await this.userRepository.findById(id); 26 | } 27 | 28 | async getByEmail(email: string) { 29 | const user = await this.userRepository.findByEmail(email); 30 | 31 | return user; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /springcloudfunctiondemo/src/main/java/com/betterjavacode/springcloudfunctiondemo/functions/CustomerConsumer.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.springcloudfunctiondemo.functions; 2 | 3 | import com.betterjavacode.springcloudfunctiondemo.models.Customer; 4 | import com.betterjavacode.springcloudfunctiondemo.repositories.CustomerRepository; 5 | import org.slf4j.Logger; 6 | import org.slf4j.LoggerFactory; 7 | import org.springframework.beans.factory.annotation.Autowired; 8 | import org.springframework.stereotype.Component; 9 | import java.util.Map; 10 | import java.util.function.Consumer; 11 | 12 | @Component 13 | public class CustomerConsumer implements Consumer> 14 | { 15 | public static final Logger LOGGER = LoggerFactory.getLogger(CustomerConsumer.class); 16 | 17 | @Autowired 18 | private CustomerRepository customerRepository; 19 | 20 | @Override 21 | public void accept (Map map) 22 | { 23 | LOGGER.info("Creating the customer", map); 24 | Customer customer = new Customer(map.get("name"), Integer.parseInt(map.get( 25 | "customerIdentifier")), map.get("email"), map.get("contactPerson")); 26 | customerRepository.save(customer); 27 | } 28 | 29 | } 30 | -------------------------------------------------------------------------------- /twofactorauthdemo/src/main/resources/message.properties: -------------------------------------------------------------------------------- 1 | lang.eng=English 2 | registration.validation.firstName=Please provide first name 3 | registration.validation.lastName=Please provide last name 4 | registration.validation.email=Please provide a valid email 5 | registration.validation.password= Password can not be empty 6 | login.error= Username or password is incorrect. Please make sure to provide valid username or password. 7 | 8 | user.registration.verification.missing.token= Token is empty. Please make sure to copy the entire URL 9 | user.registration.verification.invalid.token= It seems that token is expired or has been modified.Please provide a valid token. 10 | user.registration.verification.success= Thanks for the account verification. You can now login to your account. 11 | user.registration.verification.email.msg= Thanks for your registration. We have sent a verification email. Please verify your account.Please scan the QR code for generating MFA token for login. 12 | user.forgotpwd.msg= If the email address entered matches your account, you will receive an email with a link to reset your password. 13 | user.password.updated.msg= Your password is updated. Please login 14 | user.account.locked = Your account has been locked due to multiple failed login attempts. -------------------------------------------------------------------------------- /healthcheckdemo/src/health/health.controller.ts: -------------------------------------------------------------------------------- 1 | import { Controller, Get, Inject } from '@nestjs/common'; 2 | import { DiskHealthIndicator, HealthCheck, HealthCheckService, HttpHealthIndicator, MemoryHealthIndicator, MicroserviceHealthIndicator } from '@nestjs/terminus'; 3 | import { PrismaOrmHealthIndicator } from './prismaorm.health'; 4 | 5 | 6 | @Controller('health') 7 | export class HealthController { 8 | constructor( 9 | private health: HealthCheckService, 10 | private http: HttpHealthIndicator, 11 | @Inject(PrismaOrmHealthIndicator) 12 | private db: PrismaOrmHealthIndicator, 13 | private disk: DiskHealthIndicator, 14 | private memory: MemoryHealthIndicator, 15 | ) {} 16 | 17 | @Get() 18 | @HealthCheck() 19 | check() { 20 | return this.health.check([ 21 | () => this.http.pingCheck('basic check', 'http://localhost:3000'), 22 | () => this.disk.checkStorage('diskStorage', { thresholdPercent: 0.5, path: 'C:\\'}), 23 | () => this.db.pingCheck('healthcheckdemo'), 24 | () => this.memory.checkHeap('memory_heap', 300*1024*1024), 25 | () => this.memory.checkRSS('memory_rss', 300*1024*1024), 26 | 27 | // Mongoose for MongoDB check 28 | // Redis check 29 | ]); 30 | } 31 | 32 | 33 | } 34 | -------------------------------------------------------------------------------- /nestjspassportdemo/ui/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ui", 3 | "version": "0.1.0", 4 | "private": true, 5 | "dependencies": { 6 | "@emotion/react": "^11.10.4", 7 | "@emotion/styled": "^11.10.4", 8 | "@material-ui/core": "^4.12.4", 9 | "@material-ui/icons": "^4.11.3", 10 | "@mui/material": "^5.10.3", 11 | "@mui/styled-engine-sc": "^5.10.3", 12 | "@testing-library/jest-dom": "^5.16.5", 13 | "@testing-library/react": "^13.3.0", 14 | "@testing-library/user-event": "^13.5.0", 15 | "axios": "^0.27.2", 16 | "react": "^18.2.0", 17 | "react-dom": "^18.2.0", 18 | "react-router-dom": "^6.3.0", 19 | "react-scripts": "5.0.1", 20 | "web-vitals": "^2.1.4" 21 | }, 22 | "scripts": { 23 | "start": "set PORT=3001 && react-scripts start", 24 | "build": "react-scripts build", 25 | "test": "react-scripts test", 26 | "eject": "react-scripts eject" 27 | }, 28 | "eslintConfig": { 29 | "extends": [ 30 | "react-app", 31 | "react-app/jest" 32 | ] 33 | }, 34 | "browserslist": { 35 | "production": [ 36 | ">0.2%", 37 | "not dead", 38 | "not op_mini all" 39 | ], 40 | "development": [ 41 | "last 1 chrome version", 42 | "last 1 firefox version", 43 | "last 1 safari version" 44 | ] 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /dynamodbdemo/src/main/java/com/betterjavacode/dynamodbdemo/services/CompanyService.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.dynamodbdemo.services; 2 | 3 | import com.betterjavacode.dynamodbdemo.models.Company; 4 | import com.betterjavacode.dynamodbdemo.repositories.CompanyRepository; 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.stereotype.Service; 7 | 8 | import java.util.List; 9 | import java.util.Optional; 10 | 11 | @Service 12 | public class CompanyService 13 | { 14 | @Autowired 15 | private CompanyRepository companyRepository; 16 | 17 | public Company createCompany(final Company company) 18 | { 19 | Company createdCompany = companyRepository.save(company); 20 | return createdCompany; 21 | } 22 | 23 | public List getAllCompanies() 24 | { 25 | return (List) companyRepository.findAll(); 26 | } 27 | 28 | public Company getCompany(String companyId) 29 | { 30 | Optional companyOptional = companyRepository.findById(companyId); 31 | 32 | if(companyOptional.isPresent()) 33 | { 34 | return companyOptional.get(); 35 | } 36 | else 37 | { 38 | return null; 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /scale-bull-demo/scale-bull-jobs-app/src/app.controller.ts: -------------------------------------------------------------------------------- 1 | import { Controller, Get, Post, UploadedFile, UseInterceptors } from '@nestjs/common'; 2 | import { AppService } from './app.service'; 3 | import { InjectQueue } from '@nestjs/bull'; 4 | import { Queue } from 'bull'; 5 | import { FileInterceptor } from '@nestjs/platform-express/multer'; 6 | import { diskStorage } from 'multer'; 7 | import { extname } from 'path'; 8 | 9 | @Controller('/api/bullscaledemo') 10 | export class AppController { 11 | constructor(@InjectQueue('file-upload-queue') private fileQueue: Queue, private readonly appService: AppService) {} 12 | 13 | @Get() 14 | getHello(): string { 15 | return this.appService.getHello(); 16 | } 17 | 18 | @Post('/uploadFile') 19 | @UseInterceptors(FileInterceptor("csv", { 20 | storage: diskStorage({ 21 | destination: './csv', 22 | fileName: (req, file, cb) => { 23 | const randomName = Array(32).fill(null).map(() => (Math.round(Math.random() * cb(null, `${randomName}${extname(file.originalname)}`)))) 24 | } 25 | }) 26 | })) 27 | async uploadLargeCsvFile(@UploadedFile() file): Promise { 28 | const job = await this.fileQueue.add('process-file', {file: file}); 29 | console.log(`created job ${ job.id}`); 30 | await this.fileQueue.close(); 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /bullqueuedemo/src/bull-board-controller.ts: -------------------------------------------------------------------------------- 1 | import { createBullBoard } from "@bull-board/api"; 2 | import { BaseAdapter } from "@bull-board/api/dist/src/queueAdapters/base"; 3 | import { ExpressAdapter } from "@bull-board/express"; 4 | import { Request, Response, All, Controller, Next, Get, Post } from "@nestjs/common"; 5 | import { getBullBoardQueues } from "./bull-board-queue"; 6 | import express from 'express'; 7 | 8 | 9 | @Controller('/queues/admin') 10 | export class BullBoardController{ 11 | 12 | @All('*') 13 | admin( 14 | @Request() req: express.Request, 15 | @Response() res: express.Response, 16 | @Next() next: express.NextFunction, 17 | ) { 18 | const serverAdapter = new ExpressAdapter(); 19 | serverAdapter.setBasePath('/queues/admin'); 20 | const queues = getBullBoardQueues(); 21 | const router = serverAdapter.getRouter() as express.Express; 22 | const { addQueue } = createBullBoard({ 23 | queues: [], 24 | serverAdapter, 25 | }); 26 | queues.forEach((queue: BaseAdapter) => { 27 | addQueue(queue); 28 | }); 29 | const entryPointPath = '/queues/admin/'; 30 | req.url = req.url.replace(entryPointPath, '/'); 31 | router(req, res, next); 32 | } 33 | } -------------------------------------------------------------------------------- /scale-bull-demo/scale-bull-jobs-app/src/file-upload/file-upload.module.ts: -------------------------------------------------------------------------------- 1 | import { BullModule } from "@nestjs/bull"; 2 | import { Module } from "@nestjs/common"; 3 | import { FileUploadProcessor } from "./file-upload.processor"; 4 | import { ConfigModule, ConfigService } from "@nestjs/config"; 5 | import { FileDataModule } from "src/file-read/file-data.module"; 6 | 7 | 8 | @Module({ 9 | imports: [ 10 | ConfigModule.forRoot({ 11 | isGlobal: true, 12 | }), 13 | BullModule.forRootAsync({ 14 | imports: [ConfigModule], 15 | useFactory: async (configService: ConfigService) => ({ 16 | redis: { 17 | host: process.env.REDIS_HOST || configService.get('REDIS_HOST'), 18 | port: Number(process.env.REDIS_PORT || configService.get('REDIS_PORT')), 19 | }, 20 | }), 21 | inject: [ConfigService] 22 | }), 23 | BullModule.registerQueue({ 24 | name: 'file-upload-queue', 25 | limiter: { 26 | max: 1, 27 | duration: 10000 28 | } 29 | }), 30 | BullModule.registerQueue({ 31 | name: 'file-data-queue', 32 | }), 33 | ], 34 | providers: [FileUploadProcessor] 35 | }) 36 | export class FileUploadModule {} -------------------------------------------------------------------------------- /elasticsearchdemo/src/main/java/com/betterjavacode/elasticsearchdemo/services/LogDataService.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.elasticsearchdemo.services; 2 | 3 | import com.betterjavacode.elasticsearchdemo.models.LogData; 4 | import com.betterjavacode.elasticsearchdemo.repositories.LogDataRepository; 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.stereotype.Service; 7 | 8 | import java.util.List; 9 | 10 | @Service 11 | public class LogDataService 12 | { 13 | @Autowired 14 | private LogDataRepository logDataRepository; 15 | 16 | public LogData createLogDataIndex(final LogData logData) 17 | { 18 | return logDataRepository.save(logData); 19 | } 20 | 21 | public Iterable createLogDataIndices(final List logDataList) 22 | { 23 | return logDataRepository.saveAll(logDataList); 24 | } 25 | 26 | public List getAllLogDataForHost (String host) 27 | { 28 | return logDataRepository.findByHost(host); 29 | } 30 | 31 | public LogData findById (String id) 32 | { 33 | return logDataRepository.findById(id).get(); 34 | } 35 | 36 | public List findBySearchTerm (String term) 37 | { 38 | return logDataRepository.findByMessageContaining(term); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /elasticsearchdemo/src/main/java/com/betterjavacode/elasticsearchdemo/config/ElasticsearchClientConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.elasticsearchdemo.config; 2 | 3 | import org.elasticsearch.client.RestHighLevelClient; 4 | import org.springframework.context.annotation.Bean; 5 | import org.springframework.context.annotation.ComponentScan; 6 | import org.springframework.context.annotation.Configuration; 7 | import org.springframework.data.elasticsearch.client.ClientConfiguration; 8 | import org.springframework.data.elasticsearch.client.RestClients; 9 | import org.springframework.data.elasticsearch.config.AbstractElasticsearchConfiguration; 10 | import org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories; 11 | 12 | @Configuration 13 | @EnableElasticsearchRepositories(basePackages = "com.betterjavacode.elasticsearchdemo.repositories") 14 | @ComponentScan(basePackages = "com.betterjavacode.elasticsearchdemo") 15 | public class ElasticsearchClientConfiguration extends AbstractElasticsearchConfiguration 16 | { 17 | 18 | @Override 19 | @Bean 20 | public RestHighLevelClient elasticsearchClient () 21 | { 22 | final ClientConfiguration clientConfiguration = 23 | ClientConfiguration.builder().connectedTo("localhost:9200").build(); 24 | 25 | return RestClients.create(clientConfiguration).rest(); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /twofactorauthdemo/src/main/java/com/betterjavacode/twofactorauthdemo/context/AccountVerificationEmailContext.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.twofactorauthdemo.context; 2 | 3 | import com.betterjavacode.twofactorauthdemo.models.UserEntity; 4 | import org.springframework.web.util.UriComponentsBuilder; 5 | 6 | public class AccountVerificationEmailContext extends AbstractEmailContext 7 | { 8 | private String token; 9 | 10 | 11 | @Override 12 | public void init(T context){ 13 | //we can do any common configuration setup here 14 | // like setting up some base URL and context 15 | UserEntity customer = (UserEntity) context; // we pass the customer informati 16 | put("firstName", customer.getFirstName()); 17 | setTemplateLocation("emails/email-verification"); 18 | setSubject("Complete your registration"); 19 | setFrom("no-reply@javadevjournal.com"); 20 | setTo(customer.getEmail()); 21 | } 22 | 23 | public void setToken(String token) { 24 | this.token = token; 25 | put("token", token); 26 | } 27 | 28 | public void buildVerificationUrl(final String baseURL, final String token){ 29 | final String url= UriComponentsBuilder.fromHttpUrl(baseURL) 30 | .path("/register/verify").queryParam("token", token).toUriString(); 31 | put("verificationURL", url); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /pubsubdemo/consumerapp/index.js: -------------------------------------------------------------------------------- 1 | require('dotenv').config(); 2 | 3 | const { PubSub } = require(`@google-cloud/pubsub`); 4 | 5 | const pubsubClient = new PubSub(); 6 | const subscriptionName = 'consumeUserData'; 7 | const timeout = 60; 8 | const topicName = 'PubSubExample'; 9 | 10 | async function createSubscription() { 11 | // Creates a new subscription 12 | await pubsubClient.topic(topicName).createSubscription(subscriptionName); 13 | console.log(`Subscription ${subscriptionName} created.`); 14 | } 15 | 16 | async function doesSubscriptionExist() { 17 | const subscriptions = await pubsubClient.getSubscriptions(); 18 | const subscriptionExist = subscriptions.find((sub) => sub.name === subscriptionName); 19 | return (subscriptions && subscriptionExist); 20 | } 21 | 22 | if(!doesSubscriptionExist()) { 23 | createSubscription().catch(console.error); 24 | } 25 | 26 | const subscription = pubsubClient.subscription(subscriptionName); 27 | 28 | let messageCount = 0; 29 | 30 | const messageHandler = message => { 31 | console.log(`message received ${message.id}`); 32 | console.log(`Data: ${message.data}`); 33 | messageCount += 1; 34 | 35 | message.ack(); 36 | }; 37 | 38 | subscription.on(`message`, messageHandler); 39 | setTimeout(() => { 40 | subscription.removeListener('message', messageHandler); 41 | console.log(`${messageCount} message(s) received`); 42 | }, timeout * 1000); 43 | -------------------------------------------------------------------------------- /retrydemo/src/main/java/com/betterjavacode/retrydemo/RetrydemoApplication.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.retrydemo; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | import org.springframework.context.annotation.Bean; 6 | import org.springframework.data.jpa.repository.config.EnableJpaRepositories; 7 | import org.springframework.retry.annotation.EnableRetry; 8 | import org.springframework.retry.backoff.FixedBackOffPolicy; 9 | import org.springframework.retry.policy.SimpleRetryPolicy; 10 | import org.springframework.retry.support.RetryTemplate; 11 | 12 | 13 | @SpringBootApplication 14 | @EnableRetry 15 | @EnableJpaRepositories(basePackages = "com.betterjavacode.retrydemo.daos") 16 | public class RetrydemoApplication { 17 | 18 | public static void main(String[] args) { 19 | SpringApplication.run(RetrydemoApplication.class, args); 20 | } 21 | 22 | @Bean 23 | public RetryTemplate retryTemplate() 24 | { 25 | RetryTemplate retryTemplate = new RetryTemplate(); 26 | 27 | FixedBackOffPolicy backOffPolicy = new FixedBackOffPolicy(); 28 | backOffPolicy.setBackOffPeriod(100); 29 | 30 | SimpleRetryPolicy simpleRetryPolicy = new SimpleRetryPolicy(); 31 | simpleRetryPolicy.setMaxAttempts(2); 32 | 33 | retryTemplate.setRetryPolicy(simpleRetryPolicy); 34 | retryTemplate.setBackOffPolicy(backOffPolicy); 35 | return retryTemplate; 36 | } 37 | 38 | 39 | } 40 | -------------------------------------------------------------------------------- /dynamodbdemo/src/main/java/com/betterjavacode/dynamodbdemo/models/Company.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.dynamodbdemo.models; 2 | 3 | import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAttribute; 4 | import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAutoGeneratedKey; 5 | import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBHashKey; 6 | import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBTable; 7 | 8 | @DynamoDBTable(tableName = "Company") 9 | public class Company 10 | { 11 | private String companyId; 12 | 13 | private String name; 14 | 15 | private String type; 16 | 17 | @DynamoDBHashKey(attributeName = "CompanyId") 18 | @DynamoDBAutoGeneratedKey 19 | public String getCompanyId () 20 | { 21 | return companyId; 22 | } 23 | 24 | 25 | public void setCompanyId (String companyId) 26 | { 27 | this.companyId = companyId; 28 | } 29 | 30 | @DynamoDBAttribute(attributeName = "Name") 31 | public String getName () 32 | { 33 | return name; 34 | } 35 | 36 | public void setName (String name) 37 | { 38 | this.name = name; 39 | } 40 | 41 | @DynamoDBAttribute(attributeName = "Type") 42 | public String getType () 43 | { 44 | return type; 45 | } 46 | 47 | public void setType (String type) 48 | { 49 | this.type = type; 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /dynamodbdemo/src/main/java/com/betterjavacode/dynamodbdemo/controllers/CompanyController.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.dynamodbdemo.controllers; 2 | 3 | import com.betterjavacode.dynamodbdemo.models.Company; 4 | import com.betterjavacode.dynamodbdemo.services.CompanyService; 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.http.HttpStatus; 7 | import org.springframework.http.ResponseEntity; 8 | import org.springframework.web.bind.annotation.*; 9 | 10 | @RestController 11 | @RequestMapping("v1/betterjavacode/companies") 12 | public class CompanyController 13 | { 14 | @Autowired 15 | private CompanyService companyService; 16 | 17 | @GetMapping(value = "/{id}", produces = "application/json") 18 | public ResponseEntity getCompany(@PathVariable("id") String id) 19 | { 20 | 21 | Company company = companyService.getCompany(id); 22 | 23 | if(company == null) 24 | { 25 | return new ResponseEntity<>(HttpStatus.BAD_REQUEST); 26 | } 27 | else 28 | { 29 | return new ResponseEntity<>(company, HttpStatus.OK); 30 | } 31 | } 32 | 33 | @PostMapping() 34 | public Company createCompany(@RequestBody Company company) 35 | { 36 | Company companyCreated = companyService.createCompany(company); 37 | 38 | return company; 39 | } 40 | } 41 | 42 | 43 | -------------------------------------------------------------------------------- /pubsubdemo/index.js: -------------------------------------------------------------------------------- 1 | const { PubSub } = require('@google-cloud/pubsub'); 2 | require('dotenv').config(); 3 | 4 | const pubsubClient = new PubSub(); 5 | 6 | const data = JSON.stringify({ 7 | "userId": "50001", 8 | "companyId": "acme", 9 | "companyName": "Acme Company", 10 | "firstName": "John", 11 | "lastName": "Doe", 12 | "email": "john.doe@acme.com", 13 | "country": "US", 14 | "city": "Austin", 15 | "status": "Active", 16 | "effectiveDate": "11/11/2021", 17 | "department": "sales", 18 | "title": "Sales Lead" 19 | }); 20 | const topicName = "PubSubExample"; 21 | 22 | async function createTopic() { 23 | // Creates a new topic 24 | await pubsubClient.createTopic(topicName); 25 | console.log(`Topic ${topicName} created.`); 26 | } 27 | 28 | async function doesTopicExist() { 29 | const topics = await pubsubClient.getTopics(); 30 | const topicExists = topics.find((topic) => topic.name === topicName); 31 | return (topics && topicExists); 32 | } 33 | 34 | if(!doesTopicExist()) { 35 | createTopic(); 36 | } 37 | 38 | async function publishMessage() { 39 | const dataBuffer = Buffer.from(data); 40 | 41 | try { 42 | const messageId = await pubsubClient.topic(topicName).publish(dataBuffer); 43 | console.log(`Message ${messageId} published`); 44 | } catch(error) { 45 | console.error(`Received error while publishing: ${error.message}`); 46 | process.exitCode = 1; 47 | } 48 | } 49 | 50 | publishMessage(); 51 | -------------------------------------------------------------------------------- /twofactorauthdemo/src/main/java/com/betterjavacode/twofactorauthdemo/config/handlers/CustomAccessDeniedHandler.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.twofactorauthdemo.config.handlers; 2 | 3 | import org.slf4j.Logger; 4 | import org.slf4j.LoggerFactory; 5 | import org.springframework.security.access.AccessDeniedException; 6 | import org.springframework.security.core.Authentication; 7 | import org.springframework.security.core.context.SecurityContextHolder; 8 | import org.springframework.security.web.access.AccessDeniedHandler; 9 | 10 | import javax.servlet.ServletException; 11 | import javax.servlet.http.HttpServletRequest; 12 | import javax.servlet.http.HttpServletResponse; 13 | import java.io.IOException; 14 | 15 | public class CustomAccessDeniedHandler implements AccessDeniedHandler 16 | { 17 | private static final Logger LOG = LoggerFactory.getLogger(CustomAccessDeniedHandler.class); 18 | 19 | @Override 20 | public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException, ServletException 21 | { 22 | 23 | Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); 24 | if(authentication!=null){ 25 | 26 | LOG.info("User '" + authentication.getName() 27 | + "' attempted to access the URL: " 28 | + request.getRequestURI()); 29 | } 30 | response.sendRedirect(request.getContextPath()+ "/access-denied"); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /elasticsearchdemo/src/main/java/com/betterjavacode/elasticsearchdemo/controllers/LogDataController.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.elasticsearchdemo.controllers; 2 | 3 | import com.betterjavacode.elasticsearchdemo.models.LogData; 4 | import com.betterjavacode.elasticsearchdemo.services.LogDataService; 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.web.bind.annotation.*; 7 | 8 | import java.util.List; 9 | 10 | @RestController 11 | @RequestMapping("/v1/betterjavacode/logdata") 12 | public class LogDataController 13 | { 14 | @Autowired 15 | private LogDataService logDataService; 16 | 17 | @GetMapping 18 | public List searchLogDataByHost(@RequestParam("host") String host) 19 | { 20 | List logDataList = logDataService.getAllLogDataForHost(host); 21 | 22 | return logDataList; 23 | } 24 | 25 | @GetMapping("/search") 26 | public List searchLogDataByTerm(@RequestParam("term") String term) 27 | { 28 | return logDataService.findBySearchTerm(term); 29 | } 30 | 31 | @PostMapping 32 | public LogData addLogData(@RequestBody LogData logData) 33 | { 34 | 35 | return logDataService.createLogDataIndex(logData); 36 | } 37 | 38 | @PostMapping("/createInBulk") 39 | public List addLogDataInBulk(@RequestBody List logDataList) 40 | { 41 | return (List) logDataService.createLogDataIndices(logDataList); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /todolistkeycloaksaml/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'org.springframework.boot' version '2.2.7.RELEASE' 3 | id 'io.spring.dependency-management' version '1.0.9.RELEASE' 4 | id 'java' 5 | id 'war' 6 | } 7 | 8 | group = 'com.betterjavacode.sss' 9 | version = '0.0.1-SNAPSHOT' 10 | sourceCompatibility = '1.8' 11 | 12 | repositories { 13 | mavenCentral() 14 | } 15 | 16 | ext { 17 | set('keycloakVersion', '11.0.3') 18 | } 19 | 20 | dependencies { 21 | implementation 'org.springframework.boot:spring-boot-starter-data-jpa' 22 | implementation 'org.springframework.boot:spring-boot-starter-jdbc' 23 | implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' 24 | implementation 'org.springframework.boot:spring-boot-starter-web' 25 | /* 26 | * Spring Security 27 | */ 28 | implementation 'org.springframework.boot:spring-boot-starter-security' 29 | runtimeOnly 'mysql:mysql-connector-java' 30 | providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat' 31 | implementation 'org.springframework.security:spring-security-saml2-service-provider:5.3.5' + 32 | '.RELEASE' 33 | 34 | /* 35 | * Keycloak 36 | */ 37 | implementation 'org.keycloak:keycloak-spring-boot-starter:11.0.3' 38 | testImplementation('org.springframework.boot:spring-boot-starter-test') { 39 | exclude group: 'org.junit.vintage', module: 'junit-vintage-engine' 40 | } 41 | } 42 | 43 | dependencyManagement { 44 | imports { 45 | mavenBom "org.keycloak.bom:keycloak-adapter-bom:${keycloakVersion}" 46 | } 47 | } 48 | 49 | test { 50 | useJUnitPlatform() 51 | } 52 | -------------------------------------------------------------------------------- /twofactorauthdemo/src/main/java/com/betterjavacode/twofactorauthdemo/config/web/CustomWebAuthenticationDetails.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.twofactorauthdemo.config.web; 2 | 3 | import org.springframework.security.web.authentication.WebAuthenticationDetails; 4 | 5 | import javax.servlet.http.HttpServletRequest; 6 | import java.util.Objects; 7 | 8 | public class CustomWebAuthenticationDetails extends WebAuthenticationDetails 9 | { 10 | private String token; 11 | 12 | public CustomWebAuthenticationDetails (HttpServletRequest request) 13 | { 14 | super(request); 15 | this.token = request.getParameter("customToken"); 16 | } 17 | @Override 18 | public String toString() { 19 | return "CustomWebAuthenticationDetails{" + 20 | "token='" + token + '\'' + 21 | '}'; 22 | } 23 | 24 | @Override 25 | public boolean equals(Object o) { 26 | if (this == o) return true; 27 | if (o == null || getClass() != o.getClass()) return false; 28 | if (!super.equals(o)) return false; 29 | CustomWebAuthenticationDetails that = (CustomWebAuthenticationDetails) o; 30 | return Objects.equals(token, that.token); 31 | } 32 | 33 | @Override 34 | public int hashCode() { 35 | return Objects.hash(super.hashCode(), token); 36 | } 37 | 38 | public String getToken() { 39 | return token; 40 | } 41 | 42 | public void setToken(String token) { 43 | this.token = token; 44 | } 45 | 46 | } 47 | -------------------------------------------------------------------------------- /healthcheckdemo/src/user.service.ts: -------------------------------------------------------------------------------- 1 | 2 | import { Injectable } from '@nestjs/common'; 3 | import { PrismaService } from './prisma.service'; 4 | import { User, Prisma } from '@prisma/client'; 5 | 6 | @Injectable() 7 | export class UserService { 8 | constructor(private prisma: PrismaService) {} 9 | 10 | async user( 11 | userWhereUniqueInput: Prisma.UserWhereUniqueInput, 12 | ): Promise { 13 | return this.prisma.user.findUnique({ 14 | where: userWhereUniqueInput, 15 | }); 16 | } 17 | 18 | async users(params: { 19 | skip?: number; 20 | take?: number; 21 | cursor?: Prisma.UserWhereUniqueInput; 22 | where?: Prisma.UserWhereInput; 23 | orderBy?: Prisma.UserOrderByWithRelationInput; 24 | }): Promise { 25 | const { skip, take, cursor, where, orderBy } = params; 26 | return this.prisma.user.findMany({ 27 | skip, 28 | take, 29 | cursor, 30 | where, 31 | orderBy, 32 | }); 33 | } 34 | 35 | async createUser(data: Prisma.UserCreateInput): Promise { 36 | return this.prisma.user.create({ 37 | data, 38 | }); 39 | } 40 | 41 | async updateUser(params: { 42 | where: Prisma.UserWhereUniqueInput; 43 | data: Prisma.UserUpdateInput; 44 | }): Promise { 45 | const { where, data } = params; 46 | return this.prisma.user.update({ 47 | data, 48 | where, 49 | }); 50 | } 51 | 52 | async deleteUser(where: Prisma.UserWhereUniqueInput): Promise { 53 | return this.prisma.user.delete({ 54 | where, 55 | }); 56 | } 57 | } -------------------------------------------------------------------------------- /bullqueuedemo/src/app.module.ts: -------------------------------------------------------------------------------- 1 | 2 | import { Module } from '@nestjs/common'; 3 | import { ConfigModule, ConfigService } from '@nestjs/config'; 4 | import { AppController } from './app.controller'; 5 | import { BullBoardController } from './bull-board-controller'; 6 | import { FileUploadProcessor } from './file-upload.processor'; 7 | import { PrismaService } from './prisma.service'; 8 | import { UserService } from './user.service'; 9 | import { TransformFileProcessor } from './transform-file-processor'; 10 | import { SplitFileProcessor } from './split-file.processor'; 11 | import { MergeDataProcessor } from './merge-data.processor'; 12 | import { BullModule } from '@nestjs/bullmq'; 13 | 14 | @Module({ 15 | imports: [ 16 | BullModule.forRootAsync({ 17 | imports: [ConfigModule], 18 | useFactory: async (configService: ConfigService) => ({ 19 | connection: { 20 | host: configService.get('REDIS_HOST'), 21 | port: Number(configService.get('REDIS_PORT')), 22 | } 23 | }), 24 | inject: [ConfigService], 25 | }), 26 | BullModule.registerQueue({ 27 | name: 'file-upload-queue' 28 | }, 29 | { 30 | name: 'split-file-queue', 31 | }, 32 | { 33 | name: 'transform-file-queue', 34 | }, 35 | { 36 | name: 'merge-data-queue' 37 | }), 38 | BullModule.registerFlowProducer({ 39 | name: 'merge-all-files', 40 | }), 41 | ], 42 | controllers: [AppController, BullBoardController], 43 | providers: [UserService, PrismaService, FileUploadProcessor, TransformFileProcessor, SplitFileProcessor,MergeDataProcessor], 44 | }) 45 | export class AppModule {} 46 | -------------------------------------------------------------------------------- /dynamodbdemo/src/main/java/com/betterjavacode/dynamodbdemo/config/ApplicationConfig.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.dynamodbdemo.config; 2 | 3 | import com.amazonaws.auth.AWSCredentials; 4 | import com.amazonaws.auth.AWSCredentialsProvider; 5 | import com.amazonaws.auth.AWSStaticCredentialsProvider; 6 | import com.amazonaws.auth.BasicAWSCredentials; 7 | import com.amazonaws.regions.Regions; 8 | import com.amazonaws.services.dynamodbv2.AmazonDynamoDB; 9 | import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder; 10 | import org.socialsignin.spring.data.dynamodb.repository.config.EnableDynamoDBRepositories; 11 | import org.springframework.beans.factory.annotation.Value; 12 | import org.springframework.context.annotation.Bean; 13 | import org.springframework.context.annotation.Configuration; 14 | 15 | @Configuration 16 | @EnableDynamoDBRepositories(basePackages = "com.betterjavacode.dynamodbdemo.repositories") 17 | public class ApplicationConfig 18 | { 19 | @Value("${amazon.aws.accesskey}") 20 | private String amazonAccessKey; 21 | 22 | @Value("${amazon.aws.secretkey}") 23 | private String amazonSecretKey; 24 | 25 | public AWSCredentialsProvider awsCredentialsProvider() 26 | { 27 | return new AWSStaticCredentialsProvider(amazonAWSCredentials()); 28 | } 29 | 30 | @Bean 31 | public AWSCredentials amazonAWSCredentials() 32 | { 33 | return new BasicAWSCredentials(amazonAccessKey, amazonSecretKey); 34 | } 35 | 36 | @Bean 37 | public AmazonDynamoDB amazonDynamoDB() 38 | { 39 | return AmazonDynamoDBClientBuilder.standard().withCredentials(awsCredentialsProvider()).withRegion(Regions.US_EAST_1).build(); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /cognitodemo/src/main/java/com/betterjavacode/cognitodemo/config/CustomLogoutSuccessHandler.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.cognitodemo.config; 2 | 3 | import org.slf4j.Logger; 4 | import org.slf4j.LoggerFactory; 5 | import org.springframework.security.core.Authentication; 6 | import org.springframework.security.web.authentication.logout.LogoutSuccessHandler; 7 | import org.springframework.stereotype.Component; 8 | 9 | import javax.servlet.ServletException; 10 | import javax.servlet.http.HttpServletRequest; 11 | import javax.servlet.http.HttpServletResponse; 12 | import java.io.IOException; 13 | 14 | @Component 15 | public class CustomLogoutSuccessHandler implements LogoutSuccessHandler 16 | { 17 | public static final Logger LOGGER = LoggerFactory.getLogger(CustomLogoutSuccessHandler.class); 18 | 19 | @Override 20 | public void onLogoutSuccess (HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException 21 | { 22 | LOGGER.info("Enter >> onLogoutSuccess()"); 23 | if (authentication != null && authentication.getDetails() != null) 24 | { 25 | LOGGER.info("authentication info found."); 26 | try 27 | { 28 | request.getSession().invalidate(); 29 | } 30 | catch (Exception e) 31 | { 32 | LOGGER.debug("Exception during logout " + e.getStackTrace()); 33 | throw new RuntimeException("Could not logout due to " + e.getLocalizedMessage()); 34 | } 35 | } 36 | response.setStatus(HttpServletResponse.SC_OK); 37 | LOGGER.info("Exit << onLogoutSuccess()"); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /loggingdemo/src/main/resources/logback-spring.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | %black(%d{ISO8601}) %highlight(%-5level) [%blue(%t)] %yellow(%C{1.}): %msg%n%throwable 8 | 9 | 10 | 11 | 12 | ${LOGDIRECTORY}/microservice.log 13 | 15 | %d %p %C{1.} [%t] %m%n 16 | 17 | 18 | 20 | ${LOGDIRECTORY}/archived/microservice-%d{yyyy-MM-dd}.%i.log 21 | 22 | 24 | 5MB 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /todolistkeycloaksaml/src/main/java/com/betterjavacode/sss/todolist/security/CustomLogoutSuccessHandler.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.sss.todolist.security; 2 | 3 | import org.slf4j.Logger; 4 | import org.slf4j.LoggerFactory; 5 | import org.springframework.security.core.Authentication; 6 | import org.springframework.security.web.authentication.logout.LogoutSuccessHandler; 7 | import org.springframework.stereotype.Component; 8 | 9 | import javax.servlet.ServletException; 10 | import javax.servlet.http.HttpServletRequest; 11 | import javax.servlet.http.HttpServletResponse; 12 | import java.io.IOException; 13 | 14 | @Component 15 | public class CustomLogoutSuccessHandler implements LogoutSuccessHandler 16 | { 17 | public static final Logger LOGGER = LoggerFactory.getLogger(CustomLogoutSuccessHandler.class); 18 | 19 | @Override 20 | public void onLogoutSuccess (HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException 21 | { 22 | LOGGER.info("Enter >> onLogoutSuccess()"); 23 | if (authentication != null && authentication.getDetails() != null) 24 | { 25 | LOGGER.info("authentication info found."); 26 | try 27 | { 28 | request.getSession().invalidate(); 29 | } 30 | catch (Exception e) 31 | { 32 | LOGGER.debug("Exception during logout " + e.getStackTrace()); 33 | throw new RuntimeException("Could not logout due to " + e.getLocalizedMessage()); 34 | } 35 | } 36 | response.setStatus(HttpServletResponse.SC_OK); 37 | LOGGER.info("Exit << onLogoutSuccess()"); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /todolistkeycloaksaml/src/main/java/com/betterjavacode/sss/todolist/dtos/UserDto.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.sss.todolist.dtos; 2 | 3 | import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 4 | 5 | @JsonIgnoreProperties(ignoreUnknown = true) 6 | public class UserDto 7 | { 8 | private String email; 9 | private String firstName; 10 | private String lastName; 11 | private String password; 12 | private String role; 13 | private boolean enabled; 14 | 15 | public UserDto() 16 | { 17 | 18 | } 19 | 20 | public String getEmail () 21 | { 22 | return email; 23 | } 24 | 25 | public void setEmail (String email) 26 | { 27 | this.email = email; 28 | } 29 | 30 | public String getFirstName () 31 | { 32 | return firstName; 33 | } 34 | 35 | public void setFirstName (String firstName) 36 | { 37 | this.firstName = firstName; 38 | } 39 | 40 | public String getLastName () 41 | { 42 | return lastName; 43 | } 44 | 45 | public void setLastName (String lastName) 46 | { 47 | this.lastName = lastName; 48 | } 49 | 50 | public String getPassword () 51 | { 52 | return password; 53 | } 54 | 55 | public void setPassword (String password) 56 | { 57 | this.password = password; 58 | } 59 | 60 | public String getRole () 61 | { 62 | return role; 63 | } 64 | 65 | public void setRole (String role) 66 | { 67 | this.role = role; 68 | } 69 | 70 | public boolean isEnabled () 71 | { 72 | return enabled; 73 | } 74 | 75 | public void setEnabled (boolean enabled) 76 | { 77 | this.enabled = enabled; 78 | } 79 | } 80 | -------------------------------------------------------------------------------- /scale-bull-demo/scale-bull-jobs-app/src/app.module.ts: -------------------------------------------------------------------------------- 1 | import { Module } from '@nestjs/common'; 2 | import { AppController } from './app.controller'; 3 | import { AppService } from './app.service'; 4 | import { BullModule } from '@nestjs/bull'; 5 | import { ConfigModule, ConfigService } from '@nestjs/config'; 6 | import { BullBoardModule } from '@bull-board/nestjs'; 7 | import { ExpressAdapter } from '@bull-board/express'; 8 | import { BullAdapter } from '@bull-board/api/bullAdapter'; 9 | import { FileUploadModule } from './file-upload/file-upload.module'; 10 | import { FileDataModule } from './file-read/file-data.module'; 11 | 12 | 13 | @Module({ 14 | imports: [ 15 | ConfigModule.forRoot({ 16 | isGlobal: true, 17 | }), 18 | BullModule.forRootAsync({ 19 | imports: [ConfigModule], 20 | useFactory: async (configService: ConfigService) => ({ 21 | redis: { 22 | host: process.env.REDIS_HOST || configService.get('REDIS_HOST'), 23 | port: Number(process.env.REDIS_PORT || configService.get('REDIS_PORT')), 24 | }, 25 | }), 26 | inject: [ConfigService] 27 | }), 28 | BullModule.registerQueue({ 29 | name: 'file-upload-queue' 30 | }), 31 | BullModule.registerQueue({ 32 | name: 'file-data-queue' 33 | }), 34 | BullBoardModule.forRoot({ 35 | route: '/v1/queues', 36 | adapter: ExpressAdapter // Or FastifyAdapter from `@bull-board/fastify` 37 | }), 38 | BullBoardModule.forFeature({ 39 | name: 'file-upload-queue', 40 | adapter: BullAdapter 41 | }), 42 | BullBoardModule.forFeature({ 43 | name: 'file-data-queue', 44 | adapter: BullAdapter 45 | }), 46 | FileUploadModule, 47 | FileDataModule, 48 | ], 49 | controllers: [AppController], 50 | providers: [AppService], 51 | }) 52 | export class AppModule {} 53 | -------------------------------------------------------------------------------- /nestjspassportdemo/ui/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 12 | 13 | 17 | 18 | 27 | React App 28 | 29 | 30 | 31 |
32 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /retrydemo/src/main/java/com/betterjavacode/retrydemo/models/Company.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.retrydemo.models; 2 | 3 | import javax.persistence.*; 4 | import java.io.Serializable; 5 | 6 | @Entity(name = "Company") 7 | @Table(name = "company") 8 | public class Company implements Serializable 9 | { 10 | public Company() 11 | { 12 | 13 | } 14 | 15 | 16 | @Id 17 | @GeneratedValue(strategy = GenerationType.IDENTITY) 18 | @Column(name = "id", nullable = false) 19 | private long id; 20 | 21 | @Column 22 | private String name; 23 | 24 | @Column 25 | private String type; 26 | 27 | @Column 28 | private String city; 29 | 30 | @Column 31 | private String state; 32 | 33 | @Column 34 | private String description; 35 | 36 | public long getId () 37 | { 38 | return id; 39 | } 40 | 41 | public void setId (long id) 42 | { 43 | this.id = id; 44 | } 45 | 46 | public String getName () 47 | { 48 | return name; 49 | } 50 | 51 | public void setName (String name) 52 | { 53 | this.name = name; 54 | } 55 | 56 | public String getType () 57 | { 58 | return type; 59 | } 60 | 61 | public void setType (String type) 62 | { 63 | this.type = type; 64 | } 65 | 66 | public String getCity () 67 | { 68 | return city; 69 | } 70 | 71 | public void setCity (String city) 72 | { 73 | this.city = city; 74 | } 75 | 76 | public String getState () 77 | { 78 | return state; 79 | } 80 | 81 | public void setState (String state) 82 | { 83 | this.state = state; 84 | } 85 | 86 | public String getDescription () 87 | { 88 | return description; 89 | } 90 | 91 | public void setDescription (String description) 92 | { 93 | this.description = description; 94 | } 95 | } 96 | -------------------------------------------------------------------------------- /retrydemo/src/main/java/com/betterjavacode/retrydemo/controllers/CompanyController.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.retrydemo.controllers; 2 | 3 | import com.betterjavacode.retrydemo.dtos.CompanyDto; 4 | import com.betterjavacode.retrydemo.service.CompanyService; 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.http.HttpStatus; 7 | import org.springframework.http.ResponseEntity; 8 | import org.springframework.web.bind.annotation.*; 9 | 10 | import java.util.List; 11 | 12 | @RestController 13 | @RequestMapping("/v1/betterjavacode/companies") 14 | public class CompanyController 15 | { 16 | @Autowired 17 | CompanyService companyService; 18 | 19 | @GetMapping 20 | public ResponseEntity> getAllCompanies() 21 | { 22 | List companyDtos = companyService.getAllCompanies(); 23 | 24 | if(companyDtos.isEmpty()) 25 | { 26 | return new ResponseEntity<>(HttpStatus.NO_CONTENT); 27 | } 28 | 29 | return new ResponseEntity<>(companyDtos, HttpStatus.OK); 30 | } 31 | 32 | @GetMapping("/{id}") 33 | public ResponseEntity getCompanyById(@PathVariable("id") long id) 34 | { 35 | CompanyDto companyDto = companyService.getCompany(id); 36 | if(companyDto == null) 37 | { 38 | return new ResponseEntity<>(HttpStatus.NO_CONTENT); 39 | } 40 | return new ResponseEntity<>(companyDto, HttpStatus.OK); 41 | } 42 | 43 | @GetMapping("/") 44 | public ResponseEntity> searchCompanies(@RequestParam("name") String companyName) 45 | { 46 | List companyDtos = companyService.searchCompanyByName(companyName); 47 | if(companyDtos.isEmpty()) 48 | { 49 | return new ResponseEntity<>(HttpStatus.NO_CONTENT); 50 | } 51 | 52 | return new ResponseEntity<>(companyDtos, HttpStatus.OK); 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /twofactorauthdemo/src/main/java/com/betterjavacode/twofactorauthdemo/managers/impl/MfaTokenManagerImpl.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.twofactorauthdemo.managers.impl; 2 | 3 | import com.betterjavacode.twofactorauthdemo.managers.MfaTokenManager; 4 | import dev.samstevens.totp.code.CodeVerifier; 5 | import dev.samstevens.totp.code.HashingAlgorithm; 6 | import dev.samstevens.totp.exceptions.QrGenerationException; 7 | import dev.samstevens.totp.qr.QrData; 8 | import dev.samstevens.totp.qr.QrGenerator; 9 | import dev.samstevens.totp.secret.SecretGenerator; 10 | import dev.samstevens.totp.util.Utils; 11 | import org.springframework.beans.factory.annotation.Autowired; 12 | import org.springframework.stereotype.Service; 13 | 14 | @Service("mfaTokenManager") 15 | public class MfaTokenManagerImpl implements MfaTokenManager 16 | { 17 | @Autowired 18 | private SecretGenerator secretGenerator; 19 | 20 | @Autowired 21 | private QrGenerator qrGenerator; 22 | 23 | @Autowired 24 | private CodeVerifier codeVerifier; 25 | 26 | @Override 27 | public String generateSecretKey () 28 | { 29 | return secretGenerator.generate(); 30 | } 31 | 32 | @Override 33 | public String getQRCode (String secret) throws QrGenerationException 34 | { 35 | QrData data = new QrData.Builder().label("MFA") 36 | .secret(secret) 37 | .issuer("Two Factor Authentication Demo") 38 | .algorithm(HashingAlgorithm.SHA256) 39 | .digits(6) 40 | .period(30) 41 | .build(); 42 | return Utils.getDataUriForImage( 43 | qrGenerator.generate(data), 44 | qrGenerator.getImageMimeType() 45 | ); 46 | } 47 | 48 | @Override 49 | public boolean verifyTotp (String code, String secret) 50 | { 51 | return codeVerifier.isValidCode(secret, code); 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /twofactorauthdemo/src/main/java/com/betterjavacode/twofactorauthdemo/models/SecureToken.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.twofactorauthdemo.models; 2 | 3 | import org.hibernate.annotations.CreationTimestamp; 4 | 5 | import javax.persistence.*; 6 | import java.security.Timestamp; 7 | import java.time.LocalDateTime; 8 | 9 | @Entity 10 | @Table(name = "secureTokens") 11 | public class SecureToken 12 | { 13 | @Id 14 | @GeneratedValue(strategy = GenerationType.IDENTITY) 15 | private Long id; 16 | 17 | @Column(unique = true) 18 | private String token; 19 | 20 | @Column(updatable = false) 21 | private Timestamp timeStamp; 22 | 23 | @Column(updatable = false) 24 | @Basic(optional = false) 25 | private LocalDateTime expireAt; 26 | 27 | @ManyToOne 28 | @JoinColumn(name = "user_id", referencedColumnName ="id") 29 | private UserEntity user; 30 | 31 | @Transient 32 | private boolean isExpired; 33 | 34 | public SecureToken () 35 | { 36 | } 37 | 38 | 39 | public String getToken() { 40 | return token; 41 | } 42 | 43 | public void setToken(String token) { 44 | this.token = token; 45 | } 46 | 47 | public Long getId() { 48 | return id; 49 | } 50 | 51 | public LocalDateTime getExpireAt() { 52 | return expireAt; 53 | } 54 | 55 | public void setExpireAt(LocalDateTime expireAt) { 56 | this.expireAt = expireAt; 57 | } 58 | 59 | public Timestamp getTimeStamp() { 60 | return timeStamp; 61 | } 62 | 63 | public boolean isExpired() { 64 | 65 | return getExpireAt().isBefore(LocalDateTime.now()); // this is generic implementation, you can always make it timezone specific 66 | } 67 | 68 | public UserEntity getUser() { 69 | return user; 70 | } 71 | 72 | public void setUser(UserEntity user) { 73 | this.user = user; 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /modelmapperdemo/src/main/java/com/betterjavacode/modelmapperdemo/models/Order.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.modelmapperdemo.models; 2 | 3 | import javax.persistence.*; 4 | import java.io.Serializable; 5 | 6 | @Entity(name = "Order") 7 | @Table(name = "orders") 8 | public class Order implements Serializable 9 | { 10 | private static final long serialVersionUID = 7385741327704693623L; 11 | 12 | public Order() 13 | { 14 | 15 | } 16 | 17 | @Id 18 | @GeneratedValue(strategy = GenerationType.IDENTITY) 19 | @Column(name = "id", nullable = false) 20 | private long id; 21 | 22 | @Column(name ="order_item") 23 | private String orderItem; 24 | 25 | @Column(name = "description") 26 | private String description; 27 | 28 | 29 | @ManyToOne 30 | @JoinColumn(name = "customer_id") 31 | private Customer customer; 32 | 33 | 34 | @ManyToOne 35 | @JoinColumn(name = "address_id") 36 | private Address address; 37 | 38 | public long getId () 39 | { 40 | return id; 41 | } 42 | 43 | public void setId (long id) 44 | { 45 | this.id = id; 46 | } 47 | 48 | public String getOrderItem () 49 | { 50 | return orderItem; 51 | } 52 | 53 | public void setOrderItem (String orderItem) 54 | { 55 | this.orderItem = orderItem; 56 | } 57 | 58 | public String getDescription () 59 | { 60 | return description; 61 | } 62 | 63 | public void setDescription (String description) 64 | { 65 | this.description = description; 66 | } 67 | 68 | public Customer getCustomer () 69 | { 70 | return customer; 71 | } 72 | 73 | public void setCustomer (Customer customer) 74 | { 75 | this.customer = customer; 76 | } 77 | 78 | public Address getAddress () 79 | { 80 | return address; 81 | } 82 | 83 | public void setAddress (Address address) 84 | { 85 | this.address = address; 86 | } 87 | } 88 | -------------------------------------------------------------------------------- /modelmapperdemo/src/main/java/com/betterjavacode/modelmapperdemo/models/Customer.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.modelmapperdemo.models; 2 | 3 | import javax.persistence.*; 4 | import java.io.Serializable; 5 | import java.util.ArrayList; 6 | import java.util.List; 7 | 8 | @Entity(name = "Customer") 9 | @Table(name = "customer") 10 | public class Customer implements Serializable 11 | { 12 | private static final long serialVersionUID = -2205735699915701334L; 13 | 14 | public Customer() 15 | { 16 | 17 | } 18 | 19 | @Id 20 | @GeneratedValue(strategy = GenerationType.IDENTITY) 21 | @Column(name = "id", nullable = false) 22 | private long id; 23 | 24 | @Column(name = "first_name") 25 | private String firstName; 26 | 27 | @Column(name = "last_name") 28 | private String lastName; 29 | 30 | @Column 31 | private String email; 32 | 33 | @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) 34 | private List orderList = new ArrayList<>(); 35 | 36 | public List getOrderList () 37 | { 38 | return orderList; 39 | } 40 | 41 | public void setOrderList (List orderList) 42 | { 43 | this.orderList = orderList; 44 | } 45 | 46 | public long getId () 47 | { 48 | return id; 49 | } 50 | 51 | public void setId (long id) 52 | { 53 | this.id = id; 54 | } 55 | 56 | public String getFirstName () 57 | { 58 | return firstName; 59 | } 60 | 61 | public void setFirstName (String firstName) 62 | { 63 | this.firstName = firstName; 64 | } 65 | 66 | public String getLastName () 67 | { 68 | return lastName; 69 | } 70 | 71 | public void setLastName (String lastName) 72 | { 73 | this.lastName = lastName; 74 | } 75 | 76 | public String getEmail () 77 | { 78 | return email; 79 | } 80 | 81 | public void setEmail (String email) 82 | { 83 | this.email = email; 84 | } 85 | } 86 | -------------------------------------------------------------------------------- /retrydemo/src/main/java/com/betterjavacode/retrydemo/dtos/CompanyDto.java: -------------------------------------------------------------------------------- 1 | package com.betterjavacode.retrydemo.dtos; 2 | 3 | import com.betterjavacode.retrydemo.models.Company; 4 | 5 | public class CompanyDto 6 | { 7 | private String name; 8 | private String type; 9 | private String city; 10 | private String state; 11 | private String description; 12 | 13 | public CompanyDto(String name, String type, String city, String state, String description) 14 | { 15 | this.name = name; 16 | this.type = type; 17 | this.city = city; 18 | this.state = state; 19 | this.description = description; 20 | } 21 | 22 | public Company convertToCompany(CompanyDto companyDto) 23 | { 24 | Company company = new Company(); 25 | company.setName(companyDto.name); 26 | company.setType(companyDto.type); 27 | company.setCity(companyDto.city); 28 | company.setState(companyDto.state); 29 | company.setDescription(companyDto.description); 30 | 31 | return company; 32 | } 33 | 34 | public String getName () 35 | { 36 | return name; 37 | } 38 | 39 | public void setName (String name) 40 | { 41 | this.name = name; 42 | } 43 | 44 | public String getType () 45 | { 46 | return type; 47 | } 48 | 49 | public void setType (String type) 50 | { 51 | this.type = type; 52 | } 53 | 54 | public String getCity () 55 | { 56 | return city; 57 | } 58 | 59 | public void setCity (String city) 60 | { 61 | this.city = city; 62 | } 63 | 64 | public String getState () 65 | { 66 | return state; 67 | } 68 | 69 | public void setState (String state) 70 | { 71 | this.state = state; 72 | } 73 | 74 | public String getDescription () 75 | { 76 | return description; 77 | } 78 | 79 | public void setDescription (String description) 80 | { 81 | this.description = description; 82 | } 83 | } 84 | --------------------------------------------------------------------------------