From a4c4c11a45593f99a083cc5d0cbaf4fe0894c105 Mon Sep 17 00:00:00 2001 From: Stephanie Aurelio Date: Fri, 18 Apr 2025 16:02:18 -0700 Subject: [PATCH 01/14] part one tutorial --- source/fundamentals/crud.txt | 2 + .../crud/restful-api-tutorial.txt | 181 ++++++++++++++++++ .../MongoDBServiceSetup.cs | 23 +++ .../MongoDBSettingsSetup.cs | 9 + .../restful-api-tutorial/PlaylistSetup.cs | 19 ++ 5 files changed, 234 insertions(+) create mode 100644 source/fundamentals/crud/restful-api-tutorial.txt create mode 100644 source/includes/fundamentals/code-examples/restful-api-tutorial/MongoDBServiceSetup.cs create mode 100644 source/includes/fundamentals/code-examples/restful-api-tutorial/MongoDBSettingsSetup.cs create mode 100644 source/includes/fundamentals/code-examples/restful-api-tutorial/PlaylistSetup.cs diff --git a/source/fundamentals/crud.txt b/source/fundamentals/crud.txt index 9e3275dc..4c2abd9c 100644 --- a/source/fundamentals/crud.txt +++ b/source/fundamentals/crud.txt @@ -12,6 +12,8 @@ CRUD Operations Write Read + Create a RESTful API with the .NET/C# Driver - :ref:`csharp-crud-read-operations` - :ref:`csharp-crud-write-operations` +- :ref:`csharp-crud-restful-api-tutorial` \ No newline at end of file diff --git a/source/fundamentals/crud/restful-api-tutorial.txt b/source/fundamentals/crud/restful-api-tutorial.txt new file mode 100644 index 00000000..a6e4565d --- /dev/null +++ b/source/fundamentals/crud/restful-api-tutorial.txt @@ -0,0 +1,181 @@ +.. _csharp-crud-restful-api-tutorial: + +============================================ +Create a RESTful API with the .NET/C# Driver +============================================ + +.. facet:: + :name: genre + :values: reference + +.. meta:: + :keywords: crud, code example, tutorial + :description: Learn how to use the .NET/C# Driver to create a RESTful API for your application. + +.. contents:: On this page + :local: + :backlinks: none + :depth: 2 + :class: singlecol + +Overview +-------- + +In this tutorial, you will learn how to create a RESTful API with endpoints that +perform basic create, read, update, and delete (CRUD) operations across MongoDB +Atlas. + +Prequisites +----------- + +To complete this tutorial, you must have the following: + +- An `Atlas account + `__ with a + deployed and configured MongoDB Atlas cluster that is M0 or higher. + +- .NET 6.0 or higher `installed `__ on your machine. + +To learn how to get started with MongoDB Atlas and how to load sample data, see the +:atlas:`Get Started with Atlas Guide `. + +This tutorial uses .NET Core 8.0, but you can use any version later than .NET 6.0. + +Set Up Your Project +------------------- + +You can create a new .NET Core project using the web application template that +Microsoft offers. To do this, run the following commands in your terminal: + +.. code-block:: bash + + dotnet new webapi -o MongoExample + cd MongoExample + +To add the {+driver-short+} to your project as a dependency, run the following command: + +.. code-block:: bash + dotnet add package MongoDB.Driver + +The preceding commands create a new web application project for .NET core named +``MongoExample`` and install the latest {+driver-short+}. The template project +includes some boilerplate files. During this tutorial, you will add to these +files and remove some of the boilerplate code to create a RESTful API. + +Design a Document Model and Database Service +-------------------------------------------- + +In this section, you will create and configure your MongoDB service and define +the data model for your RESTful API. + +.. procedure:: Create a MongoDB Service + :style: connected + + .. step:: Create the MongoDBSettings class + + Your MongoDB service will be responisble for establishing a connection and + directly working with documents within MongoDB. In your project, create a + folder named ``Models``. In the ``Models`` folder, create a new file named + ``MongoDBSettings.cs``. In this file, add the following code: + + .. literalinclude:: /includes/fundamentals/code-examples/restful-api-tutorial/MongoDBSettingsSetup.cs + :language: csharp + :dedent: + + The precedeing code defines a class named ``MongoDBSettings`` that + contains information about your connection, the database name, and the + collection name. + + .. step:: Update the appsettings.json file + + The data that will be stored in the class fields defined in the + ``MongoDBSettings`` class is found in the projects' ``appsettings.json`` + file. Open this file and add the following: + + .. code-block:: json + :copyable: true + + { + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*", + "MongoDB": { + "ConnectionURI": "ATLAS_URI_HERE", + "DatabaseName": "sample_mflix", + "CollectionName": "playlist" + } + } + + Note the ``MongoDB`` field. This tutorial uses the ``sample_mflix`` + database and the ``playlist`` collection. Replace the ``ATLAS_URI_HERE`` + placeholder with your MongoDB Atlas connection string. For more + information on how to find your connection string, see the + :ref:`csharp-quickstart` guide. + + .. step:: Create the service + + In your project, create a folder named ``Services``. In the ``Services`` + folder, create a new file named ``MongoDBService.cs`` and add the + following code: + + .. literalinclude:: /includes/fundamentals/code-examples/restful-api-tutorial/MongoDBServiceSetup.cs + :language: csharp + :dedent: + + The preceding code defines a class named ``MongoDBService`` that includes + empty asynchronous functions. In this tutorial, you will add code to these + functions as you create your endpoints. The passed settings from the + ``appsettings.json`` file are set to veriables. + + .. step:: Connect the service to the application + + Open the ``Program.cs`` file and add the following code to the top of the file: + + .. code-block:: csharp + :copyable: true + + using MongoExample.Models; + using MongoExample.Services; + + var builder = WebApplication.CreateBuilder(args); + + builder.Services.Configure(builder.Configuration.GetSection("MongoDB")); + builder.Services.AddSingleton(); + + In the preceding code, the ``GetSection`` function pulls your settings + from the ``MongoDB`` field in the ``appsettings.json`` file. + + .. tip:: + + If your boilerplate code already has the ``builder`` variable, don't add it twice. + + .. step:: Create the document model + + Now that the service is set up, you can create a data model for your collection. + + In the ``Models`` folder, create a new file named ``Playlist.cs`` and add + the following code: + + .. literalinclude:: /includes/fundamentals/code-examples/restful-api-tutorial/PlaylistSetup.cs + :language: csharp + :dedent: + + In the preceding code, the ``Id`` field is represented as an ``ObjectId`` + in BSON and the ``_id`` fild within MongoDB. When you work with this + locally in your application, it is a string. + + The ``movieIds`` field will be known as ``items``. When sending or + receiving JSON, the field will also be known as ``items`` instead of + ``movieIds``. + + If you plan to have your local class field match the document field + directly, you don't need to define custom mappings. For example, the + ``username`` field in the preceding code has no custom mappings. It will + be ``username`` in C#, in JSON, and in MongoDB. + +You now have a MongoDB service and document model for your collection to work +with for .NET Core. \ No newline at end of file diff --git a/source/includes/fundamentals/code-examples/restful-api-tutorial/MongoDBServiceSetup.cs b/source/includes/fundamentals/code-examples/restful-api-tutorial/MongoDBServiceSetup.cs new file mode 100644 index 00000000..30a72d63 --- /dev/null +++ b/source/includes/fundamentals/code-examples/restful-api-tutorial/MongoDBServiceSetup.cs @@ -0,0 +1,23 @@ +using MongoExample.Models; +using Microsoft.Extensions.Options; +using MongoDB.Driver; +using MongoDB.Bson; + +namespace MongoExample.Services; + +public class MongoDBService { + + private readonly IMongoCollection _playlistCollection; + + public MongoDBService(IOptions mongoDBSettings) { + MongoClient client = new MongoClient(mongoDBSettings.Value.ConnectionURI); + IMongoDatabase database = client.GetDatabase(mongoDBSettings.Value.DatabaseName); + _playlistCollection = database.GetCollection(mongoDBSettings.Value.CollectionName); + } + + public async Task> GetAsync() { } + public async Task CreateAsync(Playlist playlist) { } + public async Task AddToPlaylistAsync(string id, string movieId) {} + public async Task DeleteAsync(string id) { } + +} \ No newline at end of file diff --git a/source/includes/fundamentals/code-examples/restful-api-tutorial/MongoDBSettingsSetup.cs b/source/includes/fundamentals/code-examples/restful-api-tutorial/MongoDBSettingsSetup.cs new file mode 100644 index 00000000..1da4cb05 --- /dev/null +++ b/source/includes/fundamentals/code-examples/restful-api-tutorial/MongoDBSettingsSetup.cs @@ -0,0 +1,9 @@ +namespace MongoExample.Models; + +public class MongoDBSettings { + + public string ConnectionURI { get; set; } = null!; + public string DatabaseName { get; set; } = null!; + public string CollectionName { get; set; } = null!; + +} \ No newline at end of file diff --git a/source/includes/fundamentals/code-examples/restful-api-tutorial/PlaylistSetup.cs b/source/includes/fundamentals/code-examples/restful-api-tutorial/PlaylistSetup.cs new file mode 100644 index 00000000..dbdb0a16 --- /dev/null +++ b/source/includes/fundamentals/code-examples/restful-api-tutorial/PlaylistSetup.cs @@ -0,0 +1,19 @@ +using MongoDB.Bson; +using MongoDB.Bson.Serialization.Attributes; +using System.Text.Json.Serialization; + +namespace MongoExample.Models; + +public class Playlist { + + [BsonId] + [BsonRepresentation(BsonType.ObjectId)] + public string? Id { get; set; } + + public string username { get; set; } = null!; + + [BsonElement("items")] + [JsonPropertyName("items")] + public List movieIds { get; set; } = null!; + +} \ No newline at end of file From bf452dd9df017dda4e8797fb3b9201719274987b Mon Sep 17 00:00:00 2001 From: Stephanie Aurelio Date: Mon, 21 Apr 2025 09:56:39 -0700 Subject: [PATCH 02/14] edits --- .../crud/restful-api-tutorial.txt | 34 +++++++++++++++++-- .../PlaylistControllerSetup.cs | 30 ++++++++++++++++ 2 files changed, 62 insertions(+), 2 deletions(-) create mode 100644 source/includes/fundamentals/code-examples/restful-api-tutorial/PlaylistControllerSetup.cs diff --git a/source/fundamentals/crud/restful-api-tutorial.txt b/source/fundamentals/crud/restful-api-tutorial.txt index a6e4565d..116ddd92 100644 --- a/source/fundamentals/crud/restful-api-tutorial.txt +++ b/source/fundamentals/crud/restful-api-tutorial.txt @@ -55,6 +55,7 @@ Microsoft offers. To do this, run the following commands in your terminal: To add the {+driver-short+} to your project as a dependency, run the following command: .. code-block:: bash + dotnet add package MongoDB.Driver The preceding commands create a new web application project for .NET core named @@ -82,7 +83,7 @@ the data model for your RESTful API. :language: csharp :dedent: - The precedeing code defines a class named ``MongoDBSettings`` that + The preceding code defines a class named ``MongoDBSettings`` that contains information about your connection, the database name, and the collection name. @@ -178,4 +179,33 @@ the data model for your RESTful API. be ``username`` in C#, in JSON, and in MongoDB. You now have a MongoDB service and document model for your collection to work -with for .NET Core. \ No newline at end of file +with for .NET Core. + +Build CRUD Endpoints +-------------------- + +To create the CRUD endpoints for this application, you need to update two +different files within the project. In this section, you can learn how to define +the endpoint within a controller and update the corresponding work within the +service. + +.. procedure:: Build endpoints to interact with MongoDB + :style: connected + + .. step:: Create a controller + + In your project, create a folder named ``Controllers``. In the + ``Controllers`` folder, create a new file named ``PlaylistController.cs`` + and add the following code: + + .. literalinclude:: /includes/fundamentals/code-examples/restful-api-tutorial/PlaylistControllerSetup.cs + :language: csharp + :dedent: + + The ``PlaylistController`` class contains a constructor method that gains + access to your singleton service class. Then, there is a series of + endpoints for this controller. + + .. step:: Add data through the POST endpoing + + Navigate to ``Services/MongoDBService.cs`` and add the following code: \ No newline at end of file diff --git a/source/includes/fundamentals/code-examples/restful-api-tutorial/PlaylistControllerSetup.cs b/source/includes/fundamentals/code-examples/restful-api-tutorial/PlaylistControllerSetup.cs new file mode 100644 index 00000000..064d46ec --- /dev/null +++ b/source/includes/fundamentals/code-examples/restful-api-tutorial/PlaylistControllerSetup.cs @@ -0,0 +1,30 @@ +using System; +using Microsoft.AspNetCore.Mvc; +using MongoExample.Services; +using MongoExample.Models; + +namespace MongoExample.Controllers; + +[Controller] +[Route("api/[controller]")] +public class PlaylistController: Controller { + + private readonly MongoDBService _mongoDBService; + + public PlaylistController(MongoDBService mongoDBService) { + _mongoDBService = mongoDBService; + } + + [HttpGet] + public async Task> Get() {} + + [HttpPost] + public async Task Post([FromBody] Playlist playlist) {} + + [HttpPut("{id}")] + public async Task AddToPlaylist(string id, [FromBody] string movieId) {} + + [HttpDelete("{id}")] + public async Task Delete(string id) {} + +} \ No newline at end of file From 47d7f30ed6e2dd7228cf6013fd4485bce88a3db9 Mon Sep 17 00:00:00 2001 From: Stephanie Aurelio Date: Mon, 21 Apr 2025 10:54:31 -0700 Subject: [PATCH 03/14] add crud section --- .../crud/restful-api-tutorial.txt | 113 +++++++++++++++++- .../MongoDBServiceComplete.cs | 48 ++++++++ .../PlaylistControllerComplete.cs | 49 ++++++++ 3 files changed, 208 insertions(+), 2 deletions(-) create mode 100644 source/includes/fundamentals/code-examples/restful-api-tutorial/MongoDBServiceComplete.cs create mode 100644 source/includes/fundamentals/code-examples/restful-api-tutorial/PlaylistControllerComplete.cs diff --git a/source/fundamentals/crud/restful-api-tutorial.txt b/source/fundamentals/crud/restful-api-tutorial.txt index 116ddd92..1b2e5def 100644 --- a/source/fundamentals/crud/restful-api-tutorial.txt +++ b/source/fundamentals/crud/restful-api-tutorial.txt @@ -189,6 +189,10 @@ different files within the project. In this section, you can learn how to define the endpoint within a controller and update the corresponding work within the service. +.. note:: + + In this example project, there is no data validation for the HTTP requests. + .. procedure:: Build endpoints to interact with MongoDB :style: connected @@ -206,6 +210,111 @@ service. access to your singleton service class. Then, there is a series of endpoints for this controller. - .. step:: Add data through the POST endpoing + .. step:: Add data through the POST endpoint + + Go to ``Services/MongoDBService.cs`` and update the ``CreateAsync`` + function to use the following code: + + .. literalinclude:: /includes/fundamentals/code-examples/restful-api-tutorial/MongoDBServiceComplete.cs + :language: csharp + :start-after: start-create-async + :end-before: end-create-async + :dedent: + + The preceding code sets the ``_playlistCollection`` in the constructor + method of the service. This lets your application use the + ``InsertOneAsync`` method, which takes a passed ``Playlist`` variable and + inserts it. + + To complete the creation of the POST endpoint, go to the + ``Controllers/PlaylistController.cs`` file and update the ``Post`` method + to use the following code: + + .. literalinclude:: /includes/fundamentals/code-examples/restful-api-tutorial/PlaylistControllerComplete.cs + :language: csharp + :start-after: start-post + :end-before: end-post + :dedent: + + When the ``POST`` endpoint executes, the application takes the + ``Playlist`` object from the ``request``, which .NET Core parses, and + passes it to the ``CreateAsync`` function in the service. After the + insert, the code returns some information about the interaction. + + .. step:: Read data through the GET endpoint + + Go to ``Services/MongoDBService.cs`` and update the ``GetAsync`` function to + use the following code: + + .. literalinclude:: /includes/fundamentals/code-examples/restful-api-tutorial/MongoDBServiceComplete.cs + :language: csharp + :start-after: start-get-async + :end-before: end-get-async + :dedent: + + The ``Find`` operation in the preceding code returns all documents that + exist in the collection. + + To complete the creation of the GET endpoint, go to the + ``Controllers/PlaylistController.cs`` file and update the ``Get`` method to + use the following code: + + .. literalinclude:: /includes/fundamentals/code-examples/restful-api-tutorial/PlaylistControllerComplete.cs + :language: csharp + :start-after: start-get + :end-before: end-get + :dedent: + + .. step:: Update data using the PUT endpoint + + Go to ``Services/MongoDBService.cs`` and update the ``AddToPlaylistAsync`` + function to use the following code: + + .. literalinclude:: /includes/fundamentals/code-examples/restful-api-tutorial/MongoDBServiceComplete.cs + :language: csharp + :start-after: start-add-to-playlist-async + :end-before: end-add-to-playlist-async + :dedent: + + The preceding code sets up a match filter to determine which document or + documents receive an update, in this case adding an item to your playlist. + The code matches based on the ``Id`` field, which is unique. Then, the + code defines the update critera, which is an ``AddtoSet`` operation that + only adds an item to the array if it doesn't already exist in the array. + + The ``UpdateOneAsync`` methods only updates on document even if the match + filter returns more than one match. + + To complete the creation of the PUT endpoint, go to the + ``Controllers/PlaylistController.cs`` file and update the + ``AddToPlaylist`` function to use the following code: - Navigate to ``Services/MongoDBService.cs`` and add the following code: \ No newline at end of file + .. literalinclude:: /includes/fundamentals/code-examples/restful-api-tutorial/PlaylistControllerComplete.cs + :language: csharp + :start-after: start-put + :end-before: end-put + :dedent: + + .. step:: Delete data using the DELETE endpoint + + Go to ``Services/MongoDBService.cs`` and update the ``DeleteAsync`` function to + use the following code: + + .. literalinclude:: /includes/fundamentals/code-examples/restful-api-tutorial/MongoDBServiceComplete.cs + :language: csharp + :start-after: start-delete-async + :end-before: end-delete-async + :dedent: + + The preceding code deletes a single document based on the filter criteria, + which matches the unique value of the ``Id`` field. + + To complete the creation of the DELETE endpoint, go to the + ``Controllers/PlaylistController.cs`` file and update the + ``Delete`` function to use the following code: + + .. literalinclude:: /includes/fundamentals/code-examples/restful-api-tutorial/PlaylistControllerComplete.cs + :language: csharp + :start-after: start-delete + :end-before: end-delete + :dedent: \ No newline at end of file diff --git a/source/includes/fundamentals/code-examples/restful-api-tutorial/MongoDBServiceComplete.cs b/source/includes/fundamentals/code-examples/restful-api-tutorial/MongoDBServiceComplete.cs new file mode 100644 index 00000000..3d841d12 --- /dev/null +++ b/source/includes/fundamentals/code-examples/restful-api-tutorial/MongoDBServiceComplete.cs @@ -0,0 +1,48 @@ +using MongoExample.Models; +using Microsoft.Extensions.Options; +using MongoDB.Driver; +using MongoDB.Bson; + +namespace MongoExample.Services; + +public class MongoDBService { + + private readonly IMongoCollection _playlistCollection; + + public MongoDBService(IOptions mongoDBSettings) { + MongoClient client = new MongoClient(mongoDBSettings.Value.ConnectionURI); + IMongoDatabase database = client.GetDatabase(mongoDBSettings.Value.DatabaseName); + _playlistCollection = database.GetCollection(mongoDBSettings.Value.CollectionName); + } + + // start-get-async + public async Task> GetAsync() { + return await _playlistCollection.Find(new BsonDocument()).ToListAsync(); + } + // end-get-async + + //start-create-async + public async Task CreateAsync(Playlist playlist) { + await _playlistCollection.InsertOneAsync(playlist); + return; + } + //end-create-async + + //start-add-to-playlist-async + public async Task AddToPlaylistAsync(string id, string movieId) { + FilterDefinition filter = Builders.Filter.Eq("Id", id); + UpdateDefinition update = Builders.Update.AddToSet("movieIds", movieId); + await _playlistCollection.UpdateOneAsync(filter, update); + return; + } + //end-add-to-playlist-async + + //start-delete-async + public async Task DeleteAsync(string id) { + FilterDefinition filter = Builders.Filter.Eq("Id", id); + await _playlistCollection.DeleteOneAsync(filter); + return; + } + //end-delete-async + +} \ No newline at end of file diff --git a/source/includes/fundamentals/code-examples/restful-api-tutorial/PlaylistControllerComplete.cs b/source/includes/fundamentals/code-examples/restful-api-tutorial/PlaylistControllerComplete.cs new file mode 100644 index 00000000..223b82df --- /dev/null +++ b/source/includes/fundamentals/code-examples/restful-api-tutorial/PlaylistControllerComplete.cs @@ -0,0 +1,49 @@ +using System; +using Microsoft.AspNetCore.Mvc; +using MongoExample.Services; +using MongoExample.Models; + +namespace MongoExample.Controllers; + +[Controller] +[Route("api/[controller]")] +public class PlaylistController: Controller { + + private readonly MongoDBService _mongoDBService; + + public PlaylistController(MongoDBService mongoDBService) { + _mongoDBService = mongoDBService; + } + + //start-get + [HttpGet] + public async Task> Get() { + return await _mongoDBService.GetAsync(); + } + //end-get + + //start-post + [HttpPost] + public async Task Post([FromBody] Playlist playlist) { + await _mongoDBService.CreateAsync(playlist); + return CreatedAtAction(nameof(Get), new { id = playlist.Id }, playlist); + } + //end-post + + //start-put + [HttpPut("{id}")] + public async Task AddToPlaylist(string id, [FromBody] string movieId) { + await _mongoDBService.AddToPlaylistAsync(id, movieId); + return NoContent(); + } + //end-put + + //start-delete + [HttpDelete("{id}")] + public async Task Delete(string id) { + await _mongoDBService.DeleteAsync(id); + return NoContent(); + } + //end-delete + +} \ No newline at end of file From 0f33792e2ba3a33635408fa7294187c5d8a8b58e Mon Sep 17 00:00:00 2001 From: Stephanie Aurelio Date: Mon, 21 Apr 2025 11:23:37 -0700 Subject: [PATCH 04/14] add test section --- .../crud/restful-api-tutorial.txt | 57 ++++++++++++++++- .../restful-api-tutorial-swagger-ui.jpg | Bin 0 -> 115687 bytes .../MongoDBExampleProgram.cs | 59 ++++++++++++++++++ 3 files changed, 115 insertions(+), 1 deletion(-) create mode 100644 source/includes/figures/restful-api-tutorial-swagger-ui.jpg create mode 100644 source/includes/fundamentals/code-examples/restful-api-tutorial/MongoDBExampleProgram.cs diff --git a/source/fundamentals/crud/restful-api-tutorial.txt b/source/fundamentals/crud/restful-api-tutorial.txt index 1b2e5def..af7c4988 100644 --- a/source/fundamentals/crud/restful-api-tutorial.txt +++ b/source/fundamentals/crud/restful-api-tutorial.txt @@ -317,4 +317,59 @@ service. :language: csharp :start-after: start-delete :end-before: end-delete - :dedent: \ No newline at end of file + :dedent: + +You now have a complete set of CRUD endpoints for your RESTful API. + +Test Your API Endpoints +----------------------- + +With the endpoints created, you can test them using the Swagger UI that is +built-in to the boilerplate .NET Core application. To do this, update your +``Program.cs`` file to include the following code: + +.. literalinclude:: /includes/fundamentals/code-examples/restful-api-tutorial/MongoDBExampleProgram.cs + :language: csharp + :dedent: + :start-after: start-program-example + :end-before: end-program-example + +You can replace any repetitive code in the boilerplate with the preceding code. + +Execute the following command to run your application: + +.. code-block:: bash + + dotnet run + +After the application starts, open your browser and go to your configured +localhost URL to access the Swagger UI, for example +``http://localhost:5000/swagger``. The Swagger UI looks like the following: + +.. figure:: /includes/figures/restful-api-tutorial-swagger-ui.jpg + :alt: Swagger UI + :align: center + + The Swagger UI for the RESTful API. + +You can test the application by clicking on the ``Try it out`` button on each +endpoint. To get started, go to the ``/api/Playlist`` ``POST`` endpoint +to add some data to the database. Add the following as dummy data: + +.. code-block:: json + :copyable: true + + { + "username": "testuser", + "items": [ + "1234", + "5678" + ] + } + +Run this request to insert data into the database. You can then go to the ``GET`` +endpoint to see the data you just inserted. You can also test the ``PUT`` and +``DELETE`` endpoints to update and delete data. + +Next Steps +---------- diff --git a/source/includes/figures/restful-api-tutorial-swagger-ui.jpg b/source/includes/figures/restful-api-tutorial-swagger-ui.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0d29aa88506cd1df8a7ca5b08647bae494bcf9b1 GIT binary patch literal 115687 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.Configuration.GetSection("MongoDB")); +builder.Services.AddSingleton(); + +// start-program-example +// Adds services to the container to configure Swagger/OpenAPI +builder.Services.AddEndpointsApiExplorer(); +builder.Services.AddSwaggerGen(); + +var app = builder.Build(); + +// Configures the HTTP request pipeline +if (app.Environment.IsDevelopment()) +{ + app.UseSwagger(); + app.UseSwaggerUI(); +} + +app.UseHttpsRedirection(); + +// Maps the endpoints for the API +app.MapGet("/api/playlists", async (MongoDBService mongoDBService) => +{ + var playlists = await mongoDBService.GetAsync(); + return playlists; +}) +.WithName("GetPlaylists") +.WithOpenApi(); + +app.MapPost("/api/playlists", async (MongoDBService mongoDBService, Playlist newPlaylist) => +{ + await mongoDBService.CreateAsync(newPlaylist); + return Results.Created($"/playlists/{newPlaylist.Id}", newPlaylist); +}) +.WithName("CreatePlaylist") +.WithOpenApi(); + +app.MapPut("/api/playlists/{id}", async (MongoDBService mongoDBService, string id, string movieId) => +{ + await mongoDBService.AddToPlaylistAsync(id, movieId); + return Results.NoContent(); +}) +.WithName("AddMovieToPlaylist") +.WithOpenApi(); + +app.MapDelete("/playlists/{id}", async (MongoDBService mongoDBService, string id) => +{ + await mongoDBService.DeleteAsync(id); + return Results.NoContent(); +}) +.WithName("DeletePlaylist") +.WithOpenApi(); + +app.Run(); +//end-program-example \ No newline at end of file From 09c23573fb6e423115637f2551f60cce3f89a0f6 Mon Sep 17 00:00:00 2001 From: Stephanie Aurelio Date: Mon, 21 Apr 2025 11:47:48 -0700 Subject: [PATCH 05/14] edits --- source/fundamentals/crud/restful-api-tutorial.txt | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/source/fundamentals/crud/restful-api-tutorial.txt b/source/fundamentals/crud/restful-api-tutorial.txt index af7c4988..4e81f077 100644 --- a/source/fundamentals/crud/restful-api-tutorial.txt +++ b/source/fundamentals/crud/restful-api-tutorial.txt @@ -1,7 +1,7 @@ .. _csharp-crud-restful-api-tutorial: ============================================ -Create a RESTful API with the .NET/C# Driver +Create a RESTful API with the C#/.NET Driver ============================================ .. facet:: @@ -352,7 +352,7 @@ localhost URL to access the Swagger UI, for example The Swagger UI for the RESTful API. -You can test the application by clicking on the ``Try it out`` button on each +You can test the application by clicking the ``Try it out`` button on each endpoint. To get started, go to the ``/api/Playlist`` ``POST`` endpoint to add some data to the database. Add the following as dummy data: @@ -373,3 +373,6 @@ endpoint to see the data you just inserted. You can also test the ``PUT`` and Next Steps ---------- + +To learn nmore about the operations discussed in this tutorial, see the following +guides: \ No newline at end of file From db47c0622d94869cba1b95ab4c12a0ccf36d6752 Mon Sep 17 00:00:00 2001 From: Stephanie Aurelio Date: Mon, 21 Apr 2025 16:16:06 -0700 Subject: [PATCH 06/14] add resources --- source/fundamentals/crud/restful-api-tutorial.txt | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/source/fundamentals/crud/restful-api-tutorial.txt b/source/fundamentals/crud/restful-api-tutorial.txt index 4e81f077..4429a5d3 100644 --- a/source/fundamentals/crud/restful-api-tutorial.txt +++ b/source/fundamentals/crud/restful-api-tutorial.txt @@ -1,8 +1,8 @@ .. _csharp-crud-restful-api-tutorial: -============================================ -Create a RESTful API with the C#/.NET Driver -============================================ +===================================================================== +Tutorial: Create a RESTful API with the {+driver-short+} Driver +===================================================================== .. facet:: :name: genre @@ -374,5 +374,10 @@ endpoint to see the data you just inserted. You can also test the ``PUT`` and Next Steps ---------- -To learn nmore about the operations discussed in this tutorial, see the following -guides: \ No newline at end of file +To learn more about the operations discussed in this tutorial, see the following +guides: + +- :ref:`csharp-insert-guide` +- :ref:`csharp-retrieve` +- :ref:`csharp-update-one` +- :ref:`csharp-delete-guide` \ No newline at end of file From 972030ac8c386cf9cc839ffcca8bf2060e5f8fa2 Mon Sep 17 00:00:00 2001 From: Stephanie Aurelio Date: Tue, 22 Apr 2025 15:41:49 -0700 Subject: [PATCH 07/14] cleanup --- source/fundamentals/crud/restful-api-tutorial.txt | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/source/fundamentals/crud/restful-api-tutorial.txt b/source/fundamentals/crud/restful-api-tutorial.txt index 4429a5d3..cd66eb78 100644 --- a/source/fundamentals/crud/restful-api-tutorial.txt +++ b/source/fundamentals/crud/restful-api-tutorial.txt @@ -15,7 +15,7 @@ Tutorial: Create a RESTful API with the {+driver-short+} Driver .. contents:: On this page :local: :backlinks: none - :depth: 2 + :depth: 1 :class: singlecol Overview @@ -325,8 +325,9 @@ Test Your API Endpoints ----------------------- With the endpoints created, you can test them using the Swagger UI that is -built-in to the boilerplate .NET Core application. To do this, update your -``Program.cs`` file to include the following code: +built-in to the boilerplate .NET Core application. To do this, go to +``Program.cs`` file and remove any code from the template project related to +``WeatherForecast`` and similar. Update the file to include the following code: .. literalinclude:: /includes/fundamentals/code-examples/restful-api-tutorial/MongoDBExampleProgram.cs :language: csharp From 0d2521d75ca1c92929fc304bc10aada48d146118 Mon Sep 17 00:00:00 2001 From: Stephanie Aurelio Date: Tue, 22 Apr 2025 16:33:17 -0700 Subject: [PATCH 08/14] edits --- source/fundamentals/crud/restful-api-tutorial.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/fundamentals/crud/restful-api-tutorial.txt b/source/fundamentals/crud/restful-api-tutorial.txt index cd66eb78..ff03de25 100644 --- a/source/fundamentals/crud/restful-api-tutorial.txt +++ b/source/fundamentals/crud/restful-api-tutorial.txt @@ -226,7 +226,7 @@ service. ``InsertOneAsync`` method, which takes a passed ``Playlist`` variable and inserts it. - To complete the creation of the POST endpoint, go to the + To complete the creation of the ``POST`` endpoint, go to the ``Controllers/PlaylistController.cs`` file and update the ``Post`` method to use the following code: @@ -255,7 +255,7 @@ service. The ``Find`` operation in the preceding code returns all documents that exist in the collection. - To complete the creation of the GET endpoint, go to the + To complete the creation of the ``GET`` endpoint, go to the ``Controllers/PlaylistController.cs`` file and update the ``Get`` method to use the following code: @@ -354,7 +354,7 @@ localhost URL to access the Swagger UI, for example The Swagger UI for the RESTful API. You can test the application by clicking the ``Try it out`` button on each -endpoint. To get started, go to the ``/api/Playlist`` ``POST`` endpoint +endpoint. To get started, go to the ``/api/playlists`` ``POST`` endpoint to add some data to the database. Add the following as dummy data: .. code-block:: json From 647441bb7ab3fd517fd6d128250666227702dfc8 Mon Sep 17 00:00:00 2001 From: Stephanie Aurelio Date: Tue, 22 Apr 2025 16:41:43 -0700 Subject: [PATCH 09/14] shorten toc title --- source/fundamentals/crud.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/fundamentals/crud.txt b/source/fundamentals/crud.txt index 4c2abd9c..f0f2c8da 100644 --- a/source/fundamentals/crud.txt +++ b/source/fundamentals/crud.txt @@ -12,7 +12,7 @@ CRUD Operations Write Read - Create a RESTful API with the .NET/C# Driver + Tutorial: Create a RESTful API - :ref:`csharp-crud-read-operations` - :ref:`csharp-crud-write-operations` From 6ee7b2cc2f4bca46958cac1918cfebeb1bfbf835 Mon Sep 17 00:00:00 2001 From: Stephanie Aurelio Date: Fri, 25 Apr 2025 09:54:19 -0700 Subject: [PATCH 10/14] RR feedback pt one --- .../crud/restful-api-tutorial.txt | 89 +++++++++---------- .../MongoDBExampleProgram.cs | 2 + 2 files changed, 43 insertions(+), 48 deletions(-) diff --git a/source/fundamentals/crud/restful-api-tutorial.txt b/source/fundamentals/crud/restful-api-tutorial.txt index ff03de25..e5f2f34a 100644 --- a/source/fundamentals/crud/restful-api-tutorial.txt +++ b/source/fundamentals/crud/restful-api-tutorial.txt @@ -21,31 +21,30 @@ Tutorial: Create a RESTful API with the {+driver-short+} Driver Overview -------- -In this tutorial, you will learn how to create a RESTful API with endpoints that -perform basic create, read, update, and delete (CRUD) operations across MongoDB -Atlas. +In this tutorial, you can learn how to create a RESTful API with endpoints that +perform basic create, read, update, and delete (CRUD) operations across +collections in a MongoDB Atlas cluster. Prequisites ----------- -To complete this tutorial, you must have the following: +Before you start this tutorial, perform the following actions: -- An `Atlas account - `__ with a - deployed and configured MongoDB Atlas cluster that is M0 or higher. +- Set up a MongoDB Atlas account and deploy and configure a cluster that is M0 + or higher. To view instructions, see the :atlas:`Get Started with Atlas ` guide. -- .NET 6.0 or higher `installed `__ on your machine. +- Install .NET 6.0 or later on your machine. To install .NET, visit the + `Microsoft .NET download page `__. -To learn how to get started with MongoDB Atlas and how to load sample data, see the -:atlas:`Get Started with Atlas Guide `. - -This tutorial uses .NET Core 8.0, but you can use any version later than .NET 6.0. +.. note:: + + This tutorial uses .NET Core 8.0, but you can use any version later than .NET 6.0. Set Up Your Project ------------------- -You can create a new .NET Core project using the web application template that -Microsoft offers. To do this, run the following commands in your terminal: +Run the following commands in your terminal to create a new .NET Core project +that uses a web application template: .. code-block:: bash @@ -60,13 +59,12 @@ To add the {+driver-short+} to your project as a dependency, run the following c The preceding commands create a new web application project for .NET core named ``MongoExample`` and install the latest {+driver-short+}. The template project -includes some boilerplate files. During this tutorial, you will add to these -files and remove some of the boilerplate code to create a RESTful API. +includes some boilerplate files that you modify to implement a RESTful API. Design a Document Model and Database Service -------------------------------------------- -In this section, you will create and configure your MongoDB service and define +In this section, you can create and configure your MongoDB service and define the data model for your RESTful API. .. procedure:: Create a MongoDB Service @@ -74,7 +72,7 @@ the data model for your RESTful API. .. step:: Create the MongoDBSettings class - Your MongoDB service will be responisble for establishing a connection and + Your MongoDB service is responsible for establishing a connection and directly working with documents within MongoDB. In your project, create a folder named ``Models``. In the ``Models`` folder, create a new file named ``MongoDBSettings.cs``. In this file, add the following code: @@ -91,7 +89,7 @@ the data model for your RESTful API. The data that will be stored in the class fields defined in the ``MongoDBSettings`` class is found in the projects' ``appsettings.json`` - file. Open this file and add the following: + file. Open this file and add the following configuration: .. code-block:: json :copyable: true @@ -105,17 +103,16 @@ the data model for your RESTful API. }, "AllowedHosts": "*", "MongoDB": { - "ConnectionURI": "ATLAS_URI_HERE", + "ConnectionURI": "", "DatabaseName": "sample_mflix", "CollectionName": "playlist" } } - Note the ``MongoDB`` field. This tutorial uses the ``sample_mflix`` - database and the ``playlist`` collection. Replace the ``ATLAS_URI_HERE`` - placeholder with your MongoDB Atlas connection string. For more - information on how to find your connection string, see the - :ref:`csharp-quickstart` guide. + This tutorial uses the ``sample_mflix`` database and the ``playlist`` + collection. Replace the ```` placeholder with + your MongoDB Atlas connection string. For more information on how to find + your connection string, see the :atlas:`Connect to Your Cluster ` tutorial. .. step:: Create the service @@ -128,31 +125,26 @@ the data model for your RESTful API. :dedent: The preceding code defines a class named ``MongoDBService`` that includes - empty asynchronous functions. In this tutorial, you will add code to these - functions as you create your endpoints. The passed settings from the - ``appsettings.json`` file are set to veriables. + empty asynchronous functions. Throughout this tutorial, you add code to these + functions as you create your endpoints. The settings you configured in the + ``appsettings.json`` file are set to variables. .. step:: Connect the service to the application Open the ``Program.cs`` file and add the following code to the top of the file: - .. code-block:: csharp - :copyable: true - - using MongoExample.Models; - using MongoExample.Services; - - var builder = WebApplication.CreateBuilder(args); - - builder.Services.Configure(builder.Configuration.GetSection("MongoDB")); - builder.Services.AddSingleton(); + .. literalinclude:: /includes/fundamentals/code-examples/restful-api-tutorial/MongoDBExampleProgram.cs + :language: csharp + :dedent: + :start-after: start-program-setup + :end-before: end-program-setup - In the preceding code, the ``GetSection`` function pulls your settings + In the preceding code, the ``GetSection()`` function pulls your settings from the ``MongoDB`` field in the ``appsettings.json`` file. .. tip:: - If your boilerplate code already has the ``builder`` variable, don't add it twice. + If the template code already has the ``builder`` variable, don't add it twice. .. step:: Create the document model @@ -179,7 +171,7 @@ the data model for your RESTful API. be ``username`` in C#, in JSON, and in MongoDB. You now have a MongoDB service and document model for your collection to work -with for .NET Core. +with .NET Core. Build CRUD Endpoints -------------------- @@ -295,7 +287,7 @@ service. :end-before: end-put :dedent: - .. step:: Delete data using the DELETE endpoint + .. step:: Delete data by using the DELETE endpoint Go to ``Services/MongoDBService.cs`` and update the ``DeleteAsync`` function to use the following code: @@ -325,9 +317,9 @@ Test Your API Endpoints ----------------------- With the endpoints created, you can test them using the Swagger UI that is -built-in to the boilerplate .NET Core application. To do this, go to -``Program.cs`` file and remove any code from the template project related to -``WeatherForecast`` and similar. Update the file to include the following code: +included with the template .NET Core application. To do this, go to the +``Program.cs`` file and remove any code from the template project related to the +``WeatherForecast`` class. Update the file to include the following code: .. literalinclude:: /includes/fundamentals/code-examples/restful-api-tutorial/MongoDBExampleProgram.cs :language: csharp @@ -345,7 +337,8 @@ Execute the following command to run your application: After the application starts, open your browser and go to your configured localhost URL to access the Swagger UI, for example -``http://localhost:5000/swagger``. The Swagger UI looks like the following: +``http://localhost:5000/swagger``. The following image shows how the Swagger UI +appears: .. figure:: /includes/figures/restful-api-tutorial-swagger-ui.jpg :alt: Swagger UI @@ -353,9 +346,9 @@ localhost URL to access the Swagger UI, for example The Swagger UI for the RESTful API. -You can test the application by clicking the ``Try it out`` button on each +You can test the application by clicking the :guilabel:`Try it out` button on each endpoint. To get started, go to the ``/api/playlists`` ``POST`` endpoint -to add some data to the database. Add the following as dummy data: +to add some data to the database. Add the following sample data: .. code-block:: json :copyable: true diff --git a/source/includes/fundamentals/code-examples/restful-api-tutorial/MongoDBExampleProgram.cs b/source/includes/fundamentals/code-examples/restful-api-tutorial/MongoDBExampleProgram.cs index d0264666..18557d8b 100644 --- a/source/includes/fundamentals/code-examples/restful-api-tutorial/MongoDBExampleProgram.cs +++ b/source/includes/fundamentals/code-examples/restful-api-tutorial/MongoDBExampleProgram.cs @@ -1,3 +1,4 @@ +// start-program-setup using MongoExample.Models; using MongoExample.Services; @@ -5,6 +6,7 @@ builder.Services.Configure(builder.Configuration.GetSection("MongoDB")); builder.Services.AddSingleton(); +// end-program-setup // start-program-example // Adds services to the container to configure Swagger/OpenAPI From e861c2e0b27f23d5d5a0d360665d56838b7d91da Mon Sep 17 00:00:00 2001 From: Stephanie Aurelio Date: Fri, 25 Apr 2025 10:07:17 -0700 Subject: [PATCH 11/14] edits --- source/fundamentals/crud/restful-api-tutorial.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/fundamentals/crud/restful-api-tutorial.txt b/source/fundamentals/crud/restful-api-tutorial.txt index e5f2f34a..d0a9ce86 100644 --- a/source/fundamentals/crud/restful-api-tutorial.txt +++ b/source/fundamentals/crud/restful-api-tutorial.txt @@ -57,7 +57,7 @@ To add the {+driver-short+} to your project as a dependency, run the following c dotnet add package MongoDB.Driver -The preceding commands create a new web application project for .NET core named +The preceding commands create a new web application project for .NET Core named ``MongoExample`` and install the latest {+driver-short+}. The template project includes some boilerplate files that you modify to implement a RESTful API. @@ -112,7 +112,7 @@ the data model for your RESTful API. This tutorial uses the ``sample_mflix`` database and the ``playlist`` collection. Replace the ```` placeholder with your MongoDB Atlas connection string. For more information on how to find - your connection string, see the :atlas:`Connect to Your Cluster ` tutorial. + your connection string, see the :atlas:`Connect to Your Cluster ` tutorial. .. step:: Create the service @@ -327,7 +327,7 @@ included with the template .NET Core application. To do this, go to the :start-after: start-program-example :end-before: end-program-example -You can replace any repetitive code in the boilerplate with the preceding code. +You can replace any repetitive code from the project template with the preceding code. Execute the following command to run your application: From 65c065c84d013c6afe5ca3f8e2879b116e7f8309 Mon Sep 17 00:00:00 2001 From: Stephanie Aurelio Date: Fri, 25 Apr 2025 10:17:41 -0700 Subject: [PATCH 12/14] vale fixes --- source/fundamentals/crud/restful-api-tutorial.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/fundamentals/crud/restful-api-tutorial.txt b/source/fundamentals/crud/restful-api-tutorial.txt index d0a9ce86..7571d6e2 100644 --- a/source/fundamentals/crud/restful-api-tutorial.txt +++ b/source/fundamentals/crud/restful-api-tutorial.txt @@ -166,7 +166,7 @@ the data model for your RESTful API. ``movieIds``. If you plan to have your local class field match the document field - directly, you don't need to define custom mappings. For example, the + directly, it isn't necessary to define custom mappings. For example, the ``username`` field in the preceding code has no custom mappings. It will be ``username`` in C#, in JSON, and in MongoDB. @@ -176,7 +176,7 @@ with .NET Core. Build CRUD Endpoints -------------------- -To create the CRUD endpoints for this application, you need to update two +To create the CRUD endpoints for this application, you must update two different files within the project. In this section, you can learn how to define the endpoint within a controller and update the corresponding work within the service. From e0bf08b1789c19779241d51ac1ce643604eb2afc Mon Sep 17 00:00:00 2001 From: Michael Morisi Date: Wed, 30 Apr 2025 10:10:57 -0400 Subject: [PATCH 13/14] RR feedback --- .../crud/restful-api-tutorial.txt | 46 +++++++++---------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/source/fundamentals/crud/restful-api-tutorial.txt b/source/fundamentals/crud/restful-api-tutorial.txt index 7571d6e2..ad33536c 100644 --- a/source/fundamentals/crud/restful-api-tutorial.txt +++ b/source/fundamentals/crud/restful-api-tutorial.txt @@ -1,8 +1,8 @@ .. _csharp-crud-restful-api-tutorial: -===================================================================== -Tutorial: Create a RESTful API with the {+driver-short+} Driver -===================================================================== +============================================================ +Tutorial: Create a RESTful API by Using the {+driver-short+} +============================================================ .. facet:: :name: genre @@ -36,7 +36,7 @@ Before you start this tutorial, perform the following actions: - Install .NET 6.0 or later on your machine. To install .NET, visit the `Microsoft .NET download page `__. -.. note:: +.. note:: Language Compatibility This tutorial uses .NET Core 8.0, but you can use any version later than .NET 6.0. @@ -87,8 +87,8 @@ the data model for your RESTful API. .. step:: Update the appsettings.json file - The data that will be stored in the class fields defined in the - ``MongoDBSettings`` class is found in the projects' ``appsettings.json`` + You can find the data that is stored in the class fields defined in the + ``MongoDBSettings`` class in the projects' ``appsettings.json`` file. Open this file and add the following configuration: .. code-block:: json @@ -101,18 +101,19 @@ the data model for your RESTful API. "Microsoft.AspNetCore": "Warning" } }, - "AllowedHosts": "*", - "MongoDB": { - "ConnectionURI": "", - "DatabaseName": "sample_mflix", - "CollectionName": "playlist" - } + "AllowedHosts": "*", + "MongoDB": { + "ConnectionURI": "", + "DatabaseName": "sample_mflix", + "CollectionName": "playlist" + } } This tutorial uses the ``sample_mflix`` database and the ``playlist`` collection. Replace the ```` placeholder with your MongoDB Atlas connection string. For more information on how to find - your connection string, see the :atlas:`Connect to Your Cluster ` tutorial. + your connection string, see the :atlas:`Connect to Your Cluster ` + tutorial in the Atlas documentation. .. step:: Create the service @@ -157,20 +158,19 @@ the data model for your RESTful API. :language: csharp :dedent: - In the preceding code, the ``Id`` field is represented as an ``ObjectId`` - in BSON and the ``_id`` fild within MongoDB. When you work with this - locally in your application, it is a string. + In the preceding code, the ``Id`` field is serialized as an ``ObjectId`` + in the ``_id`` field. The field is represented as a string in your application. - The ``movieIds`` field will be known as ``items``. When sending or - receiving JSON, the field will also be known as ``items`` instead of + The ``movieIds`` field is serialized as ``items``. When you send or + receive JSON values, the field is also named ``items`` instead of ``movieIds``. If you plan to have your local class field match the document field directly, it isn't necessary to define custom mappings. For example, the - ``username`` field in the preceding code has no custom mappings. It will + ``username`` field in the preceding code has no custom mappings. It is called be ``username`` in C#, in JSON, and in MongoDB. -You now have a MongoDB service and document model for your collection to work +After this step, you have a MongoDB service and document model for your collection to work with .NET Core. Build CRUD Endpoints @@ -181,7 +181,7 @@ different files within the project. In this section, you can learn how to define the endpoint within a controller and update the corresponding work within the service. -.. note:: +.. note:: Data Validation In this example project, there is no data validation for the HTTP requests. @@ -231,7 +231,7 @@ service. When the ``POST`` endpoint executes, the application takes the ``Playlist`` object from the ``request``, which .NET Core parses, and passes it to the ``CreateAsync`` function in the service. After the - insert, the code returns some information about the interaction. + insert, the code returns information about the interaction. .. step:: Read data through the GET endpoint @@ -311,7 +311,7 @@ service. :end-before: end-delete :dedent: -You now have a complete set of CRUD endpoints for your RESTful API. +After this step, you have a complete set of CRUD endpoints for your RESTful API. Test Your API Endpoints ----------------------- From 85c02da9294506f7240aa3955c3992e33888cb10 Mon Sep 17 00:00:00 2001 From: Michael Morisi Date: Wed, 30 Apr 2025 10:19:53 -0400 Subject: [PATCH 14/14] Fix typo --- source/fundamentals/crud/restful-api-tutorial.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/fundamentals/crud/restful-api-tutorial.txt b/source/fundamentals/crud/restful-api-tutorial.txt index ad33536c..a0485299 100644 --- a/source/fundamentals/crud/restful-api-tutorial.txt +++ b/source/fundamentals/crud/restful-api-tutorial.txt @@ -25,8 +25,8 @@ In this tutorial, you can learn how to create a RESTful API with endpoints that perform basic create, read, update, and delete (CRUD) operations across collections in a MongoDB Atlas cluster. -Prequisites ------------ +Prerequisites +------------- Before you start this tutorial, perform the following actions: