From f2d851f4286b4c43a7ea754c2cf8095c6a969399 Mon Sep 17 00:00:00 2001 From: sis0k0 Date: Fri, 14 Nov 2025 08:52:25 +0200 Subject: [PATCH 1/3] Update instructions for local Atlas deployment --- docs/20-mongodb-atlas/1-what-is-mongodb.mdx | 26 ------- docs/20-mongodb-atlas/2-create-account.mdx | 63 ---------------- docs/20-mongodb-atlas/3-create-cluster.mdx | 67 ------------------ docs/20-mongodb-atlas/_category_.json | 8 --- docs/30-importing-data/1-intro.mdx | 4 -- .../2-get-connection-string.mdx | 29 -------- docs/30-importing-data/3-import-data.mdx | 35 --------- docs/30-importing-data/_category_.json | 8 --- docs/50-demo-app/2-start-app.mdx | 60 +++++++--------- docs/50-demo-app/3-configure.mdx | 29 ++++---- package-lock.json | 31 ++++++++ .../50-demo-app/2-start-app/7-visit-page.png | Bin 0 -> 65839 bytes 12 files changed, 70 insertions(+), 290 deletions(-) delete mode 100644 docs/20-mongodb-atlas/1-what-is-mongodb.mdx delete mode 100644 docs/20-mongodb-atlas/2-create-account.mdx delete mode 100644 docs/20-mongodb-atlas/3-create-cluster.mdx delete mode 100644 docs/20-mongodb-atlas/_category_.json delete mode 100644 docs/30-importing-data/1-intro.mdx delete mode 100644 docs/30-importing-data/2-get-connection-string.mdx delete mode 100644 docs/30-importing-data/3-import-data.mdx delete mode 100644 docs/30-importing-data/_category_.json create mode 100644 static/img/screenshots/50-demo-app/2-start-app/7-visit-page.png diff --git a/docs/20-mongodb-atlas/1-what-is-mongodb.mdx b/docs/20-mongodb-atlas/1-what-is-mongodb.mdx deleted file mode 100644 index 83858bd..0000000 --- a/docs/20-mongodb-atlas/1-what-is-mongodb.mdx +++ /dev/null @@ -1,26 +0,0 @@ -# πŸ“˜ What is MongoDB Atlas? - -MongoDB comes in many different flavors. The most common is the open-source version that you can download and install on your computer. However, there is also a cloud-based version of MongoDB that you can use. This cloud offering is called MongoDB Atlas. - -In this lab, you will learn how to create a MongoDB Atlas account and a cluster. You will also learn how to connect to your cluster from an application that runs in the cloud. - -## Why use MongoDB Atlas? - -There are many reasons why you might want to use MongoDB Atlas, but most of all, it's by far the easiest way to get started with MongoDB. - -On top of that, MongoDB Atlas offers a lot of features that you would otherwise have to set up yourself. For example, MongoDB Atlas offers: -* Atlas Search β€” a powerful search engine that allows you to search through your data. -* Atlas Data Federation - a way to query data that is stored in AWS S3 or Google Cloud Storage. -* Atlas Vector Search - a way to augment your data with AI/mostly. - -## Where is MongoDB Atlas deployed? - -You can choose the cloud provider and the region where your MongoDB Atlas cluster is deployed. MongoDB Atlas is available in all major cloud providers, including AWS, Azure, and Google Cloud. - -It is also available in many regions around the world. You can choose the region that is closest to you or the region that is closest to your users. - -You can also use MongoDB Atlas directly from your cloud provider of choice by installing it from the marketplace. This will simplify all the billing and management of your MongoDB Atlas cluster. - -## How much does MongoDB Atlas cost? - -MongoDB Atlas is free to use for learning and development. You can create a free cluster and use it for as long as you want. You can also create as many free clusters as you want. diff --git a/docs/20-mongodb-atlas/2-create-account.mdx b/docs/20-mongodb-atlas/2-create-account.mdx deleted file mode 100644 index dbd63cd..0000000 --- a/docs/20-mongodb-atlas/2-create-account.mdx +++ /dev/null @@ -1,63 +0,0 @@ -import Link from "@site/src/components/Link"; -import Screenshot from "@site/src/components/Screenshot"; - -# πŸ‘ Create Your Account - -To use MongoDB Atlas, start by creating an account. - -
- πŸ¦Έβ€β™€οΈ If you already have an Atlas account, you can use it by creating a new project - - First, log into MongoDB Atlas using your existing credentials. - - - - ## Create a new Atlas project - - Once you're in Atlas, open the dropdown on the left-top corner of the page and select **New Project**. - - - - Enter a name for your project and click **Next**. - - - - On the next page, you can leave the current user as the project owner, and click **Create Project**. - - Once the project is ready, continue the workshop **deploying a Database Cluster** -
- -## Sign up for MongoDB Atlas - -:::tip -Creating a MongoDB Atlas account is free and does not require a credit card. -::: - -:::caution -Some corporate email accounts have restrictions on their use with Atlas. Consider using your personal account instead. -::: - - -Go to the MongoDB website and create your account. You will be greeted by a form similar to the one below. - - - -:::info -If you are doing this lab at an event, you should use the same email address you used to register for the event. -::: - -Complete the form and click the "Create Your Atlas Account" button. - -### Verify your email address - -You will receive an email from MongoDB asking you to verify your email address. Click the link in the email to verify your email address. - - - -:::caution -If you haven't received the email within two minutes, check your spam folder. -::: - -### Finish the onboarding - -You will be redirected to the MongoDB Atlas onboarding wizard. Fill in the form and click "Finish" to continue. diff --git a/docs/20-mongodb-atlas/3-create-cluster.mdx b/docs/20-mongodb-atlas/3-create-cluster.mdx deleted file mode 100644 index 9bcce24..0000000 --- a/docs/20-mongodb-atlas/3-create-cluster.mdx +++ /dev/null @@ -1,67 +0,0 @@ -import Screenshot from "@site/src/components/Screenshot"; - -# πŸ‘ Deploy a Database Cluster - -Now that you have a MongoDB Atlas account, you can create your first cluster. A cluster is a group of at least three servers that store your data. Using a cluster ensures that your data is always available, even if one of the servers fails. - -You can create your first database cluster for free. It won't expire, and you will have a 500 MB storage limit. This is enough to get started with MongoDB Atlas. - -## Create a new cluster - -From the overview page, click on "+ Create." - - - -:::note -If you just created your account, you will automatically be redirected to the cluster creation page and can skip this step. -::: - -You will be redirected to the cluster creation page. Here you can choose the cloud provider and region where your data will be stored. You can also choose the type of cluster you want to create. For this tutorial, we will use the free tier. - -1. For the cluster tier, pick **M0**, which is the free tier. In the **Name** input box, put the name "DeveloperDay" (one word, no spaces). -1. Uncheck the *Automate security setup* box. You will set up security manually in the next steps. -1. Uncheck the *Preload sample dataset* box. You will import a dataset later in this tutorial. -1. Select your favorite cloud provider and the region closest to you. -1. Finally, click on "Create Deployment." - - - -Once you're done with the hardest part of the process (the captcha), you will be redirected to the security quickstart. - -## Security quickstart - -By default, your MongoDB Atlas deployment is completely locked down. You need to configure the network settings and create a user to access your database. - -While your deployment is being provisioned, you will see the security quickstart dialog. - -### Network access - -First, you need to **Allow Access from Anywhere**. You will see a field prepopulated with the IP address `0.0.0.0/0`. This means that you can connect to your database from any IP address, including the virtual environment you will use for this lab. Click **Add IP Address** to add it to the network allowlist. - -:::note -If you don't see a button to allow access from anywhere, you should close the dialog and go to the **Network Access** tab under the **Security** section in the left sidebar. Click on **Add IP Address**, add `0.0.0.0/0`, and click **Confirm**. -::: - -:::caution -It is dangerous to expose your database to the entire world. Never do this in a real production environment. -::: - -### Database user - -Next, you need to create a database user. Pick any username and password you want. They will be used when you want to connect to your database. Click "Create Database User" to create the user. - -Atlas might create the user automatically for you if you have just created your account. In this case, the username and password will match your Atlas account credentials. - -:::tip -Make sure to remember your username and password. You will need them later. - -For the sake of this workshop, it might be preferable to use a simple password that you'll remember over a more secure one. - -Don't use any special characters in your password. Even though MongoDB allows some special characters, they might not work well with the tools you'll use later in this workshop. -::: - -## That's all! - -You have a new database cluster, and you can now connect to it from your application. If everything goes well, you should see your newly created cluster in the database deployment screen. - - diff --git a/docs/20-mongodb-atlas/_category_.json b/docs/20-mongodb-atlas/_category_.json deleted file mode 100644 index cf64a5b..0000000 --- a/docs/20-mongodb-atlas/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "MongoDB Atlas", - "position": 20, - "link": { - "type": "generated-index", - "description": "Learn how to create a MongoDB Atlas account and deploy a free cluster." - } -} diff --git a/docs/30-importing-data/1-intro.mdx b/docs/30-importing-data/1-intro.mdx deleted file mode 100644 index b909cfb..0000000 --- a/docs/30-importing-data/1-intro.mdx +++ /dev/null @@ -1,4 +0,0 @@ -# πŸ“˜ Library Management System Dataset - -This dataset contains over 6,700 documents for books and approximately 6,250 associated authors. The data is structured using some of the most common data modeling techniques in MongoDB. Those techniques are covered in the "Data modeling hands-on session" delivered as part of Developer Days. - diff --git a/docs/30-importing-data/2-get-connection-string.mdx b/docs/30-importing-data/2-get-connection-string.mdx deleted file mode 100644 index 268c899..0000000 --- a/docs/30-importing-data/2-get-connection-string.mdx +++ /dev/null @@ -1,29 +0,0 @@ -import Screenshot from "@site/src/components/Screenshot"; - -# πŸ‘ Get Your Connection String - -To load the dataset into your cluster, you will need to get the connection string for your cluster. - -In the Atlas UI, navigate to the **Overview** page. In the **Clusters** section, click "Connect." - - - -A modal will display several ways to connect to your database. - - - -Select "Compass." While we won't be using Compass to import the data, it's an easy way to see your connection string. - - - -Look for your connection string. It should look something like this: - -``` -mongodb+srv://:@/ -``` - -Click the copy button next to your connection string to copy it to your clipboard. Paste the connection string somewhere safe. You will need this connection string several times throughout this training. - -:::tip -Don't forget to replace `` with the password you set when you created the cluster. -::: diff --git a/docs/30-importing-data/3-import-data.mdx b/docs/30-importing-data/3-import-data.mdx deleted file mode 100644 index 342365a..0000000 --- a/docs/30-importing-data/3-import-data.mdx +++ /dev/null @@ -1,35 +0,0 @@ -import Screenshot from "@site/src/components/Screenshot"; - -# πŸ‘ Importing the Library Data - -Now that you have your connection string, you can import the library data into your project. - -To do this, we've built an importer app that will copy the data from our database, into your cluster. You'll need to provide the importer app with your connection string. - -:::caution -You should never share your connection string with anyone. It contains your database credentials, and anyone with access to it can read and write data to your database. -::: - -To import the data, start by going to the [importer application](https://mdb.link/import-library-data). - -You will be greeted by this minimalistic interface. - - - -Paste your connection string into the input field, and click "Import Library Data." - -You should see a message saying that the import has started. - -``` -Starting data import -``` - -:::note -Importing the data might take a few minutes. It's a good time to stretch or get a coffee! β˜• -::: - -After a few minutes, you should see that the import job was successful. - - - -Once the data is copied to your cluster, you are ready to start building your application. diff --git a/docs/30-importing-data/_category_.json b/docs/30-importing-data/_category_.json deleted file mode 100644 index 093137f..0000000 --- a/docs/30-importing-data/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "Importing Data", - "position": 30, - "link": { - "type": "generated-index", - "description": "This sections shows you how to import the data required for the subsequent labs." - } -} \ No newline at end of file diff --git a/docs/50-demo-app/2-start-app.mdx b/docs/50-demo-app/2-start-app.mdx index e9e7522..107afe7 100644 --- a/docs/50-demo-app/2-start-app.mdx +++ b/docs/50-demo-app/2-start-app.mdx @@ -6,11 +6,25 @@ import TabItem from '@theme/TabItem'; You have two options to start the application. -## Option 1: Run in a codespace +## Option 1: Run in Instruqt -By far, the easiest way to start the application is to run it in a codespace. A codespace is a cloud-hosted, containerized development environment that you can connect to from Visual Studio Code. It comes pre-configured with all the tools you need to build and run the application. +Instruqt is a lab platform that provides cloud-based sandboxes which come pre-configured with all the tools you need to run this lab. -In the case of this application, you can even use the online IDE to edit the code and see the changes reflected in the running application. +Navigate to the Instruqt lab using [this link](https://mdb.link/instruqt-library). + +Fill out the form that appears and click **Submit and access**. + +Click **Start** to launch the lab environment. + +You should see a screen with a purple progress bar indicating that Instruqt is preparing a sandbox with all the required libraries for this lab and a MongoDB database. + +Once this is done, you should see a **Start** button at the bottom right of the screen. Click this to enter the lab. + +## Option 2: Run in a codespace + +If Instruqt is not working for you, you can also use GitHub Codespaces. A GitHub Codespace is a cloud-hosted, containerized development environment that you can connect to from Visual Studio Code. It comes pre-configured with all the tools you need to build and run the application. + +Similar to Instruqt, you can even use Codespaces as an online IDE to edit the code and see the changes reflected in the running application. @@ -21,43 +35,21 @@ To start the application in a codespace, click "Code." Then, look for the *Codes -Let it run for a few seconds as it prepares your environment. It will clone the repository, prepare the containers, and run the installation scripts. Once it's ready, you'll see an IDE, with a preview window that shows the running application. +Let it run for a few minutes as it prepares your environment. It will clone the repository, prepare the containers, and run the installation scripts. Once it's ready, you'll see an IDE, with a preview window that shows the running application. :::note Again, this might take a few minutes. It's a great time to grab a coffee. β˜•οΈ ::: - - -:::warning -Right now, you should see a big error message in the console, as we haven't configured the app yet. Don't worry, you'll get it up and running in a few minutes. - -``` - ####### ###### ###### ####### ###### - # # # # # # # # # - # # # # # # # # # - ##### ###### ###### # # ###### - # # # # # # # # # - # # # # # # # # # - ####### # # # # ####### # # -``` -::: - -### Expose the server port +### Access the library website -To get the application working in that environment, there is one small change you need to make to the codespace. You need to expose the port where the server is running. +Once the environment loads, you may see the following warning: -Look for the *Ports* tab at the bottom of the IDE. + - +You're seeing this warning because the development server is running on a publicly forwarded port, and GitHub shows a security notice anytime someone accesses a public port. Even in your own codespace, GitHub displays it just to confirm you intended to open that external-facing URL. -Once you click on the tab, you'll see a list of ports. Right-click on the port `Server (5000)` row. Then, select "Port Visibility" and "Public." - - - -You'll see the text in the *Visibility* column change to `Public`. - -That's it! You're now ready to move to the next section. +Click "Continue" to load the library application website. Once it loads, you're ready to move on to the next step. @@ -119,13 +111,13 @@ That's it! You're now ready to move to the next section. -## 🦸 Option 2: Run locally +## 🦸 Option 3: Run locally -If you prefer to run the application locally, you can do so by following these steps. Keep in mind that the following steps of this lab will be using the codespace, so you might need to adapt some of the commands. +If you prefer to run the application locally, you can do so by following these steps. Keep in mind that the following steps of this lab will be using Instruqt or the GitHub codespace, so you might need to adapt some of the commands. :::info -During the lab, we will use GitHub Codespaces. These instructions are here just in case you can't use Codespaces or you _really, really, really_ want a local installation. +During the lab, we will use Instruqt or GitHub Codespaces. These instructions are here just in case you can't use Codespaces or you _really, really, really_ want a local installation. ::: diff --git a/docs/50-demo-app/3-configure.mdx b/docs/50-demo-app/3-configure.mdx index 9d85971..a729099 100644 --- a/docs/50-demo-app/3-configure.mdx +++ b/docs/50-demo-app/3-configure.mdx @@ -7,35 +7,32 @@ import TabItem from '@theme/TabItem'; -Now that your environment is set up, you can configure the application. +Now that your environment is set up, you can explore it. + +### Local MongoDB instance + There should already be a file open in the IDE. If not, look in the file explorer on the left, and open the file below. This file contains the configuration for the application. File: `server/.env` ``` -PORT=5000 -DATABASE_URI="mongodb+srv://user:password@serverurl" -DATABASE_NAME="library" -SECRET="secret" +PORT=5400 +DATABASE_URI=mongodb://localhost:27017 +DATABASE_NAME=library +SECRET=secret ``` +The `DATABASE_URI` parameter is already set to `mongodb://localhost:27017`, which connects to a local MongoDB Atlas deployment running inside the Codespace sandbox. -You'll need to change the `DATABASE_URI` parameter to match your connection string. That's the same one you used to import the data. - -:::tip -Don't remember how to get your connection string? Check out the [Import Data](/docs/importing-data/import-data) section. -::: - -Copy and paste your connection string into the `DATABASE_URI` parameter. +To explore the database and the imported dataset, click the leaf icon in the left sidebar to open the MongoDB extension. You’ll see a preset connection called **"Library DB"**. Expand it and browse the collections in the **library** database. -The file will automatically save, and the server will restart. - - -In the *Terminal* tab at the bottom, look for the `Server is running on port: 5000` line. If you see it, you're good to go! +In the *Terminal* tab at the bottom, look for the line `Server is running on port: 5400`. If it appears, the Node.js API for the library application is up and ready to serve requests. +You’ve already seen the client-side website for the library, running in the preview tab. Feel free to click around and explore the different pages. + diff --git a/package-lock.json b/package-lock.json index 07885a8..5c84ce0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -178,6 +178,7 @@ "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.35.0.tgz", "integrity": "sha512-FfmdHTrXhIduWyyuko1YTcGLuicVbhUyRjO3HbXE4aP655yKZgdTIfMhZ/V5VY9bHuxv/fGEh3Od1Lvv2ODNTg==", "license": "MIT", + "peer": true, "dependencies": { "@algolia/client-common": "5.35.0", "@algolia/requester-browser-xhr": "5.35.0", @@ -338,6 +339,7 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.0.tgz", "integrity": "sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==", "license": "MIT", + "peer": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.27.1", @@ -2172,6 +2174,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=18" }, @@ -2194,6 +2197,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=18" } @@ -2274,6 +2278,7 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "license": "MIT", + "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -2637,6 +2642,7 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "license": "MIT", + "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -3316,6 +3322,7 @@ "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.8.1.tgz", "integrity": "sha512-ENB01IyQSqI2FLtOzqSI3qxG2B/jP4gQPahl2C3XReiLebcVh5B5cB9KYFvdoOqOWPyr5gXK4sjgTKv7peXCrA==", "license": "MIT", + "peer": true, "dependencies": { "@docusaurus/babel": "3.8.1", "@docusaurus/bundler": "3.8.1", @@ -3392,6 +3399,7 @@ "resolved": "https://registry.npmjs.org/@docusaurus/faster/-/faster-3.8.1.tgz", "integrity": "sha512-XYrj3qnTm+o2d5ih5drCq9s63GJoM8vZ26WbLG5FZhURsNxTSXgHJcx11Qo7nWPUStCQkuqk1HvItzscCUnd4A==", "license": "MIT", + "peer": true, "dependencies": { "@docusaurus/types": "3.8.1", "@rspack/core": "^1.3.15", @@ -3520,6 +3528,7 @@ "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.8.1.tgz", "integrity": "sha512-oByRkSZzeGNQByCMaX+kif5Nl2vmtj2IHQI2fWjCfCootsdKZDPFLonhIp5s3IGJO7PLUfe0POyw0Xh/RrGXJA==", "license": "MIT", + "peer": true, "dependencies": { "@docusaurus/core": "3.8.1", "@docusaurus/logger": "3.8.1", @@ -4193,6 +4202,7 @@ "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.0.tgz", "integrity": "sha512-QjHtSaoameoalGnKDT3FoIl4+9RwyTmo9ZJGBdLOks/YOiWHoRDI3PUwEzOE7kEmGcV3AFcp9K6dYu9rEuKLAQ==", "license": "MIT", + "peer": true, "dependencies": { "@types/mdx": "^2.0.0" }, @@ -4749,6 +4759,7 @@ "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.21.3", "@svgr/babel-preset": "8.1.0", @@ -4853,6 +4864,7 @@ "integrity": "sha512-ZaDETVWnm6FE0fc+c2UE8MHYVS3Fe91o5vkmGfgwGXFbxYvAjKSqxM/j4cRc9T7VZNSJjriXq58XkfCp3Y6f+w==", "hasInstallScript": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "@swc/counter": "^0.1.3", "@swc/types": "^0.1.23" @@ -5804,6 +5816,7 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.9.tgz", "integrity": "sha512-WmdoynAX8Stew/36uTSVMcLJJ1KRh6L3IZRx1PZ7qJtBqT3dYTgyDTx8H1qoRghErydW7xw9mSJ3wS//tCRpFA==", "license": "MIT", + "peer": true, "dependencies": { "csstype": "^3.0.2" } @@ -6149,6 +6162,7 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -6216,6 +6230,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -6261,6 +6276,7 @@ "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.35.0.tgz", "integrity": "sha512-Y+moNhsqgLmvJdgTsO4GZNgsaDWv8AOGAaPeIeHKlDn/XunoAqYbA+XNpBd1dW8GOXAUDyxC9Rxc7AV4kpFcIg==", "license": "MIT", + "peer": true, "dependencies": { "@algolia/abtesting": "1.1.0", "@algolia/client-abtesting": "5.35.0", @@ -6752,6 +6768,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "caniuse-lite": "^1.0.30001726", "electron-to-chromium": "^1.5.173", @@ -7035,6 +7052,7 @@ "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-11.0.3.tgz", "integrity": "sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@chevrotain/cst-dts-gen": "11.0.3", "@chevrotain/gast": "11.0.3", @@ -7760,6 +7778,7 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "license": "MIT", + "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -8085,6 +8104,7 @@ "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.33.0.tgz", "integrity": "sha512-2d2EwwhaxLWC8ahkH1PpQwCyu6EY3xDRdcEJXrLTb4fOUtVc+YWQalHU67rFS1a6ngj1fgv9dQLtJxP/KAFZEw==", "license": "MIT", + "peer": true, "engines": { "node": ">=0.10" } @@ -8494,6 +8514,7 @@ "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", "license": "ISC", + "peer": true, "engines": { "node": ">=12" } @@ -9809,6 +9830,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -15237,6 +15259,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -15811,6 +15834,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -16714,6 +16738,7 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "license": "MIT", + "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -17545,6 +17570,7 @@ "resolved": "https://registry.npmjs.org/react/-/react-19.1.1.tgz", "integrity": "sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==", "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -17554,6 +17580,7 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.1.tgz", "integrity": "sha512-Dlq/5LAZgF0Gaz6yiqZCf6VCcZs1ghAJyrsu84Q/GT0gV+mCxbfmKNoGRKBYMJ8IEdGPqu49YWXD02GCknEDkw==", "license": "MIT", + "peer": true, "dependencies": { "scheduler": "^0.26.0" }, @@ -17609,6 +17636,7 @@ "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz", "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==", "license": "MIT", + "peer": true, "dependencies": { "@types/react": "*" }, @@ -17637,6 +17665,7 @@ "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.12.13", "history": "^4.9.0", @@ -19946,6 +19975,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -20193,6 +20223,7 @@ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.101.0.tgz", "integrity": "sha512-B4t+nJqytPeuZlHuIKTbalhljIFXeNRqrUGAQgTGlfOl2lXXKXw+yZu6bicycP+PUlM44CxBjCFD6aciKFT3LQ==", "license": "MIT", + "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.8", diff --git a/static/img/screenshots/50-demo-app/2-start-app/7-visit-page.png b/static/img/screenshots/50-demo-app/2-start-app/7-visit-page.png new file mode 100644 index 0000000000000000000000000000000000000000..d30765fb0f3fbdb8666ad74ca7c7fba7974a5621 GIT binary patch literal 65839 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 W1uv=~8sQ80OHo!$rcT-{^#1|O Date: Mon, 17 Nov 2025 09:41:23 +0100 Subject: [PATCH 2/3] Consolidate Java/JS sections --- docs/10-intro.mdx | 7 ++- docs/50-demo-app/2-start-app.mdx | 59 +++++++----------- docs/50-demo-app/3-configure.mdx | 60 ------------------- docs/50-demo-app/3-explore.mdx | 15 +++++ .../60-schema-validation/2-validate-users.mdx | 16 +---- docs/70-indexing/1-create-compound-index.mdx | 9 +-- 6 files changed, 44 insertions(+), 122 deletions(-) delete mode 100644 docs/50-demo-app/3-configure.mdx create mode 100644 docs/50-demo-app/3-explore.mdx diff --git a/docs/10-intro.mdx b/docs/10-intro.mdx index d6664a8..c803969 100644 --- a/docs/10-intro.mdx +++ b/docs/10-intro.mdx @@ -22,8 +22,11 @@ In the navigation bar, you will notice some icons. Here are their meanings: ## Requirements * Google Chrome installed -* GitHub account -* Ensure your laptop can access GitHub and GitHub Codespaces (sometimes corporate VPNs block these sites!) +* For GitHub Codespaces + * GitHub account + * Ensure your laptop can access GitHub and GitHub Codespaces (sometimes corporate VPNs block these sites!) +* Alternatively, for Instruqt + * Ensure your laptop can access the [Instruqt lab environment](https://mdb.link/instruqt-library). ## Hardware requirements diff --git a/docs/50-demo-app/2-start-app.mdx b/docs/50-demo-app/2-start-app.mdx index 107afe7..2f0bebf 100644 --- a/docs/50-demo-app/2-start-app.mdx +++ b/docs/50-demo-app/2-start-app.mdx @@ -41,16 +41,11 @@ Let it run for a few minutes as it prepares your environment. It will clone the Again, this might take a few minutes. It's a great time to grab a coffee. β˜•οΈ ::: -### Access the library website - -Once the environment loads, you may see the following warning: - - - -You're seeing this warning because the development server is running on a publicly forwarded port, and GitHub shows a security notice anytime someone accesses a public port. Even in your own codespace, GitHub displays it just to confirm you intended to open that external-facing URL. +Once the command finishes, the application will be running on port 5400. -Click "Continue" to load the library application website. Once it loads, you're ready to move on to the next step. +In the *Terminal* tab at the bottom, look for the line `Server is running on port: 5400`. If it appears, the Node.js API for the library application is up and ready to serve requests. + @@ -69,47 +64,33 @@ Let it run for a few seconds as it prepares your environment. It will clone the Again, this might take a few minutes. It's a great time to grab a coffee. β˜•οΈ ::: - +Once the command finishes, the application will be up and running on port 5400. -:::warning -Right now, you should see an error message in the console, as we haven't configured the app yet. Don't worry, you'll get it up and running in a few minutes. -::: - -### Set the MongoDB connection -To run the application in GitHub Codespaces, you now need to set the MongoDB connection string before starting the server. -In the terminal of your Codespace, run: -``` -export MONGODB_URI="" -``` -After setting the environment variable, start the application again with: -``` -mvn spring-boot:run -``` + - -Once the command finishes, the application will be up and running on port 5000. + + - +### Access the library website -### Expose the server port +Once the environment loads, you may see the following warning: -To get the application working in that environment, there is one small change you need to make to the codespace. You need to expose the port where the server is running. + -Look for the *Ports* tab at the bottom of the IDE. +You're seeing this warning because the development server is running on a publicly forwarded port, and GitHub shows a security notice anytime someone accesses a public port. Even in your own codespace, GitHub displays it just to confirm you intended to open that external-facing URL. - +Click "Continue" to load the library application website. -Once you click on the tab, you'll see a list of ports. Right-click on the port `Server (5000)` row. Then, select "Port Visibility" and "Public." + - +You should see the application with some books listed now. -You'll see the text in the *Visibility* column change to `Public`. +### Open the client in a new window -That's it! You're now ready to move to the next section. +If you accidentally close the Client or want to open it in a separate tab/window go to the Ports tab, hover over Client and a world icon should appear. Click it and the client will open in a new tab. + - - ## 🦸 Option 3: Run locally @@ -163,10 +144,10 @@ npm start 1. Before starting the backend, switch to the java-server project. -``` + ``` git checkout java-server -``` -This command moves you into the correct project folder that contains the Java backend code. + ``` + This command moves you into the correct project folder that contains the Java backend code. 2. Set the MongoDB connection string as an environment variable: - On Linux / macOS: diff --git a/docs/50-demo-app/3-configure.mdx b/docs/50-demo-app/3-configure.mdx deleted file mode 100644 index a729099..0000000 --- a/docs/50-demo-app/3-configure.mdx +++ /dev/null @@ -1,60 +0,0 @@ -import Screenshot from "@site/src/components/Screenshot"; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - -# πŸ‘ Configure the Application - - - - -Now that your environment is set up, you can explore it. - -### Local MongoDB instance - -There should already be a file open in the IDE. If not, look in the file explorer on the left, and open the file below. This file contains the configuration for the application. - -File: `server/.env` - -``` -PORT=5400 -DATABASE_URI=mongodb://localhost:27017 -DATABASE_NAME=library -SECRET=secret -``` - -The `DATABASE_URI` parameter is already set to `mongodb://localhost:27017`, which connects to a local MongoDB Atlas deployment running inside the Codespace sandbox. - -To explore the database and the imported dataset, click the leaf icon in the left sidebar to open the MongoDB extension. You’ll see a preset connection called **"Library DB"**. Expand it and browse the collections in the **library** database. - - -In the *Terminal* tab at the bottom, look for the line `Server is running on port: 5400`. If it appears, the Node.js API for the library application is up and ready to serve requests. - - - -You’ve already seen the client-side website for the library, running in the preview tab. Feel free to click around and explore the different pages. - - - - -Verify that your server application is running and the server port is set to "Public". - - - - - - -## Reload the client - -Now that the server is running, you can reload the client to see the application. - -In the upper right panel, click the refresh icon to reload the client. - - - -Clicking this will reload the client, which should now be connected to the database. You should see the application with some books listed now. - -## Open the client in a new window - -If you accidentally close the Client or want to open it in a separate tab/window go to the Ports tab, hover over Client and a world icon should appear. Click it and the client will open in a new tab. - - diff --git a/docs/50-demo-app/3-explore.mdx b/docs/50-demo-app/3-explore.mdx new file mode 100644 index 0000000..512b384 --- /dev/null +++ b/docs/50-demo-app/3-explore.mdx @@ -0,0 +1,15 @@ +import Screenshot from "@site/src/components/Screenshot"; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# πŸ‘ Explore the Dataset + +Now that your environment is set up, you can explore it. + +## Local MongoDB instance + +The database you'll be using in this exercise is a local MongoDB Atlas deployment running inside the codespace's sandbox. + +To explore the database and the imported dataset, click the leaf icon on the left sidebar to open the MongoDB extension. You’ll see a preset connection called **"Library DB"**. Expand it and browse the collections in the **library** database. + +You can open the pre-loaded documents in the collections. For example, expand the `books` collection and open a document of your choice. This will open a JSON preview of the document in the editor. You can even edit the document in the editor - saving the file will update the document in the database. diff --git a/docs/60-schema-validation/2-validate-users.mdx b/docs/60-schema-validation/2-validate-users.mdx index 0a50886..935b9bb 100644 --- a/docs/60-schema-validation/2-validate-users.mdx +++ b/docs/60-schema-validation/2-validate-users.mdx @@ -6,26 +6,12 @@ import TabItem from '@theme/TabItem'; In this exercise, you will explore the pre-written JSON validation schema for the `users` collection, run a script to apply it to the collection, and test the schema validation by inserting a document that does not match the schema. -## Database user permissions - -To update the validator for any database collection, your database user must have admin privileges. Follow these steps to ensure your user has the correct permissions: - -1. Open the [Atlas UI](https://cloud.mongodb.com?utm_campaign=devrel&utm_source=workshop&utm_medium=cta&utm_content=developer.day&utm_term=project.phoenix). -2. In the left-hand menu, navigate to **Network Settings** and select "Database Access." -3. Locate your database user in the list. Check the **MongoDB Roles** column for the role of the user you are using for this workshop. If the role is not **atlasAdmin@admin**, you will need to update it. -4. If the role is not **atlasAdmin@admin**, click "Edit" button next to the user. -5. Scroll down to the **Database User Privileges** section and expand the **Built-in Role** dropdown. -6. Select "Atlas admin" from the dropdown menu. -7. Click "Update User" to save the changes. - -Atlas will deploy the change in a few seconds. - ## Explore the JSON schema -The JSON schema for the `users` collection is stored in the `server/src/schema-validation/apply-schema.ts` [file](https://github.com/mongodb-developer/library-management-system/blob/main/server/src/schema-validation/apply-schema.ts). Open the file in your GitHub codespace and examine the schema. +The JSON schema for the `users` collection is stored in the `server/src/schema-validation/apply-schema.ts` [file](https://github.com/mongodb-developer/library-management-system/blob/main/server/src/schema-validation/apply-schema.ts). Open the file and examine the schema. diff --git a/docs/70-indexing/1-create-compound-index.mdx b/docs/70-indexing/1-create-compound-index.mdx index 749ce34..f311e9c 100644 --- a/docs/70-indexing/1-create-compound-index.mdx +++ b/docs/70-indexing/1-create-compound-index.mdx @@ -139,12 +139,9 @@ As soon as the application starts, you will see log entries showing the creation ## Verify that the index is created -1. Open the **VS Code extension** (leaf icon) from the sidebar on the left. -1. Click **Add Connection**. -1. In the welcome screen, click **Connect** under the **Connect with Connection String** section. -1. Enter the MongoDB connection string from your Atlas cluster, making sure to replace the **password placeholder**. -1. Press **Enter**. -1. In the sidebar, you should now see your database. Expand the **library** database, then the **issueDetails** collection, and finally select **Indexes**. +1. Open the **MongoDB extension** (leaf icon) from the sidebar on the left. +1. Click on **Library DB** to connect to the local MongoDB Atlas deployment. +1. Expand the **library** database, then the **issueDetails** collection, and finally select **Indexes**. From 99b679c7c261a0fd7911031e841e49b47f7a4287 Mon Sep 17 00:00:00 2001 From: Diego Freniche Date: Wed, 26 Nov 2025 09:48:32 +0100 Subject: [PATCH 3/3] Removed outdated message about permissions: now that we are running the lab inside Instruqt / JEDEE this does not make sense anymore --- docs/60-schema-validation/2-validate-users.mdx | 5 ----- 1 file changed, 5 deletions(-) diff --git a/docs/60-schema-validation/2-validate-users.mdx b/docs/60-schema-validation/2-validate-users.mdx index 935b9bb..0240914 100644 --- a/docs/60-schema-validation/2-validate-users.mdx +++ b/docs/60-schema-validation/2-validate-users.mdx @@ -162,11 +162,6 @@ When the application starts, you should see a message confirming that the valida - -:::caution -If you see an error related to your user permissions, go back to the [Database User Permissions](#database-user-permissions) section and update your user permissions. -::: - ## Test the schema validation