Outline
- ASP.NET Web API with Victor Campos
- Setting Up The Solution
- NuGet Package Manager
-
Authentication and Authorization - Registration Part 1
- Introduction
- Security
- Creating The Users Controller
- Exercise - Create Controllers
- Solution - Create Controllers
- Generics
- Create Generic Class
- Create Register Request
- Create User Response
- Create Register User Endpoint
- Interfaces
- Extracting Interfaces
- Injecting Account Repository
- Dependency Injection
- Implementing Dependency Injection
- 400 vs 422
- Modify Model Validation Behavior
-
Authentication and Authorization - Registration Part 2
- DB Context
- Add Person Domain
- Add Account Domain
- Add DB Context
- Add Connection String
- Configure Dependency Injection for DB Context
- Initial Data Migrations
- Async Process
- Implement Async Process
- Extension Methods
- Implement Extension Methods
- Cryptography
- Implement Password Encryption
- Complete Create Account
- Exercise - Install Auto Mapper
- Solution - Install Auto Mapper
- Configure Auto Mapper
- Exercise - Install JWT Bearer
- Solution - Install JWT Bearer
- Configure JWT
- Exercise - Add Configuration DI
- Solution - Add Configuration DI
- Exercise - Auto Mapper DI
- Solution - Auto Mapper DI
- Implement Create User
- Implement Create Token
- Test Register API Endpoint
- Authentication and Authorization - Login
-
Current User
- Introduction
- Exercise - Invalid Credentials Exception
- Solution - Invalid Credentials Exception
- Exercise - IAccountRepository Add Method Signatures
- Solution - IAccountRepository Add Method Signatures
- Exercise - AccountRepository Implement Interface
- Solution - AccountRepository Implement Interface
- Exercise - IAccountRepository Dependency Injection
- Solution - IAccountRepository Dependency Injection
- Exercise - Add CurrentUserAsync
- Solution - Add CurrentUserAsync
- Overview ASP.NET Core Authentication
- Configure Authentication
- Configure OpenAPI
- Implement Swagger Authorization
- Overview HttpContext
- HttpContext Dependency Injection
- Implement GetLoggedInUser
- Test CurrentUser API Endpoint
- Summary
-
Update User
- Introduction
- Exercise - Exception Classes
- Solution - Exception Classes
- Exercise - Implement Interface
- Solution - Implement Interface
- Exercise - UpdateUserAsync
- Solution - UpdateUserAsync
- Exercise - Implement UpdateLoggedInUserAsync
- Solution - Implement UpdateLoggedInUserAsync
- Test UpdateUser API Endpoint
- Summary
-
User Profile
- Introduction
- Exercise - Add Followers
- Solution - Add Followers
- Follows Data Migration
- Exercise - Add Models And Exceptions
- Solution - Add Models And Exceptions
- Exercise - Create Profile Repository
- Solution - Create Profile Repository
- Exercise - Modify ProfilesController
- Solution - Modify ProfilesController
- Implement GetProfileAsync
- Implement GetUserProfileAsync
- Exercise - Follow And Unfollow
- Solution - Follow And Unfollow
- Implement Follow And Unfollow
- Test Follow And Unfollow
- Summary
-
Articles Part 1
- Introduction
- Exercise - Modify Conduit Context
- Solution - Modify Conduit Context Part 1
- Solution - Modify Conduit Context Part 2
- Solution - Modify Conduit Context Part 3
- Solution - Modify Conduit Context Part 4
- Exercise - Create Custom Models
- Solution - Create Custom Models
- API Routes With Variables
- Exercise - Articles API Endpoints
- Solution - Articles API Endpoints
- Exercise - Articles Repository
- Solution - Articles Repository
- Implement Articles Controller
- Exercise - Implement Articles Controller
- Solution - Implement Articles Controller
-
Articles Part 2
- Recap Visualizing The Layers
- Implement Articles Repository Part 1
- Implement Articles Repository Part 2
- Solution - Implement Articles Repository
- Test GetArticles API Endpoint
- Articles Feed
- Articles By Slug
- Create Article
- Debugging
- Update Article
- Include Article Tags Using Linq
- Delete Article
- Add Comments to Article
- Solution - Add Comments To Article
- Get Comments For Article
- Delete Comment From Article
- Favorite And Unfavorite Article
- Tags
Outline
- ASP.NET Web API with Victor Campos
- Setting Up The Solution
- NuGet Package Manager
-
Authentication and Authorization - Registration Part 1
- Introduction
- Security
- Creating The Users Controller
- Exercise - Create Controllers
- Solution - Create Controllers
- Generics
- Create Generic Class
- Create Register Request
- Create User Response
- Create Register User Endpoint
- Interfaces
- Extracting Interfaces
- Injecting Account Repository
- Dependency Injection
- Implementing Dependency Injection
- 400 vs 422
- Modify Model Validation Behavior
-
Authentication and Authorization - Registration Part 2
- DB Context
- Add Person Domain
- Add Account Domain
- Add DB Context
- Add Connection String
- Configure Dependency Injection for DB Context
- Initial Data Migrations
- Async Process
- Implement Async Process
- Extension Methods
- Implement Extension Methods
- Cryptography
- Implement Password Encryption
- Complete Create Account
- Exercise - Install Auto Mapper
- Solution - Install Auto Mapper
- Configure Auto Mapper
- Exercise - Install JWT Bearer
- Solution - Install JWT Bearer
- Configure JWT
- Exercise - Add Configuration DI
- Solution - Add Configuration DI
- Exercise - Auto Mapper DI
- Solution - Auto Mapper DI
- Implement Create User
- Implement Create Token
- Test Register API Endpoint
- Authentication and Authorization - Login
-
Current User
- Introduction
- Exercise - Invalid Credentials Exception
- Solution - Invalid Credentials Exception
- Exercise - IAccountRepository Add Method Signatures
- Solution - IAccountRepository Add Method Signatures
- Exercise - AccountRepository Implement Interface
- Solution - AccountRepository Implement Interface
- Exercise - IAccountRepository Dependency Injection
- Solution - IAccountRepository Dependency Injection
- Exercise - Add CurrentUserAsync
- Solution - Add CurrentUserAsync
- Overview ASP.NET Core Authentication
- Configure Authentication
- Configure OpenAPI
- Implement Swagger Authorization
- Overview HttpContext
- HttpContext Dependency Injection
- Implement GetLoggedInUser
- Test CurrentUser API Endpoint
- Summary
-
Update User
- Introduction
- Exercise - Exception Classes
- Solution - Exception Classes
- Exercise - Implement Interface
- Solution - Implement Interface
- Exercise - UpdateUserAsync
- Solution - UpdateUserAsync
- Exercise - Implement UpdateLoggedInUserAsync
- Solution - Implement UpdateLoggedInUserAsync
- Test UpdateUser API Endpoint
- Summary
-
User Profile
- Introduction
- Exercise - Add Followers
- Solution - Add Followers
- Follows Data Migration
- Exercise - Add Models And Exceptions
- Solution - Add Models And Exceptions
- Exercise - Create Profile Repository
- Solution - Create Profile Repository
- Exercise - Modify ProfilesController
- Solution - Modify ProfilesController
- Implement GetProfileAsync
- Implement GetUserProfileAsync
- Exercise - Follow And Unfollow
- Solution - Follow And Unfollow
- Implement Follow And Unfollow
- Test Follow And Unfollow
- Summary
-
Articles Part 1
- Introduction
- Exercise - Modify Conduit Context
- Solution - Modify Conduit Context Part 1
- Solution - Modify Conduit Context Part 2
- Solution - Modify Conduit Context Part 3
- Solution - Modify Conduit Context Part 4
- Exercise - Create Custom Models
- Solution - Create Custom Models
- API Routes With Variables
- Exercise - Articles API Endpoints
- Solution - Articles API Endpoints
- Exercise - Articles Repository
- Solution - Articles Repository
- Implement Articles Controller
- Exercise - Implement Articles Controller
- Solution - Implement Articles Controller
-
Articles Part 2
- Recap Visualizing The Layers
- Implement Articles Repository Part 1
- Implement Articles Repository Part 2
- Solution - Implement Articles Repository
- Test GetArticles API Endpoint
- Articles Feed
- Articles By Slug
- Create Article
- Debugging
- Update Article
- Include Article Tags Using Linq
- Delete Article
- Add Comments to Article
- Solution - Add Comments To Article
- Get Comments For Article
- Delete Comment From Article
- Favorite And Unfavorite Article
- Tags
Solution: Creating Custom Models
In order to build out the Api Endpoints we'll need some Custom Models in place before we start.
In the Conduit.Models project, add the following models to the Responses namespace:
Add the Comment Class with the following properties
Visibility | Type | Name
------------------------------------------------------------------
public | int | Id
public | DateTime | CreatedAt
public | DateTime | UpdatedAt
public | string | Body
public | UserProfile | Author
Initialize the Author Property in the constructor.
Here's the code to the Comment.cs file:
using System;
namespace Conduit.Models.Responses
{
public class Comment
{
public int Id { get; set; }
public DateTime CreatedAt { get; set; }
public DateTime UpdatedAt { get; set; }
public string Body { get; set; }
public UserProfile Author { get; set; }
public Comment()
{
Author = new UserProfile();
}
}
}
Add the Article Class with the following properties
Visibility | Type | Name
------------------------------------------------------------------
public | string | Slug
public | string | Title
public | string | Description
public | string | Body
public | string[] | TagList
public | DateTime | CreatedAt
public | DateTime | UpdatedAt
public | bool | Favorited
public | int | FavoritesCount
public | UserProfile | Author
Here's the code for the Article.cs file:
using System;
namespace Conduit.Models.Responses
{
public class Article
{
public string Slug { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public string Body { get; set; }
public string[] TagList { get; set; }
public DateTime CreatedAt { get; set; }
public DateTime UpdatedAt { get; set; }
public bool Favorited { get; set; }
public int FavoritesCount { get; set; }
public UserProfile Author { get; set; }
}
}
In the Conduit.Models project, add the following models to the Requests namespace:
Add the ArticleRequest<T> Class with the following properties
Visibility | Type | Name
------------------------------------------------------------------
public | T | Article
This is a Generic Class. We created a Generic for UserRequest.
Here's the code to the ArticleRequest.cs file:
namespace Conduit.Models.Requests
{
public class ArticleRequest<T>
{
public T Article { get; set; }
}
}
Add the ArticleCreateRequest Class with the following properties
Visibility | Type | Name | Rules | Error Message
---------------------------------------------------------------------------------------------------
public | string | Title | Required, StringLenth(50) | Title max character length is 50.
public | string | Description | Required, StringLenth(50) | Title max character length is 50.
public | string | Body | Required, StringLenth(200) | Body max character length is 200.
public | string[] | TagList
Here's the code to the ArticleCreateRequest.cs file:
using System.ComponentModel.DataAnnotations;
namespace Conduit.Models.Requests
{
public class ArticleCreateRequest
{
[Required]
[StringLength(50, ErrorMessage = "Title max character length is 50.")]
public string Title { get; set; }
[Required]
[StringLength(50, ErrorMessage = "Description max character length is 50.")]
public string Description { get; set; }
[Required]
[StringLength(200, ErrorMessage = "Body max character length is 200.")]
public string Body { get; set; }
public string[] TagList { get; set; }
}
}
Add the ArticleUpdateRequest Class with the following properties
Visibility | Type | Name | Rules | Error Message
---------------------------------------------------------------------------------------------------
public | string | Title | Required, StringLenth(50) | Title max character length is 50.
public | string | Description | Required, StringLenth(50) | Title max character length is 50.
public | string | Body | Required, StringLenth(200) | Body max character length is 200.
Here's the code to the ArticleUpdateRequest.cs file:
using System.ComponentModel.DataAnnotations;
namespace Conduit.Models.Requests
{
public class ArticleUpdateRequest
{
[Required]
[StringLength(50, ErrorMessage = "Title max character length is 50.")]
public string Title { get; set; }
[Required]
[StringLength(50, ErrorMessage = "Description max character length is 50.")]
public string Description { get; set; }
[Required]
[StringLength(200, ErrorMessage = "Body max character length is 200.")]
public string Body { get; set; }
}
}
Add the CommentRequest<T> Class with the following properties
Visibility | Type | Name
------------------------------------------------------------------
public | T | Comment
Here's the code to the CommentRequest.cs file:
namespace Conduit.Models.Requests
{
public class CommentRequest<T>
{
public T Comment { get; set; }
}
}
Add the CommentAddRequest Class with the following properties
Visibility | Type | Name | Rules | Error Message
---------------------------------------------------------------------------------------------------
public | string | Body | Required, StringLenth(200) | Body max character length is 200.
Here's the code to the CommentAddRequest.cs file:
using System.ComponentModel.DataAnnotations;
namespace Conduit.Models.Requests
{
public class CommentAddRequest
{
[Required]
[StringLength(200, ErrorMessage = "Body max character length is 200.")]
public string Body { get; set; }
}
}