Copy disabled (too large)
Download .txt
Showing preview only (26,782K chars total). Download the full file to get everything.
Repository: darbyluv2code/fullstack-react-and-springboot
Branch: main
Commit: ddff2d7f4c3b
Files: 438
Total size: 25.4 MB
Directory structure:
gitextract_cqg26ger/
├── .gitattributes
├── .gitignore
├── LICENSE
├── README.md
├── auth0-security/
│ ├── README.md
│ └── fullstack-library-app-auth0/
│ ├── 01-starter-files/
│ │ ├── App.css/
│ │ │ └── App.css
│ │ ├── Scripts/
│ │ │ ├── Payment Script/
│ │ │ │ └── Payment Script.sql
│ │ │ ├── React-SpringBoot-Add-Books-Script-2.sql
│ │ │ ├── React-SpringBoot-Add-Books-Script-3.sql
│ │ │ ├── React-SpringBoot-Add-Books-Script-4.sql
│ │ │ ├── React-SpringBoot-Add-Books-Script-5.sql
│ │ │ └── React-Springboot-Add-Tables-Script-1.sql
│ │ └── application.properties
│ ├── 02-backend/
│ │ └── spring-boot-library/
│ │ ├── .gitignore
│ │ ├── .mvn/
│ │ │ └── wrapper/
│ │ │ └── maven-wrapper.properties
│ │ ├── mvnw
│ │ ├── mvnw.cmd
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── com/
│ │ │ │ └── luv2code/
│ │ │ │ └── springbootlibrary/
│ │ │ │ ├── SpringBootLibraryApplication.java
│ │ │ │ ├── config/
│ │ │ │ │ ├── MyDataRestConfig.java
│ │ │ │ │ └── SecurityConfiguration.java
│ │ │ │ ├── controller/
│ │ │ │ │ ├── AdminController.java
│ │ │ │ │ ├── BookController.java
│ │ │ │ │ ├── MessagesController.java
│ │ │ │ │ └── ReviewController.java
│ │ │ │ ├── dao/
│ │ │ │ │ ├── BookRepository.java
│ │ │ │ │ ├── CheckoutRepository.java
│ │ │ │ │ ├── HistoryRepository.java
│ │ │ │ │ ├── MessageRepository.java
│ │ │ │ │ └── ReviewRepository.java
│ │ │ │ ├── entity/
│ │ │ │ │ ├── Book.java
│ │ │ │ │ ├── Checkout.java
│ │ │ │ │ ├── History.java
│ │ │ │ │ ├── Message.java
│ │ │ │ │ └── Review.java
│ │ │ │ ├── requestmodels/
│ │ │ │ │ ├── AddBookRequest.java
│ │ │ │ │ ├── AdminQuestionRequest.java
│ │ │ │ │ └── ReviewRequest.java
│ │ │ │ ├── responsemodels/
│ │ │ │ │ └── ShelfCurrentLoansResponse.java
│ │ │ │ └── service/
│ │ │ │ ├── AdminService.java
│ │ │ │ ├── BookService.java
│ │ │ │ ├── MessagesService.java
│ │ │ │ └── ReviewService.java
│ │ │ └── resources/
│ │ │ └── application.properties
│ │ └── test/
│ │ └── java/
│ │ └── com/
│ │ └── luv2code/
│ │ └── springbootlibrary/
│ │ └── SpringBootLibraryApplicationTests.java
│ ├── 03-frontend/
│ │ └── react-library/
│ │ ├── .gitignore
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── public/
│ │ │ ├── index.html
│ │ │ ├── manifest.json
│ │ │ └── robots.txt
│ │ ├── src/
│ │ │ ├── App.css
│ │ │ ├── App.tsx
│ │ │ ├── Auth/
│ │ │ │ └── LoginPage.jsx
│ │ │ ├── index.css
│ │ │ ├── index.tsx
│ │ │ ├── layouts/
│ │ │ │ ├── BookCheckoutPage/
│ │ │ │ │ ├── BookCheckoutPage.tsx
│ │ │ │ │ ├── CheckoutAndReviewBox.tsx
│ │ │ │ │ ├── LatestReviews.tsx
│ │ │ │ │ └── ReviewListPage/
│ │ │ │ │ └── ReviewListPage.tsx
│ │ │ │ ├── HomePage/
│ │ │ │ │ ├── HomePage.tsx
│ │ │ │ │ └── components/
│ │ │ │ │ ├── Carousel.tsx
│ │ │ │ │ ├── ExploreTopBooks.tsx
│ │ │ │ │ ├── Heros.tsx
│ │ │ │ │ ├── LibraryServices.tsx
│ │ │ │ │ └── ReturnBook.tsx
│ │ │ │ ├── ManageLibraryPage/
│ │ │ │ │ ├── ManageLibraryPage.tsx
│ │ │ │ │ └── components/
│ │ │ │ │ ├── AddNewBook.tsx
│ │ │ │ │ ├── AdminMessage.tsx
│ │ │ │ │ ├── AdminMessages.tsx
│ │ │ │ │ ├── ChangeQuantityOfBook.tsx
│ │ │ │ │ └── ChangeQuantityOfBooks.tsx
│ │ │ │ ├── MessagesPage/
│ │ │ │ │ ├── MessagesPage.tsx
│ │ │ │ │ └── components/
│ │ │ │ │ ├── Messages.tsx
│ │ │ │ │ └── PostNewMessage.tsx
│ │ │ │ ├── NavbarAndFooter/
│ │ │ │ │ ├── Footer.tsx
│ │ │ │ │ └── Navbar.tsx
│ │ │ │ ├── SearchBooksPage/
│ │ │ │ │ ├── SearchBooksPage.tsx
│ │ │ │ │ └── components/
│ │ │ │ │ └── SearchBook.tsx
│ │ │ │ ├── ShelfPage/
│ │ │ │ │ ├── ShelfPage.tsx
│ │ │ │ │ └── components/
│ │ │ │ │ ├── HistoryPage.tsx
│ │ │ │ │ ├── Loans.tsx
│ │ │ │ │ └── LoansModal.tsx
│ │ │ │ └── Utils/
│ │ │ │ ├── LeaveAReview.tsx
│ │ │ │ ├── Pagination.tsx
│ │ │ │ ├── Review.tsx
│ │ │ │ ├── SpinnerLoading.tsx
│ │ │ │ └── StarsReview.tsx
│ │ │ ├── lib/
│ │ │ │ └── auth0Config.ts
│ │ │ ├── models/
│ │ │ │ ├── AddBookRequest.ts
│ │ │ │ ├── AdminMessageRequest.ts
│ │ │ │ ├── BookModel.ts
│ │ │ │ ├── HistoryModel.ts
│ │ │ │ ├── MessageModel.ts
│ │ │ │ ├── ReviewModel.ts
│ │ │ │ ├── ReviewRequestModel.ts
│ │ │ │ └── ShelfCurrentLoans.ts
│ │ │ └── react-app-env.d.ts
│ │ └── tsconfig.json
│ └── static-html-css-files/
│ ├── Section 10. Home Page Static Files/
│ │ ├── Carousel.tsx
│ │ ├── ExploreTopBooks.tsx
│ │ ├── Footer.tsx
│ │ ├── Heros.tsx
│ │ ├── LibraryServices.tsx
│ │ ├── Navbar.tsx
│ │ └── ReturnBook.tsx
│ ├── Section 13. Search Books Page Static Files/
│ │ ├── Pagination.tsx
│ │ ├── SearchBook.tsx
│ │ └── SearchBooksPage.tsx
│ ├── Section 15. Book Checkout Static Files/
│ │ ├── BookCheckoutPage.tsx
│ │ ├── CheckoutAndReviewBox.tsx
│ │ └── StarsReview.tsx
│ ├── Section 16. Reviews Static Files/
│ │ ├── LatestReviews.tsx
│ │ └── Review.tsx
│ ├── Section 23. Leave a Review Static Files/
│ │ └── LeaveAReview.tsx
│ ├── Section 24. Review List Page Static Files/
│ │ └── ReviewListPage.tsx
│ ├── Section 25. Shelf Page Static Files/
│ │ ├── Loans.tsx
│ │ ├── LoansModal.tsx
│ │ └── ShelfPage.tsx
│ ├── Section 26. History Page Static Files/
│ │ └── HistoryPage.tsx
│ ├── Section 27. Library Services Static Files/
│ │ ├── Messages.tsx
│ │ ├── MessagesPage.tsx
│ │ └── PostNewMessage.tsx
│ ├── Section 28. Manage Library Services Static Files/
│ │ ├── AdminMessage.tsx
│ │ ├── AdminMessages.tsx
│ │ └── ManageLibraryPage.tsx
│ ├── Section 29. Add new book Static Files/
│ │ └── AddNewBook.tsx
│ └── Section 30. Change Quantity Static Files/
│ ├── ChangeQuantityOfBook.tsx
│ └── ChangeQuantityOfBooks.tsx
├── bonus-content/
│ ├── keytool-steps.md
│ └── openssl-setup.md
├── install-react-tools/
│ ├── linux/
│ │ └── install-linux.md
│ ├── mac/
│ │ └── install-mac.md
│ └── ms-windows/
│ └── install-ms-windows.md
└── source-code/
├── bootstrap-training/
│ ├── 1. Containers/
│ │ └── home.html
│ ├── 10 accordions/
│ │ └── home.html
│ ├── 11. Columns in rows/
│ │ └── home.html
│ ├── 12. Rows and columns/
│ │ └── home.html
│ ├── 13. Tables/
│ │ └── home.html
│ ├── 14. Forms Basic/
│ │ └── home.html
│ ├── 15. Forms/
│ │ └── home.html
│ ├── 16. Modals/
│ │ └── home.html
│ ├── 17. Hide/
│ │ └── home.html
│ ├── 2. Buttons/
│ │ └── home.html
│ ├── 3. Dropdowns/
│ │ └── home.html
│ ├── 4. Cards/
│ │ └── home.html
│ ├── 5. Alerts/
│ │ └── home.html
│ ├── 6. Spinners/
│ │ └── home.html
│ ├── 7. Progress/
│ │ └── home.html
│ ├── 8. Collapse/
│ │ └── home.html
│ └── 9. Navbar/
│ └── home.html
├── fullstack-library-app/
│ ├── 01-starter-files/
│ │ ├── App.css/
│ │ │ └── App.css
│ │ ├── Scripts/
│ │ │ ├── Payment Script/
│ │ │ │ └── Payment Script.sql
│ │ │ ├── React-SpringBoot-Add-Books-Script-2.sql
│ │ │ ├── React-SpringBoot-Add-Books-Script-3.sql
│ │ │ ├── React-SpringBoot-Add-Books-Script-4.sql
│ │ │ ├── React-SpringBoot-Add-Books-Script-5.sql
│ │ │ └── React-Springboot-Add-Tables-Script-1.sql
│ │ └── application.properties
│ ├── 02-backend/
│ │ └── spring-boot-library/
│ │ └── spring-boot-library/
│ │ ├── .gitignore
│ │ ├── .mvn/
│ │ │ └── wrapper/
│ │ │ └── maven-wrapper.properties
│ │ ├── mvnw
│ │ ├── mvnw.cmd
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── com/
│ │ │ │ └── luv2code/
│ │ │ │ └── springbootlibrary/
│ │ │ │ ├── SpringBootLibraryApplication.java
│ │ │ │ ├── config/
│ │ │ │ │ ├── MyDataRestConfig.java
│ │ │ │ │ └── SecurityConfiguration.java
│ │ │ │ ├── controller/
│ │ │ │ │ ├── AdminController.java
│ │ │ │ │ ├── BookController.java
│ │ │ │ │ ├── MessagesController.java
│ │ │ │ │ └── ReviewController.java
│ │ │ │ ├── dao/
│ │ │ │ │ ├── BookRepository.java
│ │ │ │ │ ├── CheckoutRepository.java
│ │ │ │ │ ├── HistoryRepository.java
│ │ │ │ │ ├── MessageRepository.java
│ │ │ │ │ └── ReviewRepository.java
│ │ │ │ ├── entity/
│ │ │ │ │ ├── Book.java
│ │ │ │ │ ├── Checkout.java
│ │ │ │ │ ├── History.java
│ │ │ │ │ ├── Message.java
│ │ │ │ │ └── Review.java
│ │ │ │ ├── requestmodels/
│ │ │ │ │ ├── AddBookRequest.java
│ │ │ │ │ ├── AdminQuestionRequest.java
│ │ │ │ │ └── ReviewRequest.java
│ │ │ │ ├── responsemodels/
│ │ │ │ │ └── ShelfCurrentLoansResponse.java
│ │ │ │ ├── service/
│ │ │ │ │ ├── AdminService.java
│ │ │ │ │ ├── BookService.java
│ │ │ │ │ ├── MessagesService.java
│ │ │ │ │ └── ReviewService.java
│ │ │ │ └── utils/
│ │ │ │ └── ExtractJWT.java
│ │ │ └── resources/
│ │ │ └── application.properties
│ │ └── test/
│ │ └── java/
│ │ └── com/
│ │ └── luv2code/
│ │ └── springbootlibrary/
│ │ └── SpringBootLibraryApplicationTests.java
│ ├── 03-frontend/
│ │ └── react-library/
│ │ ├── .gitignore
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── public/
│ │ │ ├── index.html
│ │ │ ├── manifest.json
│ │ │ └── robots.txt
│ │ ├── src/
│ │ │ ├── App.css
│ │ │ ├── App.tsx
│ │ │ ├── Auth/
│ │ │ │ ├── LoginWidget.jsx
│ │ │ │ └── OktaSignInWidget.jsx
│ │ │ ├── index.css
│ │ │ ├── index.tsx
│ │ │ ├── layouts/
│ │ │ │ ├── BookCheckoutPage/
│ │ │ │ │ ├── BookCheckoutPage.tsx
│ │ │ │ │ ├── CheckoutAndReviewBox.tsx
│ │ │ │ │ ├── LatestReviews.tsx
│ │ │ │ │ └── ReviewListPage/
│ │ │ │ │ └── ReviewListPage.tsx
│ │ │ │ ├── HomePage/
│ │ │ │ │ ├── HomePage.tsx
│ │ │ │ │ └── components/
│ │ │ │ │ ├── Carousel.tsx
│ │ │ │ │ ├── ExploreTopBooks.tsx
│ │ │ │ │ ├── Heros.tsx
│ │ │ │ │ ├── LibraryServices.tsx
│ │ │ │ │ └── ReturnBook.tsx
│ │ │ │ ├── ManageLibraryPage/
│ │ │ │ │ ├── ManageLibraryPage.tsx
│ │ │ │ │ └── components/
│ │ │ │ │ ├── AddNewBook.tsx
│ │ │ │ │ ├── AdminMessage.tsx
│ │ │ │ │ ├── AdminMessages.tsx
│ │ │ │ │ ├── ChangeQuantityOfBook.tsx
│ │ │ │ │ └── ChangeQuantityOfBooks.tsx
│ │ │ │ ├── MessagesPage/
│ │ │ │ │ ├── MessagesPage.tsx
│ │ │ │ │ └── components/
│ │ │ │ │ ├── Messages.tsx
│ │ │ │ │ └── PostNewMessage.tsx
│ │ │ │ ├── NavbarAndFooter/
│ │ │ │ │ ├── Footer.tsx
│ │ │ │ │ └── Navbar.tsx
│ │ │ │ ├── SearchBooksPage/
│ │ │ │ │ ├── SearchBooksPage.tsx
│ │ │ │ │ └── components/
│ │ │ │ │ └── SearchBook.tsx
│ │ │ │ ├── ShelfPage/
│ │ │ │ │ ├── ShelfPage.tsx
│ │ │ │ │ └── components/
│ │ │ │ │ ├── HistoryPage.tsx
│ │ │ │ │ ├── Loans.tsx
│ │ │ │ │ └── LoansModal.tsx
│ │ │ │ └── Utils/
│ │ │ │ ├── LeaveAReview.tsx
│ │ │ │ ├── Pagination.tsx
│ │ │ │ ├── Review.tsx
│ │ │ │ ├── SpinnerLoading.tsx
│ │ │ │ └── StarsReview.tsx
│ │ │ ├── lib/
│ │ │ │ └── oktaConfig.ts
│ │ │ ├── models/
│ │ │ │ ├── AddBookRequest.ts
│ │ │ │ ├── AdminMessageRequest.ts
│ │ │ │ ├── BookModel.ts
│ │ │ │ ├── HistoryModel.ts
│ │ │ │ ├── MessageModel.ts
│ │ │ │ ├── ReviewModel.ts
│ │ │ │ ├── ReviewRequestModel.ts
│ │ │ │ └── ShelfCurrentLoans.ts
│ │ │ └── react-app-env.d.ts
│ │ └── tsconfig.json
│ └── static-html-css-files/
│ ├── Section 10. Home Page Static Files/
│ │ ├── Carousel.tsx
│ │ ├── ExploreTopBooks.tsx
│ │ ├── Footer.tsx
│ │ ├── Heros.tsx
│ │ ├── LibraryServices.tsx
│ │ ├── Navbar.tsx
│ │ └── ReturnBook.tsx
│ ├── Section 13. Search Books Page Static Files/
│ │ ├── Pagination.tsx
│ │ ├── SearchBook.tsx
│ │ └── SearchBooksPage.tsx
│ ├── Section 15. Book Checkout Static Files/
│ │ ├── BookCheckoutPage.tsx
│ │ ├── CheckoutAndReviewBox.tsx
│ │ └── StarsReview.tsx
│ ├── Section 16. Reviews Static Files/
│ │ ├── LatestReviews.tsx
│ │ └── Review.tsx
│ ├── Section 23. Leave a Review Static Files/
│ │ └── LeaveAReview.tsx
│ ├── Section 24. Review List Page Static Files/
│ │ └── ReviewListPage.tsx
│ ├── Section 25. Shelf Page Static Files/
│ │ ├── Loans.tsx
│ │ ├── LoansModal.tsx
│ │ └── ShelfPage.tsx
│ ├── Section 26. History Page Static Files/
│ │ └── HistoryPage.tsx
│ ├── Section 27. Library Services Static Files/
│ │ ├── Messages.tsx
│ │ ├── MessagesPage.tsx
│ │ └── PostNewMessage.tsx
│ ├── Section 28. Manage Library Services Static Files/
│ │ ├── AdminMessage.tsx
│ │ ├── AdminMessages.tsx
│ │ └── ManageLibraryPage.tsx
│ ├── Section 29. Add new book Static Files/
│ │ └── AddNewBook.tsx
│ └── Section 30. Change Quantity Static Files/
│ ├── ChangeQuantityOfBook.tsx
│ └── ChangeQuantityOfBooks.tsx
├── fullstack-library-app-https/
│ ├── 02-backend/
│ │ └── spring-boot-library/
│ │ └── spring-boot-library/
│ │ ├── .gitignore
│ │ ├── .mvn/
│ │ │ └── wrapper/
│ │ │ └── maven-wrapper.properties
│ │ ├── mvnw
│ │ ├── mvnw.cmd
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── com/
│ │ │ │ └── luv2code/
│ │ │ │ └── springbootlibrary/
│ │ │ │ ├── SpringBootLibraryApplication.java
│ │ │ │ ├── config/
│ │ │ │ │ ├── MyDataRestConfig.java
│ │ │ │ │ └── SecurityConfiguration.java
│ │ │ │ ├── controller/
│ │ │ │ │ ├── AdminController.java
│ │ │ │ │ ├── BookController.java
│ │ │ │ │ ├── MessagesController.java
│ │ │ │ │ ├── PaymentController.java
│ │ │ │ │ └── ReviewController.java
│ │ │ │ ├── dao/
│ │ │ │ │ ├── BookRepository.java
│ │ │ │ │ ├── CheckoutRepository.java
│ │ │ │ │ ├── HistoryRepository.java
│ │ │ │ │ ├── MessageRepository.java
│ │ │ │ │ ├── PaymentRepository.java
│ │ │ │ │ └── ReviewRepository.java
│ │ │ │ ├── entity/
│ │ │ │ │ ├── Book.java
│ │ │ │ │ ├── Checkout.java
│ │ │ │ │ ├── History.java
│ │ │ │ │ ├── Message.java
│ │ │ │ │ ├── Payment.java
│ │ │ │ │ └── Review.java
│ │ │ │ ├── requestmodels/
│ │ │ │ │ ├── AddBookRequest.java
│ │ │ │ │ ├── AdminQuestionRequest.java
│ │ │ │ │ ├── PaymentInfoRequest.java
│ │ │ │ │ └── ReviewRequest.java
│ │ │ │ ├── responsemodels/
│ │ │ │ │ └── ShelfCurrentLoansResponse.java
│ │ │ │ ├── service/
│ │ │ │ │ ├── AdminService.java
│ │ │ │ │ ├── BookService.java
│ │ │ │ │ ├── MessagesService.java
│ │ │ │ │ ├── PaymentService.java
│ │ │ │ │ └── ReviewService.java
│ │ │ │ └── utils/
│ │ │ │ └── ExtractJWT.java
│ │ │ └── resources/
│ │ │ ├── application.properties
│ │ │ └── luv2code-keystore.p12
│ │ └── test/
│ │ └── java/
│ │ └── com/
│ │ └── luv2code/
│ │ └── springbootlibrary/
│ │ └── SpringBootLibraryApplicationTests.java
│ └── 03-frontend/
│ └── react-library/
│ ├── .gitignore
│ ├── README.md
│ ├── localhost.conf
│ ├── package.json
│ ├── public/
│ │ ├── index.html
│ │ ├── manifest.json
│ │ └── robots.txt
│ ├── src/
│ │ ├── App.css
│ │ ├── App.tsx
│ │ ├── Auth/
│ │ │ ├── LoginWidget.jsx
│ │ │ └── OktaSignInWidget.jsx
│ │ ├── index.css
│ │ ├── index.tsx
│ │ ├── layouts/
│ │ │ ├── BookCheckoutPage/
│ │ │ │ ├── BookCheckoutPage.tsx
│ │ │ │ ├── CheckoutAndReviewBox.tsx
│ │ │ │ ├── LatestReviews.tsx
│ │ │ │ └── ReviewListPage/
│ │ │ │ └── ReviewListPage.tsx
│ │ │ ├── HomePage/
│ │ │ │ ├── HomePage.tsx
│ │ │ │ └── components/
│ │ │ │ ├── Carousel.tsx
│ │ │ │ ├── ExploreTopBooks.tsx
│ │ │ │ ├── Heros.tsx
│ │ │ │ ├── LibraryServices.tsx
│ │ │ │ └── ReturnBook.tsx
│ │ │ ├── ManageLibraryPage/
│ │ │ │ ├── ManageLibraryPage.tsx
│ │ │ │ └── components/
│ │ │ │ ├── AddNewBook.tsx
│ │ │ │ ├── AdminMessage.tsx
│ │ │ │ ├── AdminMessages.tsx
│ │ │ │ ├── ChangeQuantityOfBook.tsx
│ │ │ │ └── ChangeQuantityOfBooks.tsx
│ │ │ ├── MessagesPage/
│ │ │ │ ├── MessagesPage.tsx
│ │ │ │ └── components/
│ │ │ │ ├── Messages.tsx
│ │ │ │ └── PostNewMessage.tsx
│ │ │ ├── NavbarAndFooter/
│ │ │ │ ├── Footer.tsx
│ │ │ │ └── Navbar.tsx
│ │ │ ├── PaymentPage/
│ │ │ │ └── PaymentPage.tsx
│ │ │ ├── SearchBooksPage/
│ │ │ │ ├── SearchBooksPage.tsx
│ │ │ │ └── components/
│ │ │ │ └── SearchBook.tsx
│ │ │ ├── ShelfPage/
│ │ │ │ ├── ShelfPage.tsx
│ │ │ │ └── components/
│ │ │ │ ├── HistoryPage.tsx
│ │ │ │ ├── Loans.tsx
│ │ │ │ └── LoansModal.tsx
│ │ │ └── Utils/
│ │ │ ├── LeaveAReview.tsx
│ │ │ ├── Pagination.tsx
│ │ │ ├── Review.tsx
│ │ │ ├── SpinnerLoading.tsx
│ │ │ └── StarsReview.tsx
│ │ ├── lib/
│ │ │ └── oktaConfig.ts
│ │ ├── models/
│ │ │ ├── AddBookRequest.ts
│ │ │ ├── AdminMessageRequest.ts
│ │ │ ├── BookModel.ts
│ │ │ ├── HistoryModel.ts
│ │ │ ├── MessageModel.ts
│ │ │ ├── PaymentInfoRequest.ts
│ │ │ ├── ReviewModel.ts
│ │ │ ├── ReviewRequestModel.ts
│ │ │ └── ShelfCurrentLoans.ts
│ │ └── react-app-env.d.ts
│ ├── ssl-localhost/
│ │ ├── localhost.crt
│ │ └── localhost.key
│ └── tsconfig.json
├── react-overview-todo-project/
│ ├── ReactJS/
│ │ ├── .gitignore
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── public/
│ │ │ ├── index.html
│ │ │ ├── manifest.json
│ │ │ └── robots.txt
│ │ └── src/
│ │ ├── App.css
│ │ ├── App.js
│ │ ├── App.test.js
│ │ ├── components/
│ │ │ ├── NewTodoForm.js
│ │ │ ├── TodoRowItem.js
│ │ │ └── TodoTable.js
│ │ ├── index.css
│ │ ├── index.js
│ │ ├── reportWebVitals.js
│ │ └── setupTests.js
│ └── ReactTS/
│ ├── .gitignore
│ ├── README.md
│ ├── package.json
│ ├── public/
│ │ ├── index.html
│ │ ├── manifest.json
│ │ └── robots.txt
│ ├── src/
│ │ ├── App.css
│ │ ├── App.tsx
│ │ ├── components/
│ │ │ ├── NewTodoForm.tsx
│ │ │ ├── TodoRowItem.tsx
│ │ │ └── TodoTable.tsx
│ │ ├── index.css
│ │ ├── index.tsx
│ │ └── models/
│ │ └── TodoModel.ts
│ └── tsconfig.json
└── typescript-training/
├── 01-helloworld/
│ └── myhelloworld.ts
├── 02-variables/
│ └── sample-types.ts
├── 03-loops-and-arrays/
│ ├── growable-arrays.ts
│ ├── loops.ts
│ ├── reviews.ts
│ └── sports.ts
├── 04-classes/
│ ├── 01-class-definition/
│ │ └── Customer.ts
│ ├── 02-access-modifiers/
│ │ └── Customer.ts
│ ├── 03-tsconfig/
│ │ ├── Customer.ts
│ │ └── tsconfig.json
│ ├── 04-parameter-properties/
│ │ ├── Customer.ts
│ │ └── tsconfig.json
│ └── 05-modules/
│ ├── Customer.ts
│ ├── Driver.ts
│ └── tsconfig.json
├── 05-inheritance/
│ ├── ArrayDriver.ts
│ ├── Circle.ts
│ ├── Driver.ts
│ ├── Rectangle.ts
│ ├── Shape.ts
│ └── tsconfig.json
├── 06-abstract-classes/
│ ├── ArrayDriver.ts
│ ├── Circle.ts
│ ├── Rectangle.ts
│ ├── Shape.ts
│ └── tsconfig.json
└── 07-interfaces/
├── Coach.ts
├── CricketCoach.ts
├── Driver.ts
├── GolfCoach.ts
└── tsconfig.json
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitattributes
================================================
# -------------------------------------------------
# Global normalization
# -------------------------------------------------
* text=auto
# -------------------------------------------------
# Core source and configuration files (LF)
# -------------------------------------------------
*.java text eol=lf
*.properties text eol=lf
*.xml text eol=lf
*.yml text eol=lf
*.yaml text eol=lf
*.md text eol=lf
*.txt text eol=lf
# Optional: web assets (LF everywhere)
*.html text eol=lf
*.css text eol=lf
*.js text eol=lf
*.json text eol=lf
# -------------------------------------------------
# Build tool / Gradle & Kotlin DSL files (LF) (safe even if not used)
# -------------------------------------------------
*.gradle text eol=lf
*.gradle.kts text eol=lf
*.kts text eol=lf
# -------------------------------------------------
# Script wrappers (important for Spring Boot tooling)
# -------------------------------------------------
mvnw text eol=lf
gradlew text eol=lf
*.sh text eol=lf
# -------------------------------------------------
# Windows scripts
# -------------------------------------------------
*.bat text eol=crlf
*.cmd text eol=crlf
# PowerShell Core friendly
*.ps1 text eol=lf
# Wrapper batch files (explicit for clarity)
gradlew.bat text eol=crlf
# -------------------------------------------------
# GitHub language statistics
# Emphasize Java by ignoring frontend static assets
# -------------------------------------------------
/src/main/resources/static/** linguist-ignore
# -------------------------------------------------
# Reduce noisy diffs
# -------------------------------------------------
*.min.js -diff
*.min.css -diff
package-lock.json -diff
yarn.lock -diff
pnpm-lock.yaml -diff
# -------------------------------------------------
# Binary assets (no diffs)
# -------------------------------------------------
*.png binary
*.jpg binary
*.jpeg binary
*.gif binary
*.webp binary
*.pdf binary
*.pptx binary
*.docx binary
*.xlsx binary
*.jar binary
*.zip binary
# -------------------------------------------------
# Keep SVGs diffable (and normalize line endings)
# -------------------------------------------------
*.svg text eol=lf
================================================
FILE: .gitignore
================================================
################################################################################
# Source code repository for luv2code training courses.
# https://www.luv2code.com
################################################################################
################################################################################
# OS-SPECIFIC FILES
################################################################################
########################################
# macOS
########################################
.DS_Store
.AppleDouble
.LSOverride
Icon
._*
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
.com.apple.timemachine.donotpresent
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk
*.icloud
########################################
# Windows
########################################
Thumbs.db
Thumbs.db:encryptable
ehthumbs.db
ehthumbs_vista.db
[Dd]esktop.ini
$RECYCLE.BIN/
*.stackdump
*.lnk
########################################
# Linux
########################################
.Trash-*
.cache/
.config/
.local/
*.directory
*~
*.tmp
lost+found/
################################################################################
# JAVA & BUILD ARTIFACTS
################################################################################
# Compiled output
*.class
*.ctxt
*.log
# Java packaged archives (avoid committing builds)
*.jar
*.war
*.ear
*.nar
*.zip
*.tar.gz
*.rar
# JVM crash logs
hs_err_pid*
replay_pid*
################################################################################
# MAVEN
################################################################################
# Build output
target/
# Maven internal metadata
pom.xml.tag
pom.xml.releaseBackup
pom.xml.versionsBackup
pom.xml.next
release.properties
dependency-reduced-pom.xml
# Build number & wrapper
buildNumber.properties
.mvn/timing.properties
.mvn/wrapper/maven-wrapper.jar
################################################################################
# INTELLIJ IDEA
################################################################################
.idea/
*.iml
*.iws
*.ipr
out/
################################################################################
# ECLIPSE
################################################################################
.metadata/
.project
.classpath
.settings/
.loadpath
.recommenders/
bin/
tmp/
*.tmp
*.bak
*.swp
################################################################################
# VISUAL STUDIO CODE
################################################################################
.vscode/
.history/
*.vsix
################################################################################
# CLAUDE CODE
################################################################################
.claude/
CLAUDE.md
################################################################################
# GENERIC BUILD & TEMP
################################################################################
build/
dist/
*.swp
*.swo
*.bak
*.tmp
*~.nib
================================================
FILE: LICENSE
================================================
All source code and course materials in this repository are provided to enrolled students for personal learning and educational use as part of a course created by luv2code LLC.
You are granted a limited, non-exclusive, non-transferable license to use, modify, and integrate the source code for your own purposes as described below.
You may:
- Use and modify the source code for your own personal projects
- Use and modify the source code in your work or professional projects, including commercial applications
- Integrate or extend the source code to build your own applications
No action or special requests are required to use the source code in this way.
---
You may not:
- Republish, redistribute, or share any course materials, including but not limited to videos, slides, images, text, or PDFs
- Use any course materials to create derivative educational content such as tutorials, blog posts, YouTube videos, online courses, training materials, or social media content
- Use any course materials in teaching, training, or commercial educational products
- Claim any course materials as your own work
These restrictions help protect the integrity of the course and ensure that all students receive the course materials from the official source.
For permission requests, contact copyright@luv2code.com
All course materials remain the intellectual property of luv2code LLC and are protected by copyright law. Any use beyond the personal educational license described above requires prior written permission from luv2code LLC.
© luv2code LLC. All rights reserved.
================================================
FILE: README.md
================================================
# Full Stack: React and Spring Boot
[<img src="images/react-spring-boot-grabber-thumbnail.png" alt="Full Stack: React and Spring Boot" width="400" />](bit.ly/3EcIvFP)
## React Installation Guides
* [Linux](install-react-tools/linux/install-linux.md)
* [Mac](install-react-tools/mac/install-mac.md)
* [Microsoft Windows](install-react-tools/ms-windows/install-ms-windows.md)
## Source Code
* [Source code](source-code)
 
## Spring Boot Road Map - Learning Path
Here is a Spring Boot Learning Path and Roadmap to help you learn more about Spring Boot. These are links to luv2code courses on Udemy. You can purchase the courses to further your studies.
I'd recommend the following road map:
### Core Courses
1. [Java Programming Introduction for Beginners](https://www.udemy.com/course/java-intro-for-beginners/?referralCode=325F0EA33466DA1D8710)
1. [Spring Boot 4, Spring 7 and Hibernate for Beginners](http://www.luv2code.com/spring-github)
1. [Spring Boot Unit Testing](https://www.udemy.com/course/spring-boot-unit-testing/?referralCode=4184DE360D78A70932EE)
1. [Deploy Spring Boot 4 Applications on AWS](https://www.udemy.com/course/deploy-spring-boot-3-apps-to-aws/?referralCode=DCE8981B59C70BA6BDBF)
1. [Hibernate: Advanced Development Techniques](https://www.udemy.com/course/hibernate-tutorial-advanced/?referralCode=6FB9E2BA9AF54A4C9E69)
1. [Master Java Design Patterns](https://www.luv2code.com/master-java-design-patterns-github)
### Project Course: Spring Boot, Spring MVC and Thymeleaf
For end-to-end project with Spring Boot, Spring MVC and Thymeleaf:
1. [Spring Boot 4 Project: Build a Job Portal Web Application](https://www.udemy.com/course/spring-boot-project-job-portal-web-app/?referralCode=BB9301596150194B61E2)
### REST API Project Course: Spring Boot 4 REST APIs: Building Modern REST APIs
This is an intermediate level course that includes four REST API projects:
1. [Spring Boot 4 REST APIs: Building Modern REST APIs](https://www.udemy.com/course/spring-boot-rest-apis/)
### Project Courses: Full Stack
For full stack projects, you have the choice of either Angular or React. Pick the one that you like the best.
1. [Full Stack: Angular and Spring Boot](https://www.udemy.com/course/full-stack-angular-spring-boot-tutorial/?referralCode=2264F90C65A86316BB6B)
1. [Full Stack: React and Spring Boot](https://www.udemy.com/course/full-stack-react-and-java-spring-boot-the-developer-guide/?referralCode=4325FA579FD3D313E28D)
### Java Web Test Automation
Learn how to automate web browser testing using Java and test automation frameworks:
1. [Java Playwright: Master Web Test Automation](https://www.luv2code.com/java-playwright-github)
 
## More luv2code Courses
For more courses, visit the [luv2code website](https://www.luv2code.com).
I'm looking forward to seeing you in other luv2code courses!
 
## Follow luv2code on Social Media
* [YouTube Channel - luv2code](https://www.youtube.com/user/luv2codetv?sub_confirmation=1)
* [Facebook Page - luv2code](https://www.facebook.com/luv2codetv)
* [X (Twitter) - luv2code](https://twitter.com/luv2codetv)
* [LinkedIn](https://www.linkedin.com/in/chaddarby/)
 
## License
This source code and all related course materials are provided for your personal learning and educational use as part of a course by [luv2code LLC](https://www.luv2code.com).
You may:
- Use and modify the source code for your own personal projects
- Use and modify the source code in your work or professional projects, including commercial applications
- Integrate or extend the source code to build your own applications
No action or special requests are required to use the source code in this way.
---
You may not:
- Republish, redistribute, or upload any course materials, including but not limited to videos, slides, images, text, or PDFs
- Use any course materials to create derivative educational content such as tutorials, blog posts, YouTube videos, online courses, training content, or social media content
- Use any course materials in teaching, training, or commercial educational products
- Claim any course materials as your own work
See the [LICENSE](./LICENSE) file for full terms and restrictions.
For permission requests, contact **copyright@luv2code.com**
================================================
FILE: auth0-security/README.md
================================================
# Security Login/Logout - Auth0 Integration Tutorial
## Introduction
In this tutorial, you will learn how to integrate Auth0 into a react library application.
Users can Sign up or log in (including social login)
## Prerequisites
This tutorial assumes that you have already completed the section **“Library Project – Reviews On Book Checkout Page”** in *Build a Full Stack App - React and Java Spring Boot* course.
## Overview of Steps
1. Create a developer account on Auth0
1. Create Application and provide Application Information
1. Create API
1. Install Auth0 dependencies
1. Create/ Update `lib/auth0Config.ts`
1. Add Login Status Component
1. Update `App.tsx`
1. Add Logout Functionality
1. Homepage Refactor with Authentication
1. Checkout Book Functionality
1. Spring Boot – Backend Changes
1. Add an Admin Role
1. Run the Application
## 1. Create a Developer Account on Auth0
### SIGN UP
1. Open: [https://developer.auth0.com/](https://developer.auth0.com/)
2. Sign up.
## 2. Create an Application on Auth0 and provide App information
### Create Application
1. In Auth0 Developer Account, select Applications > Applications > + Create Application ...
1. Give a name: My React App.
1. Choose *Single Page Web Applications*
1. Click: *Create*
1. Click: *Settings*
### Provide App Information
Add Application URIs
- **Allowed Callback URLs**: http://localhost:3000/login/callback
- **Allowed Logout URLs**: http://localhost:3000
- **Allowed Web Origins**: http://localhost:3000
- **Allowed Origins (CORS)**: http://localhost:3000



Click *Save*
---
## 3. Create API
### Create Application
1. In Auth0 Developer Account, select Applications > API > + Create API...
1. Give a name: My Spring Boot App
1. Identifier: << BACKEND API URI >> Ex: http://localhost:8080
1. Create


---
## 4. Install Auth0 Dependencies
**Run the following command** on vs code (React app) console
```
npm install @auth0/auth0-react
```
## 5. Create/ Update `auth0Config.ts`
File : src/lib/auth0Config.ts
```
export const auth0Config = {
clientId: '"<<UPDATE-WITH-YOUR-APP-CLIENT-ID>>"',
issuer: "<<UPDATE-WITH-YOUR-DOMAIN>>",
audience: "http://localhost:8080",
redirectUri: window.location.origin+"/callback",
scope: 'openid profile email'
}
```
Example (lib/auth0Config.ts):
```
export const auth0Config = {
clientId: 'abcdefgdE3mAoSMTNAbcdEFgvvLl4ZqU2',
issuer: '1234567luv2code.us.auth0.com',
audience: "http://localhost:8080",
redirectUri: window.location.origin+"/callback",
scope: 'openid profile email'
}
```
## 6. Add LoginPage.jsx
Create login page and add the code as shown below:
File : LoginPage.jsx
```
import React from 'react';
import { useAuth0 } from '@auth0/auth0-react';
const LoginPage = () => {
const { loginWithRedirect } = useAuth0();
return (
<div>
<button onClick={() => loginWithRedirect()}>Log In</button>
</div>
);
};
export default LoginPage;
```
## 7. Update `App.tsx `
Update src/App.tsx as below:
```
import React from 'react';
import { Redirect, Route, Switch, useHistory } from 'react-router-dom';
import './App.css';
import { BookCheckoutPage } from './layouts/BookCheckoutPage/BookCheckoutPage';
import { HomePage } from './layouts/HomePage/HomePage';
import { Footer } from './layouts/NavbarAndFooter/Footer';
import { Navbar } from './layouts/NavbarAndFooter/Navbar';
import { SearchBooksPage } from './layouts/SearchBooksPage/SearchBooksPage';
import { ReviewListPage } from './layouts/BookCheckoutPage/ReviewListPage/ReviewListPage';
import { ShelfPage } from './layouts/ShelfPage/ShelfPage';
import { MessagesPage } from './layouts/MessagesPage/MessagesPage';
import { ManageLibraryPage } from './layouts/ManageLibraryPage/ManageLibraryPage';
import { Auth0Provider, withAuthenticationRequired } from '@auth0/auth0-react';
import { auth0Config } from './lib/auth0Config';
import LoginPage from './Auth/LoginPage';
import { Auth0Provider, withAuthenticationRequired} from '@auth0/auth0-react';
const Auth0ProviderWithHistory = ({ children }: { children: React.ReactNode }) => {
const history = useHistory();
const onRedirectCallback = (appState: any) => {
history.push(appState?.returnTo || "/home");
};
return (
<Auth0Provider
domain={auth0Config.issuer}
clientId={auth0Config.clientId}
authorizationParams={{
redirect_uri: auth0Config.redirectUri,
audience: auth0Config.audience,
scope: auth0Config.scope,
}}
onRedirectCallback={onRedirectCallback}
>
{children}
</Auth0Provider>
);
};
const SecureRoute = ({ component, path, ...args }: { component: React.ComponentType<any>, path: string }) => (
<Route path={path} component={withAuthenticationRequired(component)} {...args} />
);
export const App = () => {
return (
<div className='d-flex flex-column min-vh-100'>
<Auth0ProviderWithHistory>
<Navbar />
<div className='flex-grow-1'>
<Switch>
<Route path='/' exact>
<Redirect to='/home' />
</Route>
<Route path='/home'>
<HomePage />
</Route>
<Route path='/search'>
<SearchBooksPage />
</Route>
<Route path='/reviewlist/:bookId'>
<ReviewListPage/>
</Route>
<Route path='/checkout/:bookId'>
<BookCheckoutPage/>
</Route>
<Route path='/login' render={() => <LoginPage />} />
<SecureRoute path='/shelf' component={ShelfPage} />
<SecureRoute path='/messages' component={MessagesPage} />
<SecureRoute path='/admin' component={ManageLibraryPage} />
</Switch>
</div>
<Footer />
</Auth0ProviderWithHistory>
</div>
);
}
```
## 8. Add Logout Functionality
Update src/layouts/NavbarAndFooter/Navbar.tsx as below:
File : Navbar.tsx
```
import { Link, NavLink } from "react-router-dom";
import { SpinnerLoading } from "../Utils/SpinnerLoading";
import { useAuth0 } from "@auth0/auth0-react";
import React, { useEffect, useState } from "react";
export const Navbar = () => {
const [roles, setRoles] = useState<string[] | null>(null);
const [loading, setLoading] = useState(true); // Loading state to handle async data
const { isAuthenticated, loginWithRedirect, logout, getIdTokenClaims } = useAuth0();
useEffect(() => {
const fetchRoles = async () => {
const claims = await getIdTokenClaims();
const fetchedRoles = claims?.['https://luv2code-react-library.com/roles'] || [];
setRoles(fetchedRoles);
setLoading(false); // Set loading to false once roles are loaded
};
fetchRoles();
}, [isAuthenticated, getIdTokenClaims]);
if (loading) {
return <SpinnerLoading />
}
const handleLogout = () => {
console.log("handleLogout");
logout({ logoutParams: { returnTo: window.location.origin } })
};
const handleLogin = () => {
loginWithRedirect();
window.location.assign("/");
};
console.log("isAuthenticated: ", isAuthenticated);
return (
<nav className='navbar navbar-expand-lg navbar-dark main-color py-3'>
<div className='container-fluid'>
<span className='navbar-brand'>Luv 2 Read</span>
<button className='navbar-toggler' type='button'
data-bs-toggle='collapse' data-bs-target='#navbarNavDropdown'
aria-controls='navbarNavDropdown' aria-expanded='false'
aria-label='Toggle Navigation'
>
<span className='navbar-toggler-icon'></span>
</button>
<div className='collapse navbar-collapse' id='navbarNavDropdown'>
<ul className='navbar-nav'>
<li className='nav-item'>
<NavLink className='nav-link' to='/home'>Home</NavLink>
</li>
<li className='nav-item'>
<NavLink className='nav-link' to='/search'>Search Books</NavLink>
</li>
{isAuthenticated &&
<li className='nav-item'>
<NavLink className='nav-link' to='/shelf'>Shelf</NavLink>
</li>
}
{isAuthenticated && roles?.includes('admin') &&
<li className='nav-item'>
<NavLink className='nav-link' to='/admin'>Admin</NavLink>
</li>
}
</ul>
<ul className='navbar-nav ms-auto'>
{!isAuthenticated ?
<li className='nav-item m-1'>
<button className='btn btn-outline-light' onClick={handleLogin}>Sign in</button>
</li>
:
<li>
<button className='btn btn-outline-light' onClick={handleLogout}>Logout</button>
</li>
}
</ul>
</div>
</div>
</nav>
);
}
```
## 9. Home Page Refactor with Authentication
Update src/layouts/HomePage/components/Heros.tsx as below:
File: Heroes.tsx
```
import { useAuth0 } from "@auth0/auth0-react";
import { Link } from "react-router-dom";
export const Heros = () => {
const { isAuthenticated } = useAuth0();
return (
<div>
<div className='d-none d-lg-block'>
<div className='row g-0 mt-5'>
<div className='col-sm-6 col-md-6'>
<div className='col-image-left'></div>
</div>
<div className='col-4 col-md-4 container d-flex justify-content-center align-items-center'>
<div className='ml-2'>
<h1>What have you been reading?</h1>
<p className='lead'>
The library team would love to know what you have been reading.
Whether it is to learn a new skill or grow within one,
we will be able to provide the top content for you!
</p>
{isAuthenticated ?
<Link type='button' className='btn main-color btn-lg text-white'
to='search'>Explore top books </Link>
:
<Link className='btn main-color btn-lg text-white' to='/login'>Sign up</Link>
}
</div>
</div>
</div>
<div className='row g-0'>
<div className='col-4 col-md-4 container d-flex
justify-content-center align-items-center'>
<div className='ml-2'>
<h1>Our collection is always changing!</h1>
<p className='lead'>
Try to check in daily as our collection is always changing!
We work nonstop to provide the most accurate book selection possible
for our Luv 2 Read students! We are diligent about our book selection
and our books are always going to be our
top priority.
</p>
</div>
</div>
<div className='col-sm-6 col-md-6'>
<div className='col-image-right'></div>
</div>
</div>
</div>
{/* Mobile Heros */}
<div className='d-lg-none'>
<div className='container'>
<div className='m-2'>
<div className='col-image-left'></div>
<div className='mt-2'>
<h1>What have you been reading?</h1>
<p className='lead'>
The library team would love to know what you have been reading.
Whether it is to learn a new skill or grow within one,
we will be able to provide the top content for you!
</p>
{isAuthenticated ?
<Link type='button' className='btn main-color btn-lg text-white'
to='search'>Explore top books</Link>
:
<Link className='btn main-color btn-lg text-white' to='/login'>Sign up</Link>
}
</div>
</div>
<div className='m-2'>
<div className='col-image-right'></div>
<div className='mt-2'>
<h1>Our collection is always changing!</h1>
<p className='lead'>
Try to check in daily as our collection is always changing!
We work nonstop to provide the most accurate book selection possible
for our Luv 2 Read students! We are diligent about our book selection
and our books are always going to be our
top priority.
</p>
</div>
</div>
</div>
</div>
</div>
);
}
```
## 10. Checkout Book Functionality
Update src/layouts/BookCheckoutPage/BookCheckoutPage.tsx as below:
File: BookCheckoutPage.tsx
```
import { useEffect, useState } from "react";
import BookModel from "../../models/BookModel";
import ReviewModel from "../../models/ReviewModel";
import { SpinnerLoading } from "../Utils/SpinnerLoading";
import { StarsReview } from "../Utils/StarsReview";
import { CheckoutAndReviewBox } from "./CheckoutAndReviewBox";
import { LatestReviews } from "./LatestReviews";
import ReviewRequestModel from "../../models/ReviewRequestModel";
import { useAuth0 } from "@auth0/auth0-react";
export const BookCheckoutPage = () => {
const { isAuthenticated, getAccessTokenSilently } = useAuth0();
const [book, setBook] = useState<BookModel>();
const [isLoading, setIsLoading] = useState(true);
const [httpError, setHttpError] = useState(null);
// Review State
const [reviews, setReviews] = useState<ReviewModel[]>([])
const [totalStars, setTotalStars] = useState(0);
const [isLoadingReview, setIsLoadingReview] = useState(true);
const [isReviewLeft, setIsReviewLeft] = useState(false);
const [isLoadingUserReview, setIsLoadingUserReview] = useState(true);
// Loans Count State
const [currentLoansCount, setCurrentLoansCount] = useState(0);
const [isLoadingCurrentLoansCount, setIsLoadingCurrentLoansCount] = useState(true);
// Is Book Check Out?
const [isCheckedOut, setIsCheckedOut] = useState(false);
const [isLoadingBookCheckedOut, setIsLoadingBookCheckedOut] = useState(true);
const bookId = (window.location.pathname).split('/')[2];
useEffect(() => {
const fetchBook = async () => {
const baseUrl: string = `http://localhost:8080/api/books/${bookId}`;
const response = await fetch(baseUrl);
if (!response.ok) {
throw new Error('Something went wrong!');
}
const responseJson = await response.json();
const loadedBook: BookModel = {
id: responseJson.id,
title: responseJson.title,
author: responseJson.author,
description: responseJson.description,
copies: responseJson.copies,
copiesAvailable: responseJson.copiesAvailable,
category: responseJson.category,
img: responseJson.img,
};
setBook(loadedBook);
setIsLoading(false);
};
fetchBook().catch((error: any) => {
setIsLoading(false);
setHttpError(error.message);
})
}, [getAccessTokenSilently, isCheckedOut, bookId]);
useEffect(() => {
const fetchBookReviews = async () => {
const reviewUrl: string = `http://localhost:8080/api/reviews/search/findByBookId?bookId=${bookId}`;
const responseReviews = await fetch(reviewUrl);
if (!responseReviews.ok) {
throw new Error('Something went wrong!');
}
const responseJsonReviews = await responseReviews.json();
const responseData = responseJsonReviews._embedded.reviews;
const loadedReviews: ReviewModel[] = [];
let weightedStarReviews: number = 0;
for (const key in responseData) {
loadedReviews.push({
id: responseData[key].id,
userEmail: responseData[key].userEmail,
date: responseData[key].date,
rating: responseData[key].rating,
book_id: responseData[key].bookId,
reviewDescription: responseData[key].reviewDescription,
});
weightedStarReviews = weightedStarReviews + responseData[key].rating;
}
if (loadedReviews) {
const round = (Math.round((weightedStarReviews / loadedReviews.length) * 2) / 2).toFixed(1);
setTotalStars(Number(round));
}
setReviews(loadedReviews);
setIsLoadingReview(false);
};
fetchBookReviews().catch((error: any) => {
setIsLoadingReview(false);
setHttpError(error.message);
})
}, [isReviewLeft, bookId]);
useEffect(() => {
const fetchUserReviewBook = async () => {
if (isAuthenticated) {
const accessToken = await getAccessTokenSilently();
const url = `http://localhost:8080/api/reviews/secure/user/book?bookId=${bookId}`;
const requestOptions = {
method: 'GET',
headers: {
Authorization: `Bearer ${accessToken}`,
'Content-Type': 'application/json'
}
};
const userReview = await fetch(url, requestOptions);
if (!userReview.ok) {
throw new Error('Something went wrong');
}
const userReviewResponseJson = await userReview.json();
setIsReviewLeft(userReviewResponseJson);
}
setIsLoadingUserReview(false);
}
fetchUserReviewBook().catch((error: any) => {
setIsLoadingUserReview(false);
setHttpError(error.message);
})
}, [bookId, isAuthenticated, getAccessTokenSilently]);
useEffect(() => {
const fetchUserCurrentLoansCount = async () => {
if (isAuthenticated) {
const accessToken = await getAccessTokenSilently();
const url = `http://localhost:8080/api/books/secure/currentloans/count`;
const requestOptions = {
method: 'GET',
headers: {
Authorization: `Bearer ${accessToken}`,
'Content-Type': 'application/json'
}
};
const currentLoansCountResponse = await fetch(url, requestOptions);
if (!currentLoansCountResponse.ok) {
throw new Error('Something went wrong!');
}
const currentLoansCountResponseJson = await currentLoansCountResponse.json();
setCurrentLoansCount(currentLoansCountResponseJson);
}
setIsLoadingCurrentLoansCount(false);
}
fetchUserCurrentLoansCount().catch((error: any) => {
setIsLoadingCurrentLoansCount(false);
setHttpError(error.message);
})
}, [isAuthenticated, getAccessTokenSilently, isCheckedOut]);
useEffect(() => {
const fetchUserCheckedOutBook = async () => {
if (isAuthenticated) {
const accessToken = await getAccessTokenSilently();
const url = `http://localhost:8080/api/books/secure/ischeckedout/byuser?bookId=${bookId}`;
const requestOptions = {
method: 'GET',
headers: {
Authorization: `Bearer ${accessToken}`,
'Content-Type': 'application/json'
}
};
const bookCheckedOut = await fetch(url, requestOptions);
if (!bookCheckedOut.ok) {
throw new Error('Something went wrong!');
}
const bookCheckedOutResponseJson = await bookCheckedOut.json();
setIsCheckedOut(bookCheckedOutResponseJson);
}
setIsLoadingBookCheckedOut(false);
}
fetchUserCheckedOutBook().catch((error: any) => {
setIsLoadingBookCheckedOut(false);
setHttpError(error.message);
})
}, [bookId, isAuthenticated, getAccessTokenSilently]);
if (isLoading || isLoadingReview || isLoadingCurrentLoansCount || isLoadingBookCheckedOut || isLoadingUserReview) {
return (
<SpinnerLoading />
)
}
if (httpError) {
return (
<div className='container m-5'>
<p>{httpError}</p>
</div>
)
}
async function checkoutBook() {
const accessToken = await getAccessTokenSilently();
const url = `http://localhost:8080/api/books/secure/checkout?bookId=${book?.id}`;
const requestOptions = {
method: 'PUT',
headers: {
Authorization: `Bearer ${accessToken}`,
'Content-Type': 'application/json'
}
};
const checkoutResponse = await fetch(url, requestOptions);
if (!checkoutResponse.ok) {
throw new Error('Something went wrong!');
}
setIsCheckedOut(true);
}
async function submitReview(starInput: number, reviewDescription: string) {
let bookId: number = 0;
if (book?.id) {
bookId = book.id;
}
const reviewRequestModel = new ReviewRequestModel(starInput, bookId, reviewDescription);
const url = `http://localhost:8080/api/reviews/secure`;
const accessToken = await getAccessTokenSilently();
const requestOptions = {
method: 'POST',
headers: {
Authorization: `Bearer ${accessToken}`,
'Content-Type': 'application/json'
},
body: JSON.stringify(reviewRequestModel)
};
const returnResponse = await fetch(url, requestOptions);
if (!returnResponse.ok) {
throw new Error('Something went wrong!');
}
setIsReviewLeft(true);
}
return (
<div>
<div className='container d-none d-lg-block'>
<div className='row mt-5'>
<div className='col-sm-2 col-md-2'>
{book?.img ?
<img src={book?.img} width='226' height='349' alt='Book' />
:
<img src={require('./../../Images/BooksImages/book-luv2code-1000.png')} width='226'
height='349' alt='Book' />
}
</div>
<div className='col-4 col-md-4 container'>
<div className='ml-2'>
<h2>{book?.title}</h2>
<h5 className='text-primary'>{book?.author}</h5>
<p className='lead'>{book?.description}</p>
<StarsReview rating={totalStars} size={32} />
</div>
</div>
<CheckoutAndReviewBox book={book} mobile={false} currentLoansCount={currentLoansCount}
isAuthenticated={isAuthenticated} isCheckedOut={isCheckedOut}
checkoutBook={checkoutBook} isReviewLeft={isReviewLeft} submitReview={submitReview}/>
</div>
<hr />
<LatestReviews reviews={reviews} bookId={book?.id} mobile={false} />
</div>
<div className='container d-lg-none mt-5'>
<div className='d-flex justify-content-center alighn-items-center'>
{book?.img ?
<img src={book?.img} width='226' height='349' alt='Book' />
:
<img src={require('./../../Images/BooksImages/book-luv2code-1000.png')} width='226'
height='349' alt='Book' />
}
</div>
<div className='mt-4'>
<div className='ml-2'>
<h2>{book?.title}</h2>
<h5 className='text-primary'>{book?.author}</h5>
<p className='lead'>{book?.description}</p>
<StarsReview rating={totalStars} size={32} />
</div>
</div>
<CheckoutAndReviewBox book={book} mobile={true} currentLoansCount={currentLoansCount}
isAuthenticated={isAuthenticated} isCheckedOut={isCheckedOut}
checkoutBook={checkoutBook} isReviewLeft={isReviewLeft} submitReview={submitReview}/>
<hr />
<LatestReviews reviews={reviews} bookId={book?.id} mobile={true} />
</div>
</div>
);
}
```
**Follow the same procedure and update authentication details for the below files:**
- src/layouts/HomePage/components/LibraryServices.tsx
- src/layouts/ManageLibraryPage/ManageLibraryPage.tsx
- src/layouts/ManageLibraryPage/components/AddNewBook.tsx
- src/layouts/ManageLibraryPage/components/AdminMessages.tsx
- src/layouts/ManageLibraryPage/components/ChangeQuantityOfBook.tsx
- src/layouts/MessagesPage/components/Messages.tsx
- src/layouts/MessagesPage/components/PostNewMessage.tsx
- src/layouts/ShelfPage/components/HistoryPage.tsx
- src/layouts/ShelfPage/components/Loans.tsx
Example for: src/layouts/ManageLibraryPage/ManageLibraryPage.tsx
```
import { useEffect, useState } from 'react';
import { Redirect } from 'react-router-dom';
import { AddNewBook } from './components/AddNewBook';
import { AdminMessages } from './components/AdminMessages';
import { ChangeQuantityOfBooks } from './components/ChangeQuantityOfBooks';
import { useAuth0 } from '@auth0/auth0-react';
import { SpinnerLoading } from '../Utils/SpinnerLoading';
export const ManageLibraryPage = () => {
const { getIdTokenClaims } = useAuth0();
const [roles, setRoles] = useState<string[] | null>(null); // Set roles to null initially
const [loading, setLoading] = useState(true); // Loading state to handle async data
const [changeQuantityOfBooksClick, setChangeQuantityOfBooksClick] = useState(false);
const [messagesClick, setMessagesClick] = useState(false);
useEffect(() => {
const fetchRoles = async () => {
const claims = await getIdTokenClaims();
const fetchedRoles = claims?.['https://luv2code-react-library.com/roles'] || [];
setRoles(fetchedRoles);
setLoading(false); // Set loading to false once roles are loaded
};
fetchRoles();
}, [getIdTokenClaims]);
function addBookClickFunction() {
setChangeQuantityOfBooksClick(false);
setMessagesClick(false);
}
function changeQuantityOfBooksClickFunction() {
setChangeQuantityOfBooksClick(true);
setMessagesClick(false);
}
function messagesClickFunction() {
setChangeQuantityOfBooksClick(false);
setMessagesClick(true);
}
// Handle loading state
if (loading) {
return (<SpinnerLoading />)
}
if (!roles?.includes('admin')) {
return <Redirect to='/home'/>
}
return (
<div className='container'>
<div className='mt-5'>
<h3>Manage Library</h3>
<nav>
<div className='nav nav-tabs' id='nav-tab' role='tablist'>
<button onClick={addBookClickFunction} className='nav-link active' id='nav-add-book-tab' data-bs-toggle='tab'
data-bs-target='#nav-add-book' type='button' role='tab' aria-controls='nav-add-book'
aria-selected='false'
>
Add new book
</button>
<button onClick={changeQuantityOfBooksClickFunction} className='nav-link' id='nav-quantity-tab' data-bs-toggle='tab'
data-bs-target='#nav-quantity' type='button' role='tab' aria-controls='nav-quantity'
aria-selected='true'
>
Change quantity
</button>
<button onClick={messagesClickFunction} className='nav-link' id='nav-messages-tab' data-bs-toggle='tab'
data-bs-target='#nav-messages' type='button' role='tab' aria-controls='nav-messages'
aria-selected='false'
>
Messages
</button>
</div>
</nav>
<div className='tab-content' id='nav-tabContent'>
<div className='tab-pane fade show active' id='nav-add-book' role='tabpanel'
aria-labelledby='nav-add-book-tab'>
<AddNewBook/>
</div>
<div className='tab-pane fade' id='nav-quantity' role='tabpanel' aria-labelledby='nav-quantity-tab'>
{changeQuantityOfBooksClick ? <ChangeQuantityOfBooks/> : <></>}
</div>
<div className='tab-pane fade' id='nav-messages' role='tabpanel' aria-labelledby='nav-messages-tab'>
{messagesClick ? <AdminMessages/> : <></>}
</div>
</div>
</div>
</div>
);
}
function getIdTokenClaims() {
throw new Error('Function not implemented.');
}
```
## 11. Spring Boot – Backend changes
Spring Boot 3 is required to support Auth0.
### 1. Update pom.xml with Spring Boot 3 dependencies:
File: pom.xml
```
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.0</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.luv2code</groupId>
<artifactId>spring-boot-library</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-boot-library</name>
<description>Spring Boot Application for React</description>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>com.okta.spring</groupId>
<artifactId>okta-spring-boot-starter</artifactId>
<version>3.0.6</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-rest</artifactId>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
```
### 2. Update Application properties with auth0 properties
File: application.properties
```
## issuer url must ends with "/"
okta.oauth2.issuer=https://<< UPDATE-WITH-YOUR-DOMAIN-NAME >/
okta.oauth2.client-id=<< UPDATE-WITH-YOUR-APP-CLIENT-ID >>
okta.oauth2.groupsClaim=https://luv2code-react-library.com/roles
okta.oauth2.audience=http://localhost:8080
```
Example:
```
okta.oauth2.issuer=https://1234567luv2code.us.auth0.com/
okta.oauth2.client-id=abcdefgmAoSMTNAbcdEFgvvLl4ZqU2
okta.oauth2.groupsClaim=https://luv2code-react-library.com/roles
okta.oauth2.audience=http://localhost:8080
```
### 3. Replace javax packages with jakarta
Spring Boot 3 replaces javax package names with jakarta
Search whole project and:
- Replace: `import javax.persistence.*;`
- With: `import jakarta.persistence.*;`
Replace column name with entity property for JPQL
- Replace (in ReviewRepository.java)
`@Query("delete from Review where book\_id in :book\_id")`
- With
`@Query("delete from Review where bookId in :book\_id")`
Replace column name with entity property for JPQL
- Replace(in CheckoutRepository.java)
`@Query("delete from Checkout where book\_id in :book\_id")`
- With
`@Query("delete from Checkout where bookId in :book\_id")`
### 4. Update Security Configuration
File: SecurityConfiguration.java
```
package com.luv2code.springbootlibrary.config;
import com.okta.spring.boot.oauth.Okta;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.web.accept.ContentNegotiationStrategy;
import org.springframework.web.accept.HeaderContentNegotiationStrategy;
import static org.springframework.security.config.Customizer.withDefaults;
@Configuration
public class SecurityConfiguration {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
// Protect endpoints at /api/<type>/secure
http.authorizeHttpRequests(configurer ->
configurer
.requestMatchers("/api/books/secure/**",
"/api/reviews/secure/**",
"/api/messages/secure/**",
"/api/admin/secure/**")
.authenticated().anyRequest().permitAll())
.oauth2Login(withDefaults())
.oauth2ResourceServer((oauth2) -> oauth2.jwt(withDefaults()))
.cors(withDefaults());
// Disable Cross Site Request Forgery
http.csrf(AbstractHttpConfigurer::disable);
// Add content negotiation strategy
http.setSharedObject(ContentNegotiationStrategy.class,
new HeaderContentNegotiationStrategy());
// Force a non-empty response body for 401's to make the response friendly
Okta.configureResourceServer401ResponseBody(http);
return http.build();
}
}
```
### 6. Add JWT changes for all the controllers
File: BookController.java
```
package com.luv2code.springbootlibrary.controller;
import com.luv2code.springbootlibrary.entity.Book;
import com.luv2code.springbootlibrary.responsemodels.ShelfCurrentLoansResponse;
import com.luv2code.springbootlibrary.service.BookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.security.oauth2.jwt.Jwt;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@CrossOrigin("http://localhost:3000")
@RestController
@RequestMapping("/api/books")
public class BookController {
private BookService bookService;
@Autowired
public BookController(BookService bookService) {
this.bookService = bookService;
}
@GetMapping("/secure/currentloans")
public List<ShelfCurrentLoansResponse> currentLoans(@AuthenticationPrincipal Jwt jwt)
throws Exception
{
String userEmail = jwt.getClaim("email");
return bookService.currentLoans(userEmail);
}
@GetMapping("/secure/currentloans/count")
public int currentLoansCount(@AuthenticationPrincipal Jwt jwt) {
String userEmail = jwt.getClaim("email");
return bookService.currentLoansCount(userEmail);
}
@GetMapping("/secure/ischeckedout/byuser")
public Boolean checkoutBookByUser(@AuthenticationPrincipal Jwt jwt,
@RequestParam Long bookId) {
String userEmail = jwt.getClaim("email");
return bookService.checkoutBookByUser(userEmail, bookId);
}
@PutMapping("/secure/checkout")
public Book checkoutBook (@AuthenticationPrincipal Jwt jwt,
@RequestParam Long bookId) throws Exception {
String userEmail = jwt.getClaim("email");
return bookService.checkoutBook(userEmail, bookId);
}
@PutMapping("/secure/return")
public void returnBook(@AuthenticationPrincipal Jwt jwt,
@RequestParam Long bookId) throws Exception {
String userEmail = jwt.getClaim("email");
bookService.returnBook(userEmail, bookId);
}
@PutMapping("/secure/renew/loan")
public void renewLoan(@AuthenticationPrincipal Jwt jwt,
@RequestParam Long bookId) throws Exception {
String userEmail = jwt.getClaim("email");
bookService.renewLoan(userEmail, bookId);
}
}
```
File: MessagesControler.java
```
package com.luv2code.springbootlibrary.controller;
import com.luv2code.springbootlibrary.entity.Message;
import com.luv2code.springbootlibrary.requestmodels.AdminQuestionRequest;
import com.luv2code.springbootlibrary.service.MessagesService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.security.oauth2.jwt.Jwt;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@CrossOrigin("http://localhost:3000")
@RestController
@RequestMapping("/api/messages")
public class MessagesController {
private MessagesService messagesService;
@Autowired
public MessagesController(MessagesService messagesService) {
this.messagesService = messagesService;
}
@PostMapping("/secure/add/message")
public void postMessage(@AuthenticationPrincipal Jwt jwt,
@RequestBody Message messageRequest) {
String userEmail = jwt.getClaim("email");
messagesService.postMessage(messageRequest, userEmail);
}
@PutMapping("/secure/admin/message")
public void putMessage(@AuthenticationPrincipal Jwt jwt,
@RequestBody AdminQuestionRequest adminQuestionRequest) throws Exception {
String userEmail = jwt.getClaim("email");
List<String> roles = jwt.getClaimAsStringList("https://luv2code-react-library.com/roles");
String admin = roles != null && !roles.isEmpty() ? roles.get(0) : null;
if (admin == null || !admin.equals("admin")) {
throw new Exception("Administration page only.");
}
messagesService.putMessage(adminQuestionRequest, userEmail);
}
}
```
File: ReviewController.java
```
package com.luv2code.springbootlibrary.controller;
import com.luv2code.springbootlibrary.requestmodels.ReviewRequest;
import com.luv2code.springbootlibrary.service.ReviewService;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.security.oauth2.jwt.Jwt;
import org.springframework.web.bind.annotation.*;
@CrossOrigin("http://localhost:3000")
@RestController
@RequestMapping("/api/reviews")
public class ReviewController {
private ReviewService reviewService;
public ReviewController (ReviewService reviewService) {
this.reviewService = reviewService;
}
@GetMapping("/secure/user/book")
public Boolean reviewBookByUser(@AuthenticationPrincipal Jwt jwt,
@RequestParam Long bookId) throws Exception {
String userEmail = jwt.getClaim("email");
if (userEmail == null) {
throw new Exception("User email is missing");
}
return reviewService.userReviewListed(userEmail, bookId);
}
@PostMapping("/secure")
public void postReview(@AuthenticationPrincipal Jwt jwt,
@RequestBody ReviewRequest reviewRequest) throws Exception {
String userEmail = jwt.getClaim("email");
if (userEmail == null) {
throw new Exception("User email is missing");
}
reviewService.postReview(userEmail, reviewRequest);
}
}
```
### 7. Admin user need special permission via roles
(Configuration required on auth0 developer account – see the next step)
File: AdminController.java
```
package com.luv2code.springbootlibrary.controller;
import com.luv2code.springbootlibrary.requestmodels.AddBookRequest;
import com.luv2code.springbootlibrary.service.AdminService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.security.oauth2.jwt.Jwt;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@CrossOrigin("http://localhost:3000")
@RestController
@RequestMapping("/api/admin")
public class AdminController {
private AdminService adminService;
@Autowired
public AdminController(AdminService adminService) {
this.adminService = adminService;
}
@PutMapping("/secure/increase/book/quantity")
public void increaseBookQuantity(@AuthenticationPrincipal Jwt jwt,
@RequestParam Long bookId) throws Exception {
List<String> roles = jwt.getClaimAsStringList("https://luv2code-react-library.com/roles");
String admin = roles != null && !roles.isEmpty() ? roles.get(0) : null;
if (admin == null || !admin.equals("admin")) {
throw new Exception("Administration page only");
}
adminService.increaseBookQuantity(bookId);
}
@PutMapping("/secure/decrease/book/quantity")
public void decreaseBookQuantity(@AuthenticationPrincipal Jwt jwt,
@RequestParam Long bookId) throws Exception {
List<String> roles = jwt.getClaimAsStringList("https://luv2code-react-library.com/roles");
String admin = roles != null && !roles.isEmpty() ? roles.get(0) : null;
if (admin == null || !admin.equals("admin")) {
throw new Exception("Administration page only");
}
adminService.decreaseBookQuantity(bookId);
}
@PostMapping("/secure/add/book")
public void postBook(@AuthenticationPrincipal Jwt jwt,
@RequestBody AddBookRequest addBookRequest) throws Exception {
List<String> roles = jwt.getClaimAsStringList("https://luv2code-react-library.com/roles");
String admin = roles != null && !roles.isEmpty() ? roles.get(0) : null;
if (admin == null || !admin.equals("admin")) {
throw new Exception("Administration page only");
}
adminService.postBook(addBookRequest);
}
@DeleteMapping("/secure/delete/book")
public void deleteBook(@AuthenticationPrincipal Jwt jwt,
@RequestParam Long bookId) throws Exception {
List<String> roles = jwt.getClaimAsStringList("https://luv2code-react-library.com/roles");
String admin = roles != null && !roles.isEmpty() ? roles.get(0) : null;
if (admin == null || !admin.equals("admin")) {
throw new Exception("Administration page only");
}
adminService.deleteBook(bookId);
}
}
```
### 12. Add an Admin role
#### Add Custom claim post login
* Select: Actions -> Library -> Create Action -> Build from scratch
* Name: custom-claim-post-login

* Click on Deploy
Add the following code:
```
exports.onExecutePostLogin = async (event, api) => {
const namespace = "https://luv2code-react-library.com";
if (event.authorization) {
api.idToken.setCustomClaim('email', event.user.email);
api.idToken.setCustomClaim(`${namespace}/roles`, event.authorization.roles);
api.accessToken.setCustomClaim(
`${namespace}/roles`,
event.authorization.roles
);
api.accessToken.setCustomClaim('email', event.user.email);
}
};
```


Note: namespace can be anything; But, use the same name to fetch roles in frontend and backend
* Frontend:

* Backend:

## 13. Run the Application
1. Login
2. Sign Up using Email address or use Social Login
3. Verify Member and Orders
4. Logout
================================================
FILE: auth0-security/fullstack-library-app-auth0/01-starter-files/App.css/App.css
================================================
:root{
--mainOpacity: rgba(0, 0, 0, 0.55);
}
.header {
background-image: linear-gradient( rgba(0, 0, 0, 0.7), rgba(0, 0, 0, 0.7) ), url("./Images/PublicImages/image-2.jpg");
opacity: var(--mainOpacity);
height: 25em !important;
}
.dark-overlay {
background-color: rgba(0, 0, 0, 0.35);
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
.main-color {
background-color: #0e76a8 ;
}
.col-image-left {
background-image: url("./Images/PublicImages/image-4.jpg");
height: 25em !important;
}
.col-image-right {
background-image: url("./Images/PublicImages/image-1.jpg");
height: 25em !important;
}
.lost-image {
background-image: url("./Images/PublicImages/image-3.jpg");
height: 25em !important;
width: "720"
}
.homepage-carousel-title {
display: flex !important;
justify-content: center !important;
align-items: center !important;
}
.book-div {
width: 480px;
height: 384px;
}
.inactiveLink {
pointer-events: none;
cursor: default;
}
================================================
FILE: auth0-security/fullstack-library-app-auth0/01-starter-files/Scripts/Payment Script/Payment Script.sql
================================================
DROP TABLE IF EXISTS `payment`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `payment` (
`id` BIGINT(20) NOT NULL AUTO_INCREMENT,
`user_email` VARCHAR(45) DEFAULT NULL,
`amount` DECIMAL (10,2) DEFAULT NULL,
PRIMARY KEY (`id`)
)ENGINE = InnoDB AUTO_INCREMENT = 1 DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;
================================================
FILE: auth0-security/fullstack-library-app-auth0/01-starter-files/Scripts/React-SpringBoot-Add-Books-Script-2.sql
================================================
INSERT INTO `book` VALUES
(2,'Become a Guru in JavaScript','Luv, Lena','Pellentesque varius aliquam lacus quis rhoncus. Nam a dui lectus. Vestibulum libero elit, ultricies sit amet sagittis eu, molestie at velit. Donec tincidunt tempus magna, quis facilisis libero elementum non. Sed velit lacus, laoreet sed augue fermentum, sagittis convallis metus. Sed nec est at massa venenatis aliquet. Donec pretium interdum fringilla. Sed ornare tellus enim, a tincidunt libero dictum vitae. Proin bibendum posuere dui. Donec sagittis neque massa, sed semper nulla vehicula at.', 15, 15, 'FE', 'data:image/png;base64,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
gitextract_cqg26ger/
├── .gitattributes
├── .gitignore
├── LICENSE
├── README.md
├── auth0-security/
│ ├── README.md
│ └── fullstack-library-app-auth0/
│ ├── 01-starter-files/
│ │ ├── App.css/
│ │ │ └── App.css
│ │ ├── Scripts/
│ │ │ ├── Payment Script/
│ │ │ │ └── Payment Script.sql
│ │ │ ├── React-SpringBoot-Add-Books-Script-2.sql
│ │ │ ├── React-SpringBoot-Add-Books-Script-3.sql
│ │ │ ├── React-SpringBoot-Add-Books-Script-4.sql
│ │ │ ├── React-SpringBoot-Add-Books-Script-5.sql
│ │ │ └── React-Springboot-Add-Tables-Script-1.sql
│ │ └── application.properties
│ ├── 02-backend/
│ │ └── spring-boot-library/
│ │ ├── .gitignore
│ │ ├── .mvn/
│ │ │ └── wrapper/
│ │ │ └── maven-wrapper.properties
│ │ ├── mvnw
│ │ ├── mvnw.cmd
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── com/
│ │ │ │ └── luv2code/
│ │ │ │ └── springbootlibrary/
│ │ │ │ ├── SpringBootLibraryApplication.java
│ │ │ │ ├── config/
│ │ │ │ │ ├── MyDataRestConfig.java
│ │ │ │ │ └── SecurityConfiguration.java
│ │ │ │ ├── controller/
│ │ │ │ │ ├── AdminController.java
│ │ │ │ │ ├── BookController.java
│ │ │ │ │ ├── MessagesController.java
│ │ │ │ │ └── ReviewController.java
│ │ │ │ ├── dao/
│ │ │ │ │ ├── BookRepository.java
│ │ │ │ │ ├── CheckoutRepository.java
│ │ │ │ │ ├── HistoryRepository.java
│ │ │ │ │ ├── MessageRepository.java
│ │ │ │ │ └── ReviewRepository.java
│ │ │ │ ├── entity/
│ │ │ │ │ ├── Book.java
│ │ │ │ │ ├── Checkout.java
│ │ │ │ │ ├── History.java
│ │ │ │ │ ├── Message.java
│ │ │ │ │ └── Review.java
│ │ │ │ ├── requestmodels/
│ │ │ │ │ ├── AddBookRequest.java
│ │ │ │ │ ├── AdminQuestionRequest.java
│ │ │ │ │ └── ReviewRequest.java
│ │ │ │ ├── responsemodels/
│ │ │ │ │ └── ShelfCurrentLoansResponse.java
│ │ │ │ └── service/
│ │ │ │ ├── AdminService.java
│ │ │ │ ├── BookService.java
│ │ │ │ ├── MessagesService.java
│ │ │ │ └── ReviewService.java
│ │ │ └── resources/
│ │ │ └── application.properties
│ │ └── test/
│ │ └── java/
│ │ └── com/
│ │ └── luv2code/
│ │ └── springbootlibrary/
│ │ └── SpringBootLibraryApplicationTests.java
│ ├── 03-frontend/
│ │ └── react-library/
│ │ ├── .gitignore
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── public/
│ │ │ ├── index.html
│ │ │ ├── manifest.json
│ │ │ └── robots.txt
│ │ ├── src/
│ │ │ ├── App.css
│ │ │ ├── App.tsx
│ │ │ ├── Auth/
│ │ │ │ └── LoginPage.jsx
│ │ │ ├── index.css
│ │ │ ├── index.tsx
│ │ │ ├── layouts/
│ │ │ │ ├── BookCheckoutPage/
│ │ │ │ │ ├── BookCheckoutPage.tsx
│ │ │ │ │ ├── CheckoutAndReviewBox.tsx
│ │ │ │ │ ├── LatestReviews.tsx
│ │ │ │ │ └── ReviewListPage/
│ │ │ │ │ └── ReviewListPage.tsx
│ │ │ │ ├── HomePage/
│ │ │ │ │ ├── HomePage.tsx
│ │ │ │ │ └── components/
│ │ │ │ │ ├── Carousel.tsx
│ │ │ │ │ ├── ExploreTopBooks.tsx
│ │ │ │ │ ├── Heros.tsx
│ │ │ │ │ ├── LibraryServices.tsx
│ │ │ │ │ └── ReturnBook.tsx
│ │ │ │ ├── ManageLibraryPage/
│ │ │ │ │ ├── ManageLibraryPage.tsx
│ │ │ │ │ └── components/
│ │ │ │ │ ├── AddNewBook.tsx
│ │ │ │ │ ├── AdminMessage.tsx
│ │ │ │ │ ├── AdminMessages.tsx
│ │ │ │ │ ├── ChangeQuantityOfBook.tsx
│ │ │ │ │ └── ChangeQuantityOfBooks.tsx
│ │ │ │ ├── MessagesPage/
│ │ │ │ │ ├── MessagesPage.tsx
│ │ │ │ │ └── components/
│ │ │ │ │ ├── Messages.tsx
│ │ │ │ │ └── PostNewMessage.tsx
│ │ │ │ ├── NavbarAndFooter/
│ │ │ │ │ ├── Footer.tsx
│ │ │ │ │ └── Navbar.tsx
│ │ │ │ ├── SearchBooksPage/
│ │ │ │ │ ├── SearchBooksPage.tsx
│ │ │ │ │ └── components/
│ │ │ │ │ └── SearchBook.tsx
│ │ │ │ ├── ShelfPage/
│ │ │ │ │ ├── ShelfPage.tsx
│ │ │ │ │ └── components/
│ │ │ │ │ ├── HistoryPage.tsx
│ │ │ │ │ ├── Loans.tsx
│ │ │ │ │ └── LoansModal.tsx
│ │ │ │ └── Utils/
│ │ │ │ ├── LeaveAReview.tsx
│ │ │ │ ├── Pagination.tsx
│ │ │ │ ├── Review.tsx
│ │ │ │ ├── SpinnerLoading.tsx
│ │ │ │ └── StarsReview.tsx
│ │ │ ├── lib/
│ │ │ │ └── auth0Config.ts
│ │ │ ├── models/
│ │ │ │ ├── AddBookRequest.ts
│ │ │ │ ├── AdminMessageRequest.ts
│ │ │ │ ├── BookModel.ts
│ │ │ │ ├── HistoryModel.ts
│ │ │ │ ├── MessageModel.ts
│ │ │ │ ├── ReviewModel.ts
│ │ │ │ ├── ReviewRequestModel.ts
│ │ │ │ └── ShelfCurrentLoans.ts
│ │ │ └── react-app-env.d.ts
│ │ └── tsconfig.json
│ └── static-html-css-files/
│ ├── Section 10. Home Page Static Files/
│ │ ├── Carousel.tsx
│ │ ├── ExploreTopBooks.tsx
│ │ ├── Footer.tsx
│ │ ├── Heros.tsx
│ │ ├── LibraryServices.tsx
│ │ ├── Navbar.tsx
│ │ └── ReturnBook.tsx
│ ├── Section 13. Search Books Page Static Files/
│ │ ├── Pagination.tsx
│ │ ├── SearchBook.tsx
│ │ └── SearchBooksPage.tsx
│ ├── Section 15. Book Checkout Static Files/
│ │ ├── BookCheckoutPage.tsx
│ │ ├── CheckoutAndReviewBox.tsx
│ │ └── StarsReview.tsx
│ ├── Section 16. Reviews Static Files/
│ │ ├── LatestReviews.tsx
│ │ └── Review.tsx
│ ├── Section 23. Leave a Review Static Files/
│ │ └── LeaveAReview.tsx
│ ├── Section 24. Review List Page Static Files/
│ │ └── ReviewListPage.tsx
│ ├── Section 25. Shelf Page Static Files/
│ │ ├── Loans.tsx
│ │ ├── LoansModal.tsx
│ │ └── ShelfPage.tsx
│ ├── Section 26. History Page Static Files/
│ │ └── HistoryPage.tsx
│ ├── Section 27. Library Services Static Files/
│ │ ├── Messages.tsx
│ │ ├── MessagesPage.tsx
│ │ └── PostNewMessage.tsx
│ ├── Section 28. Manage Library Services Static Files/
│ │ ├── AdminMessage.tsx
│ │ ├── AdminMessages.tsx
│ │ └── ManageLibraryPage.tsx
│ ├── Section 29. Add new book Static Files/
│ │ └── AddNewBook.tsx
│ └── Section 30. Change Quantity Static Files/
│ ├── ChangeQuantityOfBook.tsx
│ └── ChangeQuantityOfBooks.tsx
├── bonus-content/
│ ├── keytool-steps.md
│ └── openssl-setup.md
├── install-react-tools/
│ ├── linux/
│ │ └── install-linux.md
│ ├── mac/
│ │ └── install-mac.md
│ └── ms-windows/
│ └── install-ms-windows.md
└── source-code/
├── bootstrap-training/
│ ├── 1. Containers/
│ │ └── home.html
│ ├── 10 accordions/
│ │ └── home.html
│ ├── 11. Columns in rows/
│ │ └── home.html
│ ├── 12. Rows and columns/
│ │ └── home.html
│ ├── 13. Tables/
│ │ └── home.html
│ ├── 14. Forms Basic/
│ │ └── home.html
│ ├── 15. Forms/
│ │ └── home.html
│ ├── 16. Modals/
│ │ └── home.html
│ ├── 17. Hide/
│ │ └── home.html
│ ├── 2. Buttons/
│ │ └── home.html
│ ├── 3. Dropdowns/
│ │ └── home.html
│ ├── 4. Cards/
│ │ └── home.html
│ ├── 5. Alerts/
│ │ └── home.html
│ ├── 6. Spinners/
│ │ └── home.html
│ ├── 7. Progress/
│ │ └── home.html
│ ├── 8. Collapse/
│ │ └── home.html
│ └── 9. Navbar/
│ └── home.html
├── fullstack-library-app/
│ ├── 01-starter-files/
│ │ ├── App.css/
│ │ │ └── App.css
│ │ ├── Scripts/
│ │ │ ├── Payment Script/
│ │ │ │ └── Payment Script.sql
│ │ │ ├── React-SpringBoot-Add-Books-Script-2.sql
│ │ │ ├── React-SpringBoot-Add-Books-Script-3.sql
│ │ │ ├── React-SpringBoot-Add-Books-Script-4.sql
│ │ │ ├── React-SpringBoot-Add-Books-Script-5.sql
│ │ │ └── React-Springboot-Add-Tables-Script-1.sql
│ │ └── application.properties
│ ├── 02-backend/
│ │ └── spring-boot-library/
│ │ └── spring-boot-library/
│ │ ├── .gitignore
│ │ ├── .mvn/
│ │ │ └── wrapper/
│ │ │ └── maven-wrapper.properties
│ │ ├── mvnw
│ │ ├── mvnw.cmd
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── com/
│ │ │ │ └── luv2code/
│ │ │ │ └── springbootlibrary/
│ │ │ │ ├── SpringBootLibraryApplication.java
│ │ │ │ ├── config/
│ │ │ │ │ ├── MyDataRestConfig.java
│ │ │ │ │ └── SecurityConfiguration.java
│ │ │ │ ├── controller/
│ │ │ │ │ ├── AdminController.java
│ │ │ │ │ ├── BookController.java
│ │ │ │ │ ├── MessagesController.java
│ │ │ │ │ └── ReviewController.java
│ │ │ │ ├── dao/
│ │ │ │ │ ├── BookRepository.java
│ │ │ │ │ ├── CheckoutRepository.java
│ │ │ │ │ ├── HistoryRepository.java
│ │ │ │ │ ├── MessageRepository.java
│ │ │ │ │ └── ReviewRepository.java
│ │ │ │ ├── entity/
│ │ │ │ │ ├── Book.java
│ │ │ │ │ ├── Checkout.java
│ │ │ │ │ ├── History.java
│ │ │ │ │ ├── Message.java
│ │ │ │ │ └── Review.java
│ │ │ │ ├── requestmodels/
│ │ │ │ │ ├── AddBookRequest.java
│ │ │ │ │ ├── AdminQuestionRequest.java
│ │ │ │ │ └── ReviewRequest.java
│ │ │ │ ├── responsemodels/
│ │ │ │ │ └── ShelfCurrentLoansResponse.java
│ │ │ │ ├── service/
│ │ │ │ │ ├── AdminService.java
│ │ │ │ │ ├── BookService.java
│ │ │ │ │ ├── MessagesService.java
│ │ │ │ │ └── ReviewService.java
│ │ │ │ └── utils/
│ │ │ │ └── ExtractJWT.java
│ │ │ └── resources/
│ │ │ └── application.properties
│ │ └── test/
│ │ └── java/
│ │ └── com/
│ │ └── luv2code/
│ │ └── springbootlibrary/
│ │ └── SpringBootLibraryApplicationTests.java
│ ├── 03-frontend/
│ │ └── react-library/
│ │ ├── .gitignore
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── public/
│ │ │ ├── index.html
│ │ │ ├── manifest.json
│ │ │ └── robots.txt
│ │ ├── src/
│ │ │ ├── App.css
│ │ │ ├── App.tsx
│ │ │ ├── Auth/
│ │ │ │ ├── LoginWidget.jsx
│ │ │ │ └── OktaSignInWidget.jsx
│ │ │ ├── index.css
│ │ │ ├── index.tsx
│ │ │ ├── layouts/
│ │ │ │ ├── BookCheckoutPage/
│ │ │ │ │ ├── BookCheckoutPage.tsx
│ │ │ │ │ ├── CheckoutAndReviewBox.tsx
│ │ │ │ │ ├── LatestReviews.tsx
│ │ │ │ │ └── ReviewListPage/
│ │ │ │ │ └── ReviewListPage.tsx
│ │ │ │ ├── HomePage/
│ │ │ │ │ ├── HomePage.tsx
│ │ │ │ │ └── components/
│ │ │ │ │ ├── Carousel.tsx
│ │ │ │ │ ├── ExploreTopBooks.tsx
│ │ │ │ │ ├── Heros.tsx
│ │ │ │ │ ├── LibraryServices.tsx
│ │ │ │ │ └── ReturnBook.tsx
│ │ │ │ ├── ManageLibraryPage/
│ │ │ │ │ ├── ManageLibraryPage.tsx
│ │ │ │ │ └── components/
│ │ │ │ │ ├── AddNewBook.tsx
│ │ │ │ │ ├── AdminMessage.tsx
│ │ │ │ │ ├── AdminMessages.tsx
│ │ │ │ │ ├── ChangeQuantityOfBook.tsx
│ │ │ │ │ └── ChangeQuantityOfBooks.tsx
│ │ │ │ ├── MessagesPage/
│ │ │ │ │ ├── MessagesPage.tsx
│ │ │ │ │ └── components/
│ │ │ │ │ ├── Messages.tsx
│ │ │ │ │ └── PostNewMessage.tsx
│ │ │ │ ├── NavbarAndFooter/
│ │ │ │ │ ├── Footer.tsx
│ │ │ │ │ └── Navbar.tsx
│ │ │ │ ├── SearchBooksPage/
│ │ │ │ │ ├── SearchBooksPage.tsx
│ │ │ │ │ └── components/
│ │ │ │ │ └── SearchBook.tsx
│ │ │ │ ├── ShelfPage/
│ │ │ │ │ ├── ShelfPage.tsx
│ │ │ │ │ └── components/
│ │ │ │ │ ├── HistoryPage.tsx
│ │ │ │ │ ├── Loans.tsx
│ │ │ │ │ └── LoansModal.tsx
│ │ │ │ └── Utils/
│ │ │ │ ├── LeaveAReview.tsx
│ │ │ │ ├── Pagination.tsx
│ │ │ │ ├── Review.tsx
│ │ │ │ ├── SpinnerLoading.tsx
│ │ │ │ └── StarsReview.tsx
│ │ │ ├── lib/
│ │ │ │ └── oktaConfig.ts
│ │ │ ├── models/
│ │ │ │ ├── AddBookRequest.ts
│ │ │ │ ├── AdminMessageRequest.ts
│ │ │ │ ├── BookModel.ts
│ │ │ │ ├── HistoryModel.ts
│ │ │ │ ├── MessageModel.ts
│ │ │ │ ├── ReviewModel.ts
│ │ │ │ ├── ReviewRequestModel.ts
│ │ │ │ └── ShelfCurrentLoans.ts
│ │ │ └── react-app-env.d.ts
│ │ └── tsconfig.json
│ └── static-html-css-files/
│ ├── Section 10. Home Page Static Files/
│ │ ├── Carousel.tsx
│ │ ├── ExploreTopBooks.tsx
│ │ ├── Footer.tsx
│ │ ├── Heros.tsx
│ │ ├── LibraryServices.tsx
│ │ ├── Navbar.tsx
│ │ └── ReturnBook.tsx
│ ├── Section 13. Search Books Page Static Files/
│ │ ├── Pagination.tsx
│ │ ├── SearchBook.tsx
│ │ └── SearchBooksPage.tsx
│ ├── Section 15. Book Checkout Static Files/
│ │ ├── BookCheckoutPage.tsx
│ │ ├── CheckoutAndReviewBox.tsx
│ │ └── StarsReview.tsx
│ ├── Section 16. Reviews Static Files/
│ │ ├── LatestReviews.tsx
│ │ └── Review.tsx
│ ├── Section 23. Leave a Review Static Files/
│ │ └── LeaveAReview.tsx
│ ├── Section 24. Review List Page Static Files/
│ │ └── ReviewListPage.tsx
│ ├── Section 25. Shelf Page Static Files/
│ │ ├── Loans.tsx
│ │ ├── LoansModal.tsx
│ │ └── ShelfPage.tsx
│ ├── Section 26. History Page Static Files/
│ │ └── HistoryPage.tsx
│ ├── Section 27. Library Services Static Files/
│ │ ├── Messages.tsx
│ │ ├── MessagesPage.tsx
│ │ └── PostNewMessage.tsx
│ ├── Section 28. Manage Library Services Static Files/
│ │ ├── AdminMessage.tsx
│ │ ├── AdminMessages.tsx
│ │ └── ManageLibraryPage.tsx
│ ├── Section 29. Add new book Static Files/
│ │ └── AddNewBook.tsx
│ └── Section 30. Change Quantity Static Files/
│ ├── ChangeQuantityOfBook.tsx
│ └── ChangeQuantityOfBooks.tsx
├── fullstack-library-app-https/
│ ├── 02-backend/
│ │ └── spring-boot-library/
│ │ └── spring-boot-library/
│ │ ├── .gitignore
│ │ ├── .mvn/
│ │ │ └── wrapper/
│ │ │ └── maven-wrapper.properties
│ │ ├── mvnw
│ │ ├── mvnw.cmd
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── com/
│ │ │ │ └── luv2code/
│ │ │ │ └── springbootlibrary/
│ │ │ │ ├── SpringBootLibraryApplication.java
│ │ │ │ ├── config/
│ │ │ │ │ ├── MyDataRestConfig.java
│ │ │ │ │ └── SecurityConfiguration.java
│ │ │ │ ├── controller/
│ │ │ │ │ ├── AdminController.java
│ │ │ │ │ ├── BookController.java
│ │ │ │ │ ├── MessagesController.java
│ │ │ │ │ ├── PaymentController.java
│ │ │ │ │ └── ReviewController.java
│ │ │ │ ├── dao/
│ │ │ │ │ ├── BookRepository.java
│ │ │ │ │ ├── CheckoutRepository.java
│ │ │ │ │ ├── HistoryRepository.java
│ │ │ │ │ ├── MessageRepository.java
│ │ │ │ │ ├── PaymentRepository.java
│ │ │ │ │ └── ReviewRepository.java
│ │ │ │ ├── entity/
│ │ │ │ │ ├── Book.java
│ │ │ │ │ ├── Checkout.java
│ │ │ │ │ ├── History.java
│ │ │ │ │ ├── Message.java
│ │ │ │ │ ├── Payment.java
│ │ │ │ │ └── Review.java
│ │ │ │ ├── requestmodels/
│ │ │ │ │ ├── AddBookRequest.java
│ │ │ │ │ ├── AdminQuestionRequest.java
│ │ │ │ │ ├── PaymentInfoRequest.java
│ │ │ │ │ └── ReviewRequest.java
│ │ │ │ ├── responsemodels/
│ │ │ │ │ └── ShelfCurrentLoansResponse.java
│ │ │ │ ├── service/
│ │ │ │ │ ├── AdminService.java
│ │ │ │ │ ├── BookService.java
│ │ │ │ │ ├── MessagesService.java
│ │ │ │ │ ├── PaymentService.java
│ │ │ │ │ └── ReviewService.java
│ │ │ │ └── utils/
│ │ │ │ └── ExtractJWT.java
│ │ │ └── resources/
│ │ │ ├── application.properties
│ │ │ └── luv2code-keystore.p12
│ │ └── test/
│ │ └── java/
│ │ └── com/
│ │ └── luv2code/
│ │ └── springbootlibrary/
│ │ └── SpringBootLibraryApplicationTests.java
│ └── 03-frontend/
│ └── react-library/
│ ├── .gitignore
│ ├── README.md
│ ├── localhost.conf
│ ├── package.json
│ ├── public/
│ │ ├── index.html
│ │ ├── manifest.json
│ │ └── robots.txt
│ ├── src/
│ │ ├── App.css
│ │ ├── App.tsx
│ │ ├── Auth/
│ │ │ ├── LoginWidget.jsx
│ │ │ └── OktaSignInWidget.jsx
│ │ ├── index.css
│ │ ├── index.tsx
│ │ ├── layouts/
│ │ │ ├── BookCheckoutPage/
│ │ │ │ ├── BookCheckoutPage.tsx
│ │ │ │ ├── CheckoutAndReviewBox.tsx
│ │ │ │ ├── LatestReviews.tsx
│ │ │ │ └── ReviewListPage/
│ │ │ │ └── ReviewListPage.tsx
│ │ │ ├── HomePage/
│ │ │ │ ├── HomePage.tsx
│ │ │ │ └── components/
│ │ │ │ ├── Carousel.tsx
│ │ │ │ ├── ExploreTopBooks.tsx
│ │ │ │ ├── Heros.tsx
│ │ │ │ ├── LibraryServices.tsx
│ │ │ │ └── ReturnBook.tsx
│ │ │ ├── ManageLibraryPage/
│ │ │ │ ├── ManageLibraryPage.tsx
│ │ │ │ └── components/
│ │ │ │ ├── AddNewBook.tsx
│ │ │ │ ├── AdminMessage.tsx
│ │ │ │ ├── AdminMessages.tsx
│ │ │ │ ├── ChangeQuantityOfBook.tsx
│ │ │ │ └── ChangeQuantityOfBooks.tsx
│ │ │ ├── MessagesPage/
│ │ │ │ ├── MessagesPage.tsx
│ │ │ │ └── components/
│ │ │ │ ├── Messages.tsx
│ │ │ │ └── PostNewMessage.tsx
│ │ │ ├── NavbarAndFooter/
│ │ │ │ ├── Footer.tsx
│ │ │ │ └── Navbar.tsx
│ │ │ ├── PaymentPage/
│ │ │ │ └── PaymentPage.tsx
│ │ │ ├── SearchBooksPage/
│ │ │ │ ├── SearchBooksPage.tsx
│ │ │ │ └── components/
│ │ │ │ └── SearchBook.tsx
│ │ │ ├── ShelfPage/
│ │ │ │ ├── ShelfPage.tsx
│ │ │ │ └── components/
│ │ │ │ ├── HistoryPage.tsx
│ │ │ │ ├── Loans.tsx
│ │ │ │ └── LoansModal.tsx
│ │ │ └── Utils/
│ │ │ ├── LeaveAReview.tsx
│ │ │ ├── Pagination.tsx
│ │ │ ├── Review.tsx
│ │ │ ├── SpinnerLoading.tsx
│ │ │ └── StarsReview.tsx
│ │ ├── lib/
│ │ │ └── oktaConfig.ts
│ │ ├── models/
│ │ │ ├── AddBookRequest.ts
│ │ │ ├── AdminMessageRequest.ts
│ │ │ ├── BookModel.ts
│ │ │ ├── HistoryModel.ts
│ │ │ ├── MessageModel.ts
│ │ │ ├── PaymentInfoRequest.ts
│ │ │ ├── ReviewModel.ts
│ │ │ ├── ReviewRequestModel.ts
│ │ │ └── ShelfCurrentLoans.ts
│ │ └── react-app-env.d.ts
│ ├── ssl-localhost/
│ │ ├── localhost.crt
│ │ └── localhost.key
│ └── tsconfig.json
├── react-overview-todo-project/
│ ├── ReactJS/
│ │ ├── .gitignore
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── public/
│ │ │ ├── index.html
│ │ │ ├── manifest.json
│ │ │ └── robots.txt
│ │ └── src/
│ │ ├── App.css
│ │ ├── App.js
│ │ ├── App.test.js
│ │ ├── components/
│ │ │ ├── NewTodoForm.js
│ │ │ ├── TodoRowItem.js
│ │ │ └── TodoTable.js
│ │ ├── index.css
│ │ ├── index.js
│ │ ├── reportWebVitals.js
│ │ └── setupTests.js
│ └── ReactTS/
│ ├── .gitignore
│ ├── README.md
│ ├── package.json
│ ├── public/
│ │ ├── index.html
│ │ ├── manifest.json
│ │ └── robots.txt
│ ├── src/
│ │ ├── App.css
│ │ ├── App.tsx
│ │ ├── components/
│ │ │ ├── NewTodoForm.tsx
│ │ │ ├── TodoRowItem.tsx
│ │ │ └── TodoTable.tsx
│ │ ├── index.css
│ │ ├── index.tsx
│ │ └── models/
│ │ └── TodoModel.ts
│ └── tsconfig.json
└── typescript-training/
├── 01-helloworld/
│ └── myhelloworld.ts
├── 02-variables/
│ └── sample-types.ts
├── 03-loops-and-arrays/
│ ├── growable-arrays.ts
│ ├── loops.ts
│ ├── reviews.ts
│ └── sports.ts
├── 04-classes/
│ ├── 01-class-definition/
│ │ └── Customer.ts
│ ├── 02-access-modifiers/
│ │ └── Customer.ts
│ ├── 03-tsconfig/
│ │ ├── Customer.ts
│ │ └── tsconfig.json
│ ├── 04-parameter-properties/
│ │ ├── Customer.ts
│ │ └── tsconfig.json
│ └── 05-modules/
│ ├── Customer.ts
│ ├── Driver.ts
│ └── tsconfig.json
├── 05-inheritance/
│ ├── ArrayDriver.ts
│ ├── Circle.ts
│ ├── Driver.ts
│ ├── Rectangle.ts
│ ├── Shape.ts
│ └── tsconfig.json
├── 06-abstract-classes/
│ ├── ArrayDriver.ts
│ ├── Circle.ts
│ ├── Rectangle.ts
│ ├── Shape.ts
│ └── tsconfig.json
└── 07-interfaces/
├── Coach.ts
├── CricketCoach.ts
├── Driver.ts
├── GolfCoach.ts
└── tsconfig.json
SYMBOL INDEX (477 symbols across 168 files)
FILE: auth0-security/fullstack-library-app-auth0/01-starter-files/Scripts/Payment Script/Payment Script.sql
type `payment` (line 4) | CREATE TABLE `payment` (
FILE: auth0-security/fullstack-library-app-auth0/01-starter-files/Scripts/React-Springboot-Add-Tables-Script-1.sql
type `book` (line 19) | CREATE TABLE `book` (
type `review` (line 39) | CREATE TABLE `review` (
type `checkout` (line 59) | CREATE TABLE `checkout` (
type `messages` (line 79) | CREATE TABLE `messages` (
type `history` (line 99) | CREATE TABLE `history` (
FILE: auth0-security/fullstack-library-app-auth0/02-backend/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/SpringBootLibraryApplication.java
class SpringBootLibraryApplication (line 6) | @SpringBootApplication
method main (line 9) | public static void main(String[] args) {
FILE: auth0-security/fullstack-library-app-auth0/02-backend/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/config/MyDataRestConfig.java
class MyDataRestConfig (line 12) | @Configuration
method configureRepositoryRestConfiguration (line 17) | @Override
method disableHttpMethods (line 39) | private void disableHttpMethods(Class theClass,
FILE: auth0-security/fullstack-library-app-auth0/02-backend/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/config/SecurityConfiguration.java
class SecurityConfiguration (line 14) | @Configuration
method filterChain (line 17) | @Bean
FILE: auth0-security/fullstack-library-app-auth0/02-backend/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/controller/AdminController.java
class AdminController (line 12) | @CrossOrigin("http://localhost:3000")
method AdminController (line 19) | @Autowired
method increaseBookQuantity (line 24) | @PutMapping("/secure/increase/book/quantity")
method decreaseBookQuantity (line 36) | @PutMapping("/secure/decrease/book/quantity")
method postBook (line 48) | @PostMapping("/secure/add/book")
method deleteBook (line 60) | @DeleteMapping("/secure/delete/book")
FILE: auth0-security/fullstack-library-app-auth0/02-backend/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/controller/BookController.java
class BookController (line 13) | @CrossOrigin("http://localhost:3000")
method BookController (line 20) | @Autowired
method currentLoans (line 25) | @GetMapping("/secure/currentloans")
method currentLoansCount (line 33) | @GetMapping("/secure/currentloans/count")
method checkoutBookByUser (line 39) | @GetMapping("/secure/ischeckedout/byuser")
method checkoutBook (line 46) | @PutMapping("/secure/checkout")
method returnBook (line 53) | @PutMapping("/secure/return")
method renewLoan (line 60) | @PutMapping("/secure/renew/loan")
FILE: auth0-security/fullstack-library-app-auth0/02-backend/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/controller/MessagesController.java
class MessagesController (line 13) | @CrossOrigin("http://localhost:3000")
method MessagesController (line 20) | @Autowired
method postMessage (line 25) | @PostMapping("/secure/add/message")
method putMessage (line 32) | @PutMapping("/secure/admin/message")
FILE: auth0-security/fullstack-library-app-auth0/02-backend/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/controller/ReviewController.java
class ReviewController (line 9) | @CrossOrigin("http://localhost:3000")
method ReviewController (line 16) | public ReviewController (ReviewService reviewService) {
method reviewBookByUser (line 20) | @GetMapping("/secure/user/book")
method postReview (line 31) | @PostMapping("/secure")
FILE: auth0-security/fullstack-library-app-auth0/02-backend/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/dao/BookRepository.java
type BookRepository (line 13) | public interface BookRepository extends JpaRepository<Book, Long> {
method findByTitleContaining (line 15) | Page<Book> findByTitleContaining(@RequestParam("title") String title, ...
method findByCategory (line 17) | Page<Book> findByCategory(@RequestParam("category") String category, P...
method findBooksByBookIds (line 19) | @Query("select o from Book o where id in :book_ids")
FILE: auth0-security/fullstack-library-app-auth0/02-backend/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/dao/CheckoutRepository.java
type CheckoutRepository (line 11) | public interface CheckoutRepository extends JpaRepository<Checkout, Long> {
method findByUserEmailAndBookId (line 13) | Checkout findByUserEmailAndBookId(String userEmail, Long bookId);
method findBooksByUserEmail (line 15) | List<Checkout> findBooksByUserEmail(String userEmail);
method deleteAllByBookId (line 17) | @Modifying
FILE: auth0-security/fullstack-library-app-auth0/02-backend/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/dao/HistoryRepository.java
type HistoryRepository (line 9) | public interface HistoryRepository extends JpaRepository<History, Long> {
method findBooksByUserEmail (line 10) | Page<History> findBooksByUserEmail(@RequestParam("email") String userE...
FILE: auth0-security/fullstack-library-app-auth0/02-backend/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/dao/MessageRepository.java
type MessageRepository (line 9) | public interface MessageRepository extends JpaRepository<Message, Long> {
method findByUserEmail (line 11) | Page<Message> findByUserEmail(@RequestParam("user_email") String userE...
method findByClosed (line 13) | Page<Message> findByClosed(@RequestParam("closed") boolean closed, Pag...
FILE: auth0-security/fullstack-library-app-auth0/02-backend/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/dao/ReviewRepository.java
type ReviewRepository (line 12) | public interface ReviewRepository extends JpaRepository<Review, Long> {
method findByBookId (line 14) | Page<Review> findByBookId(@RequestParam("book_id") Long bookId,
method findByUserEmailAndBookId (line 17) | Review findByUserEmailAndBookId(String userEmail, Long bookId);
method deleteAllByBookId (line 19) | @Modifying
FILE: auth0-security/fullstack-library-app-auth0/02-backend/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/entity/Book.java
class Book (line 6) | @Entity
FILE: auth0-security/fullstack-library-app-auth0/02-backend/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/entity/Checkout.java
class Checkout (line 7) | @Entity
method Checkout (line 12) | public Checkout() {}
method Checkout (line 14) | public Checkout(String userEmail, String checkoutDate, String returnDa...
FILE: auth0-security/fullstack-library-app-auth0/02-backend/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/entity/History.java
class History (line 7) | @Entity
method History (line 12) | public History(){}
method History (line 14) | public History(String userEmail, String checkoutDate, String returnedD...
FILE: auth0-security/fullstack-library-app-auth0/02-backend/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/entity/Message.java
class Message (line 8) | @Entity
method Message (line 13) | public Message(){}
method Message (line 15) | public Message(String title, String question) {
FILE: auth0-security/fullstack-library-app-auth0/02-backend/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/entity/Review.java
class Review (line 8) | @Entity
FILE: auth0-security/fullstack-library-app-auth0/02-backend/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/requestmodels/AddBookRequest.java
class AddBookRequest (line 5) | @Data
FILE: auth0-security/fullstack-library-app-auth0/02-backend/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/requestmodels/AdminQuestionRequest.java
class AdminQuestionRequest (line 5) | @Data
FILE: auth0-security/fullstack-library-app-auth0/02-backend/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/requestmodels/ReviewRequest.java
class ReviewRequest (line 7) | @Data
FILE: auth0-security/fullstack-library-app-auth0/02-backend/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/responsemodels/ShelfCurrentLoansResponse.java
class ShelfCurrentLoansResponse (line 6) | @Data
method ShelfCurrentLoansResponse (line 9) | public ShelfCurrentLoansResponse(Book book, int daysLeft) {
FILE: auth0-security/fullstack-library-app-auth0/02-backend/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/service/AdminService.java
class AdminService (line 14) | @Service
method AdminService (line 22) | @Autowired
method increaseBookQuantity (line 31) | public void increaseBookQuantity(Long bookId) throws Exception {
method decreaseBookQuantity (line 45) | public void decreaseBookQuantity(Long bookId) throws Exception {
method postBook (line 59) | public void postBook(AddBookRequest addBookRequest) {
method deleteBook (line 71) | public void deleteBook(Long bookId) throws Exception {
FILE: auth0-security/fullstack-library-app-auth0/02-backend/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/service/BookService.java
class BookService (line 22) | @Service
method BookService (line 32) | public BookService(BookRepository bookRepository, CheckoutRepository c...
method checkoutBook (line 39) | public Book checkoutBook (String userEmail, Long bookId) throws Except...
method checkoutBookByUser (line 64) | public Boolean checkoutBookByUser(String userEmail, Long bookId) {
method currentLoansCount (line 73) | public int currentLoansCount(String userEmail) {
method currentLoans (line 77) | public List<ShelfCurrentLoansResponse> currentLoans(String userEmail) ...
method returnBook (line 112) | public void returnBook (String userEmail, Long bookId) throws Exception {
method renewLoan (line 140) | public void renewLoan(String userEmail, Long bookId) throws Exception {
FILE: auth0-security/fullstack-library-app-auth0/02-backend/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/service/MessagesService.java
class MessagesService (line 12) | @Service
method MessagesService (line 18) | @Autowired
method postMessage (line 23) | public void postMessage(Message messageRequest, String userEmail) {
method putMessage (line 29) | public void putMessage(AdminQuestionRequest adminQuestionRequest, Stri...
FILE: auth0-security/fullstack-library-app-auth0/02-backend/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/service/ReviewService.java
class ReviewService (line 14) | @Service
method ReviewService (line 20) | @Autowired
method postReview (line 25) | public void postReview(String userEmail, ReviewRequest reviewRequest) ...
method userReviewListed (line 44) | public Boolean userReviewListed(String userEmail, Long bookId) {
FILE: auth0-security/fullstack-library-app-auth0/02-backend/spring-boot-library/src/test/java/com/luv2code/springbootlibrary/SpringBootLibraryApplicationTests.java
class SpringBootLibraryApplicationTests (line 6) | @SpringBootTest
method contextLoads (line 9) | @Test
FILE: auth0-security/fullstack-library-app-auth0/03-frontend/react-library/src/layouts/BookCheckoutPage/BookCheckoutPage.tsx
function checkoutBook (line 216) | async function checkoutBook() {
function submitReview (line 235) | async function submitReview(starInput: number, reviewDescription: string) {
FILE: auth0-security/fullstack-library-app-auth0/03-frontend/react-library/src/layouts/BookCheckoutPage/CheckoutAndReviewBox.tsx
function buttonRender (line 9) | function buttonRender() {
function reviewRender (line 22) | function reviewRender() {
FILE: auth0-security/fullstack-library-app-auth0/03-frontend/react-library/src/layouts/ManageLibraryPage/ManageLibraryPage.tsx
function addBookClickFunction (line 30) | function addBookClickFunction() {
function changeQuantityOfBooksClickFunction (line 35) | function changeQuantityOfBooksClickFunction() {
function messagesClickFunction (line 40) | function messagesClickFunction() {
FILE: auth0-security/fullstack-library-app-auth0/03-frontend/react-library/src/layouts/ManageLibraryPage/components/AddNewBook.tsx
function categoryField (line 21) | function categoryField(value: string) {
function base64ConversionForImages (line 25) | async function base64ConversionForImages(e: any) {
function getBase64 (line 31) | function getBase64(file: any) {
function submitNewBook (line 42) | async function submitNewBook() {
FILE: auth0-security/fullstack-library-app-auth0/03-frontend/react-library/src/layouts/ManageLibraryPage/components/AdminMessage.tsx
function submitBtn (line 10) | function submitBtn() {
FILE: auth0-security/fullstack-library-app-auth0/03-frontend/react-library/src/layouts/ManageLibraryPage/components/AdminMessages.tsx
function submitResponseToQuestion (line 73) | async function submitResponseToQuestion(id: number, response: string) {
FILE: auth0-security/fullstack-library-app-auth0/03-frontend/react-library/src/layouts/ManageLibraryPage/components/ChangeQuantityOfBook.tsx
function increaseQuantity (line 19) | async function increaseQuantity() {
function decreaseQuantity (line 38) | async function decreaseQuantity() {
function deleteBook (line 57) | async function deleteBook() {
FILE: auth0-security/fullstack-library-app-auth0/03-frontend/react-library/src/layouts/MessagesPage/components/PostNewMessage.tsx
function submitNewQuestion (line 13) | async function submitNewQuestion() {
FILE: auth0-security/fullstack-library-app-auth0/03-frontend/react-library/src/layouts/ShelfPage/components/Loans.tsx
function returnBook (line 62) | async function returnBook(bookId: number) {
function renewLoan (line 79) | async function renewLoan(bookId: number) {
FILE: auth0-security/fullstack-library-app-auth0/03-frontend/react-library/src/layouts/Utils/LeaveAReview.tsx
function starValue (line 10) | function starValue(value: number) {
FILE: auth0-security/fullstack-library-app-auth0/03-frontend/react-library/src/models/AddBookRequest.ts
class AddBookRequest (line 1) | class AddBookRequest {
method constructor (line 9) | constructor(title: string, author: string, description: string, copies...
FILE: auth0-security/fullstack-library-app-auth0/03-frontend/react-library/src/models/AdminMessageRequest.ts
class AdminMessageRequest (line 1) | class AdminMessageRequest {
method constructor (line 5) | constructor(id: number, response: string) {
FILE: auth0-security/fullstack-library-app-auth0/03-frontend/react-library/src/models/BookModel.ts
class BookModel (line 1) | class BookModel {
method constructor (line 11) | constructor (id: number, title: string, author: string, description: s...
FILE: auth0-security/fullstack-library-app-auth0/03-frontend/react-library/src/models/HistoryModel.ts
class HistoryModel (line 1) | class HistoryModel {
method constructor (line 11) | constructor(id: number, userEmail: string, checkoutDate: string, retur...
FILE: auth0-security/fullstack-library-app-auth0/03-frontend/react-library/src/models/MessageModel.ts
class MessageModel (line 1) | class MessageModel {
method constructor (line 10) | constructor(title: string, question: string) {
FILE: auth0-security/fullstack-library-app-auth0/03-frontend/react-library/src/models/ReviewModel.ts
class ReviewModel (line 1) | class ReviewModel {
method constructor (line 9) | constructor(id: number, userEmail: string, date: string,
FILE: auth0-security/fullstack-library-app-auth0/03-frontend/react-library/src/models/ReviewRequestModel.ts
class ReviewRequestModel (line 1) | class ReviewRequestModel {
method constructor (line 6) | constructor(rating: number, bookId: number, reviewDescription: string) {
FILE: auth0-security/fullstack-library-app-auth0/03-frontend/react-library/src/models/ShelfCurrentLoans.ts
class ShelfCurrentLoans (line 3) | class ShelfCurrentLoans {
method constructor (line 7) | constructor(book: BookModel, daysLeft: number) {
FILE: auth0-security/fullstack-library-app-auth0/static-html-css-files/Section 23. Leave a Review Static Files/LeaveAReview.tsx
function starValue (line 8) | function starValue(value: number) {
FILE: auth0-security/fullstack-library-app-auth0/static-html-css-files/Section 29. Add new book Static Files/AddNewBook.tsx
function categoryField (line 20) | function categoryField(value: string) {
FILE: source-code/fullstack-library-app-https/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/SpringBootLibraryApplication.java
class SpringBootLibraryApplication (line 6) | @SpringBootApplication
method main (line 9) | public static void main(String[] args) {
FILE: source-code/fullstack-library-app-https/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/config/MyDataRestConfig.java
class MyDataRestConfig (line 12) | @Configuration
method configureRepositoryRestConfiguration (line 17) | @Override
method disableHttpMethods (line 39) | private void disableHttpMethods(Class theClass,
FILE: source-code/fullstack-library-app-https/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/config/SecurityConfiguration.java
class SecurityConfiguration (line 11) | @Configuration
method filterChain (line 14) | @Bean
FILE: source-code/fullstack-library-app-https/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/controller/AdminController.java
class AdminController (line 9) | @CrossOrigin("https://localhost:3000")
method AdminController (line 16) | @Autowired
method increaseBookQuantity (line 21) | @PutMapping("/secure/increase/book/quantity")
method decreaseBookQuantity (line 31) | @PutMapping("/secure/decrease/book/quantity")
method postBook (line 41) | @PostMapping("/secure/add/book")
method deleteBook (line 51) | @DeleteMapping("/secure/delete/book")
FILE: source-code/fullstack-library-app-https/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/controller/BookController.java
class BookController (line 12) | @CrossOrigin("https://localhost:3000")
method BookController (line 19) | @Autowired
method currentLoans (line 24) | @GetMapping("/secure/currentloans")
method currentLoansCount (line 32) | @GetMapping("/secure/currentloans/count")
method checkoutBookByUser (line 38) | @GetMapping("/secure/ischeckedout/byuser")
method checkoutBook (line 45) | @PutMapping("/secure/checkout")
method returnBook (line 52) | @PutMapping("/secure/return")
method renewLoan (line 59) | @PutMapping("/secure/renew/loan")
FILE: source-code/fullstack-library-app-https/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/controller/MessagesController.java
class MessagesController (line 10) | @CrossOrigin("https://localhost:3000")
method MessagesController (line 17) | @Autowired
method postMessage (line 22) | @PostMapping("/secure/add/message")
method putMessage (line 29) | @PutMapping("/secure/admin/message")
FILE: source-code/fullstack-library-app-https/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/controller/PaymentController.java
class PaymentController (line 13) | @CrossOrigin("https://localhost:3000")
method PaymentController (line 20) | @Autowired
method createPaymentIntent (line 25) | @PostMapping("/payment-intent")
method stripePaymentComplete (line 35) | @PutMapping("/payment-complete")
FILE: source-code/fullstack-library-app-https/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/controller/ReviewController.java
class ReviewController (line 8) | @CrossOrigin("https://localhost:3000")
method ReviewController (line 15) | public ReviewController (ReviewService reviewService) {
method reviewBookByUser (line 19) | @GetMapping("/secure/user/book")
method postReview (line 30) | @PostMapping("/secure")
FILE: source-code/fullstack-library-app-https/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/dao/BookRepository.java
type BookRepository (line 13) | public interface BookRepository extends JpaRepository<Book, Long> {
method findByTitleContaining (line 15) | Page<Book> findByTitleContaining(@RequestParam("title") String title, ...
method findByCategory (line 17) | Page<Book> findByCategory(@RequestParam("category") String category, P...
method findBooksByBookIds (line 19) | @Query("select o from Book o where id in :book_ids")
FILE: source-code/fullstack-library-app-https/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/dao/CheckoutRepository.java
type CheckoutRepository (line 11) | public interface CheckoutRepository extends JpaRepository<Checkout, Long> {
method findByUserEmailAndBookId (line 13) | Checkout findByUserEmailAndBookId(String userEmail, Long bookId);
method findBooksByUserEmail (line 15) | List<Checkout> findBooksByUserEmail(String userEmail);
method deleteAllByBookId (line 17) | @Modifying
FILE: source-code/fullstack-library-app-https/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/dao/HistoryRepository.java
type HistoryRepository (line 9) | public interface HistoryRepository extends JpaRepository<History, Long> {
method findBooksByUserEmail (line 10) | Page<History> findBooksByUserEmail(@RequestParam("email") String userE...
FILE: source-code/fullstack-library-app-https/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/dao/MessageRepository.java
type MessageRepository (line 9) | public interface MessageRepository extends JpaRepository<Message, Long> {
method findByUserEmail (line 11) | Page<Message> findByUserEmail(@RequestParam("user_email") String userE...
method findByClosed (line 13) | Page<Message> findByClosed(@RequestParam("closed") boolean closed, Pag...
FILE: source-code/fullstack-library-app-https/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/dao/PaymentRepository.java
type PaymentRepository (line 6) | public interface PaymentRepository extends JpaRepository<Payment, Long> {
method findByUserEmail (line 8) | Payment findByUserEmail(String userEmail);
FILE: source-code/fullstack-library-app-https/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/dao/ReviewRepository.java
type ReviewRepository (line 12) | public interface ReviewRepository extends JpaRepository<Review, Long> {
method findByBookId (line 14) | Page<Review> findByBookId(@RequestParam("book_id") Long bookId,
method findByUserEmailAndBookId (line 17) | Review findByUserEmailAndBookId(String userEmail, Long bookId);
method deleteAllByBookId (line 19) | @Modifying
FILE: source-code/fullstack-library-app-https/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/entity/Book.java
class Book (line 6) | @Entity
FILE: source-code/fullstack-library-app-https/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/entity/Checkout.java
class Checkout (line 7) | @Entity
method Checkout (line 12) | public Checkout() {}
method Checkout (line 14) | public Checkout(String userEmail, String checkoutDate, String returnDa...
FILE: source-code/fullstack-library-app-https/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/entity/History.java
class History (line 7) | @Entity
method History (line 12) | public History(){}
method History (line 14) | public History(String userEmail, String checkoutDate, String returnedD...
FILE: source-code/fullstack-library-app-https/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/entity/Message.java
class Message (line 8) | @Entity
method Message (line 13) | public Message(){}
method Message (line 15) | public Message(String title, String question) {
FILE: source-code/fullstack-library-app-https/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/entity/Payment.java
class Payment (line 7) | @Entity
FILE: source-code/fullstack-library-app-https/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/entity/Review.java
class Review (line 8) | @Entity
FILE: source-code/fullstack-library-app-https/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/requestmodels/AddBookRequest.java
class AddBookRequest (line 5) | @Data
FILE: source-code/fullstack-library-app-https/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/requestmodels/AdminQuestionRequest.java
class AdminQuestionRequest (line 5) | @Data
FILE: source-code/fullstack-library-app-https/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/requestmodels/PaymentInfoRequest.java
class PaymentInfoRequest (line 5) | @Data
FILE: source-code/fullstack-library-app-https/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/requestmodels/ReviewRequest.java
class ReviewRequest (line 7) | @Data
FILE: source-code/fullstack-library-app-https/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/responsemodels/ShelfCurrentLoansResponse.java
class ShelfCurrentLoansResponse (line 6) | @Data
method ShelfCurrentLoansResponse (line 9) | public ShelfCurrentLoansResponse(Book book, int daysLeft) {
FILE: source-code/fullstack-library-app-https/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/service/AdminService.java
class AdminService (line 14) | @Service
method AdminService (line 22) | @Autowired
method increaseBookQuantity (line 31) | public void increaseBookQuantity(Long bookId) throws Exception {
method decreaseBookQuantity (line 45) | public void decreaseBookQuantity(Long bookId) throws Exception {
method postBook (line 59) | public void postBook(AddBookRequest addBookRequest) {
method deleteBook (line 71) | public void deleteBook(Long bookId) throws Exception {
FILE: source-code/fullstack-library-app-https/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/service/BookService.java
class BookService (line 26) | @Service
method BookService (line 38) | public BookService(BookRepository bookRepository, CheckoutRepository c...
method checkoutBook (line 46) | public Book checkoutBook (String userEmail, Long bookId) throws Except...
method checkoutBookByUser (line 104) | public Boolean checkoutBookByUser(String userEmail, Long bookId) {
method currentLoansCount (line 113) | public int currentLoansCount(String userEmail) {
method currentLoans (line 117) | public List<ShelfCurrentLoansResponse> currentLoans(String userEmail) ...
method returnBook (line 152) | public void returnBook (String userEmail, Long bookId) throws Exception {
method renewLoan (line 197) | public void renewLoan(String userEmail, Long bookId) throws Exception {
FILE: source-code/fullstack-library-app-https/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/service/MessagesService.java
class MessagesService (line 12) | @Service
method MessagesService (line 18) | @Autowired
method postMessage (line 23) | public void postMessage(Message messageRequest, String userEmail) {
method putMessage (line 29) | public void putMessage(AdminQuestionRequest adminQuestionRequest, Stri...
FILE: source-code/fullstack-library-app-https/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/service/PaymentService.java
class PaymentService (line 18) | @Service
method PaymentService (line 24) | @Autowired
method createPaymentIntent (line 30) | public PaymentIntent createPaymentIntent(PaymentInfoRequest paymentInf...
method stripePayment (line 42) | public ResponseEntity<String> stripePayment(String userEmail) throws E...
FILE: source-code/fullstack-library-app-https/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/service/ReviewService.java
class ReviewService (line 14) | @Service
method ReviewService (line 20) | @Autowired
method postReview (line 25) | public void postReview(String userEmail, ReviewRequest reviewRequest) ...
method userReviewListed (line 44) | public Boolean userReviewListed(String userEmail, Long bookId) {
FILE: source-code/fullstack-library-app-https/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/utils/ExtractJWT.java
class ExtractJWT (line 7) | public class ExtractJWT {
method payloadJWTExtraction (line 9) | public static String payloadJWTExtraction(String token, String extract...
FILE: source-code/fullstack-library-app-https/02-backend/spring-boot-library/spring-boot-library/src/test/java/com/luv2code/springbootlibrary/SpringBootLibraryApplicationTests.java
class SpringBootLibraryApplicationTests (line 6) | @SpringBootTest
method contextLoads (line 9) | @Test
FILE: source-code/fullstack-library-app-https/03-frontend/react-library/src/layouts/BookCheckoutPage/BookCheckoutPage.tsx
function checkoutBook (line 211) | async function checkoutBook() {
function submitReview (line 229) | async function submitReview(starInput: number, reviewDescription: string) {
FILE: source-code/fullstack-library-app-https/03-frontend/react-library/src/layouts/BookCheckoutPage/CheckoutAndReviewBox.tsx
function buttonRender (line 9) | function buttonRender() {
function reviewRender (line 22) | function reviewRender() {
FILE: source-code/fullstack-library-app-https/03-frontend/react-library/src/layouts/ManageLibraryPage/ManageLibraryPage.tsx
function addBookClickFunction (line 15) | function addBookClickFunction() {
function changeQuantityOfBooksClickFunction (line 20) | function changeQuantityOfBooksClickFunction() {
function messagesClickFunction (line 25) | function messagesClickFunction() {
FILE: source-code/fullstack-library-app-https/03-frontend/react-library/src/layouts/ManageLibraryPage/components/AddNewBook.tsx
function categoryField (line 21) | function categoryField(value: string) {
function base64ConversionForImages (line 25) | async function base64ConversionForImages(e: any) {
function getBase64 (line 31) | function getBase64(file: any) {
function submitNewBook (line 42) | async function submitNewBook() {
FILE: source-code/fullstack-library-app-https/03-frontend/react-library/src/layouts/ManageLibraryPage/components/AdminMessage.tsx
function submitBtn (line 10) | function submitBtn() {
FILE: source-code/fullstack-library-app-https/03-frontend/react-library/src/layouts/ManageLibraryPage/components/AdminMessages.tsx
function submitResponseToQuestion (line 72) | async function submitResponseToQuestion(id: number, response: string) {
FILE: source-code/fullstack-library-app-https/03-frontend/react-library/src/layouts/ManageLibraryPage/components/ChangeQuantityOfBook.tsx
function increaseQuantity (line 19) | async function increaseQuantity() {
function decreaseQuantity (line 37) | async function decreaseQuantity() {
function deleteBook (line 55) | async function deleteBook() {
FILE: source-code/fullstack-library-app-https/03-frontend/react-library/src/layouts/MessagesPage/components/PostNewMessage.tsx
function submitNewQuestion (line 13) | async function submitNewQuestion() {
FILE: source-code/fullstack-library-app-https/03-frontend/react-library/src/layouts/PaymentPage/PaymentPage.tsx
function checkout (line 42) | async function checkout() {
FILE: source-code/fullstack-library-app-https/03-frontend/react-library/src/layouts/ShelfPage/components/Loans.tsx
function returnBook (line 61) | async function returnBook(bookId: number) {
function renewLoan (line 77) | async function renewLoan(bookId: number) {
FILE: source-code/fullstack-library-app-https/03-frontend/react-library/src/layouts/Utils/LeaveAReview.tsx
function starValue (line 10) | function starValue(value: number) {
FILE: source-code/fullstack-library-app-https/03-frontend/react-library/src/models/AddBookRequest.ts
class AddBookRequest (line 1) | class AddBookRequest {
method constructor (line 9) | constructor(title: string, author: string, description: string, copies...
FILE: source-code/fullstack-library-app-https/03-frontend/react-library/src/models/AdminMessageRequest.ts
class AdminMessageRequest (line 1) | class AdminMessageRequest {
method constructor (line 5) | constructor(id: number, response: string) {
FILE: source-code/fullstack-library-app-https/03-frontend/react-library/src/models/BookModel.ts
class BookModel (line 1) | class BookModel {
method constructor (line 11) | constructor (id: number, title: string, author: string, description: s...
FILE: source-code/fullstack-library-app-https/03-frontend/react-library/src/models/HistoryModel.ts
class HistoryModel (line 1) | class HistoryModel {
method constructor (line 11) | constructor(id: number, userEmail: string, checkoutDate: string, retur...
FILE: source-code/fullstack-library-app-https/03-frontend/react-library/src/models/MessageModel.ts
class MessageModel (line 1) | class MessageModel {
method constructor (line 10) | constructor(title: string, question: string) {
FILE: source-code/fullstack-library-app-https/03-frontend/react-library/src/models/PaymentInfoRequest.ts
class PaymentInfoRequest (line 1) | class PaymentInfoRequest {
method constructor (line 6) | constructor(amount: number, currency: string, receiptEmail: string | u...
FILE: source-code/fullstack-library-app-https/03-frontend/react-library/src/models/ReviewModel.ts
class ReviewModel (line 1) | class ReviewModel {
method constructor (line 9) | constructor(id: number, userEmail: string, date: string,
FILE: source-code/fullstack-library-app-https/03-frontend/react-library/src/models/ReviewRequestModel.ts
class ReviewRequestModel (line 1) | class ReviewRequestModel {
method constructor (line 6) | constructor(rating: number, bookId: number, reviewDescription: string) {
FILE: source-code/fullstack-library-app-https/03-frontend/react-library/src/models/ShelfCurrentLoans.ts
class ShelfCurrentLoans (line 3) | class ShelfCurrentLoans {
method constructor (line 7) | constructor(book: BookModel, daysLeft: number) {
FILE: source-code/fullstack-library-app/01-starter-files/Scripts/Payment Script/Payment Script.sql
type `payment` (line 4) | CREATE TABLE `payment` (
FILE: source-code/fullstack-library-app/01-starter-files/Scripts/React-Springboot-Add-Tables-Script-1.sql
type `book` (line 19) | CREATE TABLE `book` (
type `review` (line 39) | CREATE TABLE `review` (
type `checkout` (line 59) | CREATE TABLE `checkout` (
type `messages` (line 79) | CREATE TABLE `messages` (
type `history` (line 99) | CREATE TABLE `history` (
FILE: source-code/fullstack-library-app/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/SpringBootLibraryApplication.java
class SpringBootLibraryApplication (line 6) | @SpringBootApplication
method main (line 9) | public static void main(String[] args) {
FILE: source-code/fullstack-library-app/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/config/MyDataRestConfig.java
class MyDataRestConfig (line 12) | @Configuration
method configureRepositoryRestConfiguration (line 17) | @Override
method disableHttpMethods (line 39) | private void disableHttpMethods(Class theClass,
FILE: source-code/fullstack-library-app/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/config/SecurityConfiguration.java
class SecurityConfiguration (line 11) | @Configuration
method filterChain (line 14) | @Bean
FILE: source-code/fullstack-library-app/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/controller/AdminController.java
class AdminController (line 9) | @CrossOrigin("http://localhost:3000")
method AdminController (line 16) | @Autowired
method increaseBookQuantity (line 21) | @PutMapping("/secure/increase/book/quantity")
method decreaseBookQuantity (line 31) | @PutMapping("/secure/decrease/book/quantity")
method postBook (line 41) | @PostMapping("/secure/add/book")
method deleteBook (line 51) | @DeleteMapping("/secure/delete/book")
FILE: source-code/fullstack-library-app/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/controller/BookController.java
class BookController (line 12) | @CrossOrigin("http://localhost:3000")
method BookController (line 19) | @Autowired
method currentLoans (line 24) | @GetMapping("/secure/currentloans")
method currentLoansCount (line 32) | @GetMapping("/secure/currentloans/count")
method checkoutBookByUser (line 38) | @GetMapping("/secure/ischeckedout/byuser")
method checkoutBook (line 45) | @PutMapping("/secure/checkout")
method returnBook (line 52) | @PutMapping("/secure/return")
method renewLoan (line 59) | @PutMapping("/secure/renew/loan")
FILE: source-code/fullstack-library-app/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/controller/MessagesController.java
class MessagesController (line 10) | @CrossOrigin("http://localhost:3000")
method MessagesController (line 17) | @Autowired
method postMessage (line 22) | @PostMapping("/secure/add/message")
method putMessage (line 29) | @PutMapping("/secure/admin/message")
FILE: source-code/fullstack-library-app/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/controller/ReviewController.java
class ReviewController (line 8) | @CrossOrigin("http://localhost:3000")
method ReviewController (line 15) | public ReviewController (ReviewService reviewService) {
method reviewBookByUser (line 19) | @GetMapping("/secure/user/book")
method postReview (line 30) | @PostMapping("/secure")
FILE: source-code/fullstack-library-app/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/dao/BookRepository.java
type BookRepository (line 13) | public interface BookRepository extends JpaRepository<Book, Long> {
method findByTitleContaining (line 15) | Page<Book> findByTitleContaining(@RequestParam("title") String title, ...
method findByCategory (line 17) | Page<Book> findByCategory(@RequestParam("category") String category, P...
method findBooksByBookIds (line 19) | @Query("select o from Book o where id in :book_ids")
FILE: source-code/fullstack-library-app/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/dao/CheckoutRepository.java
type CheckoutRepository (line 11) | public interface CheckoutRepository extends JpaRepository<Checkout, Long> {
method findByUserEmailAndBookId (line 13) | Checkout findByUserEmailAndBookId(String userEmail, Long bookId);
method findBooksByUserEmail (line 15) | List<Checkout> findBooksByUserEmail(String userEmail);
method deleteAllByBookId (line 17) | @Modifying
FILE: source-code/fullstack-library-app/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/dao/HistoryRepository.java
type HistoryRepository (line 9) | public interface HistoryRepository extends JpaRepository<History, Long> {
method findBooksByUserEmail (line 10) | Page<History> findBooksByUserEmail(@RequestParam("email") String userE...
FILE: source-code/fullstack-library-app/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/dao/MessageRepository.java
type MessageRepository (line 9) | public interface MessageRepository extends JpaRepository<Message, Long> {
method findByUserEmail (line 11) | Page<Message> findByUserEmail(@RequestParam("user_email") String userE...
method findByClosed (line 13) | Page<Message> findByClosed(@RequestParam("closed") boolean closed, Pag...
FILE: source-code/fullstack-library-app/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/dao/ReviewRepository.java
type ReviewRepository (line 12) | public interface ReviewRepository extends JpaRepository<Review, Long> {
method findByBookId (line 14) | Page<Review> findByBookId(@RequestParam("book_id") Long bookId,
method findByUserEmailAndBookId (line 17) | Review findByUserEmailAndBookId(String userEmail, Long bookId);
method deleteAllByBookId (line 19) | @Modifying
FILE: source-code/fullstack-library-app/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/entity/Book.java
class Book (line 6) | @Entity
FILE: source-code/fullstack-library-app/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/entity/Checkout.java
class Checkout (line 7) | @Entity
method Checkout (line 12) | public Checkout() {}
method Checkout (line 14) | public Checkout(String userEmail, String checkoutDate, String returnDa...
FILE: source-code/fullstack-library-app/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/entity/History.java
class History (line 7) | @Entity
method History (line 12) | public History(){}
method History (line 14) | public History(String userEmail, String checkoutDate, String returnedD...
FILE: source-code/fullstack-library-app/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/entity/Message.java
class Message (line 8) | @Entity
method Message (line 13) | public Message(){}
method Message (line 15) | public Message(String title, String question) {
FILE: source-code/fullstack-library-app/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/entity/Review.java
class Review (line 8) | @Entity
FILE: source-code/fullstack-library-app/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/requestmodels/AddBookRequest.java
class AddBookRequest (line 5) | @Data
FILE: source-code/fullstack-library-app/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/requestmodels/AdminQuestionRequest.java
class AdminQuestionRequest (line 5) | @Data
FILE: source-code/fullstack-library-app/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/requestmodels/ReviewRequest.java
class ReviewRequest (line 7) | @Data
FILE: source-code/fullstack-library-app/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/responsemodels/ShelfCurrentLoansResponse.java
class ShelfCurrentLoansResponse (line 6) | @Data
method ShelfCurrentLoansResponse (line 9) | public ShelfCurrentLoansResponse(Book book, int daysLeft) {
FILE: source-code/fullstack-library-app/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/service/AdminService.java
class AdminService (line 14) | @Service
method AdminService (line 22) | @Autowired
method increaseBookQuantity (line 31) | public void increaseBookQuantity(Long bookId) throws Exception {
method decreaseBookQuantity (line 45) | public void decreaseBookQuantity(Long bookId) throws Exception {
method postBook (line 59) | public void postBook(AddBookRequest addBookRequest) {
method deleteBook (line 71) | public void deleteBook(Long bookId) throws Exception {
FILE: source-code/fullstack-library-app/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/service/BookService.java
class BookService (line 23) | @Service
method BookService (line 33) | public BookService(BookRepository bookRepository, CheckoutRepository c...
method checkoutBook (line 40) | public Book checkoutBook (String userEmail, Long bookId) throws Except...
method checkoutBookByUser (line 65) | public Boolean checkoutBookByUser(String userEmail, Long bookId) {
method currentLoansCount (line 74) | public int currentLoansCount(String userEmail) {
method currentLoans (line 78) | public List<ShelfCurrentLoansResponse> currentLoans(String userEmail) ...
method returnBook (line 113) | public void returnBook (String userEmail, Long bookId) throws Exception {
method renewLoan (line 141) | public void renewLoan(String userEmail, Long bookId) throws Exception {
FILE: source-code/fullstack-library-app/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/service/MessagesService.java
class MessagesService (line 12) | @Service
method MessagesService (line 18) | @Autowired
method postMessage (line 23) | public void postMessage(Message messageRequest, String userEmail) {
method putMessage (line 29) | public void putMessage(AdminQuestionRequest adminQuestionRequest, Stri...
FILE: source-code/fullstack-library-app/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/service/ReviewService.java
class ReviewService (line 14) | @Service
method ReviewService (line 20) | @Autowired
method postReview (line 25) | public void postReview(String userEmail, ReviewRequest reviewRequest) ...
method userReviewListed (line 44) | public Boolean userReviewListed(String userEmail, Long bookId) {
FILE: source-code/fullstack-library-app/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/utils/ExtractJWT.java
class ExtractJWT (line 7) | public class ExtractJWT {
method payloadJWTExtraction (line 9) | public static String payloadJWTExtraction(String token, String extract...
FILE: source-code/fullstack-library-app/02-backend/spring-boot-library/spring-boot-library/src/test/java/com/luv2code/springbootlibrary/SpringBootLibraryApplicationTests.java
class SpringBootLibraryApplicationTests (line 6) | @SpringBootTest
method contextLoads (line 9) | @Test
FILE: source-code/fullstack-library-app/03-frontend/react-library/src/layouts/BookCheckoutPage/BookCheckoutPage.tsx
function checkoutBook (line 208) | async function checkoutBook() {
function submitReview (line 224) | async function submitReview(starInput: number, reviewDescription: string) {
FILE: source-code/fullstack-library-app/03-frontend/react-library/src/layouts/BookCheckoutPage/CheckoutAndReviewBox.tsx
function buttonRender (line 9) | function buttonRender() {
function reviewRender (line 22) | function reviewRender() {
FILE: source-code/fullstack-library-app/03-frontend/react-library/src/layouts/ManageLibraryPage/ManageLibraryPage.tsx
function addBookClickFunction (line 15) | function addBookClickFunction() {
function changeQuantityOfBooksClickFunction (line 20) | function changeQuantityOfBooksClickFunction() {
function messagesClickFunction (line 25) | function messagesClickFunction() {
FILE: source-code/fullstack-library-app/03-frontend/react-library/src/layouts/ManageLibraryPage/components/AddNewBook.tsx
function categoryField (line 21) | function categoryField(value: string) {
function base64ConversionForImages (line 25) | async function base64ConversionForImages(e: any) {
function getBase64 (line 31) | function getBase64(file: any) {
function submitNewBook (line 42) | async function submitNewBook() {
FILE: source-code/fullstack-library-app/03-frontend/react-library/src/layouts/ManageLibraryPage/components/AdminMessage.tsx
function submitBtn (line 10) | function submitBtn() {
FILE: source-code/fullstack-library-app/03-frontend/react-library/src/layouts/ManageLibraryPage/components/AdminMessages.tsx
function submitResponseToQuestion (line 72) | async function submitResponseToQuestion(id: number, response: string) {
FILE: source-code/fullstack-library-app/03-frontend/react-library/src/layouts/ManageLibraryPage/components/ChangeQuantityOfBook.tsx
function increaseQuantity (line 19) | async function increaseQuantity() {
function decreaseQuantity (line 37) | async function decreaseQuantity() {
function deleteBook (line 55) | async function deleteBook() {
FILE: source-code/fullstack-library-app/03-frontend/react-library/src/layouts/MessagesPage/components/PostNewMessage.tsx
function submitNewQuestion (line 13) | async function submitNewQuestion() {
FILE: source-code/fullstack-library-app/03-frontend/react-library/src/layouts/ShelfPage/components/Loans.tsx
function returnBook (line 61) | async function returnBook(bookId: number) {
function renewLoan (line 77) | async function renewLoan(bookId: number) {
FILE: source-code/fullstack-library-app/03-frontend/react-library/src/layouts/Utils/LeaveAReview.tsx
function starValue (line 10) | function starValue(value: number) {
FILE: source-code/fullstack-library-app/03-frontend/react-library/src/models/AddBookRequest.ts
class AddBookRequest (line 1) | class AddBookRequest {
method constructor (line 9) | constructor(title: string, author: string, description: string, copies...
FILE: source-code/fullstack-library-app/03-frontend/react-library/src/models/AdminMessageRequest.ts
class AdminMessageRequest (line 1) | class AdminMessageRequest {
method constructor (line 5) | constructor(id: number, response: string) {
FILE: source-code/fullstack-library-app/03-frontend/react-library/src/models/BookModel.ts
class BookModel (line 1) | class BookModel {
method constructor (line 11) | constructor (id: number, title: string, author: string, description: s...
FILE: source-code/fullstack-library-app/03-frontend/react-library/src/models/HistoryModel.ts
class HistoryModel (line 1) | class HistoryModel {
method constructor (line 11) | constructor(id: number, userEmail: string, checkoutDate: string, retur...
FILE: source-code/fullstack-library-app/03-frontend/react-library/src/models/MessageModel.ts
class MessageModel (line 1) | class MessageModel {
method constructor (line 10) | constructor(title: string, question: string) {
FILE: source-code/fullstack-library-app/03-frontend/react-library/src/models/ReviewModel.ts
class ReviewModel (line 1) | class ReviewModel {
method constructor (line 9) | constructor(id: number, userEmail: string, date: string,
FILE: source-code/fullstack-library-app/03-frontend/react-library/src/models/ReviewRequestModel.ts
class ReviewRequestModel (line 1) | class ReviewRequestModel {
method constructor (line 6) | constructor(rating: number, bookId: number, reviewDescription: string) {
FILE: source-code/fullstack-library-app/03-frontend/react-library/src/models/ShelfCurrentLoans.ts
class ShelfCurrentLoans (line 3) | class ShelfCurrentLoans {
method constructor (line 7) | constructor(book: BookModel, daysLeft: number) {
FILE: source-code/fullstack-library-app/static-html-css-files/Section 23. Leave a Review Static Files/LeaveAReview.tsx
function starValue (line 8) | function starValue(value: number) {
FILE: source-code/fullstack-library-app/static-html-css-files/Section 29. Add new book Static Files/AddNewBook.tsx
function categoryField (line 20) | function categoryField(value: string) {
FILE: source-code/react-overview-todo-project/ReactJS/src/App.js
function App (line 6) | function App() {
FILE: source-code/react-overview-todo-project/ReactJS/src/components/NewTodoForm.js
function NewTodoForm (line 3) | function NewTodoForm(props) {
FILE: source-code/react-overview-todo-project/ReactJS/src/components/TodoRowItem.js
function TodoRowItem (line 1) | function TodoRowItem(props) {
FILE: source-code/react-overview-todo-project/ReactJS/src/components/TodoTable.js
function TodoTable (line 3) | function TodoTable(props) {
FILE: source-code/react-overview-todo-project/ReactTS/src/models/TodoModel.ts
class TodoModel (line 1) | class TodoModel {
method constructor (line 6) | constructor(rowNumber: number, rowDescription: string, rowAssigned: st...
FILE: source-code/typescript-training/04-classes/01-class-definition/Customer.ts
class Customer (line 1) | class Customer {
method constructor (line 6) | constructor(theFirst: string, theLast: string) {
FILE: source-code/typescript-training/04-classes/02-access-modifiers/Customer.ts
class Customer (line 1) | class Customer {
method constructor (line 6) | constructor(theFirst: string, theLast: string) {
method firstName (line 11) | public get firstName(): string {
method firstName (line 15) | public set firstName(value: string) {
method lastName (line 19) | public get lastName(): string {
method lastName (line 22) | public set lastName(value: string) {
FILE: source-code/typescript-training/04-classes/03-tsconfig/Customer.ts
class Customer (line 1) | class Customer {
method constructor (line 6) | constructor(theFirst: string, theLast: string) {
method firstName (line 11) | public get firstName(): string {
method firstName (line 15) | public set firstName(value: string) {
method lastName (line 19) | public get lastName(): string {
method lastName (line 22) | public set lastName(value: string) {
FILE: source-code/typescript-training/04-classes/04-parameter-properties/Customer.ts
class Customer (line 1) | class Customer {
method constructor (line 3) | constructor(private _firstName: string, private _lastName: string) {
method firstName (line 6) | public get firstName(): string {
method firstName (line 10) | public set firstName(value: string) {
method lastName (line 14) | public get lastName(): string {
method lastName (line 17) | public set lastName(value: string) {
FILE: source-code/typescript-training/04-classes/05-modules/Customer.ts
class Customer (line 1) | class Customer {
method constructor (line 3) | constructor(private _firstName: string, private _lastName: string) {
method firstName (line 6) | public get firstName(): string {
method firstName (line 10) | public set firstName(value: string) {
method lastName (line 14) | public get lastName(): string {
method lastName (line 17) | public set lastName(value: string) {
FILE: source-code/typescript-training/05-inheritance/Circle.ts
class Circle (line 3) | class Circle extends Shape {
method constructor (line 5) | constructor(theX: number, theY: number,
method radius (line 11) | public get radius(): number {
method radius (line 15) | public set radius(value: number) {
method getInfo (line 19) | getInfo(): string {
FILE: source-code/typescript-training/05-inheritance/Rectangle.ts
class Rectangle (line 3) | class Rectangle extends Shape {
method constructor (line 5) | constructor(theX: number, theY: number,
method width (line 11) | public get width(): number {
method width (line 15) | public set width(value: number) {
method length (line 19) | public get length(): number {
method length (line 23) | public set length(value: number) {
method getInfo (line 27) | getInfo(): string {
FILE: source-code/typescript-training/05-inheritance/Shape.ts
class Shape (line 1) | class Shape {
method constructor (line 3) | constructor(private _x: number, private _y: number) {
method x (line 6) | public get x(): number {
method x (line 10) | public set x(value: number) {
method y (line 14) | public get y(): number {
method y (line 18) | public set y(value: number) {
method getInfo (line 22) | getInfo(): string {
FILE: source-code/typescript-training/06-abstract-classes/Circle.ts
class Circle (line 3) | class Circle extends Shape {
method calculateArea (line 5) | calculateArea(): number {
method constructor (line 9) | constructor(theX: number, theY: number,
method radius (line 15) | public get radius(): number {
method radius (line 19) | public set radius(value: number) {
method getInfo (line 23) | getInfo(): string {
FILE: source-code/typescript-training/06-abstract-classes/Rectangle.ts
class Rectangle (line 3) | class Rectangle extends Shape {
method calculateArea (line 5) | calculateArea(): number {
method constructor (line 9) | constructor(theX: number, theY: number,
method width (line 15) | public get width(): number {
method width (line 19) | public set width(value: number) {
method length (line 23) | public get length(): number {
method length (line 27) | public set length(value: number) {
method getInfo (line 31) | getInfo(): string {
FILE: source-code/typescript-training/06-abstract-classes/Shape.ts
method constructor (line 3) | constructor(private _x: number, private _y: number) {
method x (line 6) | public get x(): number {
method x (line 10) | public set x(value: number) {
method y (line 14) | public get y(): number {
method y (line 18) | public set y(value: number) {
method getInfo (line 22) | getInfo(): string {
FILE: source-code/typescript-training/07-interfaces/Coach.ts
type Coach (line 1) | interface Coach {
FILE: source-code/typescript-training/07-interfaces/CricketCoach.ts
class CricketCoach (line 3) | class CricketCoach implements Coach {
method getDailyWorkout (line 5) | getDailyWorkout(): string {
FILE: source-code/typescript-training/07-interfaces/GolfCoach.ts
class GolfCoach (line 3) | class GolfCoach implements Coach {
method getDailyWorkout (line 5) | getDailyWorkout(): string {
Copy disabled (too large)
Download .json
Condensed preview — 438 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (26,744K chars).
[
{
"path": ".gitattributes",
"chars": 2351,
"preview": "# -------------------------------------------------\n# Global normalization\n# -------------------------------------------"
},
{
"path": ".gitignore",
"chars": 3068,
"preview": "################################################################################\n# Source code repository for luv2code t"
},
{
"path": "LICENSE",
"chars": 1575,
"preview": "All source code and course materials in this repository are provided to enrolled students for personal learning and educ"
},
{
"path": "README.md",
"chars": 4282,
"preview": "# Full Stack: React and Spring Boot\n\n[<img src=\"images/react-spring-boot-grabber-thumbnail.png\" alt=\"Full Stack: React a"
},
{
"path": "auth0-security/README.md",
"chars": 46624,
"preview": "# Security Login/Logout - Auth0 Integration Tutorial\n\n## Introduction\n\nIn this tutorial, you will learn how to integrate"
},
{
"path": "auth0-security/fullstack-library-app-auth0/01-starter-files/App.css/App.css",
"chars": 1052,
"preview": ":root{\n --mainOpacity: rgba(0, 0, 0, 0.55);\n}\n\n.header {\n background-image: linear-gradient( rgba(0, 0, 0, 0.7), r"
},
{
"path": "auth0-security/fullstack-library-app-auth0/01-starter-files/Scripts/Payment Script/Payment Script.sql",
"chars": 414,
"preview": "DROP TABLE IF EXISTS `payment`;\n/*!40101 SET @saved_cs_client = @@character_set_client */;\n/*!40101 SET character_set_cl"
},
{
"path": "auth0-security/fullstack-library-app-auth0/01-starter-files/Scripts/React-SpringBoot-Add-Books-Script-2.sql",
"chars": 2912611,
"preview": "INSERT INTO `book` VALUES \n (2,'Become a Guru in JavaScript','Luv, Lena','Pellentesque varius aliquam lacus quis rhon"
},
{
"path": "auth0-security/fullstack-library-app-auth0/01-starter-files/Scripts/React-SpringBoot-Add-Books-Script-3.sql",
"chars": 3166249,
"preview": " INSERT INTO `book` VALUES \n (7,'Advanced Techniques in JavaScript','Luv, Yasemin', 'Pellentesque varius aliquam lac"
},
{
"path": "auth0-security/fullstack-library-app-auth0/01-starter-files/Scripts/React-SpringBoot-Add-Books-Script-4.sql",
"chars": 2456971,
"preview": " INSERT INTO `book` VALUES \n\t(12,'The Expert Guide to SQL','Luv, Poornima','Morbi eu tempus eros, in imperdiet sem. Nu"
},
{
"path": "auth0-security/fullstack-library-app-auth0/01-starter-files/Scripts/React-SpringBoot-Add-Books-Script-5.sql",
"chars": 3606097,
"preview": " INSERT INTO `book` VALUES \n\t(17,'Advanced Techniques in React.js','Luv, Mary','Proin at urna faucibus, pretium mi in,"
},
{
"path": "auth0-security/fullstack-library-app-auth0/01-starter-files/Scripts/React-Springboot-Add-Tables-Script-1.sql",
"chars": 695480,
"preview": "CREATE DATABASE IF NOT EXISTS `reactlibrarydatabase` /*!40100 DEFAULT CHARACTER SET latin1 */;\nUSE `reactlibrarydatabas"
},
{
"path": "auth0-security/fullstack-library-app-auth0/01-starter-files/application.properties",
"chars": 395,
"preview": "spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver\nspring.datasource.url=jdbc:mysql://localhost:3306/demo?useS"
},
{
"path": "auth0-security/fullstack-library-app-auth0/02-backend/spring-boot-library/.gitignore",
"chars": 395,
"preview": "HELP.md\ntarget/\n!.mvn/wrapper/maven-wrapper.jar\n!**/src/main/**/target/\n!**/src/test/**/target/\n\n### STS ###\n.apt_genera"
},
{
"path": "auth0-security/fullstack-library-app-auth0/02-backend/spring-boot-library/.mvn/wrapper/maven-wrapper.properties",
"chars": 233,
"preview": "distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.6/apache-maven-3.8.6-bin.zip\nwrap"
},
{
"path": "auth0-security/fullstack-library-app-auth0/02-backend/spring-boot-library/mvnw",
"chars": 10284,
"preview": "#!/bin/sh\n# ----------------------------------------------------------------------------\n# Licensed to the Apache Softwa"
},
{
"path": "auth0-security/fullstack-library-app-auth0/02-backend/spring-boot-library/mvnw.cmd",
"chars": 6922,
"preview": "@REM ----------------------------------------------------------------------------\r\n@REM Licensed to the Apache Software "
},
{
"path": "auth0-security/fullstack-library-app-auth0/02-backend/spring-boot-library/pom.xml",
"chars": 2015,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2"
},
{
"path": "auth0-security/fullstack-library-app-auth0/02-backend/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/SpringBootLibraryApplication.java",
"chars": 345,
"preview": "package com.luv2code.springbootlibrary;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.b"
},
{
"path": "auth0-security/fullstack-library-app-auth0/02-backend/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/config/MyDataRestConfig.java",
"chars": 2097,
"preview": "package com.luv2code.springbootlibrary.config;\n\nimport com.luv2code.springbootlibrary.entity.Book;\nimport com.luv2code.s"
},
{
"path": "auth0-security/fullstack-library-app-auth0/02-backend/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/config/SecurityConfiguration.java",
"chars": 1883,
"preview": "package com.luv2code.springbootlibrary.config;\n\nimport com.okta.spring.boot.oauth.Okta;\nimport org.springframework.conte"
},
{
"path": "auth0-security/fullstack-library-app-auth0/02-backend/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/controller/AdminController.java",
"chars": 2947,
"preview": "package com.luv2code.springbootlibrary.controller;\n\nimport com.luv2code.springbootlibrary.requestmodels.AddBookRequest;\n"
},
{
"path": "auth0-security/fullstack-library-app-auth0/02-backend/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/controller/BookController.java",
"chars": 2445,
"preview": "package com.luv2code.springbootlibrary.controller;\n\nimport com.luv2code.springbootlibrary.entity.Book;\nimport com.luv2co"
},
{
"path": "auth0-security/fullstack-library-app-auth0/02-backend/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/controller/MessagesController.java",
"chars": 1755,
"preview": "package com.luv2code.springbootlibrary.controller;\n\nimport com.luv2code.springbootlibrary.entity.Message;\nimport com.luv"
},
{
"path": "auth0-security/fullstack-library-app-auth0/02-backend/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/controller/ReviewController.java",
"chars": 1442,
"preview": "package com.luv2code.springbootlibrary.controller;\n\nimport com.luv2code.springbootlibrary.requestmodels.ReviewRequest;\ni"
},
{
"path": "auth0-security/fullstack-library-app-auth0/02-backend/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/dao/BookRepository.java",
"chars": 839,
"preview": "package com.luv2code.springbootlibrary.dao;\n\nimport com.luv2code.springbootlibrary.entity.Book;\nimport org.springframewo"
},
{
"path": "auth0-security/fullstack-library-app-auth0/02-backend/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/dao/CheckoutRepository.java",
"chars": 699,
"preview": "package com.luv2code.springbootlibrary.dao;\n\nimport com.luv2code.springbootlibrary.entity.Checkout;\nimport org.springfra"
},
{
"path": "auth0-security/fullstack-library-app-auth0/02-backend/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/dao/HistoryRepository.java",
"chars": 493,
"preview": "package com.luv2code.springbootlibrary.dao;\n\nimport com.luv2code.springbootlibrary.entity.History;\nimport org.springfram"
},
{
"path": "auth0-security/fullstack-library-app-auth0/02-backend/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/dao/MessageRepository.java",
"chars": 587,
"preview": "package com.luv2code.springbootlibrary.dao;\n\nimport com.luv2code.springbootlibrary.entity.Message;\nimport org.springfram"
},
{
"path": "auth0-security/fullstack-library-app-auth0/02-backend/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/dao/ReviewRepository.java",
"chars": 879,
"preview": "package com.luv2code.springbootlibrary.dao;\n\nimport com.luv2code.springbootlibrary.entity.Review;\nimport org.springframe"
},
{
"path": "auth0-security/fullstack-library-app-auth0/02-backend/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/entity/Book.java",
"chars": 686,
"preview": "package com.luv2code.springbootlibrary.entity;\n\nimport lombok.Data;\nimport jakarta.persistence.*;\n\n@Entity\n@Table(name ="
},
{
"path": "auth0-security/fullstack-library-app-auth0/02-backend/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/entity/Checkout.java",
"chars": 805,
"preview": "package com.luv2code.springbootlibrary.entity;\n\nimport lombok.Data;\n\nimport jakarta.persistence.*;\n\n@Entity\n@Table(name "
},
{
"path": "auth0-security/fullstack-library-app-auth0/02-backend/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/entity/History.java",
"chars": 1142,
"preview": "package com.luv2code.springbootlibrary.entity;\n\nimport lombok.Data;\n\nimport jakarta.persistence.*;\n\n@Entity\n@Table(name "
},
{
"path": "auth0-security/fullstack-library-app-auth0/02-backend/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/entity/Message.java",
"chars": 786,
"preview": "package com.luv2code.springbootlibrary.entity;\n\n\nimport lombok.Data;\n\nimport jakarta.persistence.*;\n\n@Entity\n@Table(name"
},
{
"path": "auth0-security/fullstack-library-app-auth0/02-backend/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/entity/Review.java",
"chars": 688,
"preview": "package com.luv2code.springbootlibrary.entity;\n\nimport lombok.Data;\nimport org.hibernate.annotations.CreationTimestamp;\n"
},
{
"path": "auth0-security/fullstack-library-app-auth0/02-backend/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/requestmodels/AddBookRequest.java",
"chars": 283,
"preview": "package com.luv2code.springbootlibrary.requestmodels;\n\nimport lombok.Data;\n\n@Data\npublic class AddBookRequest {\n\n pri"
},
{
"path": "auth0-security/fullstack-library-app-auth0/02-backend/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/requestmodels/AdminQuestionRequest.java",
"chars": 172,
"preview": "package com.luv2code.springbootlibrary.requestmodels;\n\nimport lombok.Data;\n\n@Data\npublic class AdminQuestionRequest {\n\n "
},
{
"path": "auth0-security/fullstack-library-app-auth0/02-backend/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/requestmodels/ReviewRequest.java",
"chars": 244,
"preview": "package com.luv2code.springbootlibrary.requestmodels;\n\nimport lombok.Data;\n\nimport java.util.Optional;\n\n@Data\npublic cla"
},
{
"path": "auth0-security/fullstack-library-app-auth0/02-backend/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/responsemodels/ShelfCurrentLoansResponse.java",
"chars": 359,
"preview": "package com.luv2code.springbootlibrary.responsemodels;\n\nimport com.luv2code.springbootlibrary.entity.Book;\nimport lombok"
},
{
"path": "auth0-security/fullstack-library-app-auth0/02-backend/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/service/AdminService.java",
"chars": 2902,
"preview": "package com.luv2code.springbootlibrary.service;\n\nimport com.luv2code.springbootlibrary.dao.BookRepository;\nimport com.lu"
},
{
"path": "auth0-security/fullstack-library-app-auth0/02-backend/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/service/BookService.java",
"chars": 5581,
"preview": "package com.luv2code.springbootlibrary.service;\n\nimport com.luv2code.springbootlibrary.dao.BookRepository;\nimport com.lu"
},
{
"path": "auth0-security/fullstack-library-app-auth0/02-backend/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/service/MessagesService.java",
"chars": 1461,
"preview": "package com.luv2code.springbootlibrary.service;\n\nimport com.luv2code.springbootlibrary.dao.MessageRepository;\nimport com"
},
{
"path": "auth0-security/fullstack-library-app-auth0/02-backend/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/service/ReviewService.java",
"chars": 1868,
"preview": "package com.luv2code.springbootlibrary.service;\n\nimport com.luv2code.springbootlibrary.dao.BookRepository;\nimport com.lu"
},
{
"path": "auth0-security/fullstack-library-app-auth0/02-backend/spring-boot-library/src/main/resources/application.properties",
"chars": 651,
"preview": "spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver\nspring.datasource.url=jdbc:mysql://localhost:3306/reactlibr"
},
{
"path": "auth0-security/fullstack-library-app-auth0/02-backend/spring-boot-library/src/test/java/com/luv2code/springbootlibrary/SpringBootLibraryApplicationTests.java",
"chars": 233,
"preview": "package com.luv2code.springbootlibrary;\n\nimport org.junit.jupiter.api.Test;\nimport org.springframework.boot.test.context"
},
{
"path": "auth0-security/fullstack-library-app-auth0/03-frontend/react-library/.gitignore",
"chars": 310,
"preview": "# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.\n\n# dependencies\n/node_modules\n/.pn"
},
{
"path": "auth0-security/fullstack-library-app-auth0/03-frontend/react-library/README.md",
"chars": 2103,
"preview": "# Getting Started with Create React App\n\nThis project was bootstrapped with [Create React App](https://github.com/facebo"
},
{
"path": "auth0-security/fullstack-library-app-auth0/03-frontend/react-library/package.json",
"chars": 1187,
"preview": "{\n \"name\": \"react-library\",\n \"version\": \"0.1.0\",\n \"private\": true,\n \"dependencies\": {\n \"@auth0/auth0-react\": \"^2."
},
{
"path": "auth0-security/fullstack-library-app-auth0/03-frontend/react-library/public/index.html",
"chars": 2232,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\" />\n <link rel=\"icon\" href=\"%PUBLIC_URL%/favicon.i"
},
{
"path": "auth0-security/fullstack-library-app-auth0/03-frontend/react-library/public/manifest.json",
"chars": 492,
"preview": "{\n \"short_name\": \"React App\",\n \"name\": \"Create React App Sample\",\n \"icons\": [\n {\n \"src\": \"favicon.ico\",\n "
},
{
"path": "auth0-security/fullstack-library-app-auth0/03-frontend/react-library/public/robots.txt",
"chars": 67,
"preview": "# https://www.robotstxt.org/robotstxt.html\nUser-agent: *\nDisallow:\n"
},
{
"path": "auth0-security/fullstack-library-app-auth0/03-frontend/react-library/src/App.css",
"chars": 1052,
"preview": ":root{\n --mainOpacity: rgba(0, 0, 0, 0.55);\n}\n\n.header {\n background-image: linear-gradient( rgba(0, 0, 0, 0.7), r"
},
{
"path": "auth0-security/fullstack-library-app-auth0/03-frontend/react-library/src/App.tsx",
"chars": 2707,
"preview": "import React from 'react';\nimport { Redirect, Route, Switch, useHistory } from 'react-router-dom';\nimport './App.css';\ni"
},
{
"path": "auth0-security/fullstack-library-app-auth0/03-frontend/react-library/src/Auth/LoginPage.jsx",
"chars": 279,
"preview": "import React from 'react';\nimport { useAuth0 } from '@auth0/auth0-react';\n\nconst LoginPage = () => {\n const { loginWith"
},
{
"path": "auth0-security/fullstack-library-app-auth0/03-frontend/react-library/src/index.css",
"chars": 366,
"preview": "body {\n margin: 0;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',\n 'Ubuntu', 'Can"
},
{
"path": "auth0-security/fullstack-library-app-auth0/03-frontend/react-library/src/index.tsx",
"chars": 321,
"preview": "import React from 'react';\nimport ReactDOM from 'react-dom/client';\nimport './index.css';\nimport { App } from './App';\ni"
},
{
"path": "auth0-security/fullstack-library-app-auth0/03-frontend/react-library/src/layouts/BookCheckoutPage/BookCheckoutPage.tsx",
"chars": 12659,
"preview": "import { useEffect, useState } from \"react\";\nimport BookModel from \"../../models/BookModel\";\nimport ReviewModel from \".."
},
{
"path": "auth0-security/fullstack-library-app-auth0/03-frontend/react-library/src/layouts/BookCheckoutPage/CheckoutAndReviewBox.tsx",
"chars": 3053,
"preview": "import { Link } from \"react-router-dom\";\nimport BookModel from \"../../models/BookModel\";\nimport { LeaveAReview } from \"."
},
{
"path": "auth0-security/fullstack-library-app-auth0/03-frontend/react-library/src/layouts/BookCheckoutPage/LatestReviews.tsx",
"chars": 1421,
"preview": "import { Link } from \"react-router-dom\";\nimport ReviewModel from \"../../models/ReviewModel\";\nimport { Review } from \"../"
},
{
"path": "auth0-security/fullstack-library-app-auth0/03-frontend/react-library/src/layouts/BookCheckoutPage/ReviewListPage/ReviewListPage.tsx",
"chars": 3449,
"preview": "import { useEffect, useState } from 'react';\nimport ReviewModel from '../../../models/ReviewModel';\nimport { Pagination "
},
{
"path": "auth0-security/fullstack-library-app-auth0/03-frontend/react-library/src/layouts/HomePage/HomePage.tsx",
"chars": 406,
"preview": "import { Carousel } from \"./components/Carousel\";\nimport { ExploreTopBooks } from \"./components/ExploreTopBooks\";\nimport"
},
{
"path": "auth0-security/fullstack-library-app-auth0/03-frontend/react-library/src/layouts/HomePage/components/Carousel.tsx",
"chars": 4765,
"preview": "import { ReturnBook } from \"./ReturnBook\";\nimport { useEffect, useState } from \"react\";\nimport BookModel from \"../../../"
},
{
"path": "auth0-security/fullstack-library-app-auth0/03-frontend/react-library/src/layouts/HomePage/components/ExploreTopBooks.tsx",
"chars": 677,
"preview": "import { Link } from \"react-router-dom\";\n\nexport const ExploreTopBooks = () => {\n return (\n <div className='p-"
},
{
"path": "auth0-security/fullstack-library-app-auth0/03-frontend/react-library/src/layouts/HomePage/components/Heros.tsx",
"chars": 4503,
"preview": "import { useAuth0 } from \"@auth0/auth0-react\";\nimport { Link } from \"react-router-dom\";\n\nexport const Heros = () => {\n\n "
},
{
"path": "auth0-security/fullstack-library-app-auth0/03-frontend/react-library/src/layouts/HomePage/components/LibraryServices.tsx",
"chars": 1414,
"preview": "import { useAuth0 } from \"@auth0/auth0-react\";\nimport { Link } from \"react-router-dom\";\n\nexport const LibraryServices = "
},
{
"path": "auth0-security/fullstack-library-app-auth0/03-frontend/react-library/src/layouts/HomePage/components/ReturnBook.tsx",
"chars": 1089,
"preview": "import React from 'react'\nimport { Link } from 'react-router-dom';\nimport BookModel from '../../../models/BookModel';\n\ne"
},
{
"path": "auth0-security/fullstack-library-app-auth0/03-frontend/react-library/src/layouts/ManageLibraryPage/ManageLibraryPage.tsx",
"chars": 4045,
"preview": "import { useEffect, useState } from 'react';\nimport { Redirect } from 'react-router-dom';\nimport { AddNewBook } from './"
},
{
"path": "auth0-security/fullstack-library-app-auth0/03-frontend/react-library/src/layouts/ManageLibraryPage/components/AddNewBook.tsx",
"chars": 6439,
"preview": "import { useState } from 'react';\nimport AddBookRequest from '../../../models/AddBookRequest';\nimport { useAuth0 } from "
},
{
"path": "auth0-security/fullstack-library-app-auth0/03-frontend/react-library/src/layouts/ManageLibraryPage/components/AdminMessage.tsx",
"chars": 1978,
"preview": "import { useState } from \"react\";\nimport MessageModel from \"../../../models/MessageModel\";\n\nexport const AdminMessage: R"
},
{
"path": "auth0-security/fullstack-library-app-auth0/03-frontend/react-library/src/layouts/ManageLibraryPage/components/AdminMessages.tsx",
"chars": 4179,
"preview": "import { useEffect, useState } from 'react';\nimport AdminMessageRequest from '../../../models/AdminMessageRequest';\nimpo"
},
{
"path": "auth0-security/fullstack-library-app-auth0/03-frontend/react-library/src/layouts/ManageLibraryPage/components/ChangeQuantityOfBook.tsx",
"chars": 5153,
"preview": "import { useEffect, useState } from \"react\";\nimport BookModel from \"../../../models/BookModel\";\nimport { useAuth0 } from"
},
{
"path": "auth0-security/fullstack-library-app-auth0/03-frontend/react-library/src/layouts/ManageLibraryPage/components/ChangeQuantityOfBooks.tsx",
"chars": 3676,
"preview": "import React from \"react\";\nimport { useEffect, useState } from \"react\";\nimport BookModel from '../../../models/BookModel"
},
{
"path": "auth0-security/fullstack-library-app-auth0/03-frontend/react-library/src/layouts/MessagesPage/MessagesPage.tsx",
"chars": 1860,
"preview": "import { useState } from 'react';\nimport { Messages } from './components/Messages';\nimport { PostNewMessage } from './co"
},
{
"path": "auth0-security/fullstack-library-app-auth0/03-frontend/react-library/src/layouts/MessagesPage/components/Messages.tsx",
"chars": 3950,
"preview": "import { useEffect, useState } from 'react';\nimport MessageModel from '../../../models/MessageModel';\nimport { SpinnerLo"
},
{
"path": "auth0-security/fullstack-library-app-auth0/03-frontend/react-library/src/layouts/MessagesPage/components/PostNewMessage.tsx",
"chars": 3367,
"preview": "import { useState } from 'react';\nimport MessageModel from '../../../models/MessageModel';\nimport { useAuth0 } from '@au"
},
{
"path": "auth0-security/fullstack-library-app-auth0/03-frontend/react-library/src/layouts/NavbarAndFooter/Footer.tsx",
"chars": 932,
"preview": "import { Link } from \"react-router-dom\";\n\nexport const Footer = () => {\n return (\n <div className='main-color'"
},
{
"path": "auth0-security/fullstack-library-app-auth0/03-frontend/react-library/src/layouts/NavbarAndFooter/Navbar.tsx",
"chars": 2901,
"preview": "import { Link, NavLink } from \"react-router-dom\";\nimport { SpinnerLoading } from \"../Utils/SpinnerLoading\";\nimport { use"
},
{
"path": "auth0-security/fullstack-library-app-auth0/03-frontend/react-library/src/layouts/SearchBooksPage/SearchBooksPage.tsx",
"chars": 8275,
"preview": "import { useEffect, useState } from 'react';\nimport BookModel from '../../models/BookModel';\nimport { Pagination } from "
},
{
"path": "auth0-security/fullstack-library-app-auth0/03-frontend/react-library/src/layouts/SearchBooksPage/components/SearchBook.tsx",
"chars": 2574,
"preview": "import { Link } from \"react-router-dom\";\nimport BookModel from \"../../../models/BookModel\"\n\nexport const SearchBook: Rea"
},
{
"path": "auth0-security/fullstack-library-app-auth0/03-frontend/react-library/src/layouts/ShelfPage/ShelfPage.tsx",
"chars": 1793,
"preview": "import { useState } from \"react\";\nimport { HistoryPage } from \"./components/HistoryPage\";\nimport { Loans } from \"./compo"
},
{
"path": "auth0-security/fullstack-library-app-auth0/03-frontend/react-library/src/layouts/ShelfPage/components/HistoryPage.tsx",
"chars": 5120,
"preview": "import { useEffect, useState } from 'react';\nimport { Link } from 'react-router-dom';\nimport HistoryModel from '../../.."
},
{
"path": "auth0-security/fullstack-library-app-auth0/03-frontend/react-library/src/layouts/ShelfPage/components/Loans.tsx",
"chars": 12105,
"preview": "import { useEffect, useState } from 'react';\nimport { Link } from 'react-router-dom';\nimport ShelfCurrentLoans from '../"
},
{
"path": "auth0-security/fullstack-library-app-auth0/03-frontend/react-library/src/layouts/ShelfPage/components/LoansModal.tsx",
"chars": 5359,
"preview": "import ShelfCurrentLoans from \"../../../models/ShelfCurrentLoans\";\n\nexport const LoansModal: React.FC<{ shelfCurrentLoan"
},
{
"path": "auth0-security/fullstack-library-app-auth0/03-frontend/react-library/src/layouts/Utils/LeaveAReview.tsx",
"chars": 2833,
"preview": "import { useState } from 'react';\nimport { StarsReview } from './StarsReview';\n\nexport const LeaveAReview: React.FC<{ su"
},
{
"path": "auth0-security/fullstack-library-app-auth0/03-frontend/react-library/src/layouts/Utils/Pagination.tsx",
"chars": 2198,
"preview": "export const Pagination: React.FC<{currentPage: number,\n totalPages: number,\n paginate: any}> = (props) => {\n\n "
},
{
"path": "auth0-security/fullstack-library-app-auth0/03-frontend/react-library/src/layouts/Utils/Review.tsx",
"chars": 1110,
"preview": "import ReviewModel from \"../../models/ReviewModel\";\nimport { StarsReview } from \"./StarsReview\";\n\nexport const Review: R"
},
{
"path": "auth0-security/fullstack-library-app-auth0/03-frontend/react-library/src/layouts/Utils/SpinnerLoading.tsx",
"chars": 398,
"preview": "export const SpinnerLoading = () => {\n return (\n <div className='container m-5 d-flex justify-content-center' "
},
{
"path": "auth0-security/fullstack-library-app-auth0/03-frontend/react-library/src/layouts/Utils/StarsReview.tsx",
"chars": 3067,
"preview": "export const StarsReview: React.FC<{ rating: number, size: number }> = (props) => {\n \n let rating = props.rating;\n"
},
{
"path": "auth0-security/fullstack-library-app-auth0/03-frontend/react-library/src/lib/auth0Config.ts",
"chars": 256,
"preview": "export const auth0Config = {\n clientId: 'wDIohwWi3mAoJ2TNFthXRgFvvLl4ZqU2',\n issuer: 'dev-07ls1kmwlsamjjsv.us.auth"
},
{
"path": "auth0-security/fullstack-library-app-auth0/03-frontend/react-library/src/models/AddBookRequest.ts",
"chars": 486,
"preview": "class AddBookRequest {\n title: string;\n author: string;\n description: string;\n copies: number;\n category:"
},
{
"path": "auth0-security/fullstack-library-app-auth0/03-frontend/react-library/src/models/AdminMessageRequest.ts",
"chars": 215,
"preview": "class AdminMessageRequest {\n id: number;\n response: string;\n\n constructor(id: number, response: string) {\n "
},
{
"path": "auth0-security/fullstack-library-app-auth0/03-frontend/react-library/src/models/BookModel.ts",
"chars": 679,
"preview": "class BookModel {\n id: number;\n title: string;\n author?: string;\n description?: string;\n copies?: number;"
},
{
"path": "auth0-security/fullstack-library-app-auth0/03-frontend/react-library/src/models/HistoryModel.ts",
"chars": 698,
"preview": "class HistoryModel {\n id: number;\n userEmail: string;\n checkoutDate: string;\n returnedDate: string;\n titl"
},
{
"path": "auth0-security/fullstack-library-app-auth0/03-frontend/react-library/src/models/MessageModel.ts",
"chars": 324,
"preview": "class MessageModel {\n title: string;\n question: string;\n id?: number;\n userEmail?: string;\n adminEmail?: "
},
{
"path": "auth0-security/fullstack-library-app-auth0/03-frontend/react-library/src/models/ReviewModel.ts",
"chars": 554,
"preview": "class ReviewModel {\n id: number;\n userEmail: string;\n date: string;\n rating: number;\n book_id: number;\n "
},
{
"path": "auth0-security/fullstack-library-app-auth0/03-frontend/react-library/src/models/ReviewRequestModel.ts",
"chars": 332,
"preview": "class ReviewRequestModel {\n rating: number;\n bookId: number;\n reviewDescription?: string;\n\n constructor(rati"
},
{
"path": "auth0-security/fullstack-library-app-auth0/03-frontend/react-library/src/models/ShelfCurrentLoans.ts",
"chars": 263,
"preview": "import BookModel from \"./BookModel\";\n\nclass ShelfCurrentLoans {\n book: BookModel;\n daysLeft: number;\n\n construc"
},
{
"path": "auth0-security/fullstack-library-app-auth0/03-frontend/react-library/src/react-app-env.d.ts",
"chars": 40,
"preview": "/// <reference types=\"react-scripts\" />\n"
},
{
"path": "auth0-security/fullstack-library-app-auth0/03-frontend/react-library/tsconfig.json",
"chars": 535,
"preview": "{\n \"compilerOptions\": {\n \"target\": \"es5\",\n \"lib\": [\n \"dom\",\n \"dom.iterable\",\n \"esnext\"\n ],\n "
},
{
"path": "auth0-security/fullstack-library-app-auth0/static-html-css-files/Section 10. Home Page Static Files/Carousel.tsx",
"chars": 5163,
"preview": "export const Carousel = () => {\n return (\n <div className='container mt-5' style={{ height: 550 }}>\n "
},
{
"path": "auth0-security/fullstack-library-app-auth0/static-html-css-files/Section 10. Home Page Static Files/ExploreTopBooks.tsx",
"chars": 625,
"preview": "export const ExploreTopBooks = () => {\n return (\n <div className='p-5 mb-4 bg-dark header'>\n <div c"
},
{
"path": "auth0-security/fullstack-library-app-auth0/static-html-css-files/Section 10. Home Page Static Files/Footer.tsx",
"chars": 872,
"preview": "export const Footer = () => {\n return (\n <div className='main-color'>\n <footer className='container"
},
{
"path": "auth0-security/fullstack-library-app-auth0/static-html-css-files/Section 10. Home Page Static Files/Heros.tsx",
"chars": 3772,
"preview": "export const Heros = () => {\n return (\n <div>\n <div className='d-none d-lg-block'>\n "
},
{
"path": "auth0-security/fullstack-library-app-auth0/static-html-css-files/Section 10. Home Page Static Files/LibraryServices.tsx",
"chars": 970,
"preview": "export const LibraryServices = () => {\n return (\n <div className='container my-5'>\n <div className="
},
{
"path": "auth0-security/fullstack-library-app-auth0/static-html-css-files/Section 10. Home Page Static Files/Navbar.tsx",
"chars": 1191,
"preview": "export const Navbar = () => {\n\n return (\n <nav className='navbar navbar-expand-lg navbar-dark main-color py-3'>\n "
},
{
"path": "auth0-security/fullstack-library-app-auth0/static-html-css-files/Section 10. Home Page Static Files/ReturnBook.tsx",
"chars": 608,
"preview": "import React from 'react'\n\nexport const ReturnBook = () => {\n return (\n <div className='col-xs-6 col-sm-6 col-"
},
{
"path": "auth0-security/fullstack-library-app-auth0/static-html-css-files/Section 13. Search Books Page Static Files/Pagination.tsx",
"chars": 2198,
"preview": "export const Pagination: React.FC<{currentPage: number,\n totalPages: number,\n paginate: any}> = (props) => {\n\n "
},
{
"path": "auth0-security/fullstack-library-app-auth0/static-html-css-files/Section 13. Search Books Page Static Files/SearchBook.tsx",
"chars": 2502,
"preview": "import BookModel from \"../../../models/BookModel\"\n\nexport const SearchBook: React.FC<{ book: BookModel }> = (props) => {"
},
{
"path": "auth0-security/fullstack-library-app-auth0/static-html-css-files/Section 13. Search Books Page Static Files/SearchBooksPage.tsx",
"chars": 5062,
"preview": "import { useEffect, useState } from 'react';\nimport BookModel from '../../models/BookModel';\nimport { SpinnerLoading } f"
},
{
"path": "auth0-security/fullstack-library-app-auth0/static-html-css-files/Section 15. Book Checkout Static Files/BookCheckoutPage.tsx",
"chars": 3538,
"preview": "import { useEffect, useState } from \"react\";\nimport BookModel from \"../../models/BookModel\";\nimport { SpinnerLoading } f"
},
{
"path": "auth0-security/fullstack-library-app-auth0/static-html-css-files/Section 15. Book Checkout Static Files/CheckoutAndReviewBox.tsx",
"chars": 1774,
"preview": "import { Link } from \"react-router-dom\";\nimport BookModel from \"../../models/BookModel\";\n\nexport const CheckoutAndReview"
},
{
"path": "auth0-security/fullstack-library-app-auth0/static-html-css-files/Section 15. Book Checkout Static Files/StarsReview.tsx",
"chars": 3067,
"preview": "export const StarsReview: React.FC<{ rating: number, size: number }> = (props) => {\n \n let rating = props.rating;\n"
},
{
"path": "auth0-security/fullstack-library-app-auth0/static-html-css-files/Section 16. Reviews Static Files/LatestReviews.tsx",
"chars": 1351,
"preview": "import { Link } from \"react-router-dom\";\nimport ReviewModel from \"../../models/ReviewModel\";\n\nexport const LatestReviews"
},
{
"path": "auth0-security/fullstack-library-app-auth0/static-html-css-files/Section 16. Reviews Static Files/Review.tsx",
"chars": 1110,
"preview": "import ReviewModel from \"../../models/ReviewModel\";\nimport { StarsReview } from \"./StarsReview\";\n\nexport const Review: R"
},
{
"path": "auth0-security/fullstack-library-app-auth0/static-html-css-files/Section 23. Leave a Review Static Files/LeaveAReview.tsx",
"chars": 1852,
"preview": "import { useState } from 'react';\nimport { StarsReview } from './StarsReview';\n\nexport const LeaveAReview: React.FC<{}> "
},
{
"path": "auth0-security/fullstack-library-app-auth0/static-html-css-files/Section 24. Review List Page Static Files/ReviewListPage.tsx",
"chars": 3449,
"preview": "import { useEffect, useState } from 'react';\nimport ReviewModel from '../../../models/ReviewModel';\nimport { Pagination "
},
{
"path": "auth0-security/fullstack-library-app-auth0/static-html-css-files/Section 25. Shelf Page Static Files/Loans.tsx",
"chars": 10354,
"preview": "import { useOktaAuth } from '@okta/okta-react';\nimport { useEffect, useState } from 'react';\nimport { Link } from 'react"
},
{
"path": "auth0-security/fullstack-library-app-auth0/static-html-css-files/Section 25. Shelf Page Static Files/LoansModal.tsx",
"chars": 4810,
"preview": "import ShelfCurrentLoans from \"../../../models/ShelfCurrentLoans\";\n\nexport const LoansModal: React.FC<{ shelfCurrentLoan"
},
{
"path": "auth0-security/fullstack-library-app-auth0/static-html-css-files/Section 25. Shelf Page Static Files/ShelfPage.tsx",
"chars": 1506,
"preview": "export const ShelfPage = () => {\n return (\n <div className='container'>\n <div className='mt-3'>\n "
},
{
"path": "auth0-security/fullstack-library-app-auth0/static-html-css-files/Section 26. History Page Static Files/HistoryPage.tsx",
"chars": 5146,
"preview": "import { useOktaAuth } from '@okta/okta-react';\nimport { useEffect, useState } from 'react';\nimport { Link } from 'react"
},
{
"path": "auth0-security/fullstack-library-app-auth0/static-html-css-files/Section 27. Library Services Static Files/Messages.tsx",
"chars": 3886,
"preview": "import { useEffect, useState } from 'react';\nimport { useOktaAuth } from '@okta/okta-react';\nimport MessageModel from '."
},
{
"path": "auth0-security/fullstack-library-app-auth0/static-html-css-files/Section 27. Library Services Static Files/MessagesPage.tsx",
"chars": 1758,
"preview": "import { useState } from 'react';\n\nexport const MessagesPage = () => {\n \n const [messagesClick, setMessagesClick] "
},
{
"path": "auth0-security/fullstack-library-app-auth0/static-html-css-files/Section 27. Library Services Static Files/PostNewMessage.tsx",
"chars": 2128,
"preview": "import { useOktaAuth } from '@okta/okta-react';\nimport { useState } from 'react';\n\nexport const PostNewMessage = () => {"
},
{
"path": "auth0-security/fullstack-library-app-auth0/static-html-css-files/Section 28. Manage Library Services Static Files/AdminMessage.tsx",
"chars": 1654,
"preview": "import { useState } from \"react\";\nimport MessageModel from \"../../../models/MessageModel\";\n\nexport const AdminMessage: R"
},
{
"path": "auth0-security/fullstack-library-app-auth0/static-html-css-files/Section 28. Manage Library Services Static Files/AdminMessages.tsx",
"chars": 2864,
"preview": "import { useOktaAuth } from '@okta/okta-react';\nimport { useEffect, useState } from 'react';\nimport MessageModel from '."
},
{
"path": "auth0-security/fullstack-library-app-auth0/static-html-css-files/Section 28. Manage Library Services Static Files/ManageLibraryPage.tsx",
"chars": 2417,
"preview": "import { useOktaAuth } from '@okta/okta-react';\nimport { useState } from 'react';\n\nexport const ManageLibraryPage = () ="
},
{
"path": "auth0-security/fullstack-library-app-auth0/static-html-css-files/Section 29. Add new book Static Files/AddNewBook.tsx",
"chars": 4422,
"preview": "import { useOktaAuth } from '@okta/okta-react';\nimport { useState } from 'react';\n\nexport const AddNewBook = () => {\n\n "
},
{
"path": "auth0-security/fullstack-library-app-auth0/static-html-css-files/Section 30. Change Quantity Static Files/ChangeQuantityOfBook.tsx",
"chars": 2984,
"preview": "import { useEffect, useState } from \"react\";\nimport BookModel from \"../../../models/BookModel\";\n\nexport const ChangeQuan"
},
{
"path": "auth0-security/fullstack-library-app-auth0/static-html-css-files/Section 30. Change Quantity Static Files/ChangeQuantityOfBooks.tsx",
"chars": 3454,
"preview": "import React from \"react\";\nimport { useEffect, useState } from \"react\";\nimport BookModel from '../../../models/BookModel"
},
{
"path": "bonus-content/keytool-steps.md",
"chars": 3914,
"preview": "# Keytool - Generate key and self-signed certificate\n\nThis document includes instructions for generating a key and self-"
},
{
"path": "bonus-content/openssl-setup.md",
"chars": 9494,
"preview": "# OpenSSL Setup - Generate key and self-signed certificate\n\nThis document includes instructions for OpenSSL setup. It al"
},
{
"path": "install-react-tools/linux/install-linux.md",
"chars": 5959,
"preview": "# Linux - Install Development Tools\n\nIn this guide, we will install the following development tools\n\n* Visual Studio Cod"
},
{
"path": "install-react-tools/mac/install-mac.md",
"chars": 7219,
"preview": "# Mac - Install Development Tools\n\nIn this guide, we will install the following development tools\n\n* Visual Studio Code\n"
},
{
"path": "install-react-tools/ms-windows/install-ms-windows.md",
"chars": 4402,
"preview": "# MS Windows - Install Development Tools\n\nIn this guide, we will install the following development tools\n\n* Visual Studi"
},
{
"path": "source-code/bootstrap-training/1. Containers/home.html",
"chars": 771,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, in"
},
{
"path": "source-code/bootstrap-training/10 accordions/home.html",
"chars": 1235,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, in"
},
{
"path": "source-code/bootstrap-training/11. Columns in rows/home.html",
"chars": 1059,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, in"
},
{
"path": "source-code/bootstrap-training/12. Rows and columns/home.html",
"chars": 978,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, in"
},
{
"path": "source-code/bootstrap-training/13. Tables/home.html",
"chars": 1272,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, in"
},
{
"path": "source-code/bootstrap-training/14. Forms Basic/home.html",
"chars": 2000,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, in"
},
{
"path": "source-code/bootstrap-training/15. Forms/home.html",
"chars": 2034,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, in"
},
{
"path": "source-code/bootstrap-training/16. Modals/home.html",
"chars": 1402,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, in"
},
{
"path": "source-code/bootstrap-training/17. Hide/home.html",
"chars": 906,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, in"
},
{
"path": "source-code/bootstrap-training/2. Buttons/home.html",
"chars": 2392,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, in"
},
{
"path": "source-code/bootstrap-training/3. Dropdowns/home.html",
"chars": 1188,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, in"
},
{
"path": "source-code/bootstrap-training/4. Cards/home.html",
"chars": 1113,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, in"
},
{
"path": "source-code/bootstrap-training/5. Alerts/home.html",
"chars": 1481,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, in"
},
{
"path": "source-code/bootstrap-training/6. Spinners/home.html",
"chars": 1182,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, in"
},
{
"path": "source-code/bootstrap-training/7. Progress/home.html",
"chars": 877,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, in"
},
{
"path": "source-code/bootstrap-training/8. Collapse/home.html",
"chars": 1046,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, in"
},
{
"path": "source-code/bootstrap-training/9. Navbar/home.html",
"chars": 1556,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, in"
},
{
"path": "source-code/fullstack-library-app/01-starter-files/App.css/App.css",
"chars": 1052,
"preview": ":root{\n --mainOpacity: rgba(0, 0, 0, 0.55);\n}\n\n.header {\n background-image: linear-gradient( rgba(0, 0, 0, 0.7), r"
},
{
"path": "source-code/fullstack-library-app/01-starter-files/Scripts/Payment Script/Payment Script.sql",
"chars": 414,
"preview": "DROP TABLE IF EXISTS `payment`;\n/*!40101 SET @saved_cs_client = @@character_set_client */;\n/*!40101 SET character_set_cl"
},
{
"path": "source-code/fullstack-library-app/01-starter-files/Scripts/React-SpringBoot-Add-Books-Script-2.sql",
"chars": 2912611,
"preview": "INSERT INTO `book` VALUES \n (2,'Become a Guru in JavaScript','Luv, Lena','Pellentesque varius aliquam lacus quis rhon"
},
{
"path": "source-code/fullstack-library-app/01-starter-files/Scripts/React-SpringBoot-Add-Books-Script-3.sql",
"chars": 3166249,
"preview": " INSERT INTO `book` VALUES \n (7,'Advanced Techniques in JavaScript','Luv, Yasemin', 'Pellentesque varius aliquam lac"
},
{
"path": "source-code/fullstack-library-app/01-starter-files/Scripts/React-SpringBoot-Add-Books-Script-4.sql",
"chars": 2456971,
"preview": " INSERT INTO `book` VALUES \n\t(12,'The Expert Guide to SQL','Luv, Poornima','Morbi eu tempus eros, in imperdiet sem. Nu"
},
{
"path": "source-code/fullstack-library-app/01-starter-files/Scripts/React-SpringBoot-Add-Books-Script-5.sql",
"chars": 3606097,
"preview": " INSERT INTO `book` VALUES \n\t(17,'Advanced Techniques in React.js','Luv, Mary','Proin at urna faucibus, pretium mi in,"
},
{
"path": "source-code/fullstack-library-app/01-starter-files/Scripts/React-Springboot-Add-Tables-Script-1.sql",
"chars": 695480,
"preview": "CREATE DATABASE IF NOT EXISTS `reactlibrarydatabase` /*!40100 DEFAULT CHARACTER SET latin1 */;\nUSE `reactlibrarydatabas"
},
{
"path": "source-code/fullstack-library-app/01-starter-files/application.properties",
"chars": 395,
"preview": "spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver\nspring.datasource.url=jdbc:mysql://localhost:3306/demo?useS"
},
{
"path": "source-code/fullstack-library-app/02-backend/spring-boot-library/spring-boot-library/.gitignore",
"chars": 395,
"preview": "HELP.md\ntarget/\n!.mvn/wrapper/maven-wrapper.jar\n!**/src/main/**/target/\n!**/src/test/**/target/\n\n### STS ###\n.apt_genera"
},
{
"path": "source-code/fullstack-library-app/02-backend/spring-boot-library/spring-boot-library/.mvn/wrapper/maven-wrapper.properties",
"chars": 233,
"preview": "distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.6/apache-maven-3.8.6-bin.zip\nwrap"
},
{
"path": "source-code/fullstack-library-app/02-backend/spring-boot-library/spring-boot-library/mvnw",
"chars": 10284,
"preview": "#!/bin/sh\n# ----------------------------------------------------------------------------\n# Licensed to the Apache Softwa"
},
{
"path": "source-code/fullstack-library-app/02-backend/spring-boot-library/spring-boot-library/mvnw.cmd",
"chars": 6922,
"preview": "@REM ----------------------------------------------------------------------------\r\n@REM Licensed to the Apache Software "
},
{
"path": "source-code/fullstack-library-app/02-backend/spring-boot-library/spring-boot-library/pom.xml",
"chars": 2014,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2"
},
{
"path": "source-code/fullstack-library-app/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/SpringBootLibraryApplication.java",
"chars": 345,
"preview": "package com.luv2code.springbootlibrary;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.b"
},
{
"path": "source-code/fullstack-library-app/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/config/MyDataRestConfig.java",
"chars": 2097,
"preview": "package com.luv2code.springbootlibrary.config;\n\nimport com.luv2code.springbootlibrary.entity.Book;\nimport com.luv2code.s"
},
{
"path": "source-code/fullstack-library-app/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/config/SecurityConfiguration.java",
"chars": 1574,
"preview": "package com.luv2code.springbootlibrary.config;\n\nimport com.okta.spring.boot.oauth.Okta;\nimport org.springframework.conte"
},
{
"path": "source-code/fullstack-library-app/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/controller/AdminController.java",
"chars": 2518,
"preview": "package com.luv2code.springbootlibrary.controller;\n\nimport com.luv2code.springbootlibrary.requestmodels.AddBookRequest;\n"
},
{
"path": "source-code/fullstack-library-app/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/controller/BookController.java",
"chars": 2660,
"preview": "package com.luv2code.springbootlibrary.controller;\n\nimport com.luv2code.springbootlibrary.entity.Book;\nimport com.luv2co"
},
{
"path": "source-code/fullstack-library-app/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/controller/MessagesController.java",
"chars": 1650,
"preview": "package com.luv2code.springbootlibrary.controller;\n\nimport com.luv2code.springbootlibrary.entity.Message;\nimport com.luv"
},
{
"path": "source-code/fullstack-library-app/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/controller/ReviewController.java",
"chars": 1461,
"preview": "package com.luv2code.springbootlibrary.controller;\n\nimport com.luv2code.springbootlibrary.requestmodels.ReviewRequest;\ni"
},
{
"path": "source-code/fullstack-library-app/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/dao/BookRepository.java",
"chars": 839,
"preview": "package com.luv2code.springbootlibrary.dao;\n\nimport com.luv2code.springbootlibrary.entity.Book;\nimport org.springframewo"
},
{
"path": "source-code/fullstack-library-app/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/dao/CheckoutRepository.java",
"chars": 700,
"preview": "package com.luv2code.springbootlibrary.dao;\n\nimport com.luv2code.springbootlibrary.entity.Checkout;\nimport org.springfra"
},
{
"path": "source-code/fullstack-library-app/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/dao/HistoryRepository.java",
"chars": 493,
"preview": "package com.luv2code.springbootlibrary.dao;\n\nimport com.luv2code.springbootlibrary.entity.History;\nimport org.springfram"
},
{
"path": "source-code/fullstack-library-app/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/dao/MessageRepository.java",
"chars": 587,
"preview": "package com.luv2code.springbootlibrary.dao;\n\nimport com.luv2code.springbootlibrary.entity.Message;\nimport org.springfram"
},
{
"path": "source-code/fullstack-library-app/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/dao/ReviewRepository.java",
"chars": 880,
"preview": "package com.luv2code.springbootlibrary.dao;\n\nimport com.luv2code.springbootlibrary.entity.Review;\nimport org.springframe"
},
{
"path": "source-code/fullstack-library-app/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/entity/Book.java",
"chars": 684,
"preview": "package com.luv2code.springbootlibrary.entity;\n\nimport lombok.Data;\nimport javax.persistence.*;\n\n@Entity\n@Table(name = \""
},
{
"path": "source-code/fullstack-library-app/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/entity/Checkout.java",
"chars": 803,
"preview": "package com.luv2code.springbootlibrary.entity;\n\nimport lombok.Data;\n\nimport javax.persistence.*;\n\n@Entity\n@Table(name = "
},
{
"path": "source-code/fullstack-library-app/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/entity/History.java",
"chars": 1140,
"preview": "package com.luv2code.springbootlibrary.entity;\n\nimport lombok.Data;\n\nimport javax.persistence.*;\n\n@Entity\n@Table(name = "
},
{
"path": "source-code/fullstack-library-app/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/entity/Message.java",
"chars": 784,
"preview": "package com.luv2code.springbootlibrary.entity;\n\n\nimport lombok.Data;\n\nimport javax.persistence.*;\n\n@Entity\n@Table(name ="
},
{
"path": "source-code/fullstack-library-app/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/entity/Review.java",
"chars": 686,
"preview": "package com.luv2code.springbootlibrary.entity;\n\nimport lombok.Data;\nimport org.hibernate.annotations.CreationTimestamp;\n"
},
{
"path": "source-code/fullstack-library-app/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/requestmodels/AddBookRequest.java",
"chars": 283,
"preview": "package com.luv2code.springbootlibrary.requestmodels;\n\nimport lombok.Data;\n\n@Data\npublic class AddBookRequest {\n\n pri"
},
{
"path": "source-code/fullstack-library-app/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/requestmodels/AdminQuestionRequest.java",
"chars": 172,
"preview": "package com.luv2code.springbootlibrary.requestmodels;\n\nimport lombok.Data;\n\n@Data\npublic class AdminQuestionRequest {\n\n "
},
{
"path": "source-code/fullstack-library-app/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/requestmodels/ReviewRequest.java",
"chars": 244,
"preview": "package com.luv2code.springbootlibrary.requestmodels;\n\nimport lombok.Data;\n\nimport java.util.Optional;\n\n@Data\npublic cla"
},
{
"path": "source-code/fullstack-library-app/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/responsemodels/ShelfCurrentLoansResponse.java",
"chars": 359,
"preview": "package com.luv2code.springbootlibrary.responsemodels;\n\nimport com.luv2code.springbootlibrary.entity.Book;\nimport lombok"
},
{
"path": "source-code/fullstack-library-app/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/service/AdminService.java",
"chars": 2902,
"preview": "package com.luv2code.springbootlibrary.service;\n\nimport com.luv2code.springbootlibrary.dao.BookRepository;\nimport com.lu"
},
{
"path": "source-code/fullstack-library-app/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/service/BookService.java",
"chars": 5614,
"preview": "package com.luv2code.springbootlibrary.service;\n\nimport com.luv2code.springbootlibrary.dao.BookRepository;\nimport com.lu"
},
{
"path": "source-code/fullstack-library-app/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/service/MessagesService.java",
"chars": 1461,
"preview": "package com.luv2code.springbootlibrary.service;\n\nimport com.luv2code.springbootlibrary.dao.MessageRepository;\nimport com"
},
{
"path": "source-code/fullstack-library-app/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/service/ReviewService.java",
"chars": 1868,
"preview": "package com.luv2code.springbootlibrary.service;\n\nimport com.luv2code.springbootlibrary.dao.BookRepository;\nimport com.lu"
},
{
"path": "source-code/fullstack-library-app/02-backend/spring-boot-library/spring-boot-library/src/main/java/com/luv2code/springbootlibrary/utils/ExtractJWT.java",
"chars": 1163,
"preview": "package com.luv2code.springbootlibrary.utils;\n\nimport java.util.Base64;\nimport java.util.HashMap;\nimport java.util.Map;\n"
},
{
"path": "source-code/fullstack-library-app/02-backend/spring-boot-library/spring-boot-library/src/main/resources/application.properties",
"chars": 520,
"preview": "spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver\nspring.datasource.url=jdbc:mysql://localhost:3306/reactlibr"
},
{
"path": "source-code/fullstack-library-app/02-backend/spring-boot-library/spring-boot-library/src/test/java/com/luv2code/springbootlibrary/SpringBootLibraryApplicationTests.java",
"chars": 233,
"preview": "package com.luv2code.springbootlibrary;\n\nimport org.junit.jupiter.api.Test;\nimport org.springframework.boot.test.context"
},
{
"path": "source-code/fullstack-library-app/03-frontend/react-library/.gitignore",
"chars": 310,
"preview": "# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.\n\n# dependencies\n/node_modules\n/.pn"
},
{
"path": "source-code/fullstack-library-app/03-frontend/react-library/README.md",
"chars": 2103,
"preview": "# Getting Started with Create React App\n\nThis project was bootstrapped with [Create React App](https://github.com/facebo"
},
{
"path": "source-code/fullstack-library-app/03-frontend/react-library/package.json",
"chars": 1151,
"preview": "{\n \"name\": \"react-library\",\n \"version\": \"0.1.0\",\n \"private\": true,\n \"dependencies\": {\n \"@okta/okta-react\": \"^6.4."
},
{
"path": "source-code/fullstack-library-app/03-frontend/react-library/public/index.html",
"chars": 2232,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\" />\n <link rel=\"icon\" href=\"%PUBLIC_URL%/favicon.i"
},
{
"path": "source-code/fullstack-library-app/03-frontend/react-library/public/manifest.json",
"chars": 492,
"preview": "{\n \"short_name\": \"React App\",\n \"name\": \"Create React App Sample\",\n \"icons\": [\n {\n \"src\": \"favicon.ico\",\n "
},
{
"path": "source-code/fullstack-library-app/03-frontend/react-library/public/robots.txt",
"chars": 67,
"preview": "# https://www.robotstxt.org/robotstxt.html\nUser-agent: *\nDisallow:\n"
},
{
"path": "source-code/fullstack-library-app/03-frontend/react-library/src/App.css",
"chars": 1052,
"preview": ":root{\n --mainOpacity: rgba(0, 0, 0, 0.55);\n}\n\n.header {\n background-image: linear-gradient( rgba(0, 0, 0, 0.7), r"
},
{
"path": "source-code/fullstack-library-app/03-frontend/react-library/src/App.tsx",
"chars": 2484,
"preview": "import React from 'react';\nimport { Redirect, Route, Switch, useHistory } from 'react-router-dom';\nimport './App.css';\ni"
}
]
// ... and 238 more files (download for full content)
About this extraction
This page contains the full source code of the darbyluv2code/fullstack-react-and-springboot GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 438 files (25.4 MB), approximately 6.7M tokens, and a symbol index with 477 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.