> explicitly.')
+ process.exit(-1);
+}
+
+const certFilePath = path.join(baseFolder, `${certificateName}.pem`);
+const keyFilePath = path.join(baseFolder, `${certificateName}.key`);
+
+if (!fs.existsSync(baseFolder)) {
+ fs.mkdirSync(baseFolder, { recursive: true });
+}
+
+if (!fs.existsSync(certFilePath) || !fs.existsSync(keyFilePath)) {
+ spawn('dotnet', [
+ 'dev-certs',
+ 'https',
+ '--export-path',
+ certFilePath,
+ '--format',
+ 'Pem',
+ '--no-password',
+ ], { stdio: 'inherit', })
+ .on('exit', (code) => process.exit(code));
+}
\ No newline at end of file
diff --git a/AwesomeMicroservices/awesomemicroservices.client/awesomemicroservices.client.esproj b/AwesomeMicroservices/awesomemicroservices.client/awesomemicroservices.client.esproj
new file mode 100644
index 0000000..af345cb
--- /dev/null
+++ b/AwesomeMicroservices/awesomemicroservices.client/awesomemicroservices.client.esproj
@@ -0,0 +1,10 @@
+
+
+ npm start
+ Jasmine
+
+ false
+
+ $(MSBuildProjectDirectory)\dist\awesomemicroservices.client\browser\
+
+
\ No newline at end of file
diff --git a/AwesomeMicroservices/awesomemicroservices.client/karma.conf.js b/AwesomeMicroservices/awesomemicroservices.client/karma.conf.js
new file mode 100644
index 0000000..efe6efe
--- /dev/null
+++ b/AwesomeMicroservices/awesomemicroservices.client/karma.conf.js
@@ -0,0 +1,44 @@
+module.exports = function (config) {
+ config.set({
+ basePath: '',
+ frameworks: ['jasmine', '@angular-devkit/build-angular'],
+ plugins: [
+ require('karma-jasmine'),
+ require('karma-chrome-launcher'),
+ require('karma-jasmine-html-reporter'),
+ require('karma-coverage'),
+ require('@angular-devkit/build-angular/plugins/karma')
+ ],
+ client: {
+ jasmine: {
+ // you can add configuration options for Jasmine here
+ // the possible options are listed at https://jasmine.github.io/api/edge/Configuration.html
+ // for example, you can disable the random execution with `random: false`
+ // or set a specific seed with `seed: 4321`
+ },
+ clearContext: false // leave Jasmine Spec Runner output visible in browser
+ },
+ jasmineHtmlReporter: {
+ suppressAll: true // removes the duplicated traces
+ },
+ coverageReporter: {
+ dir: require('path').join(__dirname, './coverage/'),
+ subdir: '.',
+ reporters: [
+ { type: 'html' },
+ { type: 'text-summary' }
+ ]
+ },
+ reporters: ['progress', 'kjhtml'],
+ port: 9876,
+ colors: true,
+ logLevel: config.LOG_INFO,
+ autoWatch: true,
+ browsers: ['Chrome'],
+ singleRun: false,
+ restartOnFileChange: true,
+ listenAddress: 'localhost',
+ hostname: 'localhost'
+ });
+};
+
diff --git a/AwesomeMicroservices/awesomemicroservices.client/package.json b/AwesomeMicroservices/awesomemicroservices.client/package.json
new file mode 100644
index 0000000..72d8571
--- /dev/null
+++ b/AwesomeMicroservices/awesomemicroservices.client/package.json
@@ -0,0 +1,43 @@
+{
+ "name": "awesomemicroservices.client",
+ "version": "0.0.0",
+ "scripts": {
+ "ng": "ng",
+ "start": "run-script-os",
+ "build": "ng build",
+ "watch": "ng build --watch --configuration development",
+ "test": "ng test",
+ "prestart": "node aspnetcore-https",
+ "start:windows": "ng serve --ssl --ssl-cert \"%APPDATA%\\ASP.NET\\https\\%npm_package_name%.pem\" --ssl-key \"%APPDATA%\\ASP.NET\\https\\%npm_package_name%.key\" --host=127.0.0.1",
+ "start:default": "ng serve --ssl --ssl-cert \"$HOME/.aspnet/https/${npm_package_name}.pem\" --ssl-key \"$HOME/.aspnet/https/${npm_package_name}.key\" --host=127.0.0.1"
+ },
+ "private": true,
+ "dependencies": {
+ "@angular/animations": "^18.2.0",
+ "@angular/common": "^18.2.0",
+ "@angular/compiler": "^18.2.0",
+ "@angular/core": "^18.2.0",
+ "@angular/forms": "^18.2.0",
+ "@angular/platform-browser": "^18.2.0",
+ "@angular/platform-browser-dynamic": "^18.2.0",
+ "@angular/router": "^18.2.0",
+ "rxjs": "~7.8.0",
+ "tslib": "^2.3.0",
+ "zone.js": "~0.14.10",
+ "jest-editor-support": "*",
+ "run-script-os": "*"
+ },
+ "devDependencies": {
+ "@angular-devkit/build-angular": "^18.2.8",
+ "@angular/cli": "^18.2.8",
+ "@angular/compiler-cli": "^18.2.0",
+ "@types/jasmine": "~5.1.0",
+ "jasmine-core": "~5.2.0",
+ "karma": "~6.4.0",
+ "karma-chrome-launcher": "~3.2.0",
+ "karma-coverage": "~2.2.0",
+ "karma-jasmine": "~5.1.0",
+ "karma-jasmine-html-reporter": "~2.1.0",
+ "typescript": "~5.5.2"
+ }
+}
\ No newline at end of file
diff --git a/AwesomeMicroservices/awesomemicroservices.client/public/favicon.ico b/AwesomeMicroservices/awesomemicroservices.client/public/favicon.ico
new file mode 100644
index 0000000..57614f9
Binary files /dev/null and b/AwesomeMicroservices/awesomemicroservices.client/public/favicon.ico differ
diff --git a/AwesomeMicroservices/awesomemicroservices.client/src/app/app-routing.module.ts b/AwesomeMicroservices/awesomemicroservices.client/src/app/app-routing.module.ts
new file mode 100644
index 0000000..0297262
--- /dev/null
+++ b/AwesomeMicroservices/awesomemicroservices.client/src/app/app-routing.module.ts
@@ -0,0 +1,10 @@
+import { NgModule } from '@angular/core';
+import { RouterModule, Routes } from '@angular/router';
+
+const routes: Routes = [];
+
+@NgModule({
+ imports: [RouterModule.forRoot(routes)],
+ exports: [RouterModule]
+})
+export class AppRoutingModule { }
diff --git a/AwesomeMicroservices/awesomemicroservices.client/src/app/app.component.css b/AwesomeMicroservices/awesomemicroservices.client/src/app/app.component.css
new file mode 100644
index 0000000..43fba20
--- /dev/null
+++ b/AwesomeMicroservices/awesomemicroservices.client/src/app/app.component.css
@@ -0,0 +1,14 @@
+:host {
+ max-width: 1280px;
+ padding: 2rem;
+ text-align: center;
+}
+
+th, td {
+ padding-left: 1rem;
+ padding-right: 1rem;
+}
+
+table {
+ margin: 0 auto;
+}
diff --git a/AwesomeMicroservices/awesomemicroservices.client/src/app/app.component.html b/AwesomeMicroservices/awesomemicroservices.client/src/app/app.component.html
new file mode 100644
index 0000000..4f4058c
--- /dev/null
+++ b/AwesomeMicroservices/awesomemicroservices.client/src/app/app.component.html
@@ -0,0 +1,24 @@
+Weather forecast
+
+This component demonstrates fetching data from the server.
+
+Loading... Please refresh once the ASP.NET backend has started. See https://aka.ms/jspsintegrationangular for more details.
+
+
+
+
+ Date |
+ Temp. (C) |
+ Temp. (F) |
+ Summary |
+
+
+
+
+ {{ forecast.date }} |
+ {{ forecast.temperatureC }} |
+ {{ forecast.temperatureF }} |
+ {{ forecast.summary }} |
+
+
+
diff --git a/AwesomeMicroservices/awesomemicroservices.client/src/app/app.component.spec.ts b/AwesomeMicroservices/awesomemicroservices.client/src/app/app.component.spec.ts
new file mode 100644
index 0000000..64dc497
--- /dev/null
+++ b/AwesomeMicroservices/awesomemicroservices.client/src/app/app.component.spec.ts
@@ -0,0 +1,45 @@
+import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { AppComponent } from './app.component';
+
+describe('AppComponent', () => {
+ let component: AppComponent;
+ let fixture: ComponentFixture;
+ let httpMock: HttpTestingController;
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ declarations: [AppComponent],
+ imports: [HttpClientTestingModule]
+ }).compileComponents();
+ });
+
+ beforeEach(() => {
+ fixture = TestBed.createComponent(AppComponent);
+ component = fixture.componentInstance;
+ httpMock = TestBed.inject(HttpTestingController);
+ });
+
+ afterEach(() => {
+ httpMock.verify();
+ });
+
+ it('should create the app', () => {
+ expect(component).toBeTruthy();
+ });
+
+ it('should retrieve weather forecasts from the server', () => {
+ const mockForecasts = [
+ { date: '2021-10-01', temperatureC: 20, temperatureF: 68, summary: 'Mild' },
+ { date: '2021-10-02', temperatureC: 25, temperatureF: 77, summary: 'Warm' }
+ ];
+
+ component.ngOnInit();
+
+ const req = httpMock.expectOne('/weatherforecast');
+ expect(req.request.method).toEqual('GET');
+ req.flush(mockForecasts);
+
+ expect(component.forecasts).toEqual(mockForecasts);
+ });
+});
\ No newline at end of file
diff --git a/AwesomeMicroservices/awesomemicroservices.client/src/app/app.component.ts b/AwesomeMicroservices/awesomemicroservices.client/src/app/app.component.ts
new file mode 100644
index 0000000..c9ba946
--- /dev/null
+++ b/AwesomeMicroservices/awesomemicroservices.client/src/app/app.component.ts
@@ -0,0 +1,37 @@
+import { HttpClient } from '@angular/common/http';
+import { Component, OnInit } from '@angular/core';
+
+interface WeatherForecast {
+ date: string;
+ temperatureC: number;
+ temperatureF: number;
+ summary: string;
+}
+
+@Component({
+ selector: 'app-root',
+ templateUrl: './app.component.html',
+ styleUrl: './app.component.css'
+})
+export class AppComponent implements OnInit {
+ public forecasts: WeatherForecast[] = [];
+
+ constructor(private http: HttpClient) {}
+
+ ngOnInit() {
+ this.getForecasts();
+ }
+
+ getForecasts() {
+ this.http.get('/weatherforecast').subscribe(
+ (result) => {
+ this.forecasts = result;
+ },
+ (error) => {
+ console.error(error);
+ }
+ );
+ }
+
+ title = 'awesomemicroservices.client';
+}
diff --git a/AwesomeMicroservices/awesomemicroservices.client/src/app/app.module.ts b/AwesomeMicroservices/awesomemicroservices.client/src/app/app.module.ts
new file mode 100644
index 0000000..0192642
--- /dev/null
+++ b/AwesomeMicroservices/awesomemicroservices.client/src/app/app.module.ts
@@ -0,0 +1,19 @@
+import { HttpClientModule } from '@angular/common/http';
+import { NgModule } from '@angular/core';
+import { BrowserModule } from '@angular/platform-browser';
+
+import { AppRoutingModule } from './app-routing.module';
+import { AppComponent } from './app.component';
+
+@NgModule({
+ declarations: [
+ AppComponent
+ ],
+ imports: [
+ BrowserModule, HttpClientModule,
+ AppRoutingModule
+ ],
+ providers: [],
+ bootstrap: [AppComponent]
+})
+export class AppModule { }
diff --git a/AwesomeMicroservices/awesomemicroservices.client/src/index.html b/AwesomeMicroservices/awesomemicroservices.client/src/index.html
new file mode 100644
index 0000000..c27f437
--- /dev/null
+++ b/AwesomeMicroservices/awesomemicroservices.client/src/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+ AwesomemicroservicesClient
+
+
+
+
+
+
+
+
diff --git a/AwesomeMicroservices/awesomemicroservices.client/src/main.ts b/AwesomeMicroservices/awesomemicroservices.client/src/main.ts
new file mode 100644
index 0000000..1d335a6
--- /dev/null
+++ b/AwesomeMicroservices/awesomemicroservices.client/src/main.ts
@@ -0,0 +1,8 @@
+import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
+
+import { AppModule } from './app/app.module';
+
+platformBrowserDynamic().bootstrapModule(AppModule, {
+ ngZoneEventCoalescing: true
+})
+ .catch(err => console.error(err));
diff --git a/AwesomeMicroservices/awesomemicroservices.client/src/proxy.conf.js b/AwesomeMicroservices/awesomemicroservices.client/src/proxy.conf.js
new file mode 100644
index 0000000..2e255a2
--- /dev/null
+++ b/AwesomeMicroservices/awesomemicroservices.client/src/proxy.conf.js
@@ -0,0 +1,16 @@
+const { env } = require('process');
+
+const target = env.ASPNETCORE_HTTPS_PORT ? `https://localhost:${env.ASPNETCORE_HTTPS_PORT}` :
+ env.ASPNETCORE_URLS ? env.ASPNETCORE_URLS.split(';')[0] : 'https://localhost:7223';
+
+const PROXY_CONFIG = [
+ {
+ context: [
+ "/weatherforecast",
+ ],
+ target,
+ secure: false
+ }
+]
+
+module.exports = PROXY_CONFIG;
diff --git a/AwesomeMicroservices/awesomemicroservices.client/src/styles.css b/AwesomeMicroservices/awesomemicroservices.client/src/styles.css
new file mode 100644
index 0000000..90d4ee0
--- /dev/null
+++ b/AwesomeMicroservices/awesomemicroservices.client/src/styles.css
@@ -0,0 +1 @@
+/* You can add global styles to this file, and also import other style files */
diff --git a/AwesomeMicroservices/awesomemicroservices.client/tsconfig.app.json b/AwesomeMicroservices/awesomemicroservices.client/tsconfig.app.json
new file mode 100644
index 0000000..3775b37
--- /dev/null
+++ b/AwesomeMicroservices/awesomemicroservices.client/tsconfig.app.json
@@ -0,0 +1,15 @@
+/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */
+/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */
+{
+ "extends": "./tsconfig.json",
+ "compilerOptions": {
+ "outDir": "./out-tsc/app",
+ "types": []
+ },
+ "files": [
+ "src/main.ts"
+ ],
+ "include": [
+ "src/**/*.d.ts"
+ ]
+}
diff --git a/AwesomeMicroservices/awesomemicroservices.client/tsconfig.json b/AwesomeMicroservices/awesomemicroservices.client/tsconfig.json
new file mode 100644
index 0000000..a8bb65b
--- /dev/null
+++ b/AwesomeMicroservices/awesomemicroservices.client/tsconfig.json
@@ -0,0 +1,33 @@
+/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */
+/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */
+{
+ "compileOnSave": false,
+ "compilerOptions": {
+ "outDir": "./dist/out-tsc",
+ "strict": true,
+ "noImplicitOverride": true,
+ "noPropertyAccessFromIndexSignature": true,
+ "noImplicitReturns": true,
+ "noFallthroughCasesInSwitch": true,
+ "skipLibCheck": true,
+ "isolatedModules": true,
+ "esModuleInterop": true,
+ "sourceMap": true,
+ "declaration": false,
+ "experimentalDecorators": true,
+ "moduleResolution": "bundler",
+ "importHelpers": true,
+ "target": "ES2022",
+ "module": "ES2022",
+ "lib": [
+ "ES2022",
+ "dom"
+ ]
+ },
+ "angularCompilerOptions": {
+ "enableI18nLegacyMessageIdFormat": false,
+ "strictInjectionParameters": true,
+ "strictInputAccessModifiers": true,
+ "strictTemplates": true
+ }
+}
diff --git a/AwesomeMicroservices/awesomemicroservices.client/tsconfig.spec.json b/AwesomeMicroservices/awesomemicroservices.client/tsconfig.spec.json
new file mode 100644
index 0000000..5fb748d
--- /dev/null
+++ b/AwesomeMicroservices/awesomemicroservices.client/tsconfig.spec.json
@@ -0,0 +1,15 @@
+/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */
+/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */
+{
+ "extends": "./tsconfig.json",
+ "compilerOptions": {
+ "outDir": "./out-tsc/spec",
+ "types": [
+ "jasmine"
+ ]
+ },
+ "include": [
+ "src/**/*.spec.ts",
+ "src/**/*.d.ts"
+ ]
+}
diff --git a/AwesomeMicroservicesSolution.sln b/AwesomeMicroservicesSolution.sln
new file mode 100644
index 0000000..4976656
--- /dev/null
+++ b/AwesomeMicroservicesSolution.sln
@@ -0,0 +1,30 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.12.35527.113 d17.12
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AwesomeMicroservices.Server", "AwesomeMicroservices\AwesomeMicroservices.Server\AwesomeMicroservices.Server.csproj", "{758C914B-C1D9-46E2-95F6-CDE1E282E283}"
+EndProject
+Project("{54A90642-561A-4BB1-A94E-469ADEE60C69}") = "awesomemicroservices.client", "AwesomeMicroservices\awesomemicroservices.client\awesomemicroservices.client.esproj", "{32A7249B-E416-4273-85AB-E8411FE0C8CA}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {758C914B-C1D9-46E2-95F6-CDE1E282E283}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {758C914B-C1D9-46E2-95F6-CDE1E282E283}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {758C914B-C1D9-46E2-95F6-CDE1E282E283}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {758C914B-C1D9-46E2-95F6-CDE1E282E283}.Release|Any CPU.Build.0 = Release|Any CPU
+ {32A7249B-E416-4273-85AB-E8411FE0C8CA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {32A7249B-E416-4273-85AB-E8411FE0C8CA}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {32A7249B-E416-4273-85AB-E8411FE0C8CA}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
+ {32A7249B-E416-4273-85AB-E8411FE0C8CA}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {32A7249B-E416-4273-85AB-E8411FE0C8CA}.Release|Any CPU.Build.0 = Release|Any CPU
+ {32A7249B-E416-4273-85AB-E8411FE0C8CA}.Release|Any CPU.Deploy.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal