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
Exercise: Modify Conduit Context
While we create some of the Data Models we're going to run into the "chicken & egg" problem. This is very common when working with Object Relational Model Frameworks. I'll give you the liberty of building out these model however you feel comfortable.
In the Conduilt.Data project:
Add the Editorial Class with the following properties
Visibility | Modifier | Type | Name | Rules
---------------------------------------------------------------------------------------------
public | | int | Id | key
public | | int | PersonId | Required
public | | string | Slug | Required, StringLenth(50)
public | | string | Title | Required, StringLenth(50)
public | | string | Description | Required, StringLenth(50)
public | | string | Body | Required, StringLenth(200)
public | | DateTime | CreatedAt | Required
public | | DateTime | UpdatedAt | Required
public | | Person | Person |
public | virtual | ICollection<Tag> | Tags |
public | virtual | ICollection<Commentary> | Commentaries |
public | virtual | ICollection<Favorite> | Favorites |
Create a Constructor and initialize:
- Tags
- Commentaries
- Favorites
Hint: Review the code in the Person Class
Add the Commentary Class with the following properties
Visibility | Type | Name | Rules
----------------------------------------------------------------------------------
public | int | Id | key
public | int | PersonId | Required, StringLenth(50)
public | int. | EditorialId | Required
public | string | Body | Required, StringLenth(200)
public | DateTime | CreatedAt | Required
public | DateTime | UpdatedAt | Required
public | Person | Person |
public | Editorial | Editorial |
Add the Favorite Class with the following properties
Visibility | Modifier | Type | Name
---------------------------------------------------------------------------------------------
public | | int | PersonId
public | | int | EditorialId
public | virtual | Person | Person
public | virtual | Editorial | Editorial
Add the Tag Class with the following properties
Visibility | Modifier | Type | Name | Rules
---------------------------------------------------------------------------------------------
public | | int | Id | key
public | | string | DisplayName | Required, StringLenth(25)
public | virtual | ICollection<Editorial> | Editorials |
Create a Constructor and initialize:
- Editorials
Modify the Person Class and add the following properties
Visibility | Modifier | Type | Name
------------------------------------------------------------------
public | virtual | ICollection<Editorial> | Editorials
public | virtual | ICollection<Commentaries> | Commentaries
public | virtual | ICollection<Favorite> | Favorites
Initialize the following properties in the Constructor:
- Editorials
- Commentaries
- Favorites
Modify the ConduitContext Class add the following properties
Visibility | Type | Name
------------------------------------------------------------------
public | DbSet<Editorial> | Editorials
public | DbSet<Commentaries> | Commentaries
public | DbSet<Favorite> | Favorites
public | DbSet<Tag> | Tags
In the OnModelCreating Method, add the following code
Table configuration for Editorial
modelBuilder.Entity<Editorial>(entity =>
{
entity.Property(e => e.CreatedAt)
.HasColumnType("datetime")
.HasDefaultValueSql("(getutcdate())");
entity.Property(e => e.UpdatedAt)
.HasColumnType("datetime")
.HasDefaultValueSql("(getutcdate())");
entity.HasOne(d => d.Person)
.WithMany(p => p.Editorials)
.HasForeignKey(d => d.PersonId)
.OnDelete(DeleteBehavior.ClientSetNull)
.HasConstraintName("FK_Articles_People");
});
Table configuration for Commentary
modelBuilder.Entity<Commentary>(entity =>
{
entity.Property(e => e.CreatedAt)
.HasColumnType("datetime")
.HasDefaultValueSql("(getutcdate())");
entity.Property(e => e.UpdateAt)
.HasColumnType("datetime")
.HasDefaultValueSql("(getutcdate())");
entity.HasOne(d => d.Editorial)
.WithMany(p => p.Commentaries)
.HasForeignKey(d => d.EditorialId)
.OnDelete(DeleteBehavior.ClientSetNull)
.HasConstraintName("FK_Commentary_Editorials");
entity.HasOne(d => d.Person)
.WithMany(p => p.Commentaries)
.HasForeignKey(d => d.PersonId)
.OnDelete(DeleteBehavior.ClientSetNull)
.HasConstraintName("FK_Commentaries_People");
});
Table configuration for Favorites
modelBuilder.Entity<Favorite>(entity =>
{
entity.HasKey(e => new { e.PersonId, e.EditorialId });
entity.HasOne(d => d.Editorial)
.WithMany(p => p.Favorites)
.HasForeignKey(d => d.EditorialId)
.OnDelete(DeleteBehavior.ClientSetNull)
.HasConstraintName("FK_Favorites_Editorials");
entity.HasOne(d => d.Person)
.WithMany(p => p.Favorites)
.HasForeignKey(d => d.PersonId)
.OnDelete(DeleteBehavior.ClientSetNull)
.HasConstraintName("FK_Favorites_People");
});
We'll go over this code in detail to understand what it's doing.
Execute Data Migrations to update the Database Tables
- open up a terminal by selecting [View], [Terminal] on the menu
- In the terminal use the following commands:
dotnet ef migrations add Articles --project Conduit.Data --startup-project Conduit.Api
dotnet ef database update --project Conduit.Data --startup-project Conduit.Api
- Check your database to see if the tables were created successfully