From b1a5d8f5d30d881b1e8daca97f3d1fd97ecedf96 Mon Sep 17 00:00:00 2001 From: "Anthony D. Mays" Date: Mon, 8 Apr 2024 21:41:50 -0700 Subject: [PATCH 1/4] feat: adds Lesson 18 content and exercise walkthrough (#373) * chore: adding boilerplate and templates. * chore: update the readme * docs: adds walkthrough tutorial * doc: fixing instructions * doc: nit updates * docs: adds a note about CORS. * doc: adds alternative dev tools shortcut * docs: nit --- .../lesson16/web/MediaItemsController.java | 12 +- lesson_18/README.md | 56 + lesson_18/api/.gitattributes | 9 + lesson_18/api/.gitignore | 5 + lesson_18/api/api_app/build.gradle.kts | 78 + lesson_18/api/api_app/lombok.config | 2 + .../codedifferently/lesson18/Lesson18.java | 38 + .../lesson18/cli/LibraryApp.java | 190 ++ .../lesson18/cli/LibraryCommand.java | 28 + .../lesson18/cli/LibrarySearchCommand.java | 28 + .../factory/LibraryCsvDataLoader.java | 126 ++ .../lesson18/factory/LibraryDataLoader.java | 15 + .../lesson18/factory/LibraryDbDataLoader.java | 26 + .../lesson18/factory/LibraryFactory.java | 103 + .../factory/LibraryJsonDataLoader.java | 28 + .../lesson18/library/Book.java | 77 + .../codedifferently/lesson18/library/Dvd.java | 20 + .../lesson18/library/Librarian.java | 13 + .../lesson18/library/Library.java | 300 +++ .../library/LibraryConfiguration.java | 16 + .../lesson18/library/LibraryGuest.java | 45 + .../lesson18/library/LibraryGuestBase.java | 75 + .../lesson18/library/LibraryInfo.java | 20 + .../lesson18/library/Magazine.java | 25 + .../lesson18/library/MediaItem.java | 53 + .../lesson18/library/MediaItemBase.java | 93 + .../lesson18/library/MediaType.java | 28 + .../lesson18/library/Newspaper.java | 25 + .../lesson18/library/Patron.java | 20 + .../exceptions/LibraryNotSetException.java | 7 + .../MediaItemCheckedOutException.java | 7 + .../exceptions/WrongLibraryException.java | 7 + .../library/search/CatalogSearcher.java | 31 + .../library/search/SearchCriteria.java | 24 + .../lesson18/library/search/Searchable.java | 11 + .../lesson18/models/AuthorsConverter.java | 18 + .../lesson18/models/CheckoutModel.java | 15 + .../lesson18/models/LibraryDataModel.java | 61 + .../lesson18/models/LibraryGuestModel.java | 19 + .../lesson18/models/MediaItemModel.java | 29 + .../repository/LibraryGuestRepository.java | 10 + .../repository/MediaItemRepository.java | 11 + .../lesson18/web/CreateMediaItemRequest.java | 17 + .../lesson18/web/CreateMediaItemResponse.java | 10 + .../lesson18/web/GetMediaItemsResponse.java | 12 + .../lesson18/web/GlobalExceptionHandler.java | 33 + .../lesson18/web/MediaItemRequest.java | 52 + .../lesson18/web/MediaItemResponse.java | 37 + .../lesson18/web/MediaItemsController.java | 34 + .../lesson18/web/WebConfiguration.java | 11 + .../src/main/resources/application.yml | 9 + .../main/resources/csv/checked_out_items.csv | 5 + .../api_app/src/main/resources/csv/guests.csv | 6 + .../src/main/resources/csv/media_items.csv | 32 + .../api_app/src/main/resources/json/data.json | 268 +++ .../main/resources/queries/anthonydmays.sql | 1 + .../api_app/src/main/resources/sqlite/data.db | Bin 0 -> 16384 bytes .../lesson18/Lesson18Test.java | 13 + .../factory/LibraryCsvDataLoaderTest.java | 84 + .../factory/LibraryJsonDataLoaderTest.java | 76 + .../lesson18/library/BookTest.java | 94 + .../lesson18/library/LibraryTest.java | 353 ++++ .../lesson18/library/MediaItemBaseTest.java | 94 + .../lesson18/library/PatronTest.java | 93 + .../web/MediaItemsControllerTest.java | 125 ++ .../api/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 61608 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + lesson_18/api/gradlew | 244 +++ lesson_18/api/gradlew.bat | 92 + lesson_18/api/settings.gradle.kts | 13 + lesson_18/webserver/package-lock.json | 1697 +++++++++++++++++ lesson_18/webserver/package.json | 25 + lesson_18/webserver/public/favicon.ico | Bin 0 -> 1310 bytes .../webserver/public/index-with-form.html | 29 + lesson_18/webserver/public/index.html | 27 + lesson_18/webserver/public/logo.gif | Bin 0 -> 304480 bytes lesson_18/webserver/public/script.js | 85 + lesson_18/webserver/public/style.css | 52 + lesson_18/webserver/src/server.ts | 34 + lesson_18/webserver/tsconfig.json | 12 + 80 files changed, 5575 insertions(+), 4 deletions(-) create mode 100644 lesson_18/README.md create mode 100644 lesson_18/api/.gitattributes create mode 100644 lesson_18/api/.gitignore create mode 100644 lesson_18/api/api_app/build.gradle.kts create mode 100644 lesson_18/api/api_app/lombok.config create mode 100644 lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/Lesson18.java create mode 100644 lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/cli/LibraryApp.java create mode 100644 lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/cli/LibraryCommand.java create mode 100644 lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/cli/LibrarySearchCommand.java create mode 100644 lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/factory/LibraryCsvDataLoader.java create mode 100644 lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/factory/LibraryDataLoader.java create mode 100644 lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/factory/LibraryDbDataLoader.java create mode 100644 lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/factory/LibraryFactory.java create mode 100644 lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/factory/LibraryJsonDataLoader.java create mode 100644 lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/Book.java create mode 100644 lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/Dvd.java create mode 100644 lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/Librarian.java create mode 100644 lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/Library.java create mode 100644 lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/LibraryConfiguration.java create mode 100644 lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/LibraryGuest.java create mode 100644 lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/LibraryGuestBase.java create mode 100644 lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/LibraryInfo.java create mode 100644 lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/Magazine.java create mode 100644 lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/MediaItem.java create mode 100644 lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/MediaItemBase.java create mode 100644 lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/MediaType.java create mode 100644 lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/Newspaper.java create mode 100644 lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/Patron.java create mode 100644 lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/exceptions/LibraryNotSetException.java create mode 100644 lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/exceptions/MediaItemCheckedOutException.java create mode 100644 lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/exceptions/WrongLibraryException.java create mode 100644 lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/search/CatalogSearcher.java create mode 100644 lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/search/SearchCriteria.java create mode 100644 lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/search/Searchable.java create mode 100644 lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/models/AuthorsConverter.java create mode 100644 lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/models/CheckoutModel.java create mode 100644 lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/models/LibraryDataModel.java create mode 100644 lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/models/LibraryGuestModel.java create mode 100644 lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/models/MediaItemModel.java create mode 100644 lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/repository/LibraryGuestRepository.java create mode 100644 lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/repository/MediaItemRepository.java create mode 100644 lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/web/CreateMediaItemRequest.java create mode 100644 lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/web/CreateMediaItemResponse.java create mode 100644 lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/web/GetMediaItemsResponse.java create mode 100644 lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/web/GlobalExceptionHandler.java create mode 100644 lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/web/MediaItemRequest.java create mode 100644 lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/web/MediaItemResponse.java create mode 100644 lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/web/MediaItemsController.java create mode 100644 lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/web/WebConfiguration.java create mode 100644 lesson_18/api/api_app/src/main/resources/application.yml create mode 100644 lesson_18/api/api_app/src/main/resources/csv/checked_out_items.csv create mode 100644 lesson_18/api/api_app/src/main/resources/csv/guests.csv create mode 100644 lesson_18/api/api_app/src/main/resources/csv/media_items.csv create mode 100644 lesson_18/api/api_app/src/main/resources/json/data.json create mode 100644 lesson_18/api/api_app/src/main/resources/queries/anthonydmays.sql create mode 100644 lesson_18/api/api_app/src/main/resources/sqlite/data.db create mode 100644 lesson_18/api/api_app/src/test/java/com/codedifferently/lesson18/Lesson18Test.java create mode 100644 lesson_18/api/api_app/src/test/java/com/codedifferently/lesson18/factory/LibraryCsvDataLoaderTest.java create mode 100644 lesson_18/api/api_app/src/test/java/com/codedifferently/lesson18/factory/LibraryJsonDataLoaderTest.java create mode 100644 lesson_18/api/api_app/src/test/java/com/codedifferently/lesson18/library/BookTest.java create mode 100644 lesson_18/api/api_app/src/test/java/com/codedifferently/lesson18/library/LibraryTest.java create mode 100644 lesson_18/api/api_app/src/test/java/com/codedifferently/lesson18/library/MediaItemBaseTest.java create mode 100644 lesson_18/api/api_app/src/test/java/com/codedifferently/lesson18/library/PatronTest.java create mode 100644 lesson_18/api/api_app/src/test/java/com/codedifferently/lesson18/web/MediaItemsControllerTest.java create mode 100644 lesson_18/api/gradle/wrapper/gradle-wrapper.jar create mode 100644 lesson_18/api/gradle/wrapper/gradle-wrapper.properties create mode 100755 lesson_18/api/gradlew create mode 100644 lesson_18/api/gradlew.bat create mode 100644 lesson_18/api/settings.gradle.kts create mode 100644 lesson_18/webserver/package-lock.json create mode 100644 lesson_18/webserver/package.json create mode 100644 lesson_18/webserver/public/favicon.ico create mode 100644 lesson_18/webserver/public/index-with-form.html create mode 100644 lesson_18/webserver/public/index.html create mode 100644 lesson_18/webserver/public/logo.gif create mode 100644 lesson_18/webserver/public/script.js create mode 100644 lesson_18/webserver/public/style.css create mode 100644 lesson_18/webserver/src/server.ts create mode 100644 lesson_18/webserver/tsconfig.json diff --git a/lesson_16/api/api_app/src/main/java/com/codedifferently/lesson16/web/MediaItemsController.java b/lesson_16/api/api_app/src/main/java/com/codedifferently/lesson16/web/MediaItemsController.java index cae5ff06..43cb1ac0 100644 --- a/lesson_16/api/api_app/src/main/java/com/codedifferently/lesson16/web/MediaItemsController.java +++ b/lesson_16/api/api_app/src/main/java/com/codedifferently/lesson16/web/MediaItemsController.java @@ -1,16 +1,20 @@ package com.codedifferently.lesson16.web; -import com.codedifferently.lesson16.library.Librarian; -import com.codedifferently.lesson16.library.Library; -import com.codedifferently.lesson16.library.MediaItem; -import com.codedifferently.lesson16.library.search.SearchCriteria; import java.io.IOException; import java.util.List; import java.util.Set; + +import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; +import com.codedifferently.lesson16.library.Librarian; +import com.codedifferently.lesson16.library.Library; +import com.codedifferently.lesson16.library.MediaItem; +import com.codedifferently.lesson16.library.search.SearchCriteria; + @RestController +@CrossOrigin public class MediaItemsController { private final Library library; private final Librarian librarian; diff --git a/lesson_18/README.md b/lesson_18/README.md new file mode 100644 index 00000000..65cfaca4 --- /dev/null +++ b/lesson_18/README.md @@ -0,0 +1,56 @@ +# Lesson 18 + +## Lecture Resources + +* [HTML Tutorial for Beginners: HTML Crash Course](https://youtu.be/qz0aGYrrlhU) **(1 hour)** - An introduction to HTML designed for folks who've never worked with it or would like a refresher. +* [Client-side vs Server-side, Front-end vs Back-end? Beginner Explanation of JavaScript on the Web](https://youtu.be/7GRKUaQ8Spk) **(12 minutes)** - Check out this video to help understand the difference between the server-side and the client-side +* [Post From HTML Form To MongoDB Atlas | Javascript Tutorial](https://www.youtube.com/watch?v=ZhqOp1Dkuso) **(12 minutes)** - This short tutorial explores the traditional way that web pages send data back and forth with a web server. +* [POST Form Data With JavaScript Fetch API](https://youtu.be/fGYQJAlLD68) **(10 minutes)** - A tutorial on how to interact with servers from the client-side using the Fetch API in the browser via JavaScript. + +## Homework + +* Go through the lecture resources to understand the basics of working with web clients and servers. Feel free to skip the HTML tutorial if you feel comfortable working with the basics already. +* Complete the [Exploring the Client and Servers](#exploring-the-client-and-servers) walthrough. + +## Exploring the Client and Servers + +Let's add some interactivity to a web page by using what we've learned about HTML, CSS, and JavaScript to exchange data with both a web server and an API server. For this exercise, we'll execute the same task (searching for media items by title) both on the server-side and on the client-side. + +### Sending form data on button click + +As demonstrated in lecture, we have a NodeJS web server implemented in TypeScript using the Express library (all files in the [webserver/](./webserver/) folder). + +1. We need to start both our web server and api servers. Our API server is implemented in Java, so navigate into the [api/](./api/) folder to get that started using `gradle run` in a terminal window. It should be running on port 5000. +2. Once the API server is started, run the Node web server using NPM by executing `npm run dev` in a separate terminal, this time navigating into the [webserver/] folder. Confirm that it has started the server on port 4000. +3. Now, Open up the [public/index.html](./webserver/public/index.html) so that we can make some changes. +4. Wrap the search box and button `div` elements in a `
` element. Configure the `action` attribute on the form to specify `/search` as the target where we will send form data and the `method` attribute to the value `POST`. +> [!NOTE] +> Our web server that serves the HTML you're modifying is also listening for `POST` requests on the `/search` path and will [read the form data](./webserver/src/server.ts#L8) in order to figure out what text to use for search. It will call our Java-based API server to query for media items. +5. To configure which field data will get sent with the post data, we need to add a `name` attribute to the desired elements. For now, we just need to send the search text, so configure the `name` attribute to be `searchText`. +> [!NOTE] +> Note that we're using `camelCase` for the element name attribute and not `kebab-case` as we do with the `class` attribute. This is a convention used by some projects and isn't a mandatory rule. +6. You should be able to view the page by visiting http://localhost:4000/. Try entering some text in the search box and clicking the search button. You should be redirected to the `/search` url and see results dynamically rendered. +7. Check the terminal where your web server is running. You should see messages prefixed with `Server: Search for titles containing` that confirm your requests have reached the server. + +The look of the results page is very simple as we're generating the HTML the hard wayβ€”character by character. In real life, we would use template engines that help us generate dynamic HTML and describe how we want it to change based on data. We'll discuss this more in the next lecture. + +### Doing the work on the client-side instead + +This time, instead of sending data to our web server, we'll keep the data in the browser and fetch what we need from the API server ourselves. The benefit to this approach is that we don't have to make a trip to the web server before calling the API server, but the downside is that we have to move that logic into our clients-side JavaScript. Figuring out which approach is the best (server-side vs. client-side) for any given project is tough and requires assessing a bunch of tradeoffs that's beyond the scope of this exercise. + +1. For this part, we're going to make a single code change to the [script.js](./webserver/public/script.js#L4) file. Uncomment the code on [line 4](./webserver/public/script.js#L4) to get things wired up. +2. Refresh or browse to the main page at https://localhost:4000/. Enter some text again and click search. Notice that instead of redirecting, results appear below the search buttons. +3. Assuming you're using Google Chrome, Open the **Developer Tools** in the browser using `F12` or `Option βŒ₯ - Cmd ⌘ - J` on Mac. On the **Console** tab, you should see messages that start with `Client: Searching for titles containing`. Note that you may need to execute a new search in order to see the messages. + +There are several things in the `script.js` file that make this demo work. Let's discuss each part. + +1. First, the code in `listenForSearchButtonClick` searches for the search button using the css class selector `.search-button` and attaches an event handler that simply calls the `onSearchButtonClick` whenever the button is clicked. +2. Once the button is clicked and the function is activated, we prevent the form from submitted data to the web server by using the provided `event` parameter and calling `event.preventDefault()` to stop the normal, default button behavior. +3. Next we read the search text from the text box identify the term we want to search on. +4. We call the `performSearch` method with the search text which will, in turn, use the `fetch` API in the browser to make a web request to our API server, parse the JSON response, and filter through the results to find matching titles. The code for getting results from the API is almost [exactly the same as the code](./webserver/src/server.ts) we were running in TypeScript on our web server. +5. Lastly, since we're on the client-side, we can use JavaScript to dynamically modify the HTML to show our results. The `showResults` function demonstrates how we manipulate the DOM to add new elements to the page without going to the server. + +> [!WARNING] +> There is one very important change that needed to be made to our API server that allowed us to call it from the client-side. For security purposes, modern browsers and server typically don't just let you post data anywhere except to URL from the same origin (in this case, localhost:4000). This is done to prevent a type of security vulnerability called a cross-site scripting (XSS) that attackers use to steal information from one website using JavaScript code running from another site. +> +> To that end, one change was made to the [MediaItemsController](./api/api_app/src/main/java/com/codedifferently/lesson18/web/MediaItemsController.java#L17) to let us call the API. A new `CrossOrigin` attribute was added to the controller to let us use CORS to access the API. This lets our website code that runs from localhost:4000 call our API server at localhost:5000. In the real world, we'd want to configure only the specific hosts we want to access our API or use other means of protection to prevent arbitrary access to our API. \ No newline at end of file diff --git a/lesson_18/api/.gitattributes b/lesson_18/api/.gitattributes new file mode 100644 index 00000000..097f9f98 --- /dev/null +++ b/lesson_18/api/.gitattributes @@ -0,0 +1,9 @@ +# +# https://help.github.com/articles/dealing-with-line-endings/ +# +# Linux start script should use lf +/gradlew text eol=lf + +# These are Windows script files and should use crlf +*.bat text eol=crlf + diff --git a/lesson_18/api/.gitignore b/lesson_18/api/.gitignore new file mode 100644 index 00000000..1b6985c0 --- /dev/null +++ b/lesson_18/api/.gitignore @@ -0,0 +1,5 @@ +# Ignore Gradle project-specific cache directory +.gradle + +# Ignore Gradle build output directory +build diff --git a/lesson_18/api/api_app/build.gradle.kts b/lesson_18/api/api_app/build.gradle.kts new file mode 100644 index 00000000..78289559 --- /dev/null +++ b/lesson_18/api/api_app/build.gradle.kts @@ -0,0 +1,78 @@ +plugins { + // Apply the application plugin to add support for building a CLI application in Java. + application + eclipse + id("com.diffplug.spotless") version "6.25.0" + id("org.springframework.boot") version "3.2.2" + id("com.adarshr.test-logger") version "4.0.0" + id("io.freefair.lombok") version "8.6" +} + +apply(plugin = "io.spring.dependency-management") + +repositories { + // Use Maven Central for resolving dependencies. + mavenCentral() +} + +dependencies { + // Use JUnit Jupiter for testing. + testImplementation("com.codedifferently.instructional:instructional-lib") + testImplementation("org.junit.jupiter:junit-jupiter:5.9.1") + testImplementation("org.springframework.boot:spring-boot-starter-test") + testImplementation("org.assertj:assertj-core:3.25.1") + testImplementation("at.favre.lib:bcrypt:0.10.2") + testImplementation("org.springframework.boot:spring-boot-starter-test") + + // This dependency is used by the application. + implementation("com.codedifferently.instructional:instructional-lib") + implementation("com.google.guava:guava:31.1-jre") + implementation("com.google.code.gson:gson:2.10.1") + implementation("commons-cli:commons-cli:1.6.0") + implementation("org.springframework.boot:spring-boot-starter") + implementation("org.springframework.boot:spring-boot-starter-data-jpa") + implementation("org.springframework.boot:spring-boot-starter-validation") + implementation("org.springframework.boot:spring-boot-starter-web") + compileOnly("org.springframework.boot:spring-boot-devtools") + implementation("com.opencsv:opencsv:5.9") + implementation("org.apache.commons:commons-csv:1.10.0") + implementation("org.xerial:sqlite-jdbc:3.36.0") + implementation("org.hibernate.orm:hibernate-community-dialects:6.2.7.Final") +} + +application { + // Define the main class for the application. + mainClass.set("com.codedifferently.lesson18.Lesson18") +} + +tasks.named("run") { + standardInput = System.`in` +} + +tasks.named("test") { + // Use JUnit Platform for unit tests. + useJUnitPlatform() +} + + +configure { + + format("misc", { + // define the files to apply `misc` to + target("*.gradle", ".gitattributes", ".gitignore") + + // define the steps to apply to those files + trimTrailingWhitespace() + indentWithTabs() // or spaces. Takes an integer argument if you don't like 4 + endWithNewline() + }) + + java { + // don't need to set target, it is inferred from java + + // apply a specific flavor of google-java-format + googleJavaFormat() + // fix formatting of type annotations + formatAnnotations() + } +} diff --git a/lesson_18/api/api_app/lombok.config b/lesson_18/api/api_app/lombok.config new file mode 100644 index 00000000..6aa51d71 --- /dev/null +++ b/lesson_18/api/api_app/lombok.config @@ -0,0 +1,2 @@ +# This file is generated by the 'io.freefair.lombok' Gradle plugin +config.stopBubbling = true diff --git a/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/Lesson18.java b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/Lesson18.java new file mode 100644 index 00000000..fa7d8ff8 --- /dev/null +++ b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/Lesson18.java @@ -0,0 +1,38 @@ +package com.codedifferently.lesson18; + +import com.codedifferently.lesson18.cli.LibraryApp; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Configuration; + +@Configuration +@SpringBootApplication(scanBasePackages = "com.codedifferently") +public class Lesson18 implements CommandLineRunner { + @Autowired private LibraryApp libraryApp; + + public static void main(String[] args) { + var application = new SpringApplication(Lesson18.class); + application.run(args); + } + + @Override + public void run(String... args) throws Exception { + // Don't run as an app if we're running as a JUnit test. + if (isJUnitTest()) { + return; + } + + libraryApp.run(args); + } + + private static boolean isJUnitTest() { + for (StackTraceElement element : Thread.currentThread().getStackTrace()) { + if (element.getClassName().startsWith("org.junit.")) { + return true; + } + } + return false; + } +} diff --git a/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/cli/LibraryApp.java b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/cli/LibraryApp.java new file mode 100644 index 00000000..006f5274 --- /dev/null +++ b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/cli/LibraryApp.java @@ -0,0 +1,190 @@ +package com.codedifferently.lesson18.cli; + +import com.codedifferently.lesson18.factory.LibraryDataLoader; +import com.codedifferently.lesson18.library.Book; +import com.codedifferently.lesson18.library.Library; +import com.codedifferently.lesson18.library.LibraryInfo; +import com.codedifferently.lesson18.library.MediaItem; +import com.codedifferently.lesson18.library.search.SearchCriteria; +import java.util.Map; +import java.util.Scanner; +import java.util.Set; +import java.util.UUID; +import org.apache.commons.cli.CommandLine; +import org.apache.commons.cli.CommandLineParser; +import org.apache.commons.cli.DefaultParser; +import org.apache.commons.cli.HelpFormatter; +import org.apache.commons.cli.Option; +import org.apache.commons.cli.Options; +import org.apache.commons.cli.ParseException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public final class LibraryApp { + @Autowired private Library library; + + public void run(String[] args) throws Exception { + // Show stats about the loaded library to the user. + printLibraryInfo(library); + + try (var scanner = new Scanner(System.in)) { + LibraryCommand command; + // Main application loop. + while ((command = promptForCommand(scanner)) != LibraryCommand.EXIT) { + switch (command) { + case SEARCH -> doSearch(scanner, library); + default -> System.out.println("\nNot ready yet, coming soon!"); + } + } + } + } + + private void printLibraryInfo(Library library) { + LibraryInfo info = library.getInfo(); + Map> checkedOutItemsByGuest = info.getCheckedOutItemsByGuest(); + int numCheckedOutItems = checkedOutItemsByGuest.values().stream().mapToInt(Set::size).sum(); + System.out.println(); + System.out.println("========================================"); + System.out.println("Library id: " + library.getId()); + System.out.println("Number of items: " + info.getItems().size()); + System.out.println("Number of guests: " + info.getGuests().size()); + System.out.println("Number of checked out items: " + numCheckedOutItems); + System.out.println("========================================"); + System.out.println(); + } + + private static LibraryDataLoader getLoaderOrDefault( + String[] args, LibraryDataLoader defaultLoader) throws Exception { + String loaderType = getLoaderFromCommandLine(args); + return loaderType == null + ? defaultLoader + : Class.forName(loaderType) + .asSubclass(LibraryDataLoader.class) + .getDeclaredConstructor() + .newInstance(); + } + + private static String getLoaderFromCommandLine(String[] args) throws IllegalArgumentException { + Options options = new Options(); + Option input = new Option("l", "loader", true, "data loader type"); + input.setRequired(false); + options.addOption(input); + CommandLineParser parser = new DefaultParser(); + HelpFormatter formatter = new HelpFormatter(); + try { + CommandLine cmd = parser.parse(options, args); + return cmd.getOptionValue("loader"); + } catch (ParseException e) { + System.out.println(); + System.out.println(e.getMessage()); + formatter.printHelp("utility-name", options); + + System.exit(1); + } + return null; + } + + private static LibraryCommand promptForCommand(Scanner scanner) { + var command = LibraryCommand.UNKNOWN; + while (command == LibraryCommand.UNKNOWN) { + printMenu(); + var input = scanner.nextLine(); + try { + command = LibraryCommand.fromValue(Integer.parseInt(input.trim())); + } catch (IllegalArgumentException e) { + System.out.println("Invalid command: " + input); + } + } + return command; + } + + private static void printMenu() { + System.out.println("\nEnter the number of the desired command:"); + System.out.println("1) << EXIT"); + System.out.println("2) SEARCH"); + System.out.println("3) CHECKOUT"); + System.out.println("4) RETURN"); + System.out.print("command> "); + } + + private void doSearch(Scanner scanner, Library library) { + LibrarySearchCommand command = promptForSearchCommand(scanner); + if (command == LibrarySearchCommand.RETURN) { + return; + } + SearchCriteria criteria = getSearchCriteria(scanner, command); + Set results = library.search(criteria); + printSearchResults(results); + } + + private LibrarySearchCommand promptForSearchCommand(Scanner scanner) { + var command = LibrarySearchCommand.UNKNOWN; + while (command == LibrarySearchCommand.UNKNOWN) { + printSearchMenu(); + var input = scanner.nextLine(); + try { + command = LibrarySearchCommand.fromValue(Integer.parseInt(input.trim())); + } catch (IllegalArgumentException e) { + System.out.println("Invalid command: " + input); + } + } + return command; + } + + private void printSearchMenu() { + System.out.println("\nEnter the number of the desired search criteria:"); + System.out.println("1) << RETURN"); + System.out.println("2) TITLE"); + System.out.println("3) AUTHOR"); + System.out.println("4) TYPE"); + System.out.print("search> "); + } + + private SearchCriteria getSearchCriteria(Scanner scanner, LibrarySearchCommand command) { + System.out.println(); + switch (command) { + case TITLE -> { + System.out.println("Enter the title to search for: "); + System.out.print("title> "); + var title = scanner.nextLine(); + return SearchCriteria.builder().title(title).build(); + } + case AUTHOR -> { + System.out.println("Enter the author to search for: "); + System.out.print("author> "); + var author = scanner.nextLine(); + return SearchCriteria.builder().author(author).build(); + } + case TYPE -> { + System.out.println("Enter the type to search for: "); + System.out.print("type> "); + var type = scanner.nextLine(); + return SearchCriteria.builder().type(type).build(); + } + default -> System.out.println("Invalid search command: " + command); + } + return null; + } + + private void printSearchResults(Set results) { + System.out.println(); + + if (results.isEmpty()) { + System.out.println("No results found."); + return; + } + + System.out.println("Search results:\n"); + for (MediaItem item : results) { + System.out.println("ID: " + item.getId()); + System.out.println("TITLE: " + item.getTitle()); + if (item instanceof Book book) { + System.out.println("AUTHOR(S): " + String.join(", ", book.getAuthors())); + } + System.out.println("TYPE: " + item.getType().toString().toUpperCase()); + System.out.println(); + } + System.out.println("Found " + results.size() + " result(s).\n"); + } +} diff --git a/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/cli/LibraryCommand.java b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/cli/LibraryCommand.java new file mode 100644 index 00000000..54e2d305 --- /dev/null +++ b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/cli/LibraryCommand.java @@ -0,0 +1,28 @@ +package com.codedifferently.lesson18.cli; + +public enum LibraryCommand { + UNKNOWN(0), + EXIT(1), + SEARCH(2), + CHECKOUT(3), + RETURN(4); + + private final int value; + + LibraryCommand(int value) { + this.value = value; + } + + public int getValue() { + return value; + } + + public static LibraryCommand fromValue(int value) { + for (LibraryCommand command : LibraryCommand.values()) { + if (command.getValue() == value) { + return command; + } + } + return UNKNOWN; + } +} diff --git a/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/cli/LibrarySearchCommand.java b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/cli/LibrarySearchCommand.java new file mode 100644 index 00000000..c4bf7af9 --- /dev/null +++ b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/cli/LibrarySearchCommand.java @@ -0,0 +1,28 @@ +package com.codedifferently.lesson18.cli; + +public enum LibrarySearchCommand { + UNKNOWN(0), + RETURN(1), + TITLE(2), + AUTHOR(3), + TYPE(4); + + private final int value; + + LibrarySearchCommand(int value) { + this.value = value; + } + + public int getValue() { + return value; + } + + public static LibrarySearchCommand fromValue(int value) { + for (LibrarySearchCommand criteria : LibrarySearchCommand.values()) { + if (criteria.getValue() == value) { + return criteria; + } + } + return UNKNOWN; + } +} diff --git a/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/factory/LibraryCsvDataLoader.java b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/factory/LibraryCsvDataLoader.java new file mode 100644 index 00000000..796f6d35 --- /dev/null +++ b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/factory/LibraryCsvDataLoader.java @@ -0,0 +1,126 @@ +package com.codedifferently.lesson18.factory; + +import com.codedifferently.lesson18.library.MediaType; +import com.codedifferently.lesson18.models.CheckoutModel; +import com.codedifferently.lesson18.models.LibraryDataModel; +import com.codedifferently.lesson18.models.LibraryGuestModel; +import com.codedifferently.lesson18.models.MediaItemModel; +import java.io.FileReader; +import java.io.IOException; +import java.time.Instant; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import org.apache.commons.csv.CSVFormat; +import org.apache.commons.csv.CSVRecord; +import org.springframework.core.io.ClassPathResource; +import org.springframework.stereotype.Service; + +/** An object that loads data from a CSV and returns a LibraryDataModel object. */ +@Service +public final class LibraryCsvDataLoader implements LibraryDataLoader { + private static final String MEDIA_ITEMS_CSV_PATH = "csv/media_items.csv"; + private static final String GUESTS_CSV_PATH = "csv/guests.csv"; + private static final String CHECKED_OUT_ITEMS_CSV_PATH = "csv/checked_out_items.csv"; + + @Override + public LibraryDataModel loadData() throws IOException { + var model = new LibraryDataModel(); + model.mediaItems = loadMediaItemsFromCsv(MEDIA_ITEMS_CSV_PATH); + model.guests = loadGuestsFromCsv(GUESTS_CSV_PATH, CHECKED_OUT_ITEMS_CSV_PATH); + return model; + } + + private List loadMediaItemsFromCsv(String filePath) throws IOException { + List mediaItems = new ArrayList<>(); + + try (var reader = new FileReader(new ClassPathResource(filePath).getFile()); + var csvParser = CSVFormat.DEFAULT.withFirstRecordAsHeader().parse(reader)) { + for (CSVRecord csvRecord : csvParser) { + var item = new MediaItemModel(); + + item.type = MediaType.fromString(csvRecord.get("type")); + item.id = UUID.fromString(csvRecord.get("id")); + item.title = csvRecord.get("title"); + item.isbn = csvRecord.get("isbn"); + item.authors = List.of(csvRecord.get("authors").split(", ")); + item.pages = parseIntOrDefault(csvRecord.get("pages"), 0); + item.runtime = parseIntOrDefault(csvRecord.get("runtime"), 0); + item.edition = csvRecord.get("edition"); + + mediaItems.add(item); + } + + } catch (IOException e) { + return new ArrayList<>(); + } + + return mediaItems; + } + + private int parseIntOrDefault(String value, int defaultVal) { + try { + return Integer.parseInt(value); + } catch (NumberFormatException e) { + return defaultVal; + } + } + + private List loadGuestsFromCsv( + String guestsCsvPath, String checkedOutCsvPath) { + List guests = loadGuestRecordsFromCsv(guestsCsvPath); + Map> checkedOutItems = loadCheckoutsFromCsv(checkedOutCsvPath); + for (LibraryGuestModel guest : guests) { + if (checkedOutItems.containsKey(guest.email)) { + guest.checkedOutItems = checkedOutItems.get(guest.email); + } else { + guest.checkedOutItems = new ArrayList<>(); + } + } + return guests; + } + + private List loadGuestRecordsFromCsv(String guestsCsvPath) { + List guests = new ArrayList<>(); + + try (var reader = new FileReader(new ClassPathResource(guestsCsvPath).getFile()); + var csvParser = CSVFormat.DEFAULT.withFirstRecordAsHeader().parse(reader)) { + for (CSVRecord csvRecord : csvParser) { + var guest = new LibraryGuestModel(); + + guest.type = csvRecord.get("type"); + guest.name = csvRecord.get("name"); + guest.email = csvRecord.get("email"); + + guests.add(guest); + } + } catch (IOException e) { + return new ArrayList<>(); + } + + return guests; + } + + private Map> loadCheckoutsFromCsv(String checkedOutCsvPath) { + Map> checkoutsByGuestEmail = new HashMap<>(); + + try (var reader = new FileReader(new ClassPathResource(checkedOutCsvPath).getFile()); + var csvParser = CSVFormat.DEFAULT.withFirstRecordAsHeader().parse(reader)) { + for (CSVRecord csvRecord : csvParser) { + var checkout = new CheckoutModel(); + + checkout.itemId = UUID.fromString(csvRecord.get("item_id")); + checkout.dueDate = Instant.parse(csvRecord.get("due_date")); + + String guestEmail = csvRecord.get("email"); + checkoutsByGuestEmail.computeIfAbsent(guestEmail, e -> new ArrayList<>()).add(checkout); + } + } catch (IOException e) { + return new HashMap<>(); + } + + return checkoutsByGuestEmail; + } +} diff --git a/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/factory/LibraryDataLoader.java b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/factory/LibraryDataLoader.java new file mode 100644 index 00000000..c08101be --- /dev/null +++ b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/factory/LibraryDataLoader.java @@ -0,0 +1,15 @@ +package com.codedifferently.lesson18.factory; + +import com.codedifferently.lesson18.models.LibraryDataModel; +import java.io.IOException; + +/** An object that loads data from a source and returns a LibraryDataModel object. */ +public interface LibraryDataLoader { + /** + * Load data from a source and return a LibraryDataModel object. + * + * @return A LibraryDataModel object. + * @throws IOException if an I/O error occurs. + */ + public LibraryDataModel loadData() throws IOException; +} diff --git a/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/factory/LibraryDbDataLoader.java b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/factory/LibraryDbDataLoader.java new file mode 100644 index 00000000..8ff694f0 --- /dev/null +++ b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/factory/LibraryDbDataLoader.java @@ -0,0 +1,26 @@ +package com.codedifferently.lesson18.factory; + +import com.codedifferently.lesson18.models.LibraryDataModel; +import com.codedifferently.lesson18.repository.LibraryGuestRepository; +import com.codedifferently.lesson18.repository.MediaItemRepository; +import java.io.IOException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** A data loader that loads library data from a database. */ +@Service +public final class LibraryDbDataLoader implements LibraryDataLoader { + + @Autowired private MediaItemRepository mediaItemsRepository; + @Autowired private LibraryGuestRepository libraryGuestRepository; + + @Override + public LibraryDataModel loadData() throws IOException { + var model = new LibraryDataModel(); + + model.mediaItems = mediaItemsRepository.findAll(); + model.guests = libraryGuestRepository.findAll(); + + return model; + } +} diff --git a/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/factory/LibraryFactory.java b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/factory/LibraryFactory.java new file mode 100644 index 00000000..838b774d --- /dev/null +++ b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/factory/LibraryFactory.java @@ -0,0 +1,103 @@ +package com.codedifferently.lesson18.factory; + +import com.codedifferently.lesson18.library.Librarian; +import com.codedifferently.lesson18.library.Library; +import com.codedifferently.lesson18.library.LibraryGuest; +import com.codedifferently.lesson18.library.MediaItem; +import com.codedifferently.lesson18.models.CheckoutModel; +import com.codedifferently.lesson18.models.LibraryDataModel; +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +/** A factory class that creates a Library object with a LibraryDataLoader object. */ +public final class LibraryFactory { + + /** + * Create a Library object with a LibraryDataLoader object. + * + * @param loader A LibraryDataLoader object. + * @return A Library object. + * @throws IOException + */ + public static Library createWithLoader(LibraryDataLoader loader) throws IOException { + Library library = new Library("main-library"); + + // Load library data. + LibraryDataModel data = loader.loadData(); + + // Add guests to the library. + List guests = data.getGuests(); + addLibraryGuests(library, guests); + + // Add library items using the first librarian. + Librarian firstLibrarian = findFirstLibrarian(guests); + List mediaItems = data.getMediaItems(); + addLibraryItems(library, mediaItems, firstLibrarian); + + // Check out items from the library. + Map> checkoutsByEmail = data.getCheckoutsByEmail(); + Map mediaItemById = getMediaItemsById(mediaItems); + Map guestsByEmail = getGuestsByEmail(guests); + checkOutItems(library, checkoutsByEmail, guestsByEmail, mediaItemById); + + return library; + } + + private static Map getMediaItemsById(List mediaItems) { + Map mediaItemById = new HashMap<>(); + for (MediaItem mediaItem : mediaItems) { + mediaItemById.put(mediaItem.getId(), mediaItem); + } + return mediaItemById; + } + + private static Librarian findFirstLibrarian(List guests) { + Librarian firstLibrarian = null; + for (LibraryGuest guest : guests) { + if (guest instanceof Librarian librarian) { + firstLibrarian = librarian; + } + } + return firstLibrarian; + } + + private static void addLibraryGuests(Library library, List guests) { + for (LibraryGuest guest : guests) { + library.addLibraryGuest(guest); + } + } + + private static void addLibraryItems( + Library library, List mediaItems, Librarian firstLibrarian) { + for (MediaItem mediaItem : mediaItems) { + library.addMediaItem(mediaItem, firstLibrarian); + } + } + + private static Map getGuestsByEmail(List guests) { + Map guestByEmail = new HashMap<>(); + for (LibraryGuest guest : guests) { + guestByEmail.put(guest.getEmail(), guest); + } + return guestByEmail; + } + + private static void checkOutItems( + Library library, + Map> checkoutsByEmail, + Map guestByEmail, + Map mediaItemById) { + for (var entry : checkoutsByEmail.entrySet()) { + String email = entry.getKey(); + List checkouts = entry.getValue(); + LibraryGuest guest = guestByEmail.get(email); + for (CheckoutModel checkout : checkouts) { + MediaItem mediaItem = mediaItemById.get(checkout.itemId); + library.checkOutMediaItem(mediaItem, guest); + } + } + } +} diff --git a/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/factory/LibraryJsonDataLoader.java b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/factory/LibraryJsonDataLoader.java new file mode 100644 index 00000000..ccb10e90 --- /dev/null +++ b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/factory/LibraryJsonDataLoader.java @@ -0,0 +1,28 @@ +package com.codedifferently.lesson18.factory; + +import com.codedifferently.lesson18.models.LibraryDataModel; +import com.fasterxml.jackson.databind.MapperFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.json.JsonMapper; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import java.io.File; +import java.io.IOException; +import org.springframework.core.io.ClassPathResource; +import org.springframework.stereotype.Service; + +/** Loads data from a JSON file and returns a LibraryDataModel object. */ +@Service +public final class LibraryJsonDataLoader implements LibraryDataLoader { + @Override + public LibraryDataModel loadData() throws IOException { + ObjectMapper objectMapper = + JsonMapper.builder() + .addModule(new JavaTimeModule()) + .enable(MapperFeature.ACCEPT_CASE_INSENSITIVE_ENUMS) + .build(); + + // Load data from data.json file + File file = new ClassPathResource("json/data.json").getFile(); + return objectMapper.readValue(file, LibraryDataModel.class); + } +} diff --git a/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/Book.java b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/Book.java new file mode 100644 index 00000000..d6067634 --- /dev/null +++ b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/Book.java @@ -0,0 +1,77 @@ +package com.codedifferently.lesson18.library; + +import java.util.List; +import java.util.UUID; + +/** Represents a book. */ +public class Book extends MediaItemBase { + private final String isbn; + private final List authors; + private final int numberOfPages; + + /** + * Create a new book with the given title, ISBN, authors, and number of pages. + * + * @param id The ID of the book. + * @param title The title of the book. + * @param isbn The ISBN of the book. + * @param authors The authors of the book. + * @param numberOfPages The number of pages in the book. + */ + public Book(UUID id, String title, String isbn, List authors, int numberOfPages) { + super(id, title); + this.isbn = isbn; + this.authors = authors; + this.numberOfPages = numberOfPages; + } + + @Override + public MediaType getType() { + return MediaType.BOOK; + } + + /** + * Get the ISBN of the book. + * + * @return The ISBN of the book. + */ + public String getIsbn() { + return this.isbn; + } + + /** + * Get the authors of the book. + * + * @return The authors of the book. + */ + public List getAuthors() { + return this.authors; + } + + /** + * Get the number of pages in the book. + * + * @return The number of pages in the book. + */ + public int getNumberOfPages() { + return this.numberOfPages; + } + + @Override + protected boolean matchesAuthor(String authorQuery) { + if (authorQuery == null) { + return true; + } + for (String author : this.getAuthors()) { + if (author.toLowerCase().contains(authorQuery.toLowerCase())) { + return true; + } + } + return false; + } + + @Override + public String toString() { + return "Book{" + "id='" + getId() + '\'' + ", title='" + getTitle() + '\'' + '}'; + } +} diff --git a/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/Dvd.java b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/Dvd.java new file mode 100644 index 00000000..0741a6b8 --- /dev/null +++ b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/Dvd.java @@ -0,0 +1,20 @@ +package com.codedifferently.lesson18.library; + +import java.util.UUID; + +/** Represents a DVD. */ +public class Dvd extends MediaItemBase { + public Dvd(UUID id, String title) { + super(id, title); + } + + @Override + public MediaType getType() { + return MediaType.DVD; + } + + @Override + public String toString() { + return "Dvd{" + "id='" + getId() + '\'' + ", title='" + getTitle() + '\'' + '}'; + } +} diff --git a/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/Librarian.java b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/Librarian.java new file mode 100644 index 00000000..f3d278ea --- /dev/null +++ b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/Librarian.java @@ -0,0 +1,13 @@ +package com.codedifferently.lesson18.library; + +/** Represents a librarian of a library. */ +public class Librarian extends LibraryGuestBase { + public Librarian(String name, String email) { + super(name, email); + } + + @Override + public String toString() { + return "Librarian{" + "id='" + getEmail() + '\'' + ", name='" + getName() + '\'' + '}'; + } +} diff --git a/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/Library.java b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/Library.java new file mode 100644 index 00000000..be240aad --- /dev/null +++ b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/Library.java @@ -0,0 +1,300 @@ +package com.codedifferently.lesson18.library; + +import com.codedifferently.lesson18.library.exceptions.MediaItemCheckedOutException; +import com.codedifferently.lesson18.library.search.CatalogSearcher; +import com.codedifferently.lesson18.library.search.SearchCriteria; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.UUID; +import java.util.stream.Collectors; + +/** Represents a library. */ +public class Library { + private final Map itemsById = new HashMap<>(); + private final Set checkedOutItemIds = new HashSet<>(); + private final Map> checkedOutItemsByGuest = new HashMap<>(); + private final Map guestsById = new HashMap<>(); + private final String id; + private final CatalogSearcher searcher; + + /** + * Create a new library with the given id. + * + * @param id The id of the library. + */ + public Library(String id) { + this.id = id; + this.searcher = new CatalogSearcher(this.itemsById.values()); + } + + /** + * Get the id of the library. + * + * @return The id of the library. + */ + public String getId() { + return this.id; + } + + /** + * Add a item to the library. + * + * @param item The item to add. + * @param librarian The librarian adding the item. + */ + public void addMediaItem(MediaItem item, Librarian librarian) { + this.itemsById.put(item.getId(), item); + item.setLibrary(this); + } + + /** + * Remove a item from the library. + * + * @param item The item to remove. + * @param librarian The librarian removing the item. + */ + public void removeMediaItem(MediaItem item, Librarian librarian) + throws MediaItemCheckedOutException { + if (this.isCheckedOut(item)) { + throw new MediaItemCheckedOutException("Cannot remove checked out item."); + } + this.itemsById.remove(item.getId()); + item.setLibrary(null); + } + + /** + * Remove a item from the library. + * + * @param id The ID of the item to remove. + * @param librarian The librarian removing the item. + */ + public void removeMediaItem(UUID id, Librarian librarian) throws MediaItemCheckedOutException { + MediaItem item = this.itemsById.get(id); + this.removeMediaItem(item, librarian); + } + + /** + * Search the library for items matching the given query. + * + * @param query The query to search for. + * @return The items matching the query. + */ + public Set search(SearchCriteria query) { + return new HashSet<>(this.searcher.search(query)); + } + + /** + * Add a guest to the library. + * + * @param guest The guest to add. + */ + public void addLibraryGuest(LibraryGuest guest) { + this.guestsById.put(guest.getId(), guest); + this.checkedOutItemsByGuest.put(guest.getId(), new HashSet<>()); + guest.setLibrary(this); + } + + /** + * Remove a guest from the library. + * + * @param id The ID of the guest to remove. + */ + public void removeLibraryGuest(UUID id) throws MediaItemCheckedOutException { + LibraryGuest guest = this.guestsById.get(id); + if (guest == null) { + return; + } + if (!this.checkedOutItemsByGuest.get(guest.getId()).isEmpty()) { + throw new MediaItemCheckedOutException("Cannot remove guest with checked out items."); + } + this.guestsById.remove(guest.getId()); + this.checkedOutItemsByGuest.remove(guest.getId()); + guest.setLibrary(null); + } + + /** + * Remove a guest from the library. + * + * @param guest The guest to remove. + */ + public void removeLibraryGuest(LibraryGuest guest) throws MediaItemCheckedOutException { + this.removeLibraryGuest(guest.getId()); + } + + /** + * Returns all librarians registered for this library. + * + * @return A unique set of librarians. + */ + public Set getLibrarians() { + return this.guestsById.values().stream() + .filter(g -> g instanceof Librarian) + .map(g -> (Librarian) g) + .collect(Collectors.toSet()); + } + + /** + * Returns all registered library patrons. + * + * @return A unique set of all Library patrons. + */ + public Set getPatrons() { + return this.guestsById.values().stream().collect(Collectors.toSet()); + } + + /** + * Check out a item to a guest. + * + * @param item The item to check out. + * @param guest The guest to check out the item to. + * @return True if the item was checked out, false otherwise. + */ + public boolean checkOutMediaItem(MediaItem item, LibraryGuest guest) { + if (!this.canCheckOutMediaItem(item, guest)) { + return false; + } + this.checkedOutItemIds.add(item.getId()); + this.checkedOutItemsByGuest.get(guest.getId()).add(item); + return true; + } + + private boolean canCheckOutMediaItem(MediaItem item, LibraryGuest guest) { + if (!item.canCheckOut()) { + return false; + } + if (!this.hasMediaItem(item)) { + return false; + } + if (this.isCheckedOut(item)) { + return false; + } + return this.hasLibraryGuest(guest); + } + + /** + * Check if the library has the given item. + * + * @param item The item to check for. + * @return True if the library has the item, false otherwise. + */ + public boolean hasMediaItem(MediaItem item) { + return this.hasMediaItem(item.getId()); + } + + /** + * Check if the library has the given item. + * + * @param id The ID of the item to check for. + * @return True if the library has the item, false otherwise. + */ + public boolean hasMediaItem(UUID id) { + return this.itemsById.containsKey(id); + } + + /** + * Check if the given item is checked out. + * + * @param item The item to check. + * @return True if the item is checked out, false otherwise. + */ + public boolean isCheckedOut(MediaItem item) { + return this.checkedOutItemIds.contains(item.getId()); + } + + /** + * Check if the library has the given guest. + * + * @param guest The guest to check for. + * @return True if the library has the guest, false otherwise. + */ + public boolean hasLibraryGuest(LibraryGuest guest) { + return this.hasLibraryGuest(guest.getId()); + } + + /** + * Check if the library has the given guest. + * + * @param id The ID to check for. + * @return True if the library has the guest, false otherwise. + */ + public boolean hasLibraryGuest(UUID id) { + return this.guestsById.containsKey(id); + } + + /** + * Check if the library has the given guest. + * + * @param emailAddress The email address to check for. + * @return True if the library has the guest, false otherwise. + */ + public boolean hasLibraryGuest(String emailAddress) { + return this.guestsById.values().stream() + .anyMatch(g -> g.getEmail().equalsIgnoreCase(emailAddress)); + } + + /** + * Return a item to the library. + * + * @param item The item to return. + * @param guest The guest returning the item. + * @return True if the item was returned, false otherwise. + */ + public boolean checkInMediaItem(MediaItem item, LibraryGuest guest) { + if (!this.hasMediaItem(item)) { + return false; + } + this.checkedOutItemIds.remove(item.getId()); + this.checkedOutItemsByGuest.get(guest.getId()).remove(item); + return true; + } + + /** + * Get the items checked out by a guest. + * + * @param guest The guest to get the items for. + * @return The items checked out by the guest. + */ + public Set getCheckedOutByGuest(LibraryGuest guest) { + return this.checkedOutItemsByGuest.get(guest.getId()); + } + + /** + * Get a snapshot of the library info. + * + * @return The library info. + */ + public LibraryInfo getInfo() { + Map> itemsByGuest = + this.checkedOutItemsByGuest.entrySet().stream() + .collect( + HashMap::new, + (map, entry) -> + map.put( + entry.getKey(), + Collections.unmodifiableSet(new HashSet<>(entry.getValue()))), + HashMap::putAll); + return LibraryInfo.builder() + .id(this.id) + .items(Collections.unmodifiableSet(new HashSet<>(this.itemsById.values()))) + .guests(Collections.unmodifiableSet(new HashSet<>(this.guestsById.values()))) + .checkedOutItemsByGuest(Collections.unmodifiableMap(itemsByGuest)) + .build(); + } + + @Override + public String toString() { + return "Library{" + + "itemsById=" + + itemsById + + ", checkedOutItemIds=" + + checkedOutItemIds + + ", checkedOutMediaItemsByLibraryGuest=" + + checkedOutItemsByGuest + + ", guestIds=" + + guestsById + + '}'; + } +} diff --git a/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/LibraryConfiguration.java b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/LibraryConfiguration.java new file mode 100644 index 00000000..3f5e0c0b --- /dev/null +++ b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/LibraryConfiguration.java @@ -0,0 +1,16 @@ +package com.codedifferently.lesson18.library; + +import com.codedifferently.lesson18.factory.LibraryDbDataLoader; +import com.codedifferently.lesson18.factory.LibraryFactory; +import java.io.IOException; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class LibraryConfiguration { + + @Bean + public Library getDefaultLibrary(LibraryDbDataLoader loader) throws IOException { + return LibraryFactory.createWithLoader(loader); + } +} diff --git a/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/LibraryGuest.java b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/LibraryGuest.java new file mode 100644 index 00000000..74073cdc --- /dev/null +++ b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/LibraryGuest.java @@ -0,0 +1,45 @@ +package com.codedifferently.lesson18.library; + +import com.codedifferently.lesson18.library.exceptions.LibraryNotSetException; +import com.codedifferently.lesson18.library.exceptions.WrongLibraryException; +import java.util.Set; +import java.util.UUID; + +public interface LibraryGuest { + /** + * Get the library that the guest is in. + * + * @param library The library that the guest is in. + * @throws WrongLibraryException If the guest is not in the library. + */ + public void setLibrary(Library library) throws WrongLibraryException; + + /** + * Get the name of the guest. + * + * @return The name of the guest. + */ + public String getName(); + + /** + * Get the email of the guest. + * + * @return The email of the guest. + */ + public String getEmail(); + + /** + * Get the id of the guest. + * + * @return The id of the guest. + */ + public UUID getId(); + + /** + * Gets the items currently checked out to the guest. + * + * @return The items currently checked out to the guest. + * @throws LibraryNotSetException If the library is not set for the guest. + */ + public Set getCheckedOutMediaItems() throws LibraryNotSetException; +} diff --git a/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/LibraryGuestBase.java b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/LibraryGuestBase.java new file mode 100644 index 00000000..38f522bb --- /dev/null +++ b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/LibraryGuestBase.java @@ -0,0 +1,75 @@ +package com.codedifferently.lesson18.library; + +import com.codedifferently.lesson18.library.exceptions.LibraryNotSetException; +import com.codedifferently.lesson18.library.exceptions.WrongLibraryException; +import java.util.Objects; +import java.util.Set; +import java.util.UUID; + +/** Base implementation of a library guest. */ +public class LibraryGuestBase implements LibraryGuest { + + private Library library; + private final UUID id = UUID.randomUUID(); + private final String name; + private final String email; + + public LibraryGuestBase(String name, String email) { + this.name = name; + this.email = email; + } + + @Override + public void setLibrary(Library library) throws WrongLibraryException { + if (library != null && !library.hasLibraryGuest(this)) { + throw new WrongLibraryException( + "Patron " + this.getEmail() + " is not in library " + library.getId()); + } + this.library = library; + } + + @Override + public String getName() { + return this.name; + } + + @Override + public String getEmail() { + return this.email; + } + + @Override + public UUID getId() { + return this.id; + } + + @Override + public Set getCheckedOutMediaItems() throws LibraryNotSetException { + if (this.library == null) { + throw new LibraryNotSetException("Library not set for patron " + this.getEmail()); + } + return this.library.getCheckedOutByGuest(this); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof LibraryGuestBase)) { + return false; + } + LibraryGuestBase guest = (LibraryGuestBase) o; + return Objects.equals(getEmail(), guest.getEmail()); + } + + @Override + public int hashCode() { + return Objects.hash(getId()); + } + + @Override + public String toString() { + return "LibraryGuestBase{" + "id='" + getEmail() + '\'' + ", name='" + getName() + '\'' + '}'; + } +} diff --git a/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/LibraryInfo.java b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/LibraryInfo.java new file mode 100644 index 00000000..ffdf4bb9 --- /dev/null +++ b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/LibraryInfo.java @@ -0,0 +1,20 @@ +package com.codedifferently.lesson18.library; + +import java.util.Map; +import java.util.Set; +import java.util.UUID; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class LibraryInfo { + public String id; + public Set items; + public Set guests; + public Map> checkedOutItemsByGuest; +} diff --git a/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/Magazine.java b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/Magazine.java new file mode 100644 index 00000000..d315bbb3 --- /dev/null +++ b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/Magazine.java @@ -0,0 +1,25 @@ +package com.codedifferently.lesson18.library; + +import java.util.UUID; + +/** Represents a magazine. */ +public class Magazine extends MediaItemBase { + public Magazine(UUID id, String title) { + super(id, title); + } + + @Override + public MediaType getType() { + return MediaType.MAGAZINE; + } + + @Override + public boolean canCheckOut() { + return false; + } + + @Override + public String toString() { + return "Magazine{" + "id='" + getId() + '\'' + ", title='" + getTitle() + '\'' + '}'; + } +} diff --git a/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/MediaItem.java b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/MediaItem.java new file mode 100644 index 00000000..7baf7d11 --- /dev/null +++ b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/MediaItem.java @@ -0,0 +1,53 @@ +package com.codedifferently.lesson18.library; + +import com.codedifferently.lesson18.library.exceptions.LibraryNotSetException; +import com.codedifferently.lesson18.library.exceptions.WrongLibraryException; +import com.codedifferently.lesson18.library.search.Searchable; +import java.util.UUID; + +/** Represents a media item. */ +public interface MediaItem extends Searchable { + /** + * Get the type of the media item. + * + * @return The type of the media item. + */ + public MediaType getType(); + + /** + * Get the id of the media item. + * + * @return The id of the media item. + */ + public UUID getId(); + + /** + * Set the library that the media item is in. + * + * @param library + * @throws WrongLibraryException + */ + public void setLibrary(Library library) throws WrongLibraryException; + + /** + * Get the title of the media item. + * + * @return The title of the media item. + */ + public String getTitle(); + + /** + * Check if the media item is checked out. + * + * @return True if the media item is checked out, false otherwise. + * @throws LibraryNotSetException + */ + public boolean isCheckedOut() throws LibraryNotSetException; + + /** + * Check if the media item can be checked out. + * + * @return True if the media item can be checked out, false otherwise. + */ + public boolean canCheckOut(); +} diff --git a/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/MediaItemBase.java b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/MediaItemBase.java new file mode 100644 index 00000000..3c0028fb --- /dev/null +++ b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/MediaItemBase.java @@ -0,0 +1,93 @@ +package com.codedifferently.lesson18.library; + +import com.codedifferently.lesson18.library.exceptions.LibraryNotSetException; +import com.codedifferently.lesson18.library.exceptions.WrongLibraryException; +import com.codedifferently.lesson18.library.search.SearchCriteria; +import java.util.Objects; +import java.util.UUID; + +/** Base implementation of a media item. */ +public abstract class MediaItemBase implements MediaItem { + private Library library; + private final UUID id; + private final String title; + + public MediaItemBase(UUID id, String title) { + this.id = id; + this.title = title; + } + + @Override + public UUID getId() { + return id; + } + + @Override + public String getTitle() { + return title; + } + + @Override + public void setLibrary(Library library) throws WrongLibraryException { + if (library != null && !library.hasMediaItem(this)) { + throw new WrongLibraryException( + "Media item " + this.getId() + " is not in library " + library.getId()); + } + this.library = library; + } + + @Override + public boolean isCheckedOut() throws LibraryNotSetException { + if (this.library == null) { + throw new LibraryNotSetException("Library not set for item " + this.getId()); + } + return library.isCheckedOut(this); + } + + @Override + public boolean canCheckOut() { + return true; + } + + /** + * Check if the media item matches the given author. + * + * @param author The author to check. + * @return True if the media item matches the author, false otherwise. + */ + protected boolean matchesAuthor(String author) { + return false; + } + + @Override + public boolean matches(SearchCriteria query) { + if (query.id != null && !this.getId().toString().equalsIgnoreCase(query.id)) { + return false; + } + if (query.title != null && !this.getTitle().toLowerCase().contains(query.title.toLowerCase())) { + return false; + } + if (query.type != null && !this.getType().toString().equalsIgnoreCase(query.type)) { + return false; + } + return query.author == null || this.matchesAuthor(query.author); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof MediaItem)) return false; + MediaItem item = (MediaItem) o; + return Objects.equals(getId(), item.getId()); + } + + @Override + public int hashCode() { + return Objects.hash(getId()); + } + + @Override + public String toString() { + return "MediaItem{" + "id='" + getId() + '\'' + ", title='" + getTitle() + '\'' + '}'; + } +} diff --git a/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/MediaType.java b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/MediaType.java new file mode 100644 index 00000000..a4bcda7e --- /dev/null +++ b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/MediaType.java @@ -0,0 +1,28 @@ +package com.codedifferently.lesson18.library; + +public enum MediaType { + UNKNOWN("unknown"), + BOOK("book"), + DVD("dvd"), + MAGAZINE("magazine"), + NEWSPAPER("newspaper"); + + private final String type; + + MediaType(String type) { + this.type = type; + } + + public String getType() { + return type; + } + + public static MediaType fromString(String type) { + for (MediaType mediaItemType : MediaType.values()) { + if (mediaItemType.type.equalsIgnoreCase(type)) { + return mediaItemType; + } + } + throw new IllegalArgumentException("Invalid media item type: " + type); + } +} diff --git a/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/Newspaper.java b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/Newspaper.java new file mode 100644 index 00000000..7316109f --- /dev/null +++ b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/Newspaper.java @@ -0,0 +1,25 @@ +package com.codedifferently.lesson18.library; + +import java.util.UUID; + +/** Represents a newspaper. */ +public class Newspaper extends MediaItemBase { + public Newspaper(UUID id, String title) { + super(id, title); + } + + @Override + public MediaType getType() { + return MediaType.NEWSPAPER; + } + + @Override + public boolean canCheckOut() { + return false; + } + + @Override + public String toString() { + return "Newspaper{" + "id='" + getId() + '\'' + ", title='" + getTitle() + '\'' + '}'; + } +} diff --git a/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/Patron.java b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/Patron.java new file mode 100644 index 00000000..1aebd364 --- /dev/null +++ b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/Patron.java @@ -0,0 +1,20 @@ +package com.codedifferently.lesson18.library; + +/** Represents a patron of a library. */ +public class Patron extends LibraryGuestBase { + + /** + * Create a new patron with the given name and email. + * + * @param name The name of the patron. + * @param email The email of the patron. + */ + public Patron(String name, String email) { + super(name, email); + } + + @Override + public String toString() { + return "Patron{" + "id='" + getEmail() + '\'' + ", name='" + getName() + '\'' + '}'; + } +} diff --git a/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/exceptions/LibraryNotSetException.java b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/exceptions/LibraryNotSetException.java new file mode 100644 index 00000000..660367b4 --- /dev/null +++ b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/exceptions/LibraryNotSetException.java @@ -0,0 +1,7 @@ +package com.codedifferently.lesson18.library.exceptions; + +public class LibraryNotSetException extends RuntimeException { + public LibraryNotSetException(String message) { + super(message); + } +} diff --git a/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/exceptions/MediaItemCheckedOutException.java b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/exceptions/MediaItemCheckedOutException.java new file mode 100644 index 00000000..573627eb --- /dev/null +++ b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/exceptions/MediaItemCheckedOutException.java @@ -0,0 +1,7 @@ +package com.codedifferently.lesson18.library.exceptions; + +public class MediaItemCheckedOutException extends RuntimeException { + public MediaItemCheckedOutException(String message) { + super(message); + } +} diff --git a/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/exceptions/WrongLibraryException.java b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/exceptions/WrongLibraryException.java new file mode 100644 index 00000000..90e8fe1d --- /dev/null +++ b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/exceptions/WrongLibraryException.java @@ -0,0 +1,7 @@ +package com.codedifferently.lesson18.library.exceptions; + +public class WrongLibraryException extends RuntimeException { + public WrongLibraryException(String message) { + super(message); + } +} diff --git a/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/search/CatalogSearcher.java b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/search/CatalogSearcher.java new file mode 100644 index 00000000..225e02f8 --- /dev/null +++ b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/search/CatalogSearcher.java @@ -0,0 +1,31 @@ +package com.codedifferently.lesson18.library.search; + +import java.util.Collection; + +/** + * Searches a catalog for items that match a query. + * + * @param + */ +public class CatalogSearcher { + private final Collection catalog; + + /** + * Constructor for CatalogSearcher + * + * @param catalog + */ + public CatalogSearcher(Collection catalog) { + this.catalog = catalog; + } + + /** + * Searches the catalog for items that match the given query. + * + * @param query The query to search for. + * @return The items that match the query. + */ + public Collection search(SearchCriteria query) { + return catalog.stream().filter(item -> item.matches(query)).toList(); + } +} diff --git a/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/search/SearchCriteria.java b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/search/SearchCriteria.java new file mode 100644 index 00000000..c53d8328 --- /dev/null +++ b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/search/SearchCriteria.java @@ -0,0 +1,24 @@ +package com.codedifferently.lesson18.library.search; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class SearchCriteria { + /** The ID to search for (exact match). */ + public String id; + + /** The title to search for. */ + public String title; + + /** The author to search for. */ + public String author; + + /** The type to search for (exact match). */ + public String type; +} diff --git a/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/search/Searchable.java b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/search/Searchable.java new file mode 100644 index 00000000..bf822366 --- /dev/null +++ b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/library/search/Searchable.java @@ -0,0 +1,11 @@ +package com.codedifferently.lesson18.library.search; + +public interface Searchable { + /** + * Indicates whether an item matches the search criteria. + * + * @param query The query to search for. + * @return The items that match the query. + */ + boolean matches(SearchCriteria query); +} diff --git a/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/models/AuthorsConverter.java b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/models/AuthorsConverter.java new file mode 100644 index 00000000..d0594036 --- /dev/null +++ b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/models/AuthorsConverter.java @@ -0,0 +1,18 @@ +package com.codedifferently.lesson18.models; + +import jakarta.persistence.AttributeConverter; +import jakarta.persistence.Converter; +import java.util.List; + +@Converter +public class AuthorsConverter implements AttributeConverter, String> { + @Override + public String convertToDatabaseColumn(List authors) { + return String.join(", ", authors); + } + + @Override + public List convertToEntityAttribute(String authors) { + return authors != null ? List.of(authors.split(", ")) : List.of(); + } +} diff --git a/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/models/CheckoutModel.java b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/models/CheckoutModel.java new file mode 100644 index 00000000..1cb91885 --- /dev/null +++ b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/models/CheckoutModel.java @@ -0,0 +1,15 @@ +package com.codedifferently.lesson18.models; + +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import java.time.Instant; +import java.util.UUID; + +@Entity +@Table(name = "checked_out_items") +public class CheckoutModel { + @Id public UUID itemId; + public String email; + public Instant dueDate; +} diff --git a/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/models/LibraryDataModel.java b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/models/LibraryDataModel.java new file mode 100644 index 00000000..e6f4b89d --- /dev/null +++ b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/models/LibraryDataModel.java @@ -0,0 +1,61 @@ +package com.codedifferently.lesson18.models; + +import com.codedifferently.lesson18.library.Book; +import com.codedifferently.lesson18.library.Dvd; +import com.codedifferently.lesson18.library.Librarian; +import com.codedifferently.lesson18.library.LibraryGuest; +import com.codedifferently.lesson18.library.Magazine; +import com.codedifferently.lesson18.library.MediaItem; +import com.codedifferently.lesson18.library.Newspaper; +import com.codedifferently.lesson18.library.Patron; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class LibraryDataModel { + public List mediaItems; + public List guests; + + public List getMediaItems() { + List results = new ArrayList<>(); + for (MediaItemModel mediaItemModel : mediaItems) { + switch (mediaItemModel.type) { + case BOOK -> + results.add( + new Book( + mediaItemModel.id, + mediaItemModel.title, + mediaItemModel.isbn, + mediaItemModel.authors, + mediaItemModel.pages)); + case DVD -> results.add(new Dvd(mediaItemModel.id, mediaItemModel.title)); + case MAGAZINE -> results.add(new Magazine(mediaItemModel.id, mediaItemModel.title)); + case NEWSPAPER -> results.add(new Newspaper(mediaItemModel.id, mediaItemModel.title)); + default -> + throw new IllegalArgumentException("Unknown media item type: " + mediaItemModel.type); + } + } + return results; + } + + public List getGuests() { + List results = new ArrayList<>(); + for (LibraryGuestModel guestModel : this.guests) { + switch (guestModel.type) { + case "librarian" -> results.add(new Librarian(guestModel.name, guestModel.email)); + case "patron" -> results.add(new Patron(guestModel.name, guestModel.email)); + default -> throw new AssertionError(); + } + } + return results; + } + + public Map> getCheckoutsByEmail() { + Map> results = new HashMap<>(); + for (LibraryGuestModel guest : this.guests) { + results.put(guest.email, guest.checkedOutItems); + } + return results; + } +} diff --git a/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/models/LibraryGuestModel.java b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/models/LibraryGuestModel.java new file mode 100644 index 00000000..d58181c1 --- /dev/null +++ b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/models/LibraryGuestModel.java @@ -0,0 +1,19 @@ +package com.codedifferently.lesson18.models; + +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.Id; +import jakarta.persistence.OneToMany; +import jakarta.persistence.Table; +import java.util.List; + +@Entity +@Table(name = "guests") +public class LibraryGuestModel { + public String type; + public String name; + @Id public String email; + + @OneToMany(mappedBy = "email", fetch = FetchType.EAGER) + public List checkedOutItems; +} diff --git a/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/models/MediaItemModel.java b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/models/MediaItemModel.java new file mode 100644 index 00000000..247f3c6c --- /dev/null +++ b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/models/MediaItemModel.java @@ -0,0 +1,29 @@ +package com.codedifferently.lesson18.models; + +import com.codedifferently.lesson18.library.MediaType; +import jakarta.persistence.Convert; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import java.util.List; +import java.util.UUID; + +@Entity +@Table(name = "media_items") +public class MediaItemModel { + @Enumerated(EnumType.STRING) + public MediaType type; + + @Id public UUID id; + public String isbn; + public String title; + + @Convert(converter = AuthorsConverter.class) + public List authors; + + public String edition; + public Integer pages = 0; + public Integer runtime = 0; +} diff --git a/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/repository/LibraryGuestRepository.java b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/repository/LibraryGuestRepository.java new file mode 100644 index 00000000..cabc0872 --- /dev/null +++ b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/repository/LibraryGuestRepository.java @@ -0,0 +1,10 @@ +package com.codedifferently.lesson18.repository; + +import com.codedifferently.lesson18.models.LibraryGuestModel; +import java.util.List; +import org.springframework.data.repository.CrudRepository; + +public interface LibraryGuestRepository extends CrudRepository { + @Override + List findAll(); +} diff --git a/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/repository/MediaItemRepository.java b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/repository/MediaItemRepository.java new file mode 100644 index 00000000..e9a0ce22 --- /dev/null +++ b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/repository/MediaItemRepository.java @@ -0,0 +1,11 @@ +package com.codedifferently.lesson18.repository; + +import com.codedifferently.lesson18.models.MediaItemModel; +import java.util.List; +import java.util.UUID; +import org.springframework.data.repository.CrudRepository; + +public interface MediaItemRepository extends CrudRepository { + @Override + List findAll(); +} diff --git a/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/web/CreateMediaItemRequest.java b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/web/CreateMediaItemRequest.java new file mode 100644 index 00000000..8d663dac --- /dev/null +++ b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/web/CreateMediaItemRequest.java @@ -0,0 +1,17 @@ +package com.codedifferently.lesson18.web; + +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class CreateMediaItemRequest { + @NotNull(message = "item is required") @Valid + private MediaItemRequest item; +} diff --git a/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/web/CreateMediaItemResponse.java b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/web/CreateMediaItemResponse.java new file mode 100644 index 00000000..bd835ca4 --- /dev/null +++ b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/web/CreateMediaItemResponse.java @@ -0,0 +1,10 @@ +package com.codedifferently.lesson18.web; + +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class CreateMediaItemResponse { + private MediaItemResponse item; +} diff --git a/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/web/GetMediaItemsResponse.java b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/web/GetMediaItemsResponse.java new file mode 100644 index 00000000..c0d3c86b --- /dev/null +++ b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/web/GetMediaItemsResponse.java @@ -0,0 +1,12 @@ +package com.codedifferently.lesson18.web; + +import java.util.List; +import lombok.Builder; +import lombok.Data; +import lombok.Singular; + +@Data +@Builder +public class GetMediaItemsResponse { + @Singular private List items; +} diff --git a/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/web/GlobalExceptionHandler.java b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/web/GlobalExceptionHandler.java new file mode 100644 index 00000000..4fcf6f89 --- /dev/null +++ b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/web/GlobalExceptionHandler.java @@ -0,0 +1,33 @@ +package com.codedifferently.lesson18.web; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.FieldError; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +@RestControllerAdvice +public class GlobalExceptionHandler { + + @ExceptionHandler(MethodArgumentNotValidException.class) + public ResponseEntity>> handleValidationErrors( + MethodArgumentNotValidException ex) { + List errors = + ex.getBindingResult().getFieldErrors().stream() + .map(FieldError::getDefaultMessage) + .collect(Collectors.toList()); + return new ResponseEntity<>(getErrorsMap(errors), new HttpHeaders(), HttpStatus.BAD_REQUEST); + } + + private Map> getErrorsMap(List errors) { + Map> errorResponse = new HashMap<>(); + errorResponse.put("errors", errors); + return errorResponse; + } +} diff --git a/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/web/MediaItemRequest.java b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/web/MediaItemRequest.java new file mode 100644 index 00000000..dd64538c --- /dev/null +++ b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/web/MediaItemRequest.java @@ -0,0 +1,52 @@ +package com.codedifferently.lesson18.web; + +import com.codedifferently.lesson18.library.Book; +import com.codedifferently.lesson18.library.Dvd; +import com.codedifferently.lesson18.library.Magazine; +import com.codedifferently.lesson18.library.MediaItem; +import com.codedifferently.lesson18.library.MediaType; +import com.codedifferently.lesson18.library.Newspaper; +import jakarta.validation.constraints.NotBlank; +import java.util.List; +import java.util.UUID; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class MediaItemRequest { + private UUID id; + private MediaType type; + private String isbn; + + @NotBlank(message = "Title is required") + private String title; + + private String[] authors; + private String edition; + private int pages; + private int runtime; + + public static MediaItem asMediaItem(MediaItemRequest request) { + var id = request.id != null ? request.id : UUID.randomUUID(); + switch (request.type) { + case BOOK -> { + return new Book(id, request.title, request.isbn, List.of(request.authors), request.pages); + } + case DVD -> { + return new Dvd(id, request.title); + } + case MAGAZINE -> { + return new Magazine(id, request.title); + } + case NEWSPAPER -> { + return new Newspaper(id, request.title); + } + default -> throw new IllegalArgumentException("Unknown media item type: " + request.type); + } + } +} diff --git a/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/web/MediaItemResponse.java b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/web/MediaItemResponse.java new file mode 100644 index 00000000..fcb5a83d --- /dev/null +++ b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/web/MediaItemResponse.java @@ -0,0 +1,37 @@ +package com.codedifferently.lesson18.web; + +import com.codedifferently.lesson18.library.Book; +import com.codedifferently.lesson18.library.MediaItem; +import com.codedifferently.lesson18.library.MediaType; +import java.util.List; +import java.util.UUID; +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class MediaItemResponse { + private MediaType type; + private UUID id; + private String isbn; + private String title; + public List authors; + public String edition; + public int pages; + public int runtime; + + public static MediaItemResponse from(MediaItem item) { + var result = + MediaItemResponse.builder().id(item.getId()).title(item.getTitle()).type(item.getType()); + + switch (item.getType()) { + case BOOK -> { + var book = (Book) item; + result = + result.isbn(book.getIsbn()).authors(book.getAuthors()).pages(book.getNumberOfPages()); + } + } + + return result.build(); + } +} diff --git a/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/web/MediaItemsController.java b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/web/MediaItemsController.java new file mode 100644 index 00000000..f5dee45e --- /dev/null +++ b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/web/MediaItemsController.java @@ -0,0 +1,34 @@ +package com.codedifferently.lesson18.web; + +import java.io.IOException; +import java.util.List; +import java.util.Set; + +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.codedifferently.lesson18.library.Librarian; +import com.codedifferently.lesson18.library.Library; +import com.codedifferently.lesson18.library.MediaItem; +import com.codedifferently.lesson18.library.search.SearchCriteria; + +@RestController +@CrossOrigin +public class MediaItemsController { + private final Library library; + private final Librarian librarian; + + public MediaItemsController(Library library) throws IOException { + this.library = library; + this.librarian = library.getLibrarians().stream().findFirst().orElseThrow(); + } + + @GetMapping("/items") + public GetMediaItemsResponse getItems() { + Set items = library.search(SearchCriteria.builder().build()); + List responseItems = items.stream().map(MediaItemResponse::from).toList(); + var response = GetMediaItemsResponse.builder().items(responseItems).build(); + return response; + } +} diff --git a/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/web/WebConfiguration.java b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/web/WebConfiguration.java new file mode 100644 index 00000000..5d21ae79 --- /dev/null +++ b/lesson_18/api/api_app/src/main/java/com/codedifferently/lesson18/web/WebConfiguration.java @@ -0,0 +1,11 @@ +package com.codedifferently.lesson18.web; + +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@EnableWebMvc +@Configuration +@ComponentScan(basePackages = "com.codedifferently") +public class WebConfiguration implements WebMvcConfigurer {} diff --git a/lesson_18/api/api_app/src/main/resources/application.yml b/lesson_18/api/api_app/src/main/resources/application.yml new file mode 100644 index 00000000..574e0f91 --- /dev/null +++ b/lesson_18/api/api_app/src/main/resources/application.yml @@ -0,0 +1,9 @@ +server: + port: 5000 +spring: + jpa: + database-platform: org.hibernate.community.dialect.SQLiteDialect + generate-ddl: true + datasource: + url: jdbc:sqlite::resource:sqlite/data.db + driver-class-name: org.sqlite.JDBC \ No newline at end of file diff --git a/lesson_18/api/api_app/src/main/resources/csv/checked_out_items.csv b/lesson_18/api/api_app/src/main/resources/csv/checked_out_items.csv new file mode 100644 index 00000000..1c2fffa7 --- /dev/null +++ b/lesson_18/api/api_app/src/main/resources/csv/checked_out_items.csv @@ -0,0 +1,5 @@ +email,item_id,due_date +jane.smith@example.com,e27a4e0d-9664-420d-955e-c0e295d0ce02,2024-04-05T00:00:00Z +jane.smith@example.com,295ea581-cd61-4319-8b0c-e5c0c03286c5,2024-04-07T00:00:00Z +alice.johnson@example.com,17dd5d20-98f5-4a26-be09-449fea88a3c3,2024-04-03T00:00:00Z +alice.johnson@example.com,28e5c91f-0e4b-4be5-abb1-8da01fd5587e,2024-04-06T00:00:00Z \ No newline at end of file diff --git a/lesson_18/api/api_app/src/main/resources/csv/guests.csv b/lesson_18/api/api_app/src/main/resources/csv/guests.csv new file mode 100644 index 00000000..bcc02b05 --- /dev/null +++ b/lesson_18/api/api_app/src/main/resources/csv/guests.csv @@ -0,0 +1,6 @@ +type,name,email +librarian,John Doe,john.doe@fakelibrary.org +patron,Jane Smith,jane.smith@example.com +patron,Alice Johnson,alice.johnson@example.com +librarian,Bob Williams,bob.williams@fakelibrary.org +patron,Emily Brown,emily.brown@example.com \ No newline at end of file diff --git a/lesson_18/api/api_app/src/main/resources/csv/media_items.csv b/lesson_18/api/api_app/src/main/resources/csv/media_items.csv new file mode 100644 index 00000000..c3f8161d --- /dev/null +++ b/lesson_18/api/api_app/src/main/resources/csv/media_items.csv @@ -0,0 +1,32 @@ +type,id,title,isbn,authors,pages,runtime,edition +book,e27a4e0d-9664-420d-955e-c0e295d0ce02,To Kill a Mockingbird,978-0061120084,"Harper Lee",336,, +book,17dd5d20-98f5-4a26-be09-449fea88a3c3,1984,978-0451524935,"George Orwell",328,, +dvd,28e5c91f-0e4b-4be5-abb1-8da01fd5587e,The Shawshank Redemption,,,,142, +dvd,295ea581-cd61-4319-8b0c-e5c0c03286c5,Inception,,,,148, +magazine,222111dd-c561-462a-8854-853ada4d3421,National Geographic,,,,,March 2024 +magazine,0afd425b-973f-4af9-a6aa-8febe943a8f6,Time,,,,,"March 15, 2024" +newspaper,91b74a71-97ad-4fea-b17c-a640c98d355f,The New York Times,,,,,"Morning Edition, March 22, 2024" +newspaper,45cab344-b792-484c-9156-d929237dde67,The Guardian,,,,,"March 22, 2024" +book,218b55fa-a3cd-4803-805e-7cd1ef3115ac,The Great Gatsby,978-0743273565,"F. Scott Fitzgerald",180,, +book,b4249c17-f77b-46da-aa82-7aa227eca5e2,Harry Potter and the Sorcerer's Stone,978-0590353427,"J.K. Rowling",309,, +dvd,a3cc5ccb-e2fd-4cd0-a6f8-dc1f2f07589b,The Godfather,,,,175, +dvd,6386364c-8505-4dbe-8731-ff8fa0d6e381,The Dark Knight,,,,152, +magazine,e5060cc1-33f0-431c-a1b3-d1979e38b6f2,Scientific American,,,,,April 2024 +magazine,7048bd13-49ee-4693-8900-e396bbdf3f98,Vogue,,,,,Spring 2024 +newspaper,6f80a5ce-5958-48f3-a029-ff3d76f2c3fe,The Washington Post,,,,,"Evening Edition, March 22, 2024" +newspaper,f5f1196c-7935-417e-bc52-7144f63da3cb,The Times,,,,,"March 23, 2024" +book,faf5a804-e02c-4bbc-8505-4ba90a526e28,Pride and Prejudice,978-0141439518,"Jane Austen",279,, +book,1aab8182-4345-4ead-98e8-0db53682311b,The Catcher in the Rye,978-0316769488,"J.D. Salinger",277,, +dvd,2b92ef3d-b224-4589-9a59-cdaba758affd,The Matrix,,,,136, +dvd,e5d75a1d-f3b4-430f-ba63-b6e4603228eb,Pulp Fiction,,,,154, +magazine,75fb71ad-ea84-45b8-8396-b790c833573e,Wired,,,,,"May 2024" +magazine,e30a6739-cdc9-4b2e-ac67-7278fcfb9a59,Forbes,,,,,"April 2024" +newspaper,3e228c29-6163-477a-8b70-e873a3788758,Los Angeles Times,,,,,"Morning Edition, March 23, 2024" +newspaper,8e3946e2-d5a6-4cb4-ac92-17cc44935d2d,Chicago Tribune,,,,,"March 23, 2024" +book,b08c9da7-5c01-494c-84ec-af3fef9dc480,The Lord of the Rings,978-0544003415,"J.R.R. Tolkien",1178,, +dvd,af1ae237-d29a-49d8-a18a-d6193c07a033,The Silence of the Lambs,,,,118, +dvd,215af9ba-e881-48fb-8284-a3dc6a1c096d,The Departed,,,,151, +magazine,8efcbbb2-5c1e-486c-924d-63c3503f498c,The Economist,,,,,"March 23, 2024" +magazine,d39f5cf3-9574-4fdc-b81b-99d31b26ee92,The New Yorker,,,,,"March 25, 2024" +newspaper,8b369c0f-6c68-4a84-8e15-8b85a2dd1949,USA Today,,,,,"Morning Edition, March 23, 2024" +newspaper,eaf356a3-ae28-4cc5-92a2-9b0264165b5d,The Wall Street Journal,,,,,"March 23, 2024" \ No newline at end of file diff --git a/lesson_18/api/api_app/src/main/resources/json/data.json b/lesson_18/api/api_app/src/main/resources/json/data.json new file mode 100644 index 00000000..d419365f --- /dev/null +++ b/lesson_18/api/api_app/src/main/resources/json/data.json @@ -0,0 +1,268 @@ +{ + "mediaItems": [ + { + "type": "book", + "id": "e27a4e0d-9664-420d-955e-c0e295d0ce02", + "title": "To Kill a Mockingbird", + "isbn": "978-0061120084", + "authors": [ + "Harper Lee" + ], + "pages": 336 + }, + { + "type": "book", + "id": "17dd5d20-98f5-4a26-be09-449fea88a3c3", + "title": "1984", + "isbn": "978-0451524935", + "authors": [ + "George Orwell" + ], + "pages": 328 + }, + { + "type": "dvd", + "id": "28e5c91f-0e4b-4be5-abb1-8da01fd5587e", + "title": "The Shawshank Redemption", + "runtime": 142 + }, + { + "type": "dvd", + "id": "295ea581-cd61-4319-8b0c-e5c0c03286c5", + "title": "Inception", + "runtime": 148 + }, + { + "type": "magazine", + "id": "222111dd-c561-462a-8854-853ada4d3421", + "title": "National Geographic", + "edition": "March 2024" + }, + { + "type": "magazine", + "id": "0afd425b-973f-4af9-a6aa-8febe943a8f6", + "title": "Time", + "edition": "March 15, 2024" + }, + { + "type": "newspaper", + "id": "91b74a71-97ad-4fea-b17c-a640c98d355f", + "title": "The New York Times", + "edition": "Morning Edition, March 22, 2024" + }, + { + "type": "newspaper", + "id": "45cab344-b792-484c-9156-d929237dde67", + "title": "The Guardian", + "edition": "March 22, 2024" + }, + { + "type": "book", + "id": "218b55fa-a3cd-4803-805e-7cd1ef3115ac", + "title": "The Great Gatsby", + "isbn": "978-0743273565", + "authors": [ + "F. Scott Fitzgerald" + ], + "pages": 180 + }, + { + "type": "book", + "id": "b4249c17-f77b-46da-aa82-7aa227eca5e2", + "title": "Harry Potter and the Sorcerer's Stone", + "isbn": "978-0590353427", + "authors": [ + "J.K. Rowling" + ], + "pages": 309 + }, + { + "type": "dvd", + "id": "a3cc5ccb-e2fd-4cd0-a6f8-dc1f2f07589b", + "title": "The Godfather", + "runtime": 175 + }, + { + "type": "dvd", + "id": "6386364c-8505-4dbe-8731-ff8fa0d6e381", + "title": "The Dark Knight", + "runtime": 152 + }, + { + "type": "magazine", + "id": "e5060cc1-33f0-431c-a1b3-d1979e38b6f2", + "title": "Scientific American", + "edition": "April 2024" + }, + { + "type": "magazine", + "id": "7048bd13-49ee-4693-8900-e396bbdf3f98", + "title": "Vogue", + "edition": "Spring 2024" + }, + { + "type": "newspaper", + "id": "6f80a5ce-5958-48f3-a029-ff3d76f2c3fe", + "title": "The Washington Post", + "edition": "Evening Edition, March 22, 2024" + }, + { + "type": "newspaper", + "id": "f5f1196c-7935-417e-bc52-7144f63da3cb", + "title": "The Times", + "edition": "March 23, 2024" + }, + { + "type": "book", + "id": "faf5a804-e02c-4bbc-8505-4ba90a526e28", + "title": "Pride and Prejudice", + "isbn": "978-0141439518", + "authors": [ + "Jane Austen" + ], + "pages": 279 + }, + { + "type": "book", + "id": "1aab8182-4345-4ead-98e8-0db53682311b", + "title": "The Catcher in the Rye", + "isbn": "978-0316769488", + "authors": [ + "J.D. Salinger" + ], + "pages": 277 + }, + { + "type": "dvd", + "id": "2b92ef3d-b224-4589-9a59-cdaba758affd", + "title": "The Matrix", + "runtime": 136 + }, + { + "type": "dvd", + "id": "e5d75a1d-f3b4-430f-ba63-b6e4603228eb", + "title": "Pulp Fiction", + "runtime": 154 + }, + { + "type": "magazine", + "id": "75fb71ad-ea84-45b8-8396-b790c833573e", + "title": "Wired", + "edition": "May 2024" + }, + { + "type": "magazine", + "id": "e30a6739-cdc9-4b2e-ac67-7278fcfb9a59", + "title": "Forbes", + "edition": "April 2024" + }, + { + "type": "newspaper", + "id": "3e228c29-6163-477a-8b70-e873a3788758", + "title": "Los Angeles Times", + "edition": "Morning Edition, March 23, 2024" + }, + { + "type": "newspaper", + "id": "8e3946e2-d5a6-4cb4-ac92-17cc44935d2d", + "title": "Chicago Tribune", + "edition": "March 23, 2024" + }, + { + "type": "book", + "id": "b08c9da7-5c01-494c-84ec-af3fef9dc480", + "title": "The Lord of the Rings", + "isbn": "978-0544003415", + "authors": [ + "J.R.R. Tolkien" + ], + "pages": 1178 + }, + { + "type": "dvd", + "id": "af1ae237-d29a-49d8-a18a-d6193c07a033", + "title": "The Silence of the Lambs", + "runtime": 118 + }, + { + "type": "dvd", + "id": "215af9ba-e881-48fb-8284-a3dc6a1c096d", + "title": "The Departed", + "runtime": 151 + }, + { + "type": "magazine", + "id": "8efcbbb2-5c1e-486c-924d-63c3503f498c", + "title": "The Economist", + "edition": "March 23, 2024" + }, + { + "type": "magazine", + "id": "d39f5cf3-9574-4fdc-b81b-99d31b26ee92", + "title": "The New Yorker", + "edition": "March 25, 2024" + }, + { + "type": "newspaper", + "id": "8b369c0f-6c68-4a84-8e15-8b85a2dd1949", + "title": "USA Today", + "edition": "Morning Edition, March 23, 2024" + }, + { + "type": "newspaper", + "id": "eaf356a3-ae28-4cc5-92a2-9b0264165b5d", + "title": "The Wall Street Journal", + "edition": "March 23, 2024" + } + ], + "guests": [ + { + "type": "librarian", + "name": "John Doe", + "email": "john.doe@fakelibrary.org", + "checkedOutItems": [] + }, + { + "type": "patron", + "name": "Jane Smith", + "email": "jane.smith@example.com", + "checkedOutItems": [ + { + "itemId": "e27a4e0d-9664-420d-955e-c0e295d0ce02", + "dueDate": "2024-04-05T00:00:00Z" + }, + { + "itemId": "295ea581-cd61-4319-8b0c-e5c0c03286c5", + "dueDate": "2024-04-07T00:00:00Z" + } + ] + }, + { + "type": "patron", + "name": "Alice Johnson", + "email": "alice.johnson@example.com", + "checkedOutItems": [ + { + "itemId": "17dd5d20-98f5-4a26-be09-449fea88a3c3", + "dueDate": "2024-04-03T00:00:00Z" + }, + { + "itemId": "28e5c91f-0e4b-4be5-abb1-8da01fd5587e", + "dueDate": "2024-04-06T00:00:00Z" + } + ] + }, + { + "type": "librarian", + "name": "Bob Williams", + "email": "bob.williams@fakelibrary.org", + "checkedOutItems": [] + }, + { + "type": "patron", + "name": "Emily Brown", + "email": "emily.brown@example.com", + "checkedOutItems": [] + } + ] +} \ No newline at end of file diff --git a/lesson_18/api/api_app/src/main/resources/queries/anthonydmays.sql b/lesson_18/api/api_app/src/main/resources/queries/anthonydmays.sql new file mode 100644 index 00000000..027b7d63 --- /dev/null +++ b/lesson_18/api/api_app/src/main/resources/queries/anthonydmays.sql @@ -0,0 +1 @@ +SELECT 1; \ No newline at end of file diff --git a/lesson_18/api/api_app/src/main/resources/sqlite/data.db b/lesson_18/api/api_app/src/main/resources/sqlite/data.db new file mode 100644 index 0000000000000000000000000000000000000000..16f3563b10820e8dd268b0c729ae36b29a164dbf GIT binary patch literal 16384 zcmeHO-ESOM6`xHucI+hHLJ6*ckV!%mTyi&azh>@L+NMskapTyj>yLyFLAamx#JfAz z?6|3Uslp39fsiT{Rfsp9kr1LtJVALwJn#Y%FFf`MiN64GX4a0^q;2{L)r_^fcV_4Q z&bhz)JLk-uS+Bmnm=-SdS>97cNP}mBMk9DR41*wO!>b9e{p}1iM)w>0Uwq7GJ80kj z$tgJD=+s)!dTHt(@KJ9y12qFR12qFR12qFR12qFR12qFR12qGm5(XX}Z;el1xzc!a ztx&q_%%(G2&fd>g0LXQ)%~nxYqgl z+U3bGJYPcHPwmJNyW{R#Rk-uvtvhR-`OeDZ?6;@Jr)Opwk4{&fZ0xu}F&MrdJ#2G$ zurgHaZUe+)JAKs~-5qgba`w@+Q{&SYE;PR1sqlNwrfN9Gk>-)ZmPWq$Fms1SRHQ|B z)Ob43{SnvHPO+KggOMZKYQw=k(79NVl<)M5wDkY+5pc0cvptl_*>Y`u_SoNo*3VlD zQ~#d&{Zw!2E2n;UDm``dpsT5hQg)VuoX`xn0|I;XT#uhO0&HToEp0J9%GqmsD;xLqacyBqHoPUk32ACHU>f z;6l?_n#iNr!~m`YL&9N>gce*8Yq4ZfB{ z!pL@u#+!+apKwai-33}xN-Le z!CZN%6>>sg0P`9N0vsr6O{}nqWL$B3!)>d)a5i}7))%1vi_pJO_E#Rmtk48mA{AoN z3Z$@5$i`Sw6D2C5v~*@Q?Yh2kVdldEb{ADo58kjd6Q|dc+1VpOaQ(H{ZtF-GX;lIP zi@+Dj3=+&41k>-Gm)0;5l~{{eZufy!U^)ge5h&t}MG<9~FSJ+S4<@X;mAZcO-PPw{ z*1uL!crfdZN)|hUELSl|O2deaBnT(QFeWLt#J;kb8nuyyYk8`7`tC4`ei}fpl%NMv zqK*(@h(s}tDPl>YKt)Le)FxEXM2Lio#cUAH^*3DC4Z=0Jz!^M6Qk~Dk{Lhqj&h1Oe z(MZJ!mB?5l5!1wh?{R_>k_d0SmWs=pS+3n+ZaYuAmGZBj2AJs*=FC1!!o5zgvdER1 zXIu*;sEms67kb%{l#)43cb*YtCQ~_7zd6@Pq-L34pN-Pw|Ni3NV z3+)^2a8-3dMlNrhzW*7pLT4}RS@FtqB_f7gL<~@^L6JNHds@jzaR^@`mh;rQQ1xxN zoVy1*HZ?;Nm|;dG$6`VCT{yQhC|tiWz4Xj}3OdMdo_mZXgmD7GLkuSlX~PLhFk?QZ zR#8)pWvG`!8Evx#aI~D)0~y9%fN#bjE;(d00m(;2ph^#HC$T36qN$|jo*Hbzu#2o8 zE@y+H^M?D-+(w3ps57;%pbL)`6fvPK2B}L2i71v72^oRjK}K3zh*~M`X0Sk61sy`x zEK~5xDS)XQKF~9d;>Z|`DD@G{Cx(c}nj%QOiF8zG@OjlhC>N`MOkdT7`P{)1(|J`4^llXl38N%| z3d?UoC>ZbuVz&4m#DnVE;MdE?L1JaS7^%pN8>J~@WwL+}6u`E`JVsU$3B|x#7bhjh z^E)bsm1Tb~ckW4PV;m51iFhDdiFLwMf{{!hl$m!5X-LMvJBy4ImcqzN#Qi$?@yT<~ z(EJ#P?R4e(zGfrkEh8KXa6&zldoRI+f<*0|c9Kygd|bxa&||z;g;$O}p;|%+#@Je9 zcnrlVCV(M0Ts&~9tYQ|X3*S*?=2P8p-enuP+J=I%#{@*e)h0-;ycij#L&=@uP=XCq z&N2uj)Q-p?2er^ZI)y6FZ$Sawu5#(y3rC@IS%in31)L_aN0DQoHtjf4T4N-vimM9)lKzqu&Mf6;fk}aH^lnU$`O#!>4VG)(+A}*f_&;B8z}-M!9`GLn1opo0@MZG z306smam+#Kl*0(~4Hv$aKXl!0_Q$g!5tzWbTtrwtK zZ#4ro12qFR12qFR12qFR12qFR12qFR12qGmat1CRYtCG_x()YAvwo+Sc6Y<;dG@gH z%4S=a&6nMqs<+*BZIktQvw8Mnr<>|r<#2cAdZxpBu=Gw>R+~psT&K*n9vtMB9V1 zHF_>;G|!%S@v&1Sba*3kC2HGd?!TQW*Z<9_zXz?~wzgXrp;2!&12qFR12qFR12qFR z12qFR12qFR12qFR1OHbH+-f$jt&e@=ni_ss_0)&`)9?S_&u<+If?G#F77BlYNBz@( z_*v^u&jrEFBTczJ_Tfu+c!vMfA1_S5|5yDC{15%j#z*6PlAj4ozc0l literal 0 HcmV?d00001 diff --git a/lesson_18/api/api_app/src/test/java/com/codedifferently/lesson18/Lesson18Test.java b/lesson_18/api/api_app/src/test/java/com/codedifferently/lesson18/Lesson18Test.java new file mode 100644 index 00000000..fe9ce679 --- /dev/null +++ b/lesson_18/api/api_app/src/test/java/com/codedifferently/lesson18/Lesson18Test.java @@ -0,0 +1,13 @@ +package com.codedifferently.lesson18; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.jupiter.api.Test; + +class Lesson18Test { + + @Test + void testInstantiate() { + assertThat(new Lesson18()).isNotNull(); + } +} diff --git a/lesson_18/api/api_app/src/test/java/com/codedifferently/lesson18/factory/LibraryCsvDataLoaderTest.java b/lesson_18/api/api_app/src/test/java/com/codedifferently/lesson18/factory/LibraryCsvDataLoaderTest.java new file mode 100644 index 00000000..f4613fcc --- /dev/null +++ b/lesson_18/api/api_app/src/test/java/com/codedifferently/lesson18/factory/LibraryCsvDataLoaderTest.java @@ -0,0 +1,84 @@ +package com.codedifferently.lesson18.factory; + +import static org.assertj.core.api.Assertions.assertThat; + +import com.codedifferently.lesson18.Lesson18; +import com.codedifferently.lesson18.library.LibraryGuest; +import com.codedifferently.lesson18.library.MediaItem; +import com.codedifferently.lesson18.library.MediaType; +import com.codedifferently.lesson18.models.CheckoutModel; +import com.codedifferently.lesson18.models.LibraryDataModel; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ContextConfiguration; + +@SpringBootTest +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +@ContextConfiguration(classes = Lesson18.class) +class LibraryCsvDataLoaderTest { + private LibraryDataModel libraryDataModel; + + @BeforeAll + void beforeAll() throws Exception { + libraryDataModel = new LibraryCsvDataLoader().loadData(); + } + + @Test + void testDataLoader_loadsCheckedOutItems() { + Map> checkedOutItemsByGuest = + libraryDataModel.getCheckoutsByEmail(); + var numCheckedOutItems = checkedOutItemsByGuest.values().stream().mapToInt(List::size).sum(); + assertThat(numCheckedOutItems) + .describedAs("LibraryCsvDataLoader should load checked out items") + .isEqualTo(4); + } + + @Test + void testDataLoader_loadsCorrectItemTypes() { + List items = libraryDataModel.getMediaItems(); + Map countByMediaType = + items.stream() + .reduce( + new HashMap<>(), + (hashMap, e) -> { + hashMap.merge(e.getType(), 1, Integer::sum); + return hashMap; + }, + (m, m2) -> { + m.putAll(m2); + return m; + }); + assertThat(countByMediaType.get(MediaType.BOOK)).isEqualTo(7); + assertThat(countByMediaType.get(MediaType.MAGAZINE)).isEqualTo(8); + assertThat(countByMediaType.get(MediaType.NEWSPAPER)).isEqualTo(8); + assertThat(countByMediaType.get(MediaType.DVD)).isEqualTo(8); + assertThat(items.stream().map(MediaItem::getId).distinct().count()).isEqualTo(31); + assertThat(items.stream().map(MediaItem::getTitle).distinct().count()).isEqualTo(31); + } + + @Test + void testDataLoader_loadsCorrectGuestTypes() { + List guests = libraryDataModel.getGuests(); + Map countByGuestType = + guests.stream() + .reduce( + new HashMap<>(), + (hashMap, e) -> { + hashMap.merge(e.getClass().getSimpleName(), 1, Integer::sum); + return hashMap; + }, + (m, m2) -> { + m.putAll(m2); + return m; + }); + assertThat(countByGuestType.get("Librarian")).isEqualTo(2); + assertThat(countByGuestType.get("Patron")).isEqualTo(3); + assertThat(guests.stream().map(LibraryGuest::getEmail).distinct().count()).isEqualTo(5); + assertThat(guests.stream().map(LibraryGuest::getName).distinct().count()).isEqualTo(5); + } +} diff --git a/lesson_18/api/api_app/src/test/java/com/codedifferently/lesson18/factory/LibraryJsonDataLoaderTest.java b/lesson_18/api/api_app/src/test/java/com/codedifferently/lesson18/factory/LibraryJsonDataLoaderTest.java new file mode 100644 index 00000000..8de5b0d8 --- /dev/null +++ b/lesson_18/api/api_app/src/test/java/com/codedifferently/lesson18/factory/LibraryJsonDataLoaderTest.java @@ -0,0 +1,76 @@ +package com.codedifferently.lesson18.factory; + +import static org.assertj.core.api.Assertions.assertThat; + +import com.codedifferently.lesson18.library.LibraryGuest; +import com.codedifferently.lesson18.library.MediaItem; +import com.codedifferently.lesson18.library.MediaType; +import com.codedifferently.lesson18.models.CheckoutModel; +import com.codedifferently.lesson18.models.LibraryDataModel; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +class LibraryJsonDataLoaderTest { + private static LibraryDataModel libraryDataModel; + + @BeforeAll + static void beforeAll() throws Exception { + var libraryJsonDataLoader = new LibraryJsonDataLoader(); + libraryDataModel = libraryJsonDataLoader.loadData(); + } + + @Test + void testDataLoader_loadsCheckedOutItems() { + Map> checkedOutItemsByGuest = + libraryDataModel.getCheckoutsByEmail(); + var numCheckedOutItems = checkedOutItemsByGuest.values().stream().mapToInt(List::size).sum(); + assertThat(numCheckedOutItems).isEqualTo(4); + } + + @Test + void testDataLoader_loadsCorrectItemTypes() { + List items = libraryDataModel.getMediaItems(); + Map countByMediaType = + items.stream() + .reduce( + new HashMap<>(), + (hashMap, e) -> { + hashMap.merge(e.getType(), 1, Integer::sum); + return hashMap; + }, + (m, m2) -> { + m.putAll(m2); + return m; + }); + assertThat(countByMediaType.get(MediaType.BOOK)).isEqualTo(7); + assertThat(countByMediaType.get(MediaType.MAGAZINE)).isEqualTo(8); + assertThat(countByMediaType.get(MediaType.NEWSPAPER)).isEqualTo(8); + assertThat(countByMediaType.get(MediaType.DVD)).isEqualTo(8); + assertThat(items.stream().map(MediaItem::getId).distinct().count()).isEqualTo(31); + assertThat(items.stream().map(MediaItem::getTitle).distinct().count()).isEqualTo(31); + } + + @Test + void testDataLoader_loadsCorrectGuestTypes() { + List guests = libraryDataModel.getGuests(); + Map countByGuestType = + guests.stream() + .reduce( + new HashMap<>(), + (hashMap, e) -> { + hashMap.merge(e.getClass().getSimpleName(), 1, Integer::sum); + return hashMap; + }, + (m, m2) -> { + m.putAll(m2); + return m; + }); + assertThat(countByGuestType.get("Librarian")).isEqualTo(2); + assertThat(countByGuestType.get("Patron")).isEqualTo(3); + assertThat(guests.stream().map(LibraryGuest::getEmail).distinct().count()).isEqualTo(5); + assertThat(guests.stream().map(LibraryGuest::getName).distinct().count()).isEqualTo(5); + } +} diff --git a/lesson_18/api/api_app/src/test/java/com/codedifferently/lesson18/library/BookTest.java b/lesson_18/api/api_app/src/test/java/com/codedifferently/lesson18/library/BookTest.java new file mode 100644 index 00000000..9c490cab --- /dev/null +++ b/lesson_18/api/api_app/src/test/java/com/codedifferently/lesson18/library/BookTest.java @@ -0,0 +1,94 @@ +package com.codedifferently.lesson18.library; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import com.codedifferently.lesson18.library.exceptions.LibraryNotSetException; +import com.codedifferently.lesson18.library.exceptions.WrongLibraryException; +import java.util.List; +import java.util.UUID; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +class BookTest { + + private Book classUnderTest; + private Library library; + + @BeforeEach + void setUp() { + classUnderTest = + new Book( + UUID.fromString("2b7591dd-f418-4115-974e-45115b3bf39a"), + "To Kill a Mockingbird", + "978-0061120084", + List.of("Harper Lee"), + 281); + library = mock(Library.class); + when(library.getId()).thenReturn("Library 1"); + when(library.hasMediaItem(classUnderTest)).thenReturn(true); + classUnderTest.setLibrary(library); + } + + @Test + void testPatron_created() { + // Assert + assertThat(classUnderTest.getTitle()).isEqualTo("To Kill a Mockingbird"); + assertThat(classUnderTest.getIsbn()).isEqualTo("978-0061120084"); + assertThat(classUnderTest.getAuthors()).isEqualTo(List.of("Harper Lee")); + assertThat(classUnderTest.getNumberOfPages()).isEqualTo(281); + } + + @Test + void testSetLibrary_WrongLibrary() { + // Arrange + Library otherLibrary = mock(Library.class); + when(otherLibrary.hasMediaItem(classUnderTest)).thenReturn(false); + when(otherLibrary.getId()).thenReturn("Library 2"); + + // Act & Assert + assertThatThrownBy(() -> classUnderTest.setLibrary(otherLibrary)) + .isInstanceOf(WrongLibraryException.class) + .hasMessageContaining( + "Media item 2b7591dd-f418-4115-974e-45115b3bf39a is not in library Library 2"); + } + + @Test + void testIsCheckedOut_LibraryNotSet() { + // Arrange + classUnderTest.setLibrary(null); + + // Act & Assert + assertThatThrownBy(() -> classUnderTest.isCheckedOut()) + .isInstanceOf(LibraryNotSetException.class) + .hasMessageContaining("Library not set for item 2b7591dd-f418-4115-974e-45115b3bf39a"); + } + + @Test + void testIsCheckedOut() { + // Arrange + when(library.isCheckedOut(classUnderTest)).thenReturn(true); + + // Act & Assert + assertThat(classUnderTest.isCheckedOut()).isTrue(); + } + + @Test + void testIsCheckedOut_whenNotCheckedOut() { + // Arrange + when(library.isCheckedOut(classUnderTest)).thenReturn(false); + + // Act & Assert + assertThat(classUnderTest.isCheckedOut()).isFalse(); + } + + @Test + void testToString() { + // Act & Assert + assertThat(classUnderTest.toString()) + .isEqualTo( + "Book{id='2b7591dd-f418-4115-974e-45115b3bf39a', title='To Kill a Mockingbird'}"); + } +} diff --git a/lesson_18/api/api_app/src/test/java/com/codedifferently/lesson18/library/LibraryTest.java b/lesson_18/api/api_app/src/test/java/com/codedifferently/lesson18/library/LibraryTest.java new file mode 100644 index 00000000..f90a3a92 --- /dev/null +++ b/lesson_18/api/api_app/src/test/java/com/codedifferently/lesson18/library/LibraryTest.java @@ -0,0 +1,353 @@ +package com.codedifferently.lesson18.library; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import com.codedifferently.lesson18.library.exceptions.MediaItemCheckedOutException; +import java.util.List; +import java.util.Set; +import java.util.UUID; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +class LibraryTest { + private Library classUnderTest; + + @BeforeEach + void setUp() { + classUnderTest = new Library("compton-library"); + } + + @Test + void testLibrary_canAddItems() { + // Arrange + Book book1 = + new Book( + UUID.randomUUID(), + "The Great Gatsby", + "978-0743273565", + List.of("F. Scott Fitzgerald"), + 180); + Book book2 = + new Book( + UUID.randomUUID(), + "To Kill a Mockingbird", + "978-0061120084", + List.of("Harper Lee"), + 281); + Librarian librarian = new Librarian("Anthony Mays", "anthony@example.com"); + // Act + classUnderTest.addMediaItem(book1, librarian); + classUnderTest.addMediaItem(book2, librarian); + // Assert + assertThat(classUnderTest.hasMediaItem(book1)).isTrue(); + assertThat(classUnderTest.hasMediaItem(book2)).isTrue(); + } + + @Test + void testLibrary_canRemoveItems() { + // Arrange + Book book1 = + new Book( + UUID.randomUUID(), + "The Great Gatsby", + "978-0743273565", + List.of("F. Scott Fitzgerald"), + 180); + Book book2 = + new Book( + UUID.randomUUID(), + "To Kill a Mockingbird", + "978-0061120084", + List.of("Harper Lee"), + 281); + Librarian librarian = new Librarian("Anthony Mays", "anthony@example.com"); + classUnderTest.addMediaItem(book1, librarian); + classUnderTest.addMediaItem(book2, librarian); + // Act + classUnderTest.removeMediaItem(book1, librarian); + classUnderTest.removeMediaItem(book2, librarian); + // Assert + assertThat(classUnderTest.hasMediaItem(book1)).isFalse(); + assertThat(classUnderTest.hasMediaItem(book2)).isFalse(); + } + + @Test + void testLibrary_canAddPatrons() { + // Arrange + Patron patron1 = new Patron("John Doe", "john@example.com"); + Patron patron2 = new Patron("Jane Doe", "jane@example.com"); + // Act + classUnderTest.addLibraryGuest(patron1); + classUnderTest.addLibraryGuest(patron2); + // Assert + assertThat(classUnderTest.hasLibraryGuest(patron1)).isTrue(); + assertThat(classUnderTest.hasLibraryGuest(patron2)).isTrue(); + } + + @Test + void testLibrary_canRemovePatrons() { + // Arrange + Patron patron1 = new Patron("John Doe", "john@example.com"); + Patron patron2 = new Patron("Jane Doe", "jane@example.com"); + classUnderTest.addLibraryGuest(patron1); + classUnderTest.addLibraryGuest(patron2); + // Act + classUnderTest.removeLibraryGuest(patron1); + classUnderTest.removeLibraryGuest(patron2); + // Assert + assertThat(classUnderTest.hasLibraryGuest(patron1)).isFalse(); + assertThat(classUnderTest.hasLibraryGuest(patron2)).isFalse(); + } + + @Test + void testLibrary_allowsPatronToCheckoutBook() { + // Arrange + Book book = + new Book( + UUID.randomUUID(), + "The Great Gatsby", + "978-0743273565", + List.of("F. Scott Fitzgerald"), + 180); + Patron patron = new Patron("John Doe", "john@example.com"); + Librarian librarian = new Librarian("Anthony Mays", "anthony@example.com"); + classUnderTest.addMediaItem(book, librarian); + classUnderTest.addLibraryGuest(patron); + // Act + boolean wasCheckedOut = classUnderTest.checkOutMediaItem(book, patron); + // Assert + assertThat(wasCheckedOut).isTrue(); + assertThat(classUnderTest.isCheckedOut(book)).isTrue(); + assertThat(patron.getCheckedOutMediaItems().contains(book)).isTrue(); + } + + @Test + void testLibrary_allowPatronToCheckInBook() { + // Arrange + Book book = + new Book( + UUID.randomUUID(), + "The Great Gatsby", + "978-0743273565", + List.of("F. Scott Fitzgerald"), + 180); + Patron patron = new Patron("John Doe", "john@example.com"); + Librarian librarian = new Librarian("Anthony Mays", "anthony@example.com"); + classUnderTest.addMediaItem(book, librarian); + classUnderTest.addLibraryGuest(patron); + classUnderTest.checkOutMediaItem(book, patron); + // Act + boolean wasReturned = classUnderTest.checkInMediaItem(book, patron); + // Assert + assertThat(wasReturned).isTrue(); + assertThat(classUnderTest.isCheckedOut(book)).isFalse(); + assertThat(patron.getCheckedOutMediaItems().contains(book)).isFalse(); + } + + @Test + void testLibrary_allowLibrarianToCheckOutBook() { + // Arrange + Librarian librarian = new Librarian("Anthony Mays", "anthony@example.com"); + Book book = + new Book( + UUID.randomUUID(), + "The Great Gatsby", + "978-0743273565", + List.of("F. Scott Fitzgerald"), + 180); + classUnderTest.addMediaItem(book, librarian); + classUnderTest.addLibraryGuest(librarian); + // Act + boolean wasCheckedOut = classUnderTest.checkOutMediaItem(book, librarian); + // Assert + assertThat(wasCheckedOut).isTrue(); + assertThat(librarian.getCheckedOutMediaItems().contains(book)).isTrue(); + } + + @Test + void testLibrary_allowLibrarianToCheckInBook() { + // Arrange + Book book = + new Book( + UUID.randomUUID(), + "The Great Gatsby", + "978-0743273565", + List.of("F. Scott Fitzgerald"), + 180); + Librarian librarian = new Librarian("John Doe", "john@example.com"); + classUnderTest.addMediaItem(book, librarian); + classUnderTest.addLibraryGuest(librarian); + classUnderTest.checkOutMediaItem(book, librarian); + // Act + boolean wasReturned = classUnderTest.checkInMediaItem(book, librarian); + // Assert + assertThat(wasReturned).isTrue(); + assertThat(classUnderTest.isCheckedOut(book)).isFalse(); + assertThat(librarian.getCheckedOutMediaItems().contains(book)).isFalse(); + } + + @Test + void testLibrary_preventsMultipleCheckouts() { + // Arrange + Book book = + new Book( + UUID.randomUUID(), + "The Great Gatsby", + "978-0743273565", + List.of("F. Scott Fitzgerald"), + 180); + Patron patron = new Patron("John Doe", "john@example.com"); + Librarian librarian = new Librarian("Anthony Mays", "anthony@example.com"); + classUnderTest.addMediaItem(book, librarian); + classUnderTest.addLibraryGuest(patron); + classUnderTest.checkOutMediaItem(book, patron); + // Act + boolean wasCheckedOut = classUnderTest.checkOutMediaItem(book, patron); + // Assert + assertThat(wasCheckedOut).isFalse(); + assertThat(classUnderTest.isCheckedOut(book)).isTrue(); + } + + @Test + void testLibrary_preventsRemovingPatronWithCheckedOutItems() { + // Arrange + Book book = + new Book( + UUID.randomUUID(), + "The Great Gatsby", + "978-0743273565", + List.of("F. Scott Fitzgerald"), + 180); + Patron patron = new Patron("John Doe", "john@example.com"); + Librarian librarian = new Librarian("Anthony Mays", "anthony@example.com"); + classUnderTest.addMediaItem(book, librarian); + classUnderTest.addLibraryGuest(patron); + classUnderTest.checkOutMediaItem(book, patron); + // Act + assertThatThrownBy(() -> classUnderTest.removeLibraryGuest(patron)) + .isInstanceOf(MediaItemCheckedOutException.class) + .hasMessage("Cannot remove guest with checked out items."); + } + + @Test + void testLibrary_preventsRemovingCheckedOutItems() { + // Arrange + Book book = + new Book( + UUID.randomUUID(), + "The Great Gatsby", + "978-0743273565", + List.of("F. Scott Fitzgerald"), + 180); + Patron patron = new Patron("Jane Doe", "jane@example.com"); + Librarian librarian = new Librarian("Anthony Mays", "anthony@example.com"); + classUnderTest.addMediaItem(book, librarian); + classUnderTest.addLibraryGuest(patron); + classUnderTest.checkOutMediaItem(book, patron); + // Act + assertThatThrownBy(() -> classUnderTest.removeMediaItem(book, librarian)) + .isInstanceOf(MediaItemCheckedOutException.class) + .hasMessage("Cannot remove checked out item."); + } + + @Test + void testLibrary_canAddDvd() { + // Arrange + Dvd dvd = new Dvd(UUID.randomUUID(), "The Great Gatsby"); + Librarian librarian = new Librarian("Anthony Mays", "anthony@example.com"); + // Act + classUnderTest.addMediaItem(dvd, librarian); + // Assert + assertThat(classUnderTest.hasMediaItem(dvd)).isTrue(); + } + + @Test + void testLibrary_canRemoveDvd() { + // Arrange + Dvd dvd = new Dvd(UUID.randomUUID(), "The Great Gatsby"); + Librarian librarian = new Librarian("Anthony Mays", "anthony@example.com"); + // Act + classUnderTest.removeMediaItem(dvd, librarian); + // Assert + assertThat(classUnderTest.hasMediaItem(dvd)).isFalse(); + } + + @Test + void testLibrary_allowLibrarianToCheckOutDvd() { + // Arrange + Librarian librarian = new Librarian("Anthony Mays", "anthony@example.com"); + Dvd dvd = new Dvd(UUID.randomUUID(), "The Great Gatsby"); + classUnderTest.addMediaItem(dvd, librarian); + classUnderTest.addLibraryGuest(librarian); + // Act + boolean wasCheckedOut = classUnderTest.checkOutMediaItem(dvd, librarian); + // Assert + assertThat(wasCheckedOut).isTrue(); + assertThat(librarian.getCheckedOutMediaItems().contains(dvd)).isTrue(); + } + + @Test + void testLibrary_allowPatronToCheckInDvd() { + // Arrange + Dvd dvd = new Dvd(UUID.randomUUID(), "The Great Gatsby"); + Patron patron = new Patron("John Doe", "john@example.com"); + Librarian librarian = new Librarian("Anthony Mays", "anthony@example.com"); + classUnderTest.addMediaItem(dvd, librarian); + classUnderTest.addLibraryGuest(patron); + classUnderTest.checkOutMediaItem(dvd, patron); + // Act + boolean wasReturned = classUnderTest.checkInMediaItem(dvd, patron); + // Assert + assertThat(wasReturned).isTrue(); + assertThat(classUnderTest.isCheckedOut(dvd)).isFalse(); + assertThat(patron.getCheckedOutMediaItems().contains(dvd)).isFalse(); + } + + @Test + void testLibrary_preventsGuestFromCheckingOutMagazine() { + // Arrange + Patron patron = new Patron("John Doe", "john@example.com"); + Librarian librarian = new Librarian("Anthony Mays", "anthony@example.com"); + Magazine magazine = new Magazine(UUID.randomUUID(), "The Great Gatsby"); + classUnderTest.addMediaItem(magazine, librarian); + classUnderTest.addLibraryGuest(librarian); + classUnderTest.addLibraryGuest(patron); + // Act + boolean wasCheckedOut = classUnderTest.checkOutMediaItem(magazine, librarian); + // Assert + assertThat(wasCheckedOut).isFalse(); + assertThat(patron.getCheckedOutMediaItems().contains(magazine)).isFalse(); + } + + @Test + void testLibrary_preventsGuestFromCheckingOutNewspaper() { + // Arrange + Patron patron = new Patron("John Doe", "john@example.com"); + Librarian librarian = new Librarian("Anthony Mays", "anthony@example.com"); + Newspaper newspaper = new Newspaper(UUID.randomUUID(), "LA Times"); + classUnderTest.addMediaItem(newspaper, librarian); + classUnderTest.addLibraryGuest(librarian); + classUnderTest.addLibraryGuest(patron); + // Act + boolean wasCheckedOut = classUnderTest.checkOutMediaItem(newspaper, librarian); + // Assert + assertThat(wasCheckedOut).isFalse(); + assertThat(patron.getCheckedOutMediaItems().contains(newspaper)).isFalse(); + } + + @Test + void testLibrary_retrievesAllPatrons() { + // Arrange + Patron patron1 = new Patron("John Doe", "john@example.com"); + Patron patron2 = new Patron("Jane Doe", "jane@example.com"); + classUnderTest.addLibraryGuest(patron1); + classUnderTest.addLibraryGuest(patron2); + + // Act + Set guests = classUnderTest.getPatrons(); + + // Assert + assertThat(classUnderTest.getPatrons().size()).isEqualTo(2); + } +} diff --git a/lesson_18/api/api_app/src/test/java/com/codedifferently/lesson18/library/MediaItemBaseTest.java b/lesson_18/api/api_app/src/test/java/com/codedifferently/lesson18/library/MediaItemBaseTest.java new file mode 100644 index 00000000..543319c3 --- /dev/null +++ b/lesson_18/api/api_app/src/test/java/com/codedifferently/lesson18/library/MediaItemBaseTest.java @@ -0,0 +1,94 @@ +package com.codedifferently.lesson18.library; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import com.codedifferently.lesson18.library.exceptions.LibraryNotSetException; +import com.codedifferently.lesson18.library.exceptions.WrongLibraryException; +import java.util.UUID; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +class MediaItemBaseTest { + private MediaItemBase mediaItem; + private static final UUID ITEM_ID = UUID.fromString("af71ac38-7628-415f-a2cd-bcaf7e001b97"); + + class MockMediaItem extends MediaItemBase { + public MockMediaItem(UUID id, String title) { + super(id, title); + } + + @Override + public MediaType getType() { + return MediaType.MAGAZINE; + } + } + + @BeforeEach + void setUp() { + mediaItem = new MockMediaItem(ITEM_ID, "Sample Title"); + } + + @Test + void getId() { + assertEquals(ITEM_ID, mediaItem.getId()); + } + + @Test + void getTitle() { + assertEquals("Sample Title", mediaItem.getTitle()); + } + + @Test + void setLibrary_withWrongLibraryException() { + Library library = mock(Library.class); + when(library.getId()).thenReturn("compton-library"); + when(library.hasMediaItem(mediaItem)).thenReturn(false); + assertThatThrownBy(() -> mediaItem.setLibrary(library)) + .isInstanceOf(WrongLibraryException.class) + .hasMessage( + "Media item af71ac38-7628-415f-a2cd-bcaf7e001b97 is not in library compton-library"); + } + + @Test + void isCheckedOut() throws LibraryNotSetException { + Library library = mock(Library.class); + when(library.hasMediaItem(mediaItem)).thenReturn(true); + when(library.isCheckedOut(mediaItem)).thenReturn(true); + mediaItem.setLibrary(library); + assertTrue(mediaItem.isCheckedOut()); + } + + @Test + void isCheckedOut_withLibraryNotSetException() { + assertThatThrownBy(() -> mediaItem.isCheckedOut()) + .isInstanceOf(LibraryNotSetException.class) + .hasMessage("Library not set for item af71ac38-7628-415f-a2cd-bcaf7e001b97"); + } + + @Test + void canCheckOut() { + assertTrue(mediaItem.canCheckOut()); + } + + @Test + void equals() { + MediaItemBase mediaItem2 = new MockMediaItem(ITEM_ID, "Sample Title"); + assertEquals(mediaItem, mediaItem2); + } + + @Test + void hashCodeTest() { + MediaItemBase mediaItem2 = new MockMediaItem(ITEM_ID, "Sample Title"); + assertEquals(mediaItem.hashCode(), mediaItem2.hashCode()); + } + + @Test + void toStringTest() { + String expected = "MediaItem{id='af71ac38-7628-415f-a2cd-bcaf7e001b97', title='Sample Title'}"; + assertEquals(expected, mediaItem.toString()); + } +} diff --git a/lesson_18/api/api_app/src/test/java/com/codedifferently/lesson18/library/PatronTest.java b/lesson_18/api/api_app/src/test/java/com/codedifferently/lesson18/library/PatronTest.java new file mode 100644 index 00000000..2561efd5 --- /dev/null +++ b/lesson_18/api/api_app/src/test/java/com/codedifferently/lesson18/library/PatronTest.java @@ -0,0 +1,93 @@ +package com.codedifferently.lesson18.library; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import com.codedifferently.lesson18.library.exceptions.LibraryNotSetException; +import com.codedifferently.lesson18.library.exceptions.WrongLibraryException; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.UUID; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +class PatronTest { + + private Patron classUnderTest; + private Library library; + + @BeforeEach + void setUp() { + classUnderTest = new Patron("John Doe", "johndoe@example.com"); + library = new Library("Library 1"); + library.addLibraryGuest(classUnderTest); + } + + @Test + void testPatron_created() { + // Assert + assertThat(classUnderTest.getName()).isEqualTo("John Doe"); + assertThat(classUnderTest.getEmail()).isEqualTo("johndoe@example.com"); + } + + @Test + void testSetLibrary_WrongLibrary() { + // Arrange + Library otherLibrary = new Library("Library 2"); + + // Act & Assert + assertThatThrownBy(() -> classUnderTest.setLibrary(otherLibrary)) + .isInstanceOf(WrongLibraryException.class) + .hasMessageContaining("Patron johndoe@example.com is not in library Library 2"); + } + + @Test + void testGetCheckedOutBooks_LibraryNotSet() { + // Arrange + classUnderTest.setLibrary(null); + + // Act & Assert + assertThatThrownBy(() -> classUnderTest.getCheckedOutMediaItems()) + .isInstanceOf(LibraryNotSetException.class) + .hasMessageContaining("Library not set for patron johndoe@example.com"); + } + + @Test + void testGetCheckedOutBooks() { + // Arrange + Book book1 = + new Book( + UUID.randomUUID(), + "The Great Gatsby", + "978-0743273565", + List.of("F. Scott Fitzgerald"), + 180); + Book book2 = + new Book( + UUID.randomUUID(), + "To Kill a Mockingbird", + "978-0061120084", + List.of("Harper Lee"), + 281); + Librarian librarian = new Librarian("Anthony Mays", "anthony@example.com"); + Set expectedBooks = new HashSet<>(); + expectedBooks.add(book1); + expectedBooks.add(book2); + + library.addMediaItem(book1, librarian); + library.addMediaItem(book2, librarian); + library.checkOutMediaItem(book1, classUnderTest); + library.checkOutMediaItem(book2, classUnderTest); + + // Act & Assert + assertThat(classUnderTest.getCheckedOutMediaItems()).isEqualTo(expectedBooks); + } + + @Test + void testToString() { + // Act & Assert + assertThat(classUnderTest.toString()) + .isEqualTo("Patron{id='johndoe@example.com', name='John Doe'}"); + } +} diff --git a/lesson_18/api/api_app/src/test/java/com/codedifferently/lesson18/web/MediaItemsControllerTest.java b/lesson_18/api/api_app/src/test/java/com/codedifferently/lesson18/web/MediaItemsControllerTest.java new file mode 100644 index 00000000..fb2fd8a2 --- /dev/null +++ b/lesson_18/api/api_app/src/test/java/com/codedifferently/lesson18/web/MediaItemsControllerTest.java @@ -0,0 +1,125 @@ +package com.codedifferently.lesson18.web; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import com.codedifferently.lesson18.Lesson18; +import com.codedifferently.lesson18.library.Book; +import com.codedifferently.lesson18.library.Library; +import com.codedifferently.lesson18.library.MediaItem; +import com.codedifferently.lesson18.library.search.SearchCriteria; +import java.util.Set; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.context.WebApplicationContext; + +@SpringBootTest +@ContextConfiguration(classes = Lesson18.class) +class MediaItemsControllerTest { + private static MockMvc mockMvc; + @Autowired private Library library; + + @BeforeAll + static void setUp(WebApplicationContext wac) { + mockMvc = MockMvcBuilders.webAppContextSetup(wac).build(); + } + + @Test + void testController_getsAllItems() throws Exception { + mockMvc + .perform(get("/items").contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.items").isArray()) + .andExpect(jsonPath("$.items.length()").value(31)); + } + + @Test + void testController_getsAnItem() throws Exception { + mockMvc + .perform( + get("/items/31616162-3831-3832-2d34-3334352d3465") + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()); + } + + @Test + void testController_returnsNotFoundOnGetItem() throws Exception { + mockMvc + .perform( + get("/items/00000000-0000-0000-0000-000000000000") + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isNotFound()); + } + + @Test + void testController_reportsBadRequestOnAddItem() throws Exception { + String json = "{}"; + + mockMvc + .perform(post("/items").contentType(MediaType.APPLICATION_JSON).content(json)) + .andExpect(status().isBadRequest()) + .andExpect(jsonPath("$.errors").isArray()) + .andExpect(jsonPath("$.errors.length()").value(1)); + } + + @Test + void testController_addsItem() throws Exception { + String json = + """ + { + "item": { + "id": "e27a4e0d-9664-420d-955e-c0e295d0ce02", + "type": "BOOK", + "title": "Becoming", + "isbn": "9781524763138", + "authors": ["Michelle Obama"], + "pages": 448 + } + } + """; + + mockMvc + .perform(post("/items").contentType(MediaType.APPLICATION_JSON).content(json)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.item.id").value("e27a4e0d-9664-420d-955e-c0e295d0ce02")); + + Set items = + library.search(SearchCriteria.builder().id("e27a4e0d-9664-420d-955e-c0e295d0ce02").build()); + assertThat(items).hasSize(1); + var item = items.iterator().next(); + assertThat(item).isInstanceOf(Book.class); + assertThat(item.getTitle()).isEqualTo("Becoming"); + } + + @Test + void testController_returnsNotFoundOnDeleteItem() throws Exception { + mockMvc + .perform( + delete("/items/00000000-0000-0000-0000-000000000000") + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isNotFound()); + } + + @Test + void testController_deletesItem() throws Exception { + mockMvc + .perform( + delete("/items/32623932-6566-3364-2d62-3232342d3435") + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isNoContent()); + + Set items = + library.search(SearchCriteria.builder().id("32623932-6566-3364-2d62-3232342d3435").build()); + assertThat(items).hasSize(0); + } +} diff --git a/lesson_18/api/gradle/wrapper/gradle-wrapper.jar b/lesson_18/api/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..ccebba7710deaf9f98673a68957ea02138b60d0a GIT binary patch literal 61608 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 literal 0 HcmV?d00001 diff --git a/lesson_18/api/gradle/wrapper/gradle-wrapper.properties b/lesson_18/api/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..bdc9a83b --- /dev/null +++ b/lesson_18/api/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.2-bin.zip +networkTimeout=10000 +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/lesson_18/api/gradlew b/lesson_18/api/gradlew new file mode 100755 index 00000000..79a61d42 --- /dev/null +++ b/lesson_18/api/gradlew @@ -0,0 +1,244 @@ +#!/bin/sh + +# +# Copyright Β© 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions Β«$varΒ», Β«${var}Β», Β«${var:-default}Β», Β«${var+SET}Β», +# Β«${var#prefix}Β», Β«${var%suffix}Β», and Β«$( cmd )Β»; +# * compound commands having a testable exit status, especially Β«caseΒ»; +# * various built-in commands including Β«commandΒ», Β«setΒ», and Β«ulimitΒ». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/lesson_18/api/gradlew.bat b/lesson_18/api/gradlew.bat new file mode 100644 index 00000000..93e3f59f --- /dev/null +++ b/lesson_18/api/gradlew.bat @@ -0,0 +1,92 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/lesson_18/api/settings.gradle.kts b/lesson_18/api/settings.gradle.kts new file mode 100644 index 00000000..30fe5857 --- /dev/null +++ b/lesson_18/api/settings.gradle.kts @@ -0,0 +1,13 @@ +/* + * This file was generated by the Gradle 'init' task. + * + * The settings file is used to specify which projects to include in your build. + * + * Detailed information about configuring a multi-project build in Gradle can be found + * in the user manual at https://docs.gradle.org/8.0.2/userguide/multi_project_builds.html + */ + +includeBuild("../../lib/java/codedifferently-instructional") + +rootProject.name = "lesson_16" +include("api_app") diff --git a/lesson_18/webserver/package-lock.json b/lesson_18/webserver/package-lock.json new file mode 100644 index 00000000..7bedc1e8 --- /dev/null +++ b/lesson_18/webserver/package-lock.json @@ -0,0 +1,1697 @@ +{ + "name": "codedifferently-web", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "codedifferently-web", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "@types/cors": "^2.8.17", + "@types/express": "^4.17.21", + "@types/node": "^20.12.5", + "cors": "^2.8.5", + "express": "^4.19.2" + }, + "devDependencies": { + "nodemon": "^3.1.0", + "ts-node-dev": "^2.0.0", + "typescript": "^5.4.4" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/cors": { + "version": "2.8.17", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", + "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/express": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.0.tgz", + "integrity": "sha512-bGyep3JqPCRry1wq+O5n7oiBgGWmeIJXPjXXCo8EK0u8duZGSYar7cGqd3ML2JUsLGeB7fmc06KYo9fLGWqPvQ==", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==" + }, + "node_modules/@types/node": { + "version": "20.12.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.5.tgz", + "integrity": "sha512-BD+BjQ9LS/D8ST9p5uqBxghlN+S42iuNxjsUGjeZobe/ciXzk2qb1B6IXc6AnRLS+yFJRpN2IPEHMzwspfDJNw==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/qs": { + "version": "6.9.14", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.14.tgz", + "integrity": "sha512-5khscbd3SwWMhFqylJBLQ0zIu7c1K6Vz0uBIt915BI3zV0q1nfjRQD3RqSBcPaO6PHEF4ov/t9y89fSiyThlPA==" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==" + }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } + }, + "node_modules/@types/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-xevGOReSYGM7g/kUBZzPqCrR/KYAo+F0yiPc85WFTJa0MSLtyFTVTU6cJu/aV4mid7IffDIWqo69THF2o4JiEQ==", + "dev": true + }, + "node_modules/@types/strip-json-comments": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz", + "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", + "dev": true + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", + "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dynamic-dedupe": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/dynamic-dedupe/-/dynamic-dedupe-0.3.0.tgz", + "integrity": "sha512-ssuANeD+z97meYOqd50e04Ze5qp4bPqo8cCkI4TRjZkzAUgIDTrXV1R8QCdINpiI+hw14+rYazvTRdQrz0/rFQ==", + "dev": true, + "dependencies": { + "xtend": "^4.0.0" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.6.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/nodemon": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.0.tgz", + "integrity": "sha512-xqlktYlDMCepBJd43ZQhjWwMw2obW/JRvkrLxq5RCNcuDDX1DbcPT+qT1IlIIdf+DhnWs90JpTMe+Y5KxOchvA==", + "dev": true, + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^4", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "dependencies": { + "nopt": "~1.0.10" + }, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-node-dev": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ts-node-dev/-/ts-node-dev-2.0.0.tgz", + "integrity": "sha512-ywMrhCfH6M75yftYvrvNarLEY+SUXtUvU8/0Z6llrHQVBx12GiFk5sStF8UdfE/yfzk9IAq7O5EEbTQsxlBI8w==", + "dev": true, + "dependencies": { + "chokidar": "^3.5.1", + "dynamic-dedupe": "^0.3.0", + "minimist": "^1.2.6", + "mkdirp": "^1.0.4", + "resolve": "^1.0.0", + "rimraf": "^2.6.1", + "source-map-support": "^0.5.12", + "tree-kill": "^1.2.2", + "ts-node": "^10.4.0", + "tsconfig": "^7.0.0" + }, + "bin": { + "ts-node-dev": "lib/bin.js", + "tsnd": "lib/bin.js" + }, + "engines": { + "node": ">=0.8.0" + }, + "peerDependencies": { + "node-notifier": "*", + "typescript": "*" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/tsconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz", + "integrity": "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==", + "dev": true, + "dependencies": { + "@types/strip-bom": "^3.0.0", + "@types/strip-json-comments": "0.0.30", + "strip-bom": "^3.0.0", + "strip-json-comments": "^2.0.0" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typescript": { + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.4.tgz", + "integrity": "sha512-dGE2Vv8cpVvw28v8HCPqyb08EzbBURxDpuhJvTrusShUfGnhHBafDsLdS1EhhxyL6BJQE+2cT3dDPAv+MQ6oLw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + } + } +} diff --git a/lesson_18/webserver/package.json b/lesson_18/webserver/package.json new file mode 100644 index 00000000..12558de2 --- /dev/null +++ b/lesson_18/webserver/package.json @@ -0,0 +1,25 @@ +{ + "name": "codedifferently-web", + "version": "1.0.0", + "description": "", + "main": "server.js", + "scripts": { + "build": "npx tsc", + "start": "node dist/server.js", + "dev": "nodemon src/server.ts --quiet" + }, + "author": "", + "license": "ISC", + "devDependencies": { + "nodemon": "^3.1.0", + "ts-node-dev": "^2.0.0", + "typescript": "^5.4.4" + }, + "dependencies": { + "@types/cors": "^2.8.17", + "@types/express": "^4.17.21", + "@types/node": "^20.12.5", + "cors": "^2.8.5", + "express": "^4.19.2" + } +} diff --git a/lesson_18/webserver/public/favicon.ico b/lesson_18/webserver/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..fb0a2bf6c63562a0bb7c539a39316e8b8c45df9d GIT binary patch literal 1310 zcmV+(1>yQqNk&E%1pok7MM6+kP&il$0000G0001M003(M06|PpNR0ph00Dqv+uE}1 z#hq%=-MUYO#RS}=Wt{}c$Pp`5bqnC4u}t(9!T`7#L(&f9q!+MQFMABfv@60rwyVyW0NAF zIb>#H76et9QvjAv~HcP`%iEW(=L&} z$^XlGfc;qz327DL|{yT*ur8TOiAmyyK-*m3mEQYm4m(WTTD(x^tQ8^*#iI*Ln_8%0% zedXPEc{-X|R^k}q#EXd$3Z4nWE3jJqhHrK?rIf8ONW z{bH9e3#pQjZA`^VtW-s-WgjrCv^muXf64+S*QdRAcVwz1S!anw#aV-PjG2Z6%l2@8z& z-N6QLh2!h3^hCDs&xkd)$#e|?U#p+pJPUS!TaSl56^I=}2MH}v@|Z$pl{_=e##^$x zbJVsT2NL#{`CaE|M^!O7IYda*`^7Q0=;3Yc?+`nls>L|YmFW;-dT;GTV7OBkN!nX1 z_b*TyI{0nZUTs|L^(cr@4V2mZ&f}pWgL@3!o{C_-kP9*lJT(}vBatG6&+B`gdV&4p zq5Q~vo0v;E=v6o#{@Tq+v|iDs;K0_i)K9-;Bx7#SG-L)h^m?N&qp5Q8dAYOLXIUOQ zS)zsCeGHnKH#68<>zP!3fBiIT1R=}Tl^;ynTYwMJ&wyD@TXz9JOGM~6)-2XF1NXh$ Uu2V`sKX9^p`hVT9000000AZhZWdHyG literal 0 HcmV?d00001 diff --git a/lesson_18/webserver/public/index-with-form.html b/lesson_18/webserver/public/index-with-form.html new file mode 100644 index 00000000..e83270db --- /dev/null +++ b/lesson_18/webserver/public/index-with-form.html @@ -0,0 +1,29 @@ + + + + Web server demo + + + + +
+ + + +
+ + +
+ +
+
+ + +
+

© 2024 Web server demo

+
+ \ No newline at end of file diff --git a/lesson_18/webserver/public/index.html b/lesson_18/webserver/public/index.html new file mode 100644 index 00000000..f16e7f86 --- /dev/null +++ b/lesson_18/webserver/public/index.html @@ -0,0 +1,27 @@ + + + + Web server demo + + + + +
+ + +
+ + +
+
+
+ + +
+

© 2024 Web server demo

+
+ \ No newline at end of file diff --git a/lesson_18/webserver/public/logo.gif b/lesson_18/webserver/public/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..9309d40e36378088ebdd1dbb191a1afef9bf6a91 GIT binary patch literal 304480 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 #fn8JA+us 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

-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 literal 0 HcmV?d00001 diff --git a/lesson_18/webserver/public/script.js b/lesson_18/webserver/public/script.js new file mode 100644 index 00000000..d888b6af --- /dev/null +++ b/lesson_18/webserver/public/script.js @@ -0,0 +1,85 @@ +(() => { + document.addEventListener("DOMContentLoaded", function () { + printWelcomeMessage(); + listenForSearchButtonClick(); + }); + + /** + * Print a welcome message to the console. + */ + function printWelcomeMessage() { + console.info("πŸŽ‰πŸ”₯πŸŽ‰πŸ”₯πŸŽ‰πŸ”₯πŸŽ‰πŸ”₯πŸŽ‰πŸ”₯πŸŽ‰πŸ”₯πŸŽ‰πŸ”₯πŸŽ‰πŸ”₯πŸŽ‰πŸ”₯πŸŽ‰πŸ”₯πŸŽ‰πŸ”₯πŸŽ‰πŸ”₯πŸŽ‰πŸ”₯"); + console.info("πŸ”₯ Welcome to the Code Differently course! πŸŽ‰"); + console.info("πŸŽ‰πŸ”₯πŸŽ‰πŸ”₯πŸŽ‰πŸ”₯πŸŽ‰πŸ”₯πŸŽ‰πŸ”₯πŸŽ‰πŸ”₯πŸŽ‰πŸ”₯πŸŽ‰πŸ”₯πŸŽ‰πŸ”₯πŸŽ‰πŸ”₯πŸŽ‰πŸ”₯πŸŽ‰πŸ”₯πŸŽ‰πŸ”₯"); + } + + /** + * Adds an event listener to the search button to listen for a click event. + */ + function listenForSearchButtonClick() { + document + .querySelector(".search-button") + .addEventListener("click", (event) => onSearchButtonClick(event)); + } + + /** + * Handles the search button click event. + * + * @param {Event} event + */ + function onSearchButtonClick(event) { + // If this button is inside a form, prevent the form from submitting. + event.preventDefault(); + + // Get the search text from the input field and perform the search. + const searchText = document.querySelector(".search-text").value; + performSearch(searchText); + } + + /** + * Perform a search for items containing the search text. + * + * @param {string} searchText + */ + async function performSearch(searchText) { + console.log("Client: Searching for titles containing: ", searchText); + try { + const response = await fetch(`http://localhost:5000/items`); + const data = await response.json(); + const foundItems = data.items.filter((i) => + i.title.toLowerCase().includes(searchText.toLowerCase()) + ); + showResults(foundItems); + } catch (error) { + console.error(error); + } + } + + /** + * Shows the results on the page. + * + * @param {Array} results + */ + function showResults(results) { + // Get the results element from the DOM and clear it. + const resultsEl = document.querySelector(".results"); + resultsEl.innerHTML = ""; + + // Create a heading + const headingEl = document.createElement("h2"); + resultsEl.appendChild(headingEl); + headingEl.textContent = "Search Results on the Client:"; + + // Create an unordered list (UL) element and add it to the results element. + const ulListEl = document.createElement("ul"); + ulListEl.classList.add("results-list"); + resultsEl.appendChild(ulListEl); + + // Populate the list with the search results using the list item (ul) tag. + results.forEach((item) => { + const listItemEl = document.createElement("li"); + listItemEl.textContent = item.title; + ulListEl.appendChild(listItemEl); + }); + } +})(); diff --git a/lesson_18/webserver/public/style.css b/lesson_18/webserver/public/style.css new file mode 100644 index 00000000..89ac2183 --- /dev/null +++ b/lesson_18/webserver/public/style.css @@ -0,0 +1,52 @@ +body, html { + width: 100%; + height: 100%; + margin: 0; + padding: 0; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + font-family: Arial, sans-serif; +} + +.container { + text-align: center; +} + +.logo img { + max-width: 300px; + margin-bottom: 20px; +} + +.search-box input { + width: 60vw; + padding: 10px 20px; + margin-bottom: 20px; + max-width: 580px; + font-size: 18px; + border: 1px solid #ddd; + border-radius: 24px; + outline: none; +} + +.buttons button { + padding: 10px 20px; + margin: 0 10px; + font-size: 14px; + border: none; + background-color: #f2f2f2; + color: #5F6368; + border-radius: 4px; + cursor: pointer; +} + +.buttons button:hover { + box-shadow: 0 1px 2px rgba(0,0,0,0.24), 0 1px 5px rgba(0,0,0,0.12); +} + +footer { + margin-top: 20px; + font-size: 12px; + color: #5F6368; +} \ No newline at end of file diff --git a/lesson_18/webserver/src/server.ts b/lesson_18/webserver/src/server.ts new file mode 100644 index 00000000..61364c1f --- /dev/null +++ b/lesson_18/webserver/src/server.ts @@ -0,0 +1,34 @@ +import express, { Express, Request, Response } from 'express'; + +const app: Express = express(); + +app.use(express.static('public')); +app.use(express.urlencoded({ extended: true })); + +app.post('/search', async (req: Request, res: Response) => { + const searchText = req.body.searchText as string; + + console.log("Server: Search for titles containing:", searchText || ""); + + // Invoke the items API to get the list of items and filter matching titles. + const apiResponse = await fetch(`http://localhost:5000/items`); + const apiData = await apiResponse.json(); + const filteredData = apiData.items + .filter((item: any) => item.title.toLowerCase().includes(searchText.toLowerCase())); + + // Dynamically build our response HTML character-by-character. + let responseText = '

Search Results

'; + responseText += '
    '; + for (const item of filteredData) { + responseText += `
  • ${item.title}
  • `; + } + responseText += '
'; + + // Send the response back to the client. + res.status(200).send(responseText); +}); + +const port = 4000; +app.listen(port, () => { + console.log(`Server is running on http://localhost:${port}`); +}); \ No newline at end of file diff --git a/lesson_18/webserver/tsconfig.json b/lesson_18/webserver/tsconfig.json new file mode 100644 index 00000000..33b87bb5 --- /dev/null +++ b/lesson_18/webserver/tsconfig.json @@ -0,0 +1,12 @@ +{ + "compilerOptions": { + "rootDir": "./src", + "outDir": "./dist", + "target": "es2016", + "module": "commonjs", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true + } +} \ No newline at end of file From 865760ddc80e96e24352de4e3dba2baa1e44b638 Mon Sep 17 00:00:00 2001 From: "Anthony D. Mays" Date: Tue, 9 Apr 2024 04:44:07 +0000 Subject: [PATCH 2/4] fix: script --- lesson_18/webserver/public/script.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lesson_18/webserver/public/script.js b/lesson_18/webserver/public/script.js index d888b6af..735428c7 100644 --- a/lesson_18/webserver/public/script.js +++ b/lesson_18/webserver/public/script.js @@ -1,7 +1,7 @@ (() => { document.addEventListener("DOMContentLoaded", function () { printWelcomeMessage(); - listenForSearchButtonClick(); + // listenForSearchButtonClick(); }); /** From 6a8865580e9846ad5e6f1bbe33858b7be947689b Mon Sep 17 00:00:00 2001 From: "Anthony D. Mays" Date: Tue, 9 Apr 2024 04:47:50 +0000 Subject: [PATCH 3/4] lint: fixed file format. --- .../lesson16/web/MediaItemsController.java | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/lesson_16/api/api_app/src/main/java/com/codedifferently/lesson16/web/MediaItemsController.java b/lesson_16/api/api_app/src/main/java/com/codedifferently/lesson16/web/MediaItemsController.java index 43cb1ac0..d4bfb7bf 100644 --- a/lesson_16/api/api_app/src/main/java/com/codedifferently/lesson16/web/MediaItemsController.java +++ b/lesson_16/api/api_app/src/main/java/com/codedifferently/lesson16/web/MediaItemsController.java @@ -1,18 +1,16 @@ package com.codedifferently.lesson16.web; +import com.codedifferently.lesson16.library.Librarian; +import com.codedifferently.lesson16.library.Library; +import com.codedifferently.lesson16.library.MediaItem; +import com.codedifferently.lesson16.library.search.SearchCriteria; import java.io.IOException; import java.util.List; import java.util.Set; - import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; -import com.codedifferently.lesson16.library.Librarian; -import com.codedifferently.lesson16.library.Library; -import com.codedifferently.lesson16.library.MediaItem; -import com.codedifferently.lesson16.library.search.SearchCriteria; - @RestController @CrossOrigin public class MediaItemsController { From 7ca7eafee4eda55d283791a65e81788056999c3a Mon Sep 17 00:00:00 2001 From: "Anthony D. Mays" Date: Tue, 9 Apr 2024 04:50:59 +0000 Subject: [PATCH 4/4] docs: spelling and additional instructions --- lesson_18/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lesson_18/README.md b/lesson_18/README.md index 65cfaca4..480795e6 100644 --- a/lesson_18/README.md +++ b/lesson_18/README.md @@ -10,7 +10,8 @@ ## Homework * Go through the lecture resources to understand the basics of working with web clients and servers. Feel free to skip the HTML tutorial if you feel comfortable working with the basics already. -* Complete the [Exploring the Client and Servers](#exploring-the-client-and-servers) walthrough. +* Complete the [Exploring the Client and Servers](#exploring-the-client-and-servers) walkthrough. You will not need to submit a PR for this assignment. +* Continue working on [lesson_16](/lesson_16/) PR submission. ## Exploring the Client and Servers