├── .gitignore ├── .hgignore ├── All_Chapters.sln ├── Chapter_01.sln ├── Chapter_01 └── HealthCheck │ ├── .gitignore │ ├── ClientApp │ ├── .editorconfig │ ├── .gitignore │ ├── README.md │ ├── angular.json │ ├── browserslist │ ├── e2e │ │ ├── protractor.conf.js │ │ ├── src │ │ │ ├── app.e2e-spec.ts │ │ │ └── app.po.ts │ │ └── tsconfig.e2e.json │ ├── package-lock.json │ ├── package.json │ ├── src │ │ ├── app │ │ │ ├── app.component.html │ │ │ ├── app.component.ts │ │ │ ├── app.module.ts │ │ │ ├── app.server.module.ts │ │ │ ├── counter │ │ │ │ ├── counter.component.html │ │ │ │ ├── counter.component.spec.ts │ │ │ │ └── counter.component.ts │ │ │ ├── fetch-data │ │ │ │ ├── fetch-data.component.html │ │ │ │ └── fetch-data.component.ts │ │ │ ├── home │ │ │ │ ├── home.component.html │ │ │ │ └── home.component.ts │ │ │ └── nav-menu │ │ │ │ ├── nav-menu.component.css │ │ │ │ ├── nav-menu.component.html │ │ │ │ └── nav-menu.component.ts │ │ ├── assets │ │ │ └── .gitkeep │ │ ├── environments │ │ │ ├── environment.prod.ts │ │ │ └── environment.ts │ │ ├── index.html │ │ ├── karma.conf.js │ │ ├── main.ts │ │ ├── polyfills.ts │ │ ├── styles.css │ │ ├── test.ts │ │ ├── tsconfig.app.json │ │ ├── tsconfig.server.json │ │ ├── tsconfig.spec.json │ │ └── tslint.json │ ├── tsconfig.json │ └── tslint.json │ ├── ClientApp_delete │ ├── .browserslistrc │ ├── .editorconfig │ ├── .gitignore │ ├── README.md │ ├── angular.json │ ├── e2e │ │ ├── protractor.conf.js │ │ ├── src │ │ │ ├── app.e2e-spec.ts │ │ │ └── app.po.ts │ │ └── tsconfig.e2e.json │ ├── package-lock.json │ ├── package.json │ ├── src │ │ ├── app │ │ │ ├── app.component.html │ │ │ ├── app.component.ts │ │ │ ├── app.module.ts │ │ │ ├── app.server.module.ts │ │ │ ├── counter │ │ │ │ ├── counter.component.html │ │ │ │ ├── counter.component.spec.ts │ │ │ │ └── counter.component.ts │ │ │ ├── fetch-data │ │ │ │ ├── fetch-data.component.html │ │ │ │ └── fetch-data.component.ts │ │ │ ├── home │ │ │ │ ├── home.component.html │ │ │ │ └── home.component.ts │ │ │ └── nav-menu │ │ │ │ ├── nav-menu.component.css │ │ │ │ ├── nav-menu.component.html │ │ │ │ └── nav-menu.component.ts │ │ ├── assets │ │ │ └── .gitkeep │ │ ├── environments │ │ │ ├── environment.prod.ts │ │ │ └── environment.ts │ │ ├── index.html │ │ ├── karma.conf.js │ │ ├── main.ts │ │ ├── polyfills.ts │ │ ├── styles.css │ │ ├── test.ts │ │ ├── tsconfig.app.json │ │ ├── tsconfig.server.json │ │ ├── tsconfig.spec.json │ │ └── tslint.json │ ├── tsconfig.json │ ├── tslint.json │ └── update-npm.bat │ ├── Controllers │ └── WeatherForecastController.cs │ ├── HealthCheck.csproj │ ├── Pages │ ├── Error.cshtml │ ├── Error.cshtml.cs │ └── _ViewImports.cshtml │ ├── Program.cs │ ├── Startup.cs │ ├── WeatherForecast.cs │ ├── appsettings.Development.json │ ├── appsettings.json │ ├── libman.json │ └── wwwroot │ └── favicon.ico ├── Chapter_02.sln ├── Chapter_02 └── HealthCheck │ ├── .gitignore │ ├── ClientApp │ ├── .browserslistrc │ ├── .editorconfig │ ├── .gitignore │ ├── README.md │ ├── angular.json │ ├── e2e │ │ ├── protractor.conf.js │ │ ├── src │ │ │ ├── app.e2e-spec.ts │ │ │ └── app.po.ts │ │ └── tsconfig.e2e.json │ ├── package-lock.json │ ├── package.json │ ├── src │ │ ├── app │ │ │ ├── app-routing.module.ts │ │ │ ├── app.component.html │ │ │ ├── app.component.ts │ │ │ ├── app.module.ts │ │ │ ├── app.server.module.ts │ │ │ ├── home │ │ │ │ ├── home.component.html │ │ │ │ └── home.component.ts │ │ │ └── nav-menu │ │ │ │ ├── nav-menu.component.css │ │ │ │ ├── nav-menu.component.html │ │ │ │ └── nav-menu.component.ts │ │ ├── assets │ │ │ └── .gitkeep │ │ ├── environments │ │ │ ├── environment.prod.ts │ │ │ └── environment.ts │ │ ├── index.html │ │ ├── karma.conf.js │ │ ├── main.ts │ │ ├── polyfills.ts │ │ ├── styles.css │ │ ├── test.ts │ │ ├── tsconfig.app.json │ │ ├── tsconfig.server.json │ │ ├── tsconfig.spec.json │ │ └── tslint.json │ ├── tsconfig.json │ ├── tslint.json │ └── update-npm.bat │ ├── Controllers │ └── _empty.txt │ ├── HealthCheck.csproj │ ├── HealthCheck │ ├── .browserslistrc │ ├── .editorconfig │ ├── .gitignore │ ├── README.md │ ├── angular.json │ ├── e2e │ │ ├── protractor.conf.js │ │ ├── src │ │ │ ├── app.e2e-spec.ts │ │ │ └── app.po.ts │ │ └── tsconfig.json │ ├── karma.conf.js │ ├── package-lock.json │ ├── package.json │ ├── src │ │ ├── app │ │ │ ├── app-routing.module.ts │ │ │ ├── app.component.html │ │ │ ├── app.component.scss │ │ │ ├── app.component.spec.ts │ │ │ ├── app.component.ts │ │ │ └── app.module.ts │ │ ├── assets │ │ │ └── .gitkeep │ │ ├── environments │ │ │ ├── environment.prod.ts │ │ │ └── environment.ts │ │ ├── favicon.ico │ │ ├── index.html │ │ ├── main.ts │ │ ├── polyfills.ts │ │ ├── styles.scss │ │ └── test.ts │ ├── tsconfig.app.json │ ├── tsconfig.json │ ├── tsconfig.spec.json │ └── tslint.json │ ├── Pages │ ├── Error.cshtml │ ├── Error.cshtml.cs │ └── _ViewImports.cshtml │ ├── Program.cs │ ├── Startup.cs │ ├── appsettings.Development.json │ ├── appsettings.json │ ├── libman.json │ └── wwwroot │ ├── favicon.ico │ └── test.html ├── Chapter_03.sln ├── Chapter_03 └── HealthCheck │ ├── .gitignore │ ├── ClientApp │ ├── .browserslistrc │ ├── .editorconfig │ ├── .gitignore │ ├── README.md │ ├── angular.json │ ├── e2e │ │ ├── protractor.conf.js │ │ ├── src │ │ │ ├── app.e2e-spec.ts │ │ │ └── app.po.ts │ │ └── tsconfig.e2e.json │ ├── package-lock.json │ ├── package.json │ ├── src │ │ ├── app │ │ │ ├── app-routing.module.ts │ │ │ ├── app.component.html │ │ │ ├── app.component.ts │ │ │ ├── app.module.ts │ │ │ ├── app.server.module.ts │ │ │ ├── health-check │ │ │ │ ├── health-check.component.css │ │ │ │ ├── health-check.component.html │ │ │ │ └── health-check.component.ts │ │ │ ├── home │ │ │ │ ├── home.component.html │ │ │ │ └── home.component.ts │ │ │ └── nav-menu │ │ │ │ ├── nav-menu.component.css │ │ │ │ ├── nav-menu.component.html │ │ │ │ └── nav-menu.component.ts │ │ ├── assets │ │ │ └── .gitkeep │ │ ├── environments │ │ │ ├── environment.prod.ts │ │ │ └── environment.ts │ │ ├── index.html │ │ ├── karma.conf.js │ │ ├── main.ts │ │ ├── polyfills.ts │ │ ├── styles.css │ │ ├── test.ts │ │ ├── tsconfig.app.json │ │ ├── tsconfig.server.json │ │ ├── tsconfig.spec.json │ │ └── tslint.json │ ├── tsconfig.json │ ├── tslint.json │ └── update-npm.bat │ ├── Controllers │ └── _empty.txt │ ├── CustomHealthCheckOptions.cs │ ├── HealthCheck.csproj │ ├── ICMPHealthCheck.cs │ ├── Pages │ ├── Error.cshtml │ ├── Error.cshtml.cs │ └── _ViewImports.cshtml │ ├── Program.cs │ ├── Startup.cs │ ├── appsettings.Development.json │ ├── appsettings.json │ ├── libman.json │ └── wwwroot │ ├── favicon.ico │ └── test.html ├── Chapter_04.sln ├── Chapter_04 └── WorldCities │ ├── .gitignore │ ├── ClientApp │ ├── .browserslistrc │ ├── .editorconfig │ ├── .gitignore │ ├── README.md │ ├── angular.json │ ├── e2e │ │ ├── protractor.conf.js │ │ ├── src │ │ │ ├── app.e2e-spec.ts │ │ │ └── app.po.ts │ │ └── tsconfig.e2e.json │ ├── package-lock.json │ ├── package.json │ ├── src │ │ ├── app │ │ │ ├── app-routing.module.ts │ │ │ ├── app.component.html │ │ │ ├── app.component.ts │ │ │ ├── app.module.ts │ │ │ ├── app.server.module.ts │ │ │ ├── home │ │ │ │ ├── home.component.css │ │ │ │ ├── home.component.html │ │ │ │ └── home.component.ts │ │ │ └── nav-menu │ │ │ │ ├── nav-menu.component.css │ │ │ │ ├── nav-menu.component.html │ │ │ │ └── nav-menu.component.ts │ │ ├── assets │ │ │ └── .gitkeep │ │ ├── environments │ │ │ ├── environment.prod.ts │ │ │ └── environment.ts │ │ ├── index.html │ │ ├── karma.conf.js │ │ ├── main.ts │ │ ├── polyfills.ts │ │ ├── styles.css │ │ ├── test.ts │ │ ├── tsconfig.app.json │ │ ├── tsconfig.server.json │ │ ├── tsconfig.spec.json │ │ └── tslint.json │ ├── tsconfig.json │ ├── tslint.json │ └── update-npm.bat │ ├── Controllers │ ├── CitiesController.cs │ ├── CountriesController.cs │ └── SeedController.cs │ ├── Data │ ├── ApplicationDbContext.cs │ ├── Migrations │ │ ├── 20201008030948_Initial.Designer.cs │ │ ├── 20201008030948_Initial.cs │ │ └── ApplicationDbContextModelSnapshot.cs │ ├── Models │ │ ├── City.cs │ │ ├── CityEntityTypeConfiguration.cs │ │ ├── Country.cs │ │ └── CountryEntityTypeConfiguration.cs │ └── Source │ │ ├── license.txt │ │ └── worldcities.xlsx │ ├── Pages │ ├── Error.cshtml │ ├── Error.cshtml.cs │ └── _ViewImports.cshtml │ ├── Program.cs │ ├── Startup.cs │ ├── WorldCities.csproj │ ├── appsettings.Development.json │ ├── appsettings.json │ └── wwwroot │ ├── favicon.ico │ └── img │ └── home.jpg ├── Chapter_05.sln ├── Chapter_05 └── WorldCities │ ├── .gitignore │ ├── ClientApp │ ├── .browserslistrc │ ├── .editorconfig │ ├── .gitignore │ ├── README.md │ ├── angular.json │ ├── e2e │ │ ├── protractor.conf.js │ │ ├── src │ │ │ ├── app.e2e-spec.ts │ │ │ └── app.po.ts │ │ └── tsconfig.e2e.json │ ├── package-lock.json │ ├── package.json │ ├── src │ │ ├── app │ │ │ ├── angular-material.module.ts │ │ │ ├── app-routing.module.ts │ │ │ ├── app.component.html │ │ │ ├── app.component.ts │ │ │ ├── app.module.ts │ │ │ ├── app.server.module.ts │ │ │ ├── cities │ │ │ │ ├── _clientSidePagination │ │ │ │ │ ├── _README.txt │ │ │ │ │ ├── cities.component.html │ │ │ │ │ └── cities.component.ts_sample │ │ │ │ ├── cities.component.css │ │ │ │ ├── cities.component.html │ │ │ │ ├── cities.component.ts │ │ │ │ └── city.ts │ │ │ ├── countries │ │ │ │ ├── countries.component.css │ │ │ │ ├── countries.component.html │ │ │ │ ├── countries.component.ts │ │ │ │ └── country.ts │ │ │ ├── home │ │ │ │ ├── home.component.css │ │ │ │ ├── home.component.html │ │ │ │ └── home.component.ts │ │ │ └── nav-menu │ │ │ │ ├── nav-menu.component.css │ │ │ │ ├── nav-menu.component.html │ │ │ │ └── nav-menu.component.ts │ │ ├── assets │ │ │ └── .gitkeep │ │ ├── environments │ │ │ ├── environment.prod.ts │ │ │ └── environment.ts │ │ ├── index.html │ │ ├── karma.conf.js │ │ ├── main.ts │ │ ├── polyfills.ts │ │ ├── styles.css │ │ ├── test.ts │ │ ├── tsconfig.app.json │ │ ├── tsconfig.server.json │ │ ├── tsconfig.spec.json │ │ └── tslint.json │ ├── tsconfig.json │ ├── tslint.json │ └── update-npm.bat │ ├── Controllers │ ├── CitiesController.cs │ ├── CountriesController.cs │ └── SeedController.cs │ ├── Data │ ├── ApiResult.cs │ ├── ApplicationDbContext.cs │ ├── Migrations │ │ ├── 20201008030948_Initial.Designer.cs │ │ ├── 20201008030948_Initial.cs │ │ └── ApplicationDbContextModelSnapshot.cs │ ├── Models │ │ ├── City.cs │ │ └── Country.cs │ └── Source │ │ ├── license.txt │ │ └── worldcities.xlsx │ ├── Pages │ ├── Error.cshtml │ ├── Error.cshtml.cs │ └── _ViewImports.cshtml │ ├── Program.cs │ ├── Startup.cs │ ├── WorldCities.csproj │ ├── appsettings.Development.json │ ├── appsettings.json │ └── wwwroot │ ├── favicon.ico │ └── img │ └── home.jpg ├── Chapter_06.sln ├── Chapter_06 └── WorldCities │ ├── .gitignore │ ├── ClientApp │ ├── .browserslistrc │ ├── .editorconfig │ ├── .gitignore │ ├── README.md │ ├── angular.json │ ├── e2e │ │ ├── protractor.conf.js │ │ ├── src │ │ │ ├── app.e2e-spec.ts │ │ │ └── app.po.ts │ │ └── tsconfig.e2e.json │ ├── package-lock.json │ ├── package.json │ ├── src │ │ ├── app │ │ │ ├── angular-material.module.ts │ │ │ ├── app-routing.module.ts │ │ │ ├── app.component.html │ │ │ ├── app.component.ts │ │ │ ├── app.module.ts │ │ │ ├── app.server.module.ts │ │ │ ├── cities │ │ │ │ ├── cities.component.css │ │ │ │ ├── cities.component.html │ │ │ │ ├── cities.component.ts │ │ │ │ ├── city-edit.component.css │ │ │ │ ├── city-edit.component.html │ │ │ │ ├── city-edit.component.ts │ │ │ │ └── city.ts │ │ │ ├── countries │ │ │ │ ├── countries.component.css │ │ │ │ ├── countries.component.html │ │ │ │ ├── countries.component.ts │ │ │ │ ├── country-edit.component.css │ │ │ │ ├── country-edit.component.html │ │ │ │ ├── country-edit.component.ts │ │ │ │ └── country.ts │ │ │ ├── home │ │ │ │ ├── home.component.css │ │ │ │ ├── home.component.html │ │ │ │ └── home.component.ts │ │ │ └── nav-menu │ │ │ │ ├── nav-menu.component.css │ │ │ │ ├── nav-menu.component.html │ │ │ │ └── nav-menu.component.ts │ │ ├── assets │ │ │ └── .gitkeep │ │ ├── environments │ │ │ ├── environment.prod.ts │ │ │ └── environment.ts │ │ ├── index.html │ │ ├── karma.conf.js │ │ ├── main.ts │ │ ├── polyfills.ts │ │ ├── styles.css │ │ ├── test.ts │ │ ├── tsconfig.app.json │ │ ├── tsconfig.server.json │ │ ├── tsconfig.spec.json │ │ └── tslint.json │ ├── tsconfig.json │ ├── tslint.json │ └── update-npm.bat │ ├── Controllers │ ├── CitiesController.cs │ ├── CountriesController.cs │ └── SeedController.cs │ ├── Data │ ├── ApiResult.cs │ ├── ApplicationDbContext.cs │ ├── Migrations │ │ ├── 20201008030948_Initial.Designer.cs │ │ ├── 20201008030948_Initial.cs │ │ └── ApplicationDbContextModelSnapshot.cs │ ├── Models │ │ ├── City.cs │ │ └── Country.cs │ └── Source │ │ ├── license.txt │ │ └── worldcities.xlsx │ ├── Pages │ ├── Error.cshtml │ ├── Error.cshtml.cs │ └── _ViewImports.cshtml │ ├── Program.cs │ ├── Startup.cs │ ├── WorldCities.csproj │ ├── appsettings.Development.json │ ├── appsettings.json │ └── wwwroot │ ├── favicon.ico │ └── img │ └── home.jpg ├── Chapter_07.sln ├── Chapter_07 └── WorldCities │ ├── .gitignore │ ├── ClientApp │ ├── .browserslistrc │ ├── .editorconfig │ ├── .gitignore │ ├── README.md │ ├── angular.json │ ├── e2e │ │ ├── protractor.conf.js │ │ ├── src │ │ │ ├── app.e2e-spec.ts │ │ │ └── app.po.ts │ │ └── tsconfig.e2e.json │ ├── package-lock.json │ ├── package.json │ ├── src │ │ ├── app │ │ │ ├── angular-material.module.ts │ │ │ ├── app-routing.module.ts │ │ │ ├── app.component.html │ │ │ ├── app.component.ts │ │ │ ├── app.module.ts │ │ │ ├── app.server.module.ts │ │ │ ├── base.form.component.ts │ │ │ ├── base.service.ts │ │ │ ├── cities │ │ │ │ ├── cities.component.css │ │ │ │ ├── cities.component.html │ │ │ │ ├── cities.component.ts │ │ │ │ ├── city-edit.component.css │ │ │ │ ├── city-edit.component.html │ │ │ │ ├── city-edit.component.ts │ │ │ │ ├── city.service.ts │ │ │ │ └── city.ts │ │ │ ├── countries │ │ │ │ ├── countries.component.css │ │ │ │ ├── countries.component.html │ │ │ │ ├── countries.component.ts │ │ │ │ ├── country-edit.component.css │ │ │ │ ├── country-edit.component.html │ │ │ │ ├── country-edit.component.ts │ │ │ │ ├── country.service.ts │ │ │ │ └── country.ts │ │ │ ├── home │ │ │ │ ├── home.component.css │ │ │ │ ├── home.component.html │ │ │ │ └── home.component.ts │ │ │ └── nav-menu │ │ │ │ ├── nav-menu.component.css │ │ │ │ ├── nav-menu.component.html │ │ │ │ └── nav-menu.component.ts │ │ ├── assets │ │ │ └── .gitkeep │ │ ├── environments │ │ │ ├── environment.prod.ts │ │ │ └── environment.ts │ │ ├── index.html │ │ ├── karma.conf.js │ │ ├── main.ts │ │ ├── polyfills.ts │ │ ├── styles.css │ │ ├── test.ts │ │ ├── tsconfig.app.json │ │ ├── tsconfig.server.json │ │ ├── tsconfig.spec.json │ │ └── tslint.json │ ├── tsconfig.json │ ├── tslint.json │ └── update-npm.bat │ ├── Controllers │ ├── CitiesController.cs │ ├── CountriesController.cs │ └── SeedController.cs │ ├── Data │ ├── ApiResult.cs │ ├── ApplicationDbContext.cs │ ├── CityDTO.cs │ ├── CountryDTO.cs │ ├── Migrations │ │ ├── 20201008030948_Initial.Designer.cs │ │ ├── 20201008030948_Initial.cs │ │ └── ApplicationDbContextModelSnapshot.cs │ ├── Models │ │ ├── City.cs │ │ └── Country.cs │ └── Source │ │ ├── license.txt │ │ └── worldcities.xlsx │ ├── Pages │ ├── Error.cshtml │ ├── Error.cshtml.cs │ └── _ViewImports.cshtml │ ├── Program.cs │ ├── Startup.cs │ ├── WorldCities.csproj │ ├── appsettings.Development.json │ ├── appsettings.json │ ├── package-lock.json │ └── wwwroot │ ├── favicon.ico │ └── img │ └── home.jpg ├── Chapter_08.sln ├── Chapter_08 └── WorldCities │ ├── .gitignore │ ├── ClientApp │ ├── .browserslistrc │ ├── .editorconfig │ ├── .gitignore │ ├── README.md │ ├── angular.json │ ├── e2e │ │ ├── protractor.conf.js │ │ ├── src │ │ │ ├── app.e2e-spec.ts │ │ │ └── app.po.ts │ │ └── tsconfig.e2e.json │ ├── package-lock.json │ ├── package.json │ ├── src │ │ ├── app │ │ │ ├── angular-material.module.ts │ │ │ ├── app-routing.module.ts │ │ │ ├── app.component.html │ │ │ ├── app.component.ts │ │ │ ├── app.module.ts │ │ │ ├── app.server.module.ts │ │ │ ├── base.form.component.ts │ │ │ ├── base.service.ts │ │ │ ├── cities │ │ │ │ ├── cities.component.css │ │ │ │ ├── cities.component.html │ │ │ │ ├── cities.component.ts │ │ │ │ ├── city-edit.component.css │ │ │ │ ├── city-edit.component.html │ │ │ │ ├── city-edit.component.ts │ │ │ │ ├── city.service.ts │ │ │ │ └── city.ts │ │ │ ├── countries │ │ │ │ ├── countries.component.css │ │ │ │ ├── countries.component.html │ │ │ │ ├── countries.component.ts │ │ │ │ ├── country-edit.component.css │ │ │ │ ├── country-edit.component.html │ │ │ │ ├── country-edit.component.ts │ │ │ │ ├── country.service.ts │ │ │ │ └── country.ts │ │ │ ├── home │ │ │ │ ├── home.component.css │ │ │ │ ├── home.component.html │ │ │ │ └── home.component.ts │ │ │ └── nav-menu │ │ │ │ ├── nav-menu.component.css │ │ │ │ ├── nav-menu.component.html │ │ │ │ └── nav-menu.component.ts │ │ ├── assets │ │ │ └── .gitkeep │ │ ├── environments │ │ │ ├── environment.prod.ts │ │ │ └── environment.ts │ │ ├── index.html │ │ ├── karma.conf.js │ │ ├── main.ts │ │ ├── polyfills.ts │ │ ├── styles.css │ │ ├── test.ts │ │ ├── tsconfig.app.json │ │ ├── tsconfig.server.json │ │ ├── tsconfig.spec.json │ │ └── tslint.json │ ├── tsconfig.json │ ├── tslint.json │ └── update-npm.bat │ ├── Controllers │ ├── CitiesController.cs │ ├── CountriesController.cs │ └── SeedController.cs │ ├── Data │ ├── ApiResult.cs │ ├── ApplicationDbContext.cs │ ├── CityDTO.cs │ ├── CountryDTO.cs │ ├── IQueryableExtensions.cs │ ├── Migrations │ │ ├── 20201008030948_Initial.Designer.cs │ │ ├── 20201008030948_Initial.cs │ │ └── ApplicationDbContextModelSnapshot.cs │ ├── Models │ │ ├── City.cs │ │ └── Country.cs │ └── Source │ │ ├── license.txt │ │ └── worldcities.xlsx │ ├── Pages │ ├── Error.cshtml │ ├── Error.cshtml.cs │ └── _ViewImports.cshtml │ ├── Program.cs │ ├── Startup.cs │ ├── WorldCities.csproj │ ├── appsettings.Development.json │ ├── appsettings.json │ └── wwwroot │ ├── favicon.ico │ └── img │ └── home.jpg ├── Chapter_09.sln ├── Chapter_09 ├── WorldCities.Tests │ ├── CitiesController_Tests.cs │ └── WorldCities.Tests.csproj └── WorldCities │ ├── .gitignore │ ├── ClientApp │ ├── .browserslistrc │ ├── .editorconfig │ ├── .gitignore │ ├── README.md │ ├── angular.json │ ├── e2e │ │ ├── protractor.conf.js │ │ ├── src │ │ │ ├── app.e2e-spec.ts │ │ │ └── app.po.ts │ │ └── tsconfig.e2e.json │ ├── package-lock.json │ ├── package.json │ ├── src │ │ ├── app │ │ │ ├── angular-material.module.ts │ │ │ ├── app-routing.module.ts │ │ │ ├── app.component.html │ │ │ ├── app.component.ts │ │ │ ├── app.module.ts │ │ │ ├── app.server.module.ts │ │ │ ├── base.form.component.ts │ │ │ ├── base.service.ts │ │ │ ├── cities │ │ │ │ ├── cities.component.css │ │ │ │ ├── cities.component.html │ │ │ │ ├── cities.component.spec.ts │ │ │ │ ├── cities.component.ts │ │ │ │ ├── city-edit.component.css │ │ │ │ ├── city-edit.component.html │ │ │ │ ├── city-edit.component.ts │ │ │ │ ├── city.service.ts │ │ │ │ └── city.ts │ │ │ ├── countries │ │ │ │ ├── countries.component.css │ │ │ │ ├── countries.component.html │ │ │ │ ├── countries.component.ts │ │ │ │ ├── country-edit.component.css │ │ │ │ ├── country-edit.component.html │ │ │ │ ├── country-edit.component.ts │ │ │ │ ├── country.service.ts │ │ │ │ └── country.ts │ │ │ ├── home │ │ │ │ ├── home.component.css │ │ │ │ ├── home.component.html │ │ │ │ └── home.component.ts │ │ │ └── nav-menu │ │ │ │ ├── nav-menu.component.css │ │ │ │ ├── nav-menu.component.html │ │ │ │ └── nav-menu.component.ts │ │ ├── assets │ │ │ └── .gitkeep │ │ ├── environments │ │ │ ├── environment.prod.ts │ │ │ └── environment.ts │ │ ├── index.html │ │ ├── karma.conf.js │ │ ├── main.ts │ │ ├── polyfills.ts │ │ ├── styles.css │ │ ├── test.ts │ │ ├── tsconfig.app.json │ │ ├── tsconfig.server.json │ │ ├── tsconfig.spec.json │ │ └── tslint.json │ ├── tsconfig.json │ ├── tslint.json │ └── update-npm.bat │ ├── Controllers │ ├── CitiesController.cs │ ├── CountriesController.cs │ └── SeedController.cs │ ├── Data │ ├── ApiResult.cs │ ├── ApplicationDbContext.cs │ ├── CityDTO.cs │ ├── CountryDTO.cs │ ├── IQueryableExtensions.cs │ ├── Migrations │ │ ├── 20201008030948_Initial.Designer.cs │ │ ├── 20201008030948_Initial.cs │ │ └── ApplicationDbContextModelSnapshot.cs │ ├── Models │ │ ├── City.cs │ │ └── Country.cs │ └── Source │ │ ├── license.txt │ │ └── worldcities.xlsx │ ├── Pages │ ├── Error.cshtml │ ├── Error.cshtml.cs │ └── _ViewImports.cshtml │ ├── Program.cs │ ├── Startup.cs │ ├── WorldCities.csproj │ ├── appsettings.Development.json │ ├── appsettings.json │ └── wwwroot │ ├── favicon.ico │ └── img │ └── home.jpg ├── Chapter_10.sln ├── Chapter_10 ├── AuthSample │ ├── .gitignore │ ├── AuthSample.csproj │ ├── ClientApp │ │ ├── .editorconfig │ │ ├── .gitignore │ │ ├── README.md │ │ ├── angular.json │ │ ├── browserslist │ │ ├── e2e │ │ │ ├── protractor.conf.js │ │ │ ├── src │ │ │ │ ├── app.e2e-spec.ts │ │ │ │ └── app.po.ts │ │ │ └── tsconfig.e2e.json │ │ ├── package-lock.json │ │ ├── package.json │ │ ├── src │ │ │ ├── api-authorization │ │ │ │ ├── api-authorization.constants.ts │ │ │ │ ├── api-authorization.module.spec.ts │ │ │ │ ├── api-authorization.module.ts │ │ │ │ ├── authorize.guard.spec.ts │ │ │ │ ├── authorize.guard.ts │ │ │ │ ├── authorize.interceptor.spec.ts │ │ │ │ ├── authorize.interceptor.ts │ │ │ │ ├── authorize.service.spec.ts │ │ │ │ ├── authorize.service.ts │ │ │ │ ├── login-menu │ │ │ │ │ ├── login-menu.component.css │ │ │ │ │ ├── login-menu.component.html │ │ │ │ │ ├── login-menu.component.spec.ts │ │ │ │ │ └── login-menu.component.ts │ │ │ │ ├── login │ │ │ │ │ ├── login.component.css │ │ │ │ │ ├── login.component.html │ │ │ │ │ ├── login.component.spec.ts │ │ │ │ │ └── login.component.ts │ │ │ │ └── logout │ │ │ │ │ ├── logout.component.css │ │ │ │ │ ├── logout.component.html │ │ │ │ │ ├── logout.component.spec.ts │ │ │ │ │ └── logout.component.ts │ │ │ ├── app │ │ │ │ ├── app.component.html │ │ │ │ ├── app.component.ts │ │ │ │ ├── app.module.ts │ │ │ │ ├── app.server.module.ts │ │ │ │ ├── counter │ │ │ │ │ ├── counter.component.html │ │ │ │ │ ├── counter.component.spec.ts │ │ │ │ │ └── counter.component.ts │ │ │ │ ├── fetch-data │ │ │ │ │ ├── fetch-data.component.html │ │ │ │ │ └── fetch-data.component.ts │ │ │ │ ├── home │ │ │ │ │ ├── home.component.html │ │ │ │ │ └── home.component.ts │ │ │ │ └── nav-menu │ │ │ │ │ ├── nav-menu.component.css │ │ │ │ │ ├── nav-menu.component.html │ │ │ │ │ └── nav-menu.component.ts │ │ │ ├── assets │ │ │ │ └── .gitkeep │ │ │ ├── environments │ │ │ │ ├── environment.prod.ts │ │ │ │ └── environment.ts │ │ │ ├── index.html │ │ │ ├── karma.conf.js │ │ │ ├── main.ts │ │ │ ├── polyfills.ts │ │ │ ├── styles.css │ │ │ ├── test.ts │ │ │ ├── tsconfig.app.json │ │ │ ├── tsconfig.server.json │ │ │ ├── tsconfig.spec.json │ │ │ └── tslint.json │ │ ├── tsconfig.json │ │ └── tslint.json │ ├── Controllers │ │ ├── OidcConfigurationController.cs │ │ └── WeatherForecastController.cs │ ├── Data │ │ ├── ApplicationDbContext.cs │ │ └── Migrations │ │ │ ├── 00000000000000_CreateIdentitySchema.Designer.cs │ │ │ ├── 00000000000000_CreateIdentitySchema.cs │ │ │ └── ApplicationDbContextModelSnapshot.cs │ ├── Models │ │ └── ApplicationUser.cs │ ├── Pages │ │ ├── Error.cshtml │ │ ├── Error.cshtml.cs │ │ ├── Shared │ │ │ └── _LoginPartial.cshtml │ │ └── _ViewImports.cshtml │ ├── Program.cs │ ├── Startup.cs │ ├── WeatherForecast.cs │ ├── app.db │ ├── appsettings.Development.json │ ├── appsettings.json │ └── wwwroot │ │ └── favicon.ico ├── WorldCities.Tests │ ├── CitiesController_Tests.cs │ ├── IdentityHelper.cs │ ├── SeedController_Tests.cs │ └── WorldCities.Tests.csproj └── WorldCities │ ├── .gitignore │ ├── Areas │ └── Identity │ │ ├── IdentityHostingStartup.cs │ │ └── Pages │ │ ├── Account │ │ ├── AccessDenied.cshtml │ │ ├── AccessDenied.cshtml.cs │ │ ├── ConfirmEmail.cshtml │ │ ├── ConfirmEmail.cshtml.cs │ │ ├── ConfirmEmailChange.cshtml │ │ ├── ConfirmEmailChange.cshtml.cs │ │ ├── ExternalLogin.cshtml │ │ ├── ExternalLogin.cshtml.cs │ │ ├── ForgotPassword.cshtml │ │ ├── ForgotPassword.cshtml.cs │ │ ├── ForgotPasswordConfirmation.cshtml │ │ ├── ForgotPasswordConfirmation.cshtml.cs │ │ ├── Lockout.cshtml │ │ ├── Lockout.cshtml.cs │ │ ├── Login.cshtml │ │ ├── Login.cshtml.cs │ │ ├── LoginWith2fa.cshtml │ │ ├── LoginWith2fa.cshtml.cs │ │ ├── LoginWithRecoveryCode.cshtml │ │ ├── LoginWithRecoveryCode.cshtml.cs │ │ ├── Logout.cshtml │ │ ├── Logout.cshtml.cs │ │ ├── Manage │ │ │ ├── ChangePassword.cshtml │ │ │ ├── ChangePassword.cshtml.cs │ │ │ ├── DeletePersonalData.cshtml │ │ │ ├── DeletePersonalData.cshtml.cs │ │ │ ├── Disable2fa.cshtml │ │ │ ├── Disable2fa.cshtml.cs │ │ │ ├── DownloadPersonalData.cshtml │ │ │ ├── DownloadPersonalData.cshtml.cs │ │ │ ├── Email.cshtml │ │ │ ├── Email.cshtml.cs │ │ │ ├── EnableAuthenticator.cshtml │ │ │ ├── EnableAuthenticator.cshtml.cs │ │ │ ├── ExternalLogins.cshtml │ │ │ ├── ExternalLogins.cshtml.cs │ │ │ ├── GenerateRecoveryCodes.cshtml │ │ │ ├── GenerateRecoveryCodes.cshtml.cs │ │ │ ├── Index.cshtml │ │ │ ├── Index.cshtml.cs │ │ │ ├── ManageNavPages.cs │ │ │ ├── PersonalData.cshtml │ │ │ ├── PersonalData.cshtml.cs │ │ │ ├── ResetAuthenticator.cshtml │ │ │ ├── ResetAuthenticator.cshtml.cs │ │ │ ├── SetPassword.cshtml │ │ │ ├── SetPassword.cshtml.cs │ │ │ ├── ShowRecoveryCodes.cshtml │ │ │ ├── ShowRecoveryCodes.cshtml.cs │ │ │ ├── TwoFactorAuthentication.cshtml │ │ │ ├── TwoFactorAuthentication.cshtml.cs │ │ │ ├── _Layout.cshtml │ │ │ ├── _ManageNav.cshtml │ │ │ ├── _StatusMessage.cshtml │ │ │ └── _ViewImports.cshtml │ │ ├── Register.cshtml │ │ ├── Register.cshtml.cs │ │ ├── RegisterConfirmation.cshtml │ │ ├── RegisterConfirmation.cshtml.cs │ │ ├── ResendEmailConfirmation.cshtml │ │ ├── ResendEmailConfirmation.cshtml.cs │ │ ├── ResetPassword.cshtml │ │ ├── ResetPassword.cshtml.cs │ │ ├── ResetPasswordConfirmation.cshtml │ │ ├── ResetPasswordConfirmation.cshtml.cs │ │ ├── _StatusMessage.cshtml │ │ └── _ViewImports.cshtml │ │ ├── Error.cshtml │ │ ├── Error.cshtml.cs │ │ ├── _ViewImports.cshtml │ │ └── _ViewStart.cshtml │ ├── ClientApp │ ├── .browserslistrc │ ├── .editorconfig │ ├── .gitignore │ ├── README.md │ ├── angular.json │ ├── e2e │ │ ├── protractor.conf.js │ │ ├── src │ │ │ ├── app.e2e-spec.ts │ │ │ └── app.po.ts │ │ └── tsconfig.e2e.json │ ├── package-lock.json │ ├── package.json │ ├── src │ │ ├── api-authorization │ │ │ ├── api-authorization.constants.ts │ │ │ ├── api-authorization.module.spec.ts │ │ │ ├── api-authorization.module.ts │ │ │ ├── authorize.guard.spec.ts │ │ │ ├── authorize.guard.ts │ │ │ ├── authorize.interceptor.spec.ts │ │ │ ├── authorize.interceptor.ts │ │ │ ├── authorize.service.spec.ts │ │ │ ├── authorize.service.ts │ │ │ ├── login-menu │ │ │ │ ├── login-menu.component.css │ │ │ │ ├── login-menu.component.html │ │ │ │ ├── login-menu.component.spec.ts │ │ │ │ └── login-menu.component.ts │ │ │ ├── login │ │ │ │ ├── login.component.css │ │ │ │ ├── login.component.html │ │ │ │ ├── login.component.spec.ts │ │ │ │ └── login.component.ts │ │ │ └── logout │ │ │ │ ├── logout.component.css │ │ │ │ ├── logout.component.html │ │ │ │ ├── logout.component.spec.ts │ │ │ │ └── logout.component.ts │ │ ├── app │ │ │ ├── angular-material.module.ts │ │ │ ├── app-routing.module.ts │ │ │ ├── app.component.html │ │ │ ├── app.component.ts │ │ │ ├── app.module.ts │ │ │ ├── app.server.module.ts │ │ │ ├── base.form.component.ts │ │ │ ├── base.service.ts │ │ │ ├── cities │ │ │ │ ├── cities.component.css │ │ │ │ ├── cities.component.html │ │ │ │ ├── cities.component.spec.ts │ │ │ │ ├── cities.component.ts │ │ │ │ ├── city-edit.component.css │ │ │ │ ├── city-edit.component.html │ │ │ │ ├── city-edit.component.ts │ │ │ │ ├── city.service.ts │ │ │ │ └── city.ts │ │ │ ├── countries │ │ │ │ ├── countries.component.css │ │ │ │ ├── countries.component.html │ │ │ │ ├── countries.component.ts │ │ │ │ ├── country-edit.component.css │ │ │ │ ├── country-edit.component.html │ │ │ │ ├── country-edit.component.ts │ │ │ │ ├── country.service.ts │ │ │ │ └── country.ts │ │ │ ├── home │ │ │ │ ├── home.component.css │ │ │ │ ├── home.component.html │ │ │ │ └── home.component.ts │ │ │ └── nav-menu │ │ │ │ ├── nav-menu.component.css │ │ │ │ ├── nav-menu.component.html │ │ │ │ └── nav-menu.component.ts │ │ ├── assets │ │ │ └── .gitkeep │ │ ├── environments │ │ │ ├── environment.prod.ts │ │ │ └── environment.ts │ │ ├── index.html │ │ ├── karma.conf.js │ │ ├── main.ts │ │ ├── polyfills.ts │ │ ├── styles.css │ │ ├── test.ts │ │ ├── tsconfig.app.json │ │ ├── tsconfig.server.json │ │ ├── tsconfig.spec.json │ │ └── tslint.json │ ├── tsconfig.json │ ├── tslint.json │ └── update-npm.bat │ ├── Controllers │ ├── CitiesController.cs │ ├── CountriesController.cs │ ├── OidcConfigurationController.cs │ └── SeedController.cs │ ├── Data │ ├── ApiResult.cs │ ├── ApplicationDbContext.cs │ ├── CityDTO.cs │ ├── CountryDTO.cs │ ├── IQueryableExtensions.cs │ ├── Migrations │ │ ├── 20201008030948_Initial.Designer.cs │ │ ├── 20201008030948_Initial.cs │ │ ├── 20201112034035_Identity.Designer.cs │ │ ├── 20201112034035_Identity.cs │ │ └── ApplicationDbContextModelSnapshot.cs │ ├── Models │ │ ├── ApplicationUser.cs │ │ ├── City.cs │ │ └── Country.cs │ └── Source │ │ ├── license.txt │ │ └── worldcities.xlsx │ ├── Pages │ ├── Error.cshtml │ ├── Error.cshtml.cs │ ├── Shared │ │ ├── _Layout.cshtml │ │ ├── _LoginPartial.cshtml │ │ └── _ValidationScriptsPartial.cshtml │ ├── _ViewImports.cshtml │ └── _ViewStart.cshtml │ ├── Program.cs │ ├── ScaffoldingReadMe.txt │ ├── Services │ ├── MailKitEmailSender.cs │ ├── MailKitEmailSenderOptions.cs │ ├── SendGridEmailSender.cs │ └── SendGridEmailSenderOptions.cs │ ├── Startup.cs │ ├── WorldCities.csproj │ ├── appsettings.Development.json │ ├── appsettings.json │ └── wwwroot │ ├── favicon.ico │ └── img │ └── home.jpg ├── Chapter_11.sln ├── Chapter_11 ├── HealthCheck │ ├── .config │ │ └── dotnet-tools.json │ ├── .gitignore │ ├── ClientApp │ │ ├── .browserslistrc │ │ ├── .editorconfig │ │ ├── .gitignore │ │ ├── README.md │ │ ├── angular.json │ │ ├── e2e │ │ │ ├── protractor.conf.js │ │ │ ├── src │ │ │ │ ├── app.e2e-spec.ts │ │ │ │ └── app.po.ts │ │ │ └── tsconfig.e2e.json │ │ ├── ngsw-config.json │ │ ├── package-lock.json │ │ ├── package.json │ │ ├── src │ │ │ ├── app │ │ │ │ ├── app-routing.module.ts │ │ │ │ ├── app.component.html │ │ │ │ ├── app.component.ts │ │ │ │ ├── app.module.ts │ │ │ │ ├── app.server.module.ts │ │ │ │ ├── health-check │ │ │ │ │ ├── health-check.component.css │ │ │ │ │ ├── health-check.component.html │ │ │ │ │ └── health-check.component.ts │ │ │ │ ├── home │ │ │ │ │ ├── home.component.html │ │ │ │ │ └── home.component.ts │ │ │ │ └── nav-menu │ │ │ │ │ ├── nav-menu.component.css │ │ │ │ │ ├── nav-menu.component.html │ │ │ │ │ └── nav-menu.component.ts │ │ │ ├── assets │ │ │ │ ├── .gitkeep │ │ │ │ └── icons │ │ │ │ │ ├── icon-128x128.png │ │ │ │ │ ├── icon-144x144.png │ │ │ │ │ ├── icon-152x152.png │ │ │ │ │ ├── icon-192x192.png │ │ │ │ │ ├── icon-384x384.png │ │ │ │ │ ├── icon-512x512.png │ │ │ │ │ ├── icon-72x72.png │ │ │ │ │ └── icon-96x96.png │ │ │ ├── environments │ │ │ │ ├── environment.prod.ts │ │ │ │ └── environment.ts │ │ │ ├── index.html │ │ │ ├── karma.conf.js │ │ │ ├── main.ts │ │ │ ├── manifest.webmanifest │ │ │ ├── ng-connection-service │ │ │ │ ├── connection-service.module.ts │ │ │ │ ├── connection-service.service.spec.ts │ │ │ │ └── connection-service.service.ts │ │ │ ├── polyfills.ts │ │ │ ├── styles.css │ │ │ ├── test.ts │ │ │ ├── tsconfig.app.json │ │ │ ├── tsconfig.server.json │ │ │ ├── tsconfig.spec.json │ │ │ └── tslint.json │ │ ├── tsconfig.json │ │ ├── tslint.json │ │ └── update-npm.bat │ ├── Controllers │ │ └── _empty.txt │ ├── CustomHealthCheckOptions.cs │ ├── HealthCheck.csproj │ ├── ICMPHealthCheck.cs │ ├── Pages │ │ ├── Error.cshtml │ │ ├── Error.cshtml.cs │ │ └── _ViewImports.cshtml │ ├── Program.cs │ ├── Startup.cs │ ├── appsettings.Development.json │ ├── appsettings.json │ ├── libman.json │ └── wwwroot │ │ ├── favicon.ico │ │ ├── isOnline.txt │ │ └── test.html └── WorldCities │ ├── .gitignore │ ├── ClientApp │ ├── .browserslistrc │ ├── .editorconfig │ ├── .gitignore │ ├── README.md │ ├── angular.json │ ├── e2e │ │ ├── protractor.conf.js │ │ ├── src │ │ │ ├── app.e2e-spec.ts │ │ │ └── app.po.ts │ │ └── tsconfig.e2e.json │ ├── ngsw-config.json │ ├── package-lock.json │ ├── package.json │ ├── src │ │ ├── api-authorization │ │ │ ├── api-authorization.constants.ts │ │ │ ├── api-authorization.module.spec.ts │ │ │ ├── api-authorization.module.ts │ │ │ ├── authorize.guard.spec.ts │ │ │ ├── authorize.guard.ts │ │ │ ├── authorize.interceptor.spec.ts │ │ │ ├── authorize.interceptor.ts │ │ │ ├── authorize.service.spec.ts │ │ │ ├── authorize.service.ts │ │ │ ├── login-menu │ │ │ │ ├── login-menu.component.css │ │ │ │ ├── login-menu.component.html │ │ │ │ ├── login-menu.component.spec.ts │ │ │ │ └── login-menu.component.ts │ │ │ ├── login │ │ │ │ ├── login.component.css │ │ │ │ ├── login.component.html │ │ │ │ ├── login.component.spec.ts │ │ │ │ └── login.component.ts │ │ │ └── logout │ │ │ │ ├── logout.component.css │ │ │ │ ├── logout.component.html │ │ │ │ ├── logout.component.spec.ts │ │ │ │ └── logout.component.ts │ │ ├── app │ │ │ ├── angular-material.module.ts │ │ │ ├── app-routing.module.ts │ │ │ ├── app.component.html │ │ │ ├── app.component.ts │ │ │ ├── app.module.ts │ │ │ ├── app.server.module.ts │ │ │ ├── base.form.component.ts │ │ │ ├── base.service.ts │ │ │ ├── cities │ │ │ │ ├── cities.component.css │ │ │ │ ├── cities.component.html │ │ │ │ ├── cities.component.spec.ts │ │ │ │ ├── cities.component.ts │ │ │ │ ├── city-edit.component.css │ │ │ │ ├── city-edit.component.html │ │ │ │ ├── city-edit.component.ts │ │ │ │ ├── city.service.ts │ │ │ │ └── city.ts │ │ │ ├── countries │ │ │ │ ├── countries.component.css │ │ │ │ ├── countries.component.html │ │ │ │ ├── countries.component.ts │ │ │ │ ├── country-edit.component.css │ │ │ │ ├── country-edit.component.html │ │ │ │ ├── country-edit.component.ts │ │ │ │ ├── country.service.ts │ │ │ │ └── country.ts │ │ │ ├── home │ │ │ │ ├── home.component.css │ │ │ │ ├── home.component.html │ │ │ │ └── home.component.ts │ │ │ └── nav-menu │ │ │ │ ├── nav-menu.component.css │ │ │ │ ├── nav-menu.component.html │ │ │ │ └── nav-menu.component.ts │ │ ├── assets │ │ │ ├── .gitkeep │ │ │ └── icons │ │ │ │ ├── icon-128x128.png │ │ │ │ ├── icon-144x144.png │ │ │ │ ├── icon-152x152.png │ │ │ │ ├── icon-192x192.png │ │ │ │ ├── icon-384x384.png │ │ │ │ ├── icon-512x512.png │ │ │ │ ├── icon-72x72.png │ │ │ │ └── icon-96x96.png │ │ ├── environments │ │ │ ├── environment.prod.ts │ │ │ └── environment.ts │ │ ├── index.html │ │ ├── karma.conf.js │ │ ├── main.ts │ │ ├── manifest.webmanifest │ │ ├── ng-connection-service │ │ │ ├── connection-service.module.ts │ │ │ ├── connection-service.service.spec.ts │ │ │ └── connection-service.service.ts │ │ ├── polyfills.ts │ │ ├── styles.css │ │ ├── test.ts │ │ ├── tsconfig.app.json │ │ ├── tsconfig.server.json │ │ ├── tsconfig.spec.json │ │ └── tslint.json │ ├── tsconfig.json │ ├── tslint.json │ └── update-npm.bat │ ├── Controllers │ ├── CitiesController.cs │ ├── CountriesController.cs │ ├── OidcConfigurationController.cs │ └── SeedController.cs │ ├── Data │ ├── ApiResult.cs │ ├── ApplicationDbContext.cs │ ├── CityDTO.cs │ ├── CountryDTO.cs │ ├── IQueryableExtensions.cs │ ├── Migrations │ │ ├── 20201008030948_Initial.Designer.cs │ │ ├── 20201008030948_Initial.cs │ │ └── ApplicationDbContextModelSnapshot.cs │ ├── Models │ │ ├── ApplicationUser.cs │ │ ├── City.cs │ │ └── Country.cs │ └── Source │ │ ├── license.txt │ │ └── worldcities.xlsx │ ├── Pages │ ├── Error.cshtml │ ├── Error.cshtml.cs │ ├── Shared │ │ └── _LoginPartial.cshtml │ └── _ViewImports.cshtml │ ├── Program.cs │ ├── Services │ ├── MailKitEmailSender.cs │ ├── MailKitEmailSenderOptions.cs │ ├── SendGridEmailSender.cs │ └── SendGridEmailSenderOptions.cs │ ├── Startup.cs │ ├── WorldCities.csproj │ ├── appsettings.Development.json │ ├── appsettings.json │ ├── package-lock.json │ └── wwwroot │ ├── favicon.ico │ ├── img │ └── home.jpg │ └── isOnline.txt ├── Chapter_12.sln ├── Chapter_12 ├── HealthCheck │ ├── .config │ │ └── dotnet-tools.json │ ├── .gitignore │ ├── ClientApp │ │ ├── .browserslistrc │ │ ├── .editorconfig │ │ ├── .gitignore │ │ ├── README.md │ │ ├── angular.json │ │ ├── e2e │ │ │ ├── protractor.conf.js │ │ │ ├── src │ │ │ │ ├── app.e2e-spec.ts │ │ │ │ └── app.po.ts │ │ │ └── tsconfig.e2e.json │ │ ├── ngsw-config.json │ │ ├── package-lock.json │ │ ├── package.json │ │ ├── src │ │ │ ├── app │ │ │ │ ├── app-routing.module.ts │ │ │ │ ├── app.component.html │ │ │ │ ├── app.component.ts │ │ │ │ ├── app.module.ts │ │ │ │ ├── app.server.module.ts │ │ │ │ ├── health-check │ │ │ │ │ ├── health-check.component.css │ │ │ │ │ ├── health-check.component.html │ │ │ │ │ └── health-check.component.ts │ │ │ │ ├── home │ │ │ │ │ ├── home.component.html │ │ │ │ │ └── home.component.ts │ │ │ │ └── nav-menu │ │ │ │ │ ├── nav-menu.component.css │ │ │ │ │ ├── nav-menu.component.html │ │ │ │ │ └── nav-menu.component.ts │ │ │ ├── assets │ │ │ │ ├── .gitkeep │ │ │ │ └── icons │ │ │ │ │ ├── icon-128x128.png │ │ │ │ │ ├── icon-144x144.png │ │ │ │ │ ├── icon-152x152.png │ │ │ │ │ ├── icon-192x192.png │ │ │ │ │ ├── icon-384x384.png │ │ │ │ │ ├── icon-512x512.png │ │ │ │ │ ├── icon-72x72.png │ │ │ │ │ └── icon-96x96.png │ │ │ ├── environments │ │ │ │ ├── environment.prod.ts │ │ │ │ └── environment.ts │ │ │ ├── index.html │ │ │ ├── karma.conf.js │ │ │ ├── main.ts │ │ │ ├── manifest.webmanifest │ │ │ ├── ng-connection-service │ │ │ │ ├── connection-service.module.ts │ │ │ │ ├── connection-service.service.spec.ts │ │ │ │ └── connection-service.service.ts │ │ │ ├── polyfills.ts │ │ │ ├── styles.css │ │ │ ├── test.ts │ │ │ ├── tsconfig.app.json │ │ │ ├── tsconfig.server.json │ │ │ ├── tsconfig.spec.json │ │ │ └── tslint.json │ │ ├── tsconfig.json │ │ ├── tslint.json │ │ └── update-npm.bat │ ├── Controllers │ │ └── _empty.txt │ ├── CustomHealthCheckOptions.cs │ ├── HealthCheck.csproj │ ├── ICMPHealthCheck.cs │ ├── Pages │ │ ├── Error.cshtml │ │ ├── Error.cshtml.cs │ │ └── _ViewImports.cshtml │ ├── Program.cs │ ├── Properties │ │ └── ServiceDependencies │ │ │ └── HealthCheck2020 - Web Deploy │ │ │ └── profile.arm.json │ ├── Startup.cs │ ├── appsettings.Development.json │ ├── appsettings.json │ ├── libman.json │ └── wwwroot │ │ ├── favicon.ico │ │ ├── isOnline.txt │ │ └── test.html └── WorldCities │ ├── .gitignore │ ├── ClientApp │ ├── .browserslistrc │ ├── .editorconfig │ ├── .gitignore │ ├── README.md │ ├── angular.json │ ├── e2e │ │ ├── protractor.conf.js │ │ ├── src │ │ │ ├── app.e2e-spec.ts │ │ │ └── app.po.ts │ │ └── tsconfig.e2e.json │ ├── ngsw-config.json │ ├── package-lock.json │ ├── package.json │ ├── src │ │ ├── api-authorization │ │ │ ├── api-authorization.constants.ts │ │ │ ├── api-authorization.module.spec.ts │ │ │ ├── api-authorization.module.ts │ │ │ ├── authorize.guard.spec.ts │ │ │ ├── authorize.guard.ts │ │ │ ├── authorize.interceptor.spec.ts │ │ │ ├── authorize.interceptor.ts │ │ │ ├── authorize.service.spec.ts │ │ │ ├── authorize.service.ts │ │ │ ├── login-menu │ │ │ │ ├── login-menu.component.css │ │ │ │ ├── login-menu.component.html │ │ │ │ ├── login-menu.component.spec.ts │ │ │ │ └── login-menu.component.ts │ │ │ ├── login │ │ │ │ ├── login.component.css │ │ │ │ ├── login.component.html │ │ │ │ ├── login.component.spec.ts │ │ │ │ └── login.component.ts │ │ │ └── logout │ │ │ │ ├── logout.component.css │ │ │ │ ├── logout.component.html │ │ │ │ ├── logout.component.spec.ts │ │ │ │ └── logout.component.ts │ │ ├── app │ │ │ ├── angular-material.module.ts │ │ │ ├── app-routing.module.ts │ │ │ ├── app.component.html │ │ │ ├── app.component.ts │ │ │ ├── app.module.ts │ │ │ ├── app.server.module.ts │ │ │ ├── base.form.component.ts │ │ │ ├── base.service.ts │ │ │ ├── cities │ │ │ │ ├── cities.component.css │ │ │ │ ├── cities.component.html │ │ │ │ ├── cities.component.spec.ts │ │ │ │ ├── cities.component.ts │ │ │ │ ├── city-edit.component.css │ │ │ │ ├── city-edit.component.html │ │ │ │ ├── city-edit.component.ts │ │ │ │ ├── city.service.ts │ │ │ │ └── city.ts │ │ │ ├── countries │ │ │ │ ├── countries.component.css │ │ │ │ ├── countries.component.html │ │ │ │ ├── countries.component.ts │ │ │ │ ├── country-edit.component.css │ │ │ │ ├── country-edit.component.html │ │ │ │ ├── country-edit.component.ts │ │ │ │ ├── country.service.ts │ │ │ │ └── country.ts │ │ │ ├── home │ │ │ │ ├── home.component.css │ │ │ │ ├── home.component.html │ │ │ │ └── home.component.ts │ │ │ └── nav-menu │ │ │ │ ├── nav-menu.component.css │ │ │ │ ├── nav-menu.component.html │ │ │ │ └── nav-menu.component.ts │ │ ├── assets │ │ │ ├── .gitkeep │ │ │ └── icons │ │ │ │ ├── icon-128x128.png │ │ │ │ ├── icon-144x144.png │ │ │ │ ├── icon-152x152.png │ │ │ │ ├── icon-192x192.png │ │ │ │ ├── icon-384x384.png │ │ │ │ ├── icon-512x512.png │ │ │ │ ├── icon-72x72.png │ │ │ │ └── icon-96x96.png │ │ ├── environments │ │ │ ├── environment.prod.ts │ │ │ └── environment.ts │ │ ├── index.html │ │ ├── karma.conf.js │ │ ├── main.ts │ │ ├── manifest.webmanifest │ │ ├── ng-connection-service │ │ │ ├── connection-service.module.ts │ │ │ ├── connection-service.service.spec.ts │ │ │ └── connection-service.service.ts │ │ ├── polyfills.ts │ │ ├── styles.css │ │ ├── test.ts │ │ ├── tsconfig.app.json │ │ ├── tsconfig.server.json │ │ ├── tsconfig.spec.json │ │ └── tslint.json │ ├── tsconfig.json │ ├── tslint.json │ └── update-npm.bat │ ├── Controllers │ ├── CitiesController.cs │ ├── CountriesController.cs │ ├── OidcConfigurationController.cs │ └── SeedController.cs │ ├── Data │ ├── ApiResult.cs │ ├── ApplicationDbContext.cs │ ├── CityDTO.cs │ ├── CountryDTO.cs │ ├── IQueryableExtensions.cs │ ├── Migrations │ │ ├── 20201008030948_Initial.Designer.cs │ │ ├── 20201008030948_Initial.cs │ │ └── ApplicationDbContextModelSnapshot.cs │ ├── Models │ │ ├── ApplicationUser.cs │ │ ├── City.cs │ │ └── Country.cs │ └── Source │ │ ├── license.txt │ │ └── worldcities.xlsx │ ├── Pages │ ├── Error.cshtml │ ├── Error.cshtml.cs │ ├── Shared │ │ └── _LoginPartial.cshtml │ └── _ViewImports.cshtml │ ├── Program.cs │ ├── Services │ ├── MailKitEmailSender.cs │ ├── MailKitEmailSenderOptions.cs │ ├── SendGridEmailSender.cs │ └── SendGridEmailSenderOptions.cs │ ├── Startup.cs │ ├── WorldCities.csproj │ ├── _LinuxVM_ConfigFiles │ ├── kestrel-worldcities.service │ ├── nginx-worldcities.conf │ └── nginx.conf │ ├── appsettings.Development.json │ ├── appsettings.Production.json │ ├── appsettings.json │ └── wwwroot │ ├── favicon.ico │ ├── img │ └── home.jpg │ └── isOnline.txt ├── LICENSE ├── Readme.md └── errata.md /Chapter_01/HealthCheck/ClientApp/.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see http://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.md] 12 | max_line_length = off 13 | trim_trailing_whitespace = false 14 | -------------------------------------------------------------------------------- /Chapter_01/HealthCheck/ClientApp/browserslist: -------------------------------------------------------------------------------- 1 | # This file is currently used by autoprefixer to adjust CSS to support the below specified browsers 2 | # For additional information regarding the format and rule options, please see: 3 | # https://github.com/browserslist/browserslist#queries 4 | # For IE 9-11 support, please uncomment the last line of the file and adjust as needed 5 | > 0.5% 6 | last 2 versions 7 | Firefox ESR 8 | not dead 9 | # IE 9-11 -------------------------------------------------------------------------------- /Chapter_01/HealthCheck/ClientApp/e2e/src/app.e2e-spec.ts: -------------------------------------------------------------------------------- 1 | import { AppPage } from './app.po'; 2 | 3 | describe('App', () => { 4 | let page: AppPage; 5 | 6 | beforeEach(() => { 7 | page = new AppPage(); 8 | }); 9 | 10 | it('should display welcome message', () => { 11 | page.navigateTo(); 12 | expect(page.getMainHeading()).toEqual('Hello, world!'); 13 | }); 14 | }); 15 | -------------------------------------------------------------------------------- /Chapter_01/HealthCheck/ClientApp/e2e/src/app.po.ts: -------------------------------------------------------------------------------- 1 | import { browser, by, element } from 'protractor'; 2 | 3 | export class AppPage { 4 | navigateTo() { 5 | return browser.get('/'); 6 | } 7 | 8 | getMainHeading() { 9 | return element(by.css('app-root h1')).getText(); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /Chapter_01/HealthCheck/ClientApp/e2e/tsconfig.e2e.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out-tsc/app", 5 | "module": "commonjs", 6 | "target": "es5", 7 | "types": [ 8 | "jasmine", 9 | "jasminewd2", 10 | "node" 11 | ] 12 | } 13 | } -------------------------------------------------------------------------------- /Chapter_01/HealthCheck/ClientApp/src/app/app.component.html: -------------------------------------------------------------------------------- 1 |
2 |This is a simple example of an Angular component.
4 | 5 |Current count: {{ currentCount }}
6 | 7 | 8 | -------------------------------------------------------------------------------- /Chapter_01/HealthCheck/ClientApp/src/app/counter/counter.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-counter-component', 5 | templateUrl: './counter.component.html' 6 | }) 7 | export class CounterComponent { 8 | public currentCount = 0; 9 | 10 | public incrementCounter() { 11 | this.currentCount++; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /Chapter_01/HealthCheck/ClientApp/src/app/home/home.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-home', 5 | templateUrl: './home.component.html', 6 | }) 7 | export class HomeComponent { 8 | } 9 | -------------------------------------------------------------------------------- /Chapter_01/HealthCheck/ClientApp/src/app/nav-menu/nav-menu.component.css: -------------------------------------------------------------------------------- 1 | a.navbar-brand { 2 | white-space: normal; 3 | text-align: center; 4 | word-break: break-all; 5 | } 6 | 7 | html { 8 | font-size: 14px; 9 | } 10 | @media (min-width: 768px) { 11 | html { 12 | font-size: 16px; 13 | } 14 | } 15 | 16 | .box-shadow { 17 | box-shadow: 0 .25rem .75rem rgba(0, 0, 0, .05); 18 | } 19 | -------------------------------------------------------------------------------- /Chapter_01/HealthCheck/ClientApp/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PacktPublishing/ASP.NET-Core-5-and-Angular/24cd1eb3ae7c60957139d478472a0f5873778968/Chapter_01/HealthCheck/ClientApp/src/assets/.gitkeep -------------------------------------------------------------------------------- /Chapter_01/HealthCheck/ClientApp/src/environments/environment.prod.ts: -------------------------------------------------------------------------------- 1 | export const environment = { 2 | production: true 3 | }; 4 | -------------------------------------------------------------------------------- /Chapter_01/HealthCheck/ClientApp/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 |This is a simple example of an Angular component.
4 | 5 |Current count: {{ currentCount }}
6 | 7 | 8 | -------------------------------------------------------------------------------- /Chapter_01/HealthCheck/ClientApp_delete/src/app/counter/counter.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-counter-component', 5 | templateUrl: './counter.component.html' 6 | }) 7 | export class CounterComponent { 8 | public currentCount = 0; 9 | 10 | public incrementCounter() { 11 | this.currentCount++; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /Chapter_01/HealthCheck/ClientApp_delete/src/app/home/home.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-home', 5 | templateUrl: './home.component.html', 6 | }) 7 | export class HomeComponent { 8 | } 9 | -------------------------------------------------------------------------------- /Chapter_01/HealthCheck/ClientApp_delete/src/app/nav-menu/nav-menu.component.css: -------------------------------------------------------------------------------- 1 | a.navbar-brand { 2 | white-space: normal; 3 | text-align: center; 4 | word-break: break-all; 5 | } 6 | 7 | html { 8 | font-size: 14px; 9 | } 10 | @media (min-width: 768px) { 11 | html { 12 | font-size: 16px; 13 | } 14 | } 15 | 16 | .box-shadow { 17 | box-shadow: 0 .25rem .75rem rgba(0, 0, 0, .05); 18 | } 19 | -------------------------------------------------------------------------------- /Chapter_01/HealthCheck/ClientApp_delete/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PacktPublishing/ASP.NET-Core-5-and-Angular/24cd1eb3ae7c60957139d478472a0f5873778968/Chapter_01/HealthCheck/ClientApp_delete/src/assets/.gitkeep -------------------------------------------------------------------------------- /Chapter_01/HealthCheck/ClientApp_delete/src/environments/environment.prod.ts: -------------------------------------------------------------------------------- 1 | export const environment = { 2 | production: true 3 | }; 4 | -------------------------------------------------------------------------------- /Chapter_01/HealthCheck/ClientApp_delete/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 |This is what you get for messing up with ASP.NET and Angular.
4 | -------------------------------------------------------------------------------- /Chapter_02/HealthCheck/ClientApp/src/app/home/home.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-home', 5 | templateUrl: './home.component.html', 6 | }) 7 | export class HomeComponent { 8 | } 9 | -------------------------------------------------------------------------------- /Chapter_02/HealthCheck/ClientApp/src/app/nav-menu/nav-menu.component.css: -------------------------------------------------------------------------------- 1 | a.navbar-brand { 2 | white-space: normal; 3 | text-align: center; 4 | word-break: break-all; 5 | } 6 | 7 | html { 8 | font-size: 14px; 9 | } 10 | @media (min-width: 768px) { 11 | html { 12 | font-size: 16px; 13 | } 14 | } 15 | 16 | .box-shadow { 17 | box-shadow: 0 .25rem .75rem rgba(0, 0, 0, .05); 18 | } 19 | -------------------------------------------------------------------------------- /Chapter_02/HealthCheck/ClientApp/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PacktPublishing/ASP.NET-Core-5-and-Angular/24cd1eb3ae7c60957139d478472a0f5873778968/Chapter_02/HealthCheck/ClientApp/src/assets/.gitkeep -------------------------------------------------------------------------------- /Chapter_02/HealthCheck/ClientApp/src/environments/environment.prod.ts: -------------------------------------------------------------------------------- 1 | export const environment = { 2 | production: true 3 | }; 4 | -------------------------------------------------------------------------------- /Chapter_02/HealthCheck/ClientApp/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 |This is what you get for messing up with ASP.NET and Angular.
4 | -------------------------------------------------------------------------------- /Chapter_03/HealthCheck/ClientApp/src/app/home/home.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-home', 5 | templateUrl: './home.component.html', 6 | }) 7 | export class HomeComponent { 8 | } 9 | -------------------------------------------------------------------------------- /Chapter_03/HealthCheck/ClientApp/src/app/nav-menu/nav-menu.component.css: -------------------------------------------------------------------------------- 1 | a.navbar-brand { 2 | white-space: normal; 3 | text-align: center; 4 | word-break: break-all; 5 | } 6 | 7 | html { 8 | font-size: 14px; 9 | } 10 | @media (min-width: 768px) { 11 | html { 12 | font-size: 16px; 13 | } 14 | } 15 | 16 | .box-shadow { 17 | box-shadow: 0 .25rem .75rem rgba(0, 0, 0, .05); 18 | } 19 | -------------------------------------------------------------------------------- /Chapter_03/HealthCheck/ClientApp/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PacktPublishing/ASP.NET-Core-5-and-Angular/24cd1eb3ae7c60957139d478472a0f5873778968/Chapter_03/HealthCheck/ClientApp/src/assets/.gitkeep -------------------------------------------------------------------------------- /Chapter_03/HealthCheck/ClientApp/src/environments/environment.prod.ts: -------------------------------------------------------------------------------- 1 | export const environment = { 2 | production: true 3 | }; 4 | -------------------------------------------------------------------------------- /Chapter_03/HealthCheck/ClientApp/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 |3 | A sample web application to demonstrate 4 | how to interact with ASP.NET, Angular, 5 | Entity Framework Core and a SQL Database. 6 |
7 | 8 |3 | A sample web application to demonstrate 4 | how to interact with ASP.NET, Angular, 5 | Entity Framework Core and a SQL Database. 6 |
7 | 8 |3 | A sample web application to demonstrate 4 | how to interact with ASP.NET, Angular, 5 | Entity Framework Core and a SQL Database. 6 |
7 | 8 |3 | A sample web application to demonstrate 4 | how to interact with ASP.NET, Angular, 5 | Entity Framework Core and a SQL Database. 6 |
7 | 8 |3 | A sample web application to demonstrate 4 | how to interact with ASP.NET, Angular, 5 | Entity Framework Core and a SQL Database. 6 |
7 | 8 |3 | A sample web application to demonstrate 4 | how to interact with ASP.NET, Angular, 5 | Entity Framework Core and a SQL Database. 6 |
7 | 8 |{{ message | async }}
-------------------------------------------------------------------------------- /Chapter_10/AuthSample/ClientApp/src/api-authorization/logout/logout.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PacktPublishing/ASP.NET-Core-5-and-Angular/24cd1eb3ae7c60957139d478472a0f5873778968/Chapter_10/AuthSample/ClientApp/src/api-authorization/logout/logout.component.css -------------------------------------------------------------------------------- /Chapter_10/AuthSample/ClientApp/src/api-authorization/logout/logout.component.html: -------------------------------------------------------------------------------- 1 |{{ message | async }}
-------------------------------------------------------------------------------- /Chapter_10/AuthSample/ClientApp/src/app/app.component.html: -------------------------------------------------------------------------------- 1 | 2 |This is a simple example of an Angular component.
4 | 5 |Current count: {{ currentCount }}
6 | 7 | 8 | -------------------------------------------------------------------------------- /Chapter_10/AuthSample/ClientApp/src/app/counter/counter.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-counter-component', 5 | templateUrl: './counter.component.html' 6 | }) 7 | export class CounterComponent { 8 | public currentCount = 0; 9 | 10 | public incrementCounter() { 11 | this.currentCount++; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /Chapter_10/AuthSample/ClientApp/src/app/home/home.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-home', 5 | templateUrl: './home.component.html', 6 | }) 7 | export class HomeComponent { 8 | } 9 | -------------------------------------------------------------------------------- /Chapter_10/AuthSample/ClientApp/src/app/nav-menu/nav-menu.component.css: -------------------------------------------------------------------------------- 1 | a.navbar-brand { 2 | white-space: normal; 3 | text-align: center; 4 | word-break: break-all; 5 | } 6 | 7 | html { 8 | font-size: 14px; 9 | } 10 | @media (min-width: 768px) { 11 | html { 12 | font-size: 16px; 13 | } 14 | } 15 | 16 | .box-shadow { 17 | box-shadow: 0 .25rem .75rem rgba(0, 0, 0, .05); 18 | } 19 | -------------------------------------------------------------------------------- /Chapter_10/AuthSample/ClientApp/src/app/nav-menu/nav-menu.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-nav-menu', 5 | templateUrl: './nav-menu.component.html', 6 | styleUrls: ['./nav-menu.component.css'] 7 | }) 8 | export class NavMenuComponent { 9 | isExpanded = false; 10 | 11 | collapse() { 12 | this.isExpanded = false; 13 | } 14 | 15 | toggle() { 16 | this.isExpanded = !this.isExpanded; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /Chapter_10/AuthSample/ClientApp/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PacktPublishing/ASP.NET-Core-5-and-Angular/24cd1eb3ae7c60957139d478472a0f5873778968/Chapter_10/AuthSample/ClientApp/src/assets/.gitkeep -------------------------------------------------------------------------------- /Chapter_10/AuthSample/ClientApp/src/environments/environment.prod.ts: -------------------------------------------------------------------------------- 1 | export const environment = { 2 | production: true 3 | }; 4 | -------------------------------------------------------------------------------- /Chapter_10/AuthSample/ClientApp/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 |You do not have access to this resource.
10 |9 | Please check your email to reset your password. 10 |
11 | 12 | -------------------------------------------------------------------------------- /Chapter_10/WorldCities/Areas/Identity/Pages/Account/Lockout.cshtml: -------------------------------------------------------------------------------- 1 | @page 2 | @model LockoutModel 3 | @{ 4 | ViewData["Title"] = "Locked out"; 5 | } 6 | 7 |This account has been locked out, please try again later.
10 |9 | Your password has been reset. Please click here to log in. 10 |
11 | -------------------------------------------------------------------------------- /Chapter_10/WorldCities/Areas/Identity/Pages/Account/_ViewImports.cshtml: -------------------------------------------------------------------------------- 1 | @using WorldCities.Areas.Identity.Pages.Account -------------------------------------------------------------------------------- /Chapter_10/WorldCities/Areas/Identity/Pages/_ViewImports.cshtml: -------------------------------------------------------------------------------- 1 | @using Microsoft.AspNetCore.Identity 2 | @using WorldCities.Areas.Identity 3 | @using WorldCities.Areas.Identity.Pages 4 | @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers 5 | @using WorldCities.Data.Models 6 | -------------------------------------------------------------------------------- /Chapter_10/WorldCities/Areas/Identity/Pages/_ViewStart.cshtml: -------------------------------------------------------------------------------- 1 | 2 | @{ 3 | Layout = "/Pages/Shared/_Layout.cshtml"; 4 | } 5 | -------------------------------------------------------------------------------- /Chapter_10/WorldCities/ClientApp/.browserslistrc: -------------------------------------------------------------------------------- 1 | # This file is currently used by autoprefixer to adjust CSS to support the below specified browsers 2 | # For additional information regarding the format and rule options, please see: 3 | # https://github.com/browserslist/browserslist#queries 4 | # For IE 9-11 support, please uncomment the last line of the file and adjust as needed 5 | > 0.5% 6 | last 2 versions 7 | Firefox ESR 8 | not dead 9 | # IE 9-11 -------------------------------------------------------------------------------- /Chapter_10/WorldCities/ClientApp/.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see http://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.md] 12 | max_line_length = off 13 | trim_trailing_whitespace = false 14 | -------------------------------------------------------------------------------- /Chapter_10/WorldCities/ClientApp/e2e/src/app.e2e-spec.ts: -------------------------------------------------------------------------------- 1 | import { AppPage } from './app.po'; 2 | 3 | describe('App', () => { 4 | let page: AppPage; 5 | 6 | beforeEach(() => { 7 | page = new AppPage(); 8 | }); 9 | 10 | it('should display welcome message', () => { 11 | page.navigateTo(); 12 | expect(page.getMainHeading()).toEqual('Hello, world!'); 13 | }); 14 | }); 15 | -------------------------------------------------------------------------------- /Chapter_10/WorldCities/ClientApp/e2e/src/app.po.ts: -------------------------------------------------------------------------------- 1 | import { browser, by, element } from 'protractor'; 2 | 3 | export class AppPage { 4 | navigateTo() { 5 | return browser.get('/'); 6 | } 7 | 8 | getMainHeading() { 9 | return element(by.css('app-root h1')).getText(); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /Chapter_10/WorldCities/ClientApp/e2e/tsconfig.e2e.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out-tsc/app", 5 | "module": "commonjs", 6 | "target": "es5", 7 | "types": [ 8 | "jasmine", 9 | "jasminewd2", 10 | "node" 11 | ] 12 | } 13 | } -------------------------------------------------------------------------------- /Chapter_10/WorldCities/ClientApp/src/api-authorization/login-menu/login-menu.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PacktPublishing/ASP.NET-Core-5-and-Angular/24cd1eb3ae7c60957139d478472a0f5873778968/Chapter_10/WorldCities/ClientApp/src/api-authorization/login-menu/login-menu.component.css -------------------------------------------------------------------------------- /Chapter_10/WorldCities/ClientApp/src/api-authorization/login/login.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PacktPublishing/ASP.NET-Core-5-and-Angular/24cd1eb3ae7c60957139d478472a0f5873778968/Chapter_10/WorldCities/ClientApp/src/api-authorization/login/login.component.css -------------------------------------------------------------------------------- /Chapter_10/WorldCities/ClientApp/src/api-authorization/login/login.component.html: -------------------------------------------------------------------------------- 1 |{{ message | async }}
-------------------------------------------------------------------------------- /Chapter_10/WorldCities/ClientApp/src/api-authorization/logout/logout.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PacktPublishing/ASP.NET-Core-5-and-Angular/24cd1eb3ae7c60957139d478472a0f5873778968/Chapter_10/WorldCities/ClientApp/src/api-authorization/logout/logout.component.css -------------------------------------------------------------------------------- /Chapter_10/WorldCities/ClientApp/src/api-authorization/logout/logout.component.html: -------------------------------------------------------------------------------- 1 |{{ message | async }}
-------------------------------------------------------------------------------- /Chapter_10/WorldCities/ClientApp/src/app/app.component.html: -------------------------------------------------------------------------------- 1 | 2 |3 | A sample web application to demonstrate 4 | how to interact with ASP.NET, Angular, 5 | Entity Framework Core and a SQL Database. 6 |
7 | 8 |{{ message | async }}
-------------------------------------------------------------------------------- /Chapter_11/WorldCities/ClientApp/src/api-authorization/logout/logout.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PacktPublishing/ASP.NET-Core-5-and-Angular/24cd1eb3ae7c60957139d478472a0f5873778968/Chapter_11/WorldCities/ClientApp/src/api-authorization/logout/logout.component.css -------------------------------------------------------------------------------- /Chapter_11/WorldCities/ClientApp/src/api-authorization/logout/logout.component.html: -------------------------------------------------------------------------------- 1 |{{ message | async }}
-------------------------------------------------------------------------------- /Chapter_11/WorldCities/ClientApp/src/app/app.server.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { ServerModule } from '@angular/platform-server'; 3 | import { AppComponent } from './app.component'; 4 | import { AppModule } from './app.module'; 5 | 6 | @NgModule({ 7 | imports: [AppModule, ServerModule], 8 | bootstrap: [AppComponent] 9 | }) 10 | export class AppServerModule { } 11 | -------------------------------------------------------------------------------- /Chapter_11/WorldCities/ClientApp/src/app/cities/cities.component.css: -------------------------------------------------------------------------------- 1 | table { 2 | width: 100%; 3 | } 4 | 5 | .mat-form-field { 6 | font-size: 14px; 7 | width: 100%; 8 | } 9 | -------------------------------------------------------------------------------- /Chapter_11/WorldCities/ClientApp/src/app/cities/city-edit.component.css: -------------------------------------------------------------------------------- 1 | input.ng-valid { 2 | border-left: 5px solid green; 3 | } 4 | 5 | input.ng-invalid.ng-dirty, 6 | input.ng-invalid.ng-touched { 7 | border-left: 5px solid red; 8 | } 9 | 10 | input.ng-valid ~ .valid-feedback, 11 | input.ng-invalid ~ .invalid-feedback { 12 | display: block; 13 | } 14 | -------------------------------------------------------------------------------- /Chapter_11/WorldCities/ClientApp/src/app/cities/city.ts: -------------------------------------------------------------------------------- 1 | export interface City { 2 | id: number; 3 | name: string; 4 | lat: number; 5 | lon: number; 6 | countryId: number; 7 | countryName: string; 8 | } 9 | -------------------------------------------------------------------------------- /Chapter_11/WorldCities/ClientApp/src/app/countries/countries.component.css: -------------------------------------------------------------------------------- 1 | table { 2 | width: 100%; 3 | } 4 | 5 | .mat-form-field { 6 | font-size: 14px; 7 | width: 100%; 8 | } 9 | -------------------------------------------------------------------------------- /Chapter_11/WorldCities/ClientApp/src/app/countries/country-edit.component.css: -------------------------------------------------------------------------------- 1 | input.ng-valid { 2 | border-left: 5px solid green; 3 | } 4 | 5 | input.ng-invalid.ng-dirty, 6 | input.ng-invalid.ng-touched { 7 | border-left: 5px solid red; 8 | } 9 | 10 | input.ng-valid ~ .valid-feedback, 11 | input.ng-invalid ~ .invalid-feedback { 12 | display: block; 13 | } 14 | -------------------------------------------------------------------------------- /Chapter_11/WorldCities/ClientApp/src/app/countries/country.ts: -------------------------------------------------------------------------------- 1 | export interface Country { 2 | id: number; 3 | name: string; 4 | iso2: string; 5 | iso3: string; 6 | totCities: number; 7 | } 8 | -------------------------------------------------------------------------------- /Chapter_11/WorldCities/ClientApp/src/app/home/home.component.css: -------------------------------------------------------------------------------- 1 | 2 | .home-cover { 3 | display:block; 4 | margin: auto; 5 | max-width:100%; 6 | } 7 | -------------------------------------------------------------------------------- /Chapter_11/WorldCities/ClientApp/src/app/home/home.component.html: -------------------------------------------------------------------------------- 1 | 2 |3 | A sample web application to demonstrate 4 | how to interact with ASP.NET, Angular, 5 | Entity Framework Core and a SQL Database. 6 |
7 | 8 |{{ message | async }}
-------------------------------------------------------------------------------- /Chapter_12/WorldCities/ClientApp/src/api-authorization/logout/logout.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PacktPublishing/ASP.NET-Core-5-and-Angular/24cd1eb3ae7c60957139d478472a0f5873778968/Chapter_12/WorldCities/ClientApp/src/api-authorization/logout/logout.component.css -------------------------------------------------------------------------------- /Chapter_12/WorldCities/ClientApp/src/api-authorization/logout/logout.component.html: -------------------------------------------------------------------------------- 1 |{{ message | async }}
-------------------------------------------------------------------------------- /Chapter_12/WorldCities/ClientApp/src/app/app.server.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { ServerModule } from '@angular/platform-server'; 3 | import { AppComponent } from './app.component'; 4 | import { AppModule } from './app.module'; 5 | 6 | @NgModule({ 7 | imports: [AppModule, ServerModule], 8 | bootstrap: [AppComponent] 9 | }) 10 | export class AppServerModule { } 11 | -------------------------------------------------------------------------------- /Chapter_12/WorldCities/ClientApp/src/app/cities/cities.component.css: -------------------------------------------------------------------------------- 1 | table { 2 | width: 100%; 3 | } 4 | 5 | .mat-form-field { 6 | font-size: 14px; 7 | width: 100%; 8 | } 9 | -------------------------------------------------------------------------------- /Chapter_12/WorldCities/ClientApp/src/app/cities/city-edit.component.css: -------------------------------------------------------------------------------- 1 | input.ng-valid { 2 | border-left: 5px solid green; 3 | } 4 | 5 | input.ng-invalid.ng-dirty, 6 | input.ng-invalid.ng-touched { 7 | border-left: 5px solid red; 8 | } 9 | 10 | input.ng-valid ~ .valid-feedback, 11 | input.ng-invalid ~ .invalid-feedback { 12 | display: block; 13 | } 14 | -------------------------------------------------------------------------------- /Chapter_12/WorldCities/ClientApp/src/app/cities/city.ts: -------------------------------------------------------------------------------- 1 | export interface City { 2 | id: number; 3 | name: string; 4 | lat: number; 5 | lon: number; 6 | countryId: number; 7 | countryName: string; 8 | } 9 | -------------------------------------------------------------------------------- /Chapter_12/WorldCities/ClientApp/src/app/countries/countries.component.css: -------------------------------------------------------------------------------- 1 | table { 2 | width: 100%; 3 | } 4 | 5 | .mat-form-field { 6 | font-size: 14px; 7 | width: 100%; 8 | } 9 | -------------------------------------------------------------------------------- /Chapter_12/WorldCities/ClientApp/src/app/countries/country-edit.component.css: -------------------------------------------------------------------------------- 1 | input.ng-valid { 2 | border-left: 5px solid green; 3 | } 4 | 5 | input.ng-invalid.ng-dirty, 6 | input.ng-invalid.ng-touched { 7 | border-left: 5px solid red; 8 | } 9 | 10 | input.ng-valid ~ .valid-feedback, 11 | input.ng-invalid ~ .invalid-feedback { 12 | display: block; 13 | } 14 | -------------------------------------------------------------------------------- /Chapter_12/WorldCities/ClientApp/src/app/countries/country.ts: -------------------------------------------------------------------------------- 1 | export interface Country { 2 | id: number; 3 | name: string; 4 | iso2: string; 5 | iso3: string; 6 | totCities: number; 7 | } 8 | -------------------------------------------------------------------------------- /Chapter_12/WorldCities/ClientApp/src/app/home/home.component.css: -------------------------------------------------------------------------------- 1 | 2 | .home-cover { 3 | display:block; 4 | margin: auto; 5 | max-width:100%; 6 | } 7 | -------------------------------------------------------------------------------- /Chapter_12/WorldCities/ClientApp/src/app/home/home.component.html: -------------------------------------------------------------------------------- 1 | 2 |3 | A sample web application to demonstrate 4 | how to interact with ASP.NET, Angular, 5 | Entity Framework Core and a SQL Database. 6 |
7 | 8 |