├── .github ├── ISSUE_TEMPLATE │ ├── бъг.md │ ├── желание-или-идея.md │ └── проблем-с-проект.md └── workflows │ └── thanks.yaml ├── README.md ├── aop ├── .gitignore ├── build.gradle ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── settings.gradle └── src │ ├── main │ ├── java │ │ └── bg │ │ │ └── softuni │ │ │ └── aop │ │ │ ├── AopApplication.java │ │ │ ├── IncredibleMachine.java │ │ │ └── example │ │ │ ├── Example1Aspect.java │ │ │ └── Example1Demo.java │ └── resources │ │ └── application.properties │ └── test │ └── java │ └── bg │ └── softuni │ └── aop │ └── AopApplicationTests.java ├── di-ioc ├── .gitignore ├── README.md ├── build.gradle ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── settings.gradle └── src │ └── main │ ├── java │ └── bg │ │ └── softuni │ │ ├── Main.java │ │ └── student │ │ ├── StudentService.java │ │ ├── StudentServiceImpl.java │ │ ├── config │ │ └── AppConfig.java │ │ ├── model │ │ └── Student.java │ │ ├── repository │ │ ├── CompountStudentRepository.java │ │ ├── FileStudentRepository.java │ │ ├── InMemoryStudentRepository.java │ │ └── StudentRepository.java │ │ └── scopes │ │ ├── Counter.java │ │ ├── CounterService.java │ │ └── CounterServiceImpl.java │ └── resources │ ├── beans-unused.xml.txt │ └── students.csv ├── events-scheduling-caches ├── .gitignore ├── build.gradle ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── settings.gradle └── src │ ├── main │ ├── java │ │ └── bg │ │ │ └── softuni │ │ │ └── events_scheduling_caches │ │ │ ├── EventsSchedulingCachesApplication.java │ │ │ ├── cache │ │ │ ├── StudentDTO.java │ │ │ ├── StudentService.java │ │ │ └── StudentsController.java │ │ │ ├── events │ │ │ ├── EventConfig.java │ │ │ ├── EventController.java │ │ │ ├── EventService.java │ │ │ ├── HelloWorldEvent.java │ │ │ └── HelloWorldEventListener.java │ │ │ └── scheduling │ │ │ ├── CronScheduler.java │ │ │ ├── FixRateScheduler.java │ │ │ └── FixedDelayScheduler.java │ └── resources │ │ └── application.properties │ └── test │ └── java │ └── bg │ └── softuni │ └── events_scheduling_caches │ └── EventsSchedulingCachesApplicationTests.java ├── hateoas ├── .gitignore ├── build.gradle ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── settings.gradle └── src │ ├── main │ ├── java │ │ └── bg │ │ │ └── softuni │ │ │ └── hateoas │ │ │ ├── HateoasApplication.java │ │ │ ├── dto │ │ │ ├── OrderDTO.java │ │ │ └── StudentDTO.java │ │ │ ├── entity │ │ │ ├── CourseEntity.java │ │ │ ├── OrderEntity.java │ │ │ └── StudentEntity.java │ │ │ ├── repository │ │ │ └── StudentRepository.java │ │ │ ├── service │ │ │ └── StudentService.java │ │ │ └── web │ │ │ └── StudentController.java │ └── resources │ │ ├── application.yaml │ │ └── data.sql │ └── test │ └── java │ └── bg │ └── softuni │ └── hateoas │ └── HateoasApplicationTests.java ├── interview-questions ├── 01-spring-mvc.md ├── 02-thymeleaf.md ├── 03-state.md ├── 04-scheduler-events-cache.md ├── 05-rest-api.md ├── 06-spring-security.md ├── 07-error-handling.md ├── 08-unit-tests.md ├── 09-integration-tests.md ├── 10-aop.md └── 11-docker.md ├── kafka-consumer ├── .gitignore ├── build.gradle ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── settings.gradle └── src │ ├── main │ ├── java │ │ └── bg │ │ │ └── softuni │ │ │ ├── kafka │ │ │ └── consumer │ │ │ │ ├── ExRatesConsumer.java │ │ │ │ └── KafkaConsumerApplication.java │ │ │ └── mobilele │ │ │ └── model │ │ │ └── dto │ │ │ └── ExRateDTO.java │ └── resources │ │ └── application.yaml │ └── test │ └── java │ └── bg │ └── softuni │ └── kafka │ └── consumer │ └── KafkaConsumerApplicationTests.java ├── local-docker ├── docker-compose.yaml └── prometheus.yaml ├── mobilele-offers ├── .gitignore ├── build.gradle ├── docker │ └── Dockerfile ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── settings.gradle └── src │ ├── main │ ├── java │ │ └── bg │ │ │ └── softuni │ │ │ └── mobilele │ │ │ └── offers │ │ │ ├── MobileleOffersApplication.java │ │ │ ├── config │ │ │ └── OpenAPIConfig.java │ │ │ ├── model │ │ │ ├── dto │ │ │ │ ├── AddOfferDTO.java │ │ │ │ └── OfferDTO.java │ │ │ ├── entity │ │ │ │ └── OfferEntity.java │ │ │ └── enums │ │ │ │ └── EngineTypeEnum.java │ │ │ ├── repository │ │ │ └── OfferRepository.java │ │ │ ├── security │ │ │ ├── JwtAuthenticationFilter.java │ │ │ └── SecurityConfig.java │ │ │ ├── service │ │ │ ├── JwtService.java │ │ │ ├── MonitoringService.java │ │ │ ├── OfferService.java │ │ │ ├── RetentionScheduler.java │ │ │ ├── exception │ │ │ │ └── ObjectNotFoundException.java │ │ │ └── impl │ │ │ │ ├── JwtServiceImpl.java │ │ │ │ ├── MonitoringServiceImpl.java │ │ │ │ └── OfferServiceImpl.java │ │ │ └── web │ │ │ └── OfferController.java │ └── resources │ │ └── application.yaml │ └── test │ ├── java │ └── bg │ │ └── softuni │ │ └── mobilele │ │ └── offers │ │ ├── MobileleOffersApplicationTests.java │ │ └── web │ │ └── OfferControllerIT.java │ ├── requests.http │ └── resources │ ├── application.yaml │ └── sample-create-offer.json ├── mobilele ├── .gitignore ├── build.gradle ├── docker │ ├── Dockerfile │ └── docker-compose.yaml ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── settings.gradle └── src │ ├── main │ ├── java │ │ └── bg │ │ │ └── softuni │ │ │ └── mobilele │ │ │ ├── MobileleApplication.java │ │ │ ├── config │ │ │ ├── AppConfig.java │ │ │ ├── ForexApiConfig.java │ │ │ ├── I18NConfig.java │ │ │ ├── KafkaConfig.java │ │ │ ├── OfferApiConfig.java │ │ │ ├── RestConfig.java │ │ │ ├── SecurityConfig.java │ │ │ └── WebConfig.java │ │ │ ├── init │ │ │ ├── ExRatesPublisher.java │ │ │ └── ExchangeRateInitializer.java │ │ │ ├── model │ │ │ ├── dto │ │ │ │ ├── AddOfferDTO.java │ │ │ │ ├── ConversionResultDTO.java │ │ │ │ ├── ExRateDTO.java │ │ │ │ ├── ExRatesDTO.java │ │ │ │ ├── OfferDetailsDTO.java │ │ │ │ ├── OfferSummaryDTO.java │ │ │ │ ├── UserLoginDTO.java │ │ │ │ └── UserRegistrationDTO.java │ │ │ ├── entity │ │ │ │ ├── BaseEntity.java │ │ │ │ ├── ExRateEntity.java │ │ │ │ ├── OfferEntity.java │ │ │ │ ├── UUIDSequence.java │ │ │ │ ├── UUIDSequenceGenerator.java │ │ │ │ ├── UserEntity.java │ │ │ │ └── UserRoleEntity.java │ │ │ ├── enums │ │ │ │ ├── EngineTypeEnum.java │ │ │ │ └── UserRoleEnum.java │ │ │ └── user │ │ │ │ └── MobileleUserDetails.java │ │ │ ├── repository │ │ │ ├── ExRateRepository.java │ │ │ ├── OfferRepository.java │ │ │ ├── UserRepository.java │ │ │ └── UserRoleRepository.java │ │ │ ├── service │ │ │ ├── ExRateService.java │ │ │ ├── JwtService.java │ │ │ ├── KafkaPublicationService.java │ │ │ ├── OfferService.java │ │ │ ├── UserService.java │ │ │ ├── exception │ │ │ │ ├── ApiObjectNotFoundException.java │ │ │ │ └── ObjectNotFoundException.java │ │ │ └── impl │ │ │ │ ├── ExRateServiceImpl.java │ │ │ │ ├── JwtServiceImpl.java │ │ │ │ ├── KafkaPublicationServiceImpl.java │ │ │ │ ├── MobileleUserDetailsService.java │ │ │ │ ├── OfferServiceImpl.java │ │ │ │ └── UserServiceImpl.java │ │ │ └── web │ │ │ ├── CurrencyController.java │ │ │ ├── GlobalExceptionHandler.java │ │ │ ├── HomeController.java │ │ │ ├── LoginController.java │ │ │ ├── OfferController.java │ │ │ ├── OffersController.java │ │ │ ├── RegistrationController.java │ │ │ └── aop │ │ │ ├── MonitoringAspect.java │ │ │ ├── Pointcuts.java │ │ │ └── WarnIfExecutionExceeds.java │ └── resources │ │ ├── application.yaml │ │ ├── data.sql │ │ ├── i18n │ │ ├── messages_bg.properties │ │ └── messages_en.properties │ │ ├── static │ │ ├── css │ │ │ ├── bootstrap.min.css │ │ │ ├── main.css │ │ │ └── reset-css.css │ │ ├── favicon.ico │ │ ├── images │ │ │ ├── 1.jpg │ │ │ ├── car-dealership-car-car-showroom.jpg │ │ │ ├── car.png │ │ │ └── user-avatar.svg │ │ └── js │ │ │ ├── bootstrap.min.js │ │ │ ├── currency.js │ │ │ └── jquery-3.5.1.slim.min.js │ │ └── templates │ │ ├── auth-login.html │ │ ├── auth-register.html │ │ ├── brands.html │ │ ├── details.html │ │ ├── fragments │ │ └── navbar.html │ │ ├── index.html │ │ ├── object-not-found.html │ │ ├── offer-add.html │ │ ├── offer-not-found.html │ │ ├── offers.html │ │ └── update.html │ └── test │ ├── java │ └── bg │ │ └── softuni │ │ └── mobilele │ │ ├── MobileleApplicationTests.java │ │ ├── service │ │ └── impl │ │ │ ├── ExRateServiceImplIT.java │ │ │ ├── ExRateServiceImplTest.java │ │ │ ├── MobileleUserDetailsServiceTest.java │ │ │ └── UserServiceImplTest.java │ │ └── web │ │ ├── CurrencyControllerIT.java │ │ └── RegistrationControllerIT.java │ └── resources │ ├── application.yaml │ └── currency-api.http ├── proxies ├── .gitignore ├── .idea │ └── misc.xml ├── build.gradle ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── settings.gradle └── src │ └── main │ └── java │ └── org │ └── example │ ├── Main.java │ └── proxydemo │ ├── Cacheable.java │ ├── CacheableInvocationHandler.java │ ├── StudentDTO.java │ ├── StudentService.java │ └── StudentServiceImpl.java ├── state ├── .gitignore ├── build.gradle ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── settings.gradle └── src │ ├── main │ ├── java │ │ └── bg │ │ │ └── softuni │ │ │ └── state │ │ │ ├── StateApplication.java │ │ │ └── web │ │ │ ├── CookieController.java │ │ │ └── SessionController.java │ └── resources │ │ ├── application.properties │ │ └── templates │ │ ├── cookies.html │ │ └── session.html │ └── test │ └── java │ └── bg │ └── softuni │ └── state │ └── StateApplicationTests.java ├── thymeleaf-pure ├── .gitignore ├── .idea │ └── .gitignore ├── build.gradle ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── settings.gradle └── src │ └── main │ ├── java │ └── org │ │ └── example │ │ └── Main.java │ └── resources │ └── test.html └── virt-threads-demo ├── api ├── .gitignore ├── build.gradle ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── settings.gradle └── src │ ├── main │ ├── java │ │ └── eu │ │ │ └── balev │ │ │ └── virtual │ │ │ └── api │ │ │ ├── ApiApplication.java │ │ │ └── web │ │ │ └── RandomController.java │ └── resources │ │ └── application.yaml │ └── test │ └── java │ └── eu │ └── balev │ └── virtual │ └── api │ └── ApiApplicationTests.java └── server ├── .gitignore ├── build.gradle ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── settings.gradle └── src ├── main ├── java │ └── eu │ │ └── balev │ │ └── virtual │ │ └── server │ │ ├── ServerApplication.java │ │ ├── config │ │ └── RestConfig.java │ │ └── web │ │ └── RandomController.java └── resources │ └── application.yaml └── test └── java └── eu └── balev └── virtual └── server └── ServerApplicationTests.java /.github/ISSUE_TEMPLATE/бъг.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Бъг 3 | about: Съобщете за бъг в нашите проекти 4 | title: '' 5 | labels: bug 6 | assignees: luchob 7 | 8 | --- 9 | 10 | 11 | 12 | **Опишете грешката** 13 | 14 | Опишете къде сме допуснали грешка. Линк към [кода](https://github.com/) е желателен. 15 | Какво очаквате да се случи, и какво се случва реално. 16 | 17 | **Стъпки за да се репродуцира** 18 | 19 | Ако описанието е недостатъчно, моля добавете тук. 20 | 21 | **Допълнителен контекст** 22 | Всякаква полезна информация - например OS, браузър и т.н. 23 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/желание-или-идея.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Желание или идея 3 | about: Предложете нещо свежо за нашия курс. 4 | title: '' 5 | labels: suggestion 6 | assignees: luchob 7 | 8 | --- 9 | 10 | _Попълнете отделните секции отдолу и изтрийте упътванията._ 11 | 12 | Опишете накратко какво бихте искали да видите или да чуете в нашия курс. 13 | Не обещаваме, че това ще се случи. Но все пак значителна част от желанията са се сбъдвали. -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/проблем-с-проект.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: "Проблем с проект" 3 | about: Моля, използвайте този template при въпроси за вашите проекти. 4 | title: '' 5 | labels: project-help 6 | assignees: luchob 7 | 8 | --- 9 | 10 | _Попълнете отделните секции отдолу и изтрийте упътванията._ 11 | 12 | *Връзка към проекта:* 13 | 14 | _Поставете [връзка](https://github.com/) към проекта си по подобен начин._ 15 | 16 | *Кратко описание:* 17 | 18 | Възможно най-накратко опишете: 19 | 20 | 1. Какво очаквате да се случи 21 | 2. Какво всъщност се случва 22 | 3. (Желателно) Какво опитахте 23 | 24 | *Стъпки за репродуциране:* 25 | 26 | Опишете възможно най-лесните стъпки, с помощта на които бързо може да се репродуцира проблемът. 27 | -------------------------------------------------------------------------------- /.github/workflows/thanks.yaml: -------------------------------------------------------------------------------- 1 | on: 2 | issues: 3 | types: [opened] 4 | 5 | jobs: 6 | thanks: 7 | runs-on: ubuntu-latest 8 | steps: 9 | - uses: EddieHubCommunity/gh-action-community/src/welcome@main 10 | with: 11 | github-token: ${{ secrets.ISSUES_TOKEN }} 12 | issue-message: '