├── .github └── screen.gif ├── .gitignore ├── README.md ├── client ├── .editorconfig ├── .gitignore ├── .prettierrc ├── README.md ├── angular.json ├── assets │ ├── cordova │ │ ├── config.xml │ │ └── package.json │ ├── electron │ │ ├── cpuValues.js │ │ ├── icon.ico │ │ ├── index.js │ │ ├── installerconfig.json │ │ ├── package.json │ │ └── trayIcon.js │ ├── img │ │ ├── icon.png │ │ └── splash.png │ └── toggleHamburger.js ├── browserslist ├── 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.component.html │ │ ├── app.component.ts │ │ ├── app.module.ts │ │ ├── app.routes.ts │ │ ├── core │ │ │ ├── core.module.ts │ │ │ ├── data-services │ │ │ │ ├── food-data.service.ts │ │ │ │ ├── httpWrapper.service.ts │ │ │ │ └── ingredient-data.service.ts │ │ │ ├── interceptors │ │ │ │ ├── index.ts │ │ │ │ └── standard-header.interceptor.ts │ │ │ ├── services │ │ │ │ ├── abstract-camera.service.ts │ │ │ │ ├── abstract-notification.service.ts │ │ │ │ ├── currentUser.service.ts │ │ │ │ ├── desktop-camera.service.ts │ │ │ │ ├── desktop-cpuValue.service.ts │ │ │ │ ├── desktop-notification.service.ts │ │ │ │ ├── mobile-camera.service.ts │ │ │ │ ├── mobile-notification.service.ts │ │ │ │ ├── platform-information.provider.ts │ │ │ │ ├── signalR.service.ts │ │ │ │ ├── sort.service.ts │ │ │ │ ├── storage.service.ts │ │ │ │ └── web-notification.service.ts │ │ │ └── store │ │ │ │ ├── actions │ │ │ │ ├── core.actions.ts │ │ │ │ └── index.ts │ │ │ │ ├── core-store.facade.ts │ │ │ │ ├── effects │ │ │ │ ├── core.effects.ts │ │ │ │ └── index.ts │ │ │ │ ├── reducers │ │ │ │ ├── core.reducer.ts │ │ │ │ └── index.ts │ │ │ │ └── selectors │ │ │ │ ├── core.selectors.ts │ │ │ │ └── index.ts │ │ ├── food │ │ │ ├── container │ │ │ │ ├── food-details │ │ │ │ │ ├── food-details.component.html │ │ │ │ │ └── food-details.component.ts │ │ │ │ ├── index.ts │ │ │ │ ├── ingredients │ │ │ │ │ ├── ingredients.component.css │ │ │ │ │ ├── ingredients.component.html │ │ │ │ │ ├── ingredients.component.spec.ts │ │ │ │ │ └── ingredients.component.ts │ │ │ │ └── main-food │ │ │ │ │ ├── main-food.component.html │ │ │ │ │ └── main-food.component.ts │ │ │ ├── food.module.ts │ │ │ ├── food.routes.ts │ │ │ ├── guards │ │ │ │ ├── food-is-loaded.guard.ts │ │ │ │ └── index.ts │ │ │ ├── pipes │ │ │ │ ├── filter.pipe.spec.ts │ │ │ │ └── filter.pipe.ts │ │ │ ├── presentational │ │ │ │ ├── food-form │ │ │ │ │ ├── food-form.component.html │ │ │ │ │ └── food-form.component.ts │ │ │ │ ├── food-list │ │ │ │ │ ├── food-list.component.css │ │ │ │ │ ├── food-list.component.html │ │ │ │ │ └── food-list.component.ts │ │ │ │ ├── food-picture │ │ │ │ │ ├── food-picture.component.css │ │ │ │ │ ├── food-picture.component.html │ │ │ │ │ ├── food-picture.component.spec.ts │ │ │ │ │ └── food-picture.component.ts │ │ │ │ ├── index.ts │ │ │ │ └── ingredient-list │ │ │ │ │ ├── ingredient-list.component.css │ │ │ │ │ ├── ingredient-list.component.html │ │ │ │ │ ├── ingredient-list.component.spec.ts │ │ │ │ │ └── ingredient-list.component.ts │ │ │ ├── store │ │ │ │ ├── actions │ │ │ │ │ ├── food.actions.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── ingredients.actions.ts │ │ │ │ │ └── signalR.actions.ts │ │ │ │ ├── effects │ │ │ │ │ ├── food.effects.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ └── ingredients.effects.ts │ │ │ │ ├── food-store.facade.ts │ │ │ │ ├── reducers │ │ │ │ │ ├── food.reducer.spec.ts │ │ │ │ │ ├── food.reducer.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ └── ingredient.reducer.ts │ │ │ │ └── selectors │ │ │ │ │ ├── foods.selectors.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ └── ingredients.selectors.ts │ │ │ └── validators │ │ │ │ ├── isInRange.validator.ts │ │ │ │ ├── isInRangeValidator.spec.ts │ │ │ │ ├── isNumber.validator.spec.ts │ │ │ │ └── isNumber.validator.ts │ │ ├── home │ │ │ ├── home.module.ts │ │ │ ├── home.routes.ts │ │ │ ├── home │ │ │ │ ├── home.component.css │ │ │ │ ├── home.component.html │ │ │ │ ├── home.component.spec.ts │ │ │ │ └── home.component.ts │ │ │ ├── randomMeal │ │ │ │ ├── randomMeal.component.html │ │ │ │ ├── randomMeal.component.spec.ts │ │ │ │ └── randomMeal.component.ts │ │ │ ├── single-meal │ │ │ │ ├── single-meal.component.css │ │ │ │ ├── single-meal.component.html │ │ │ │ ├── single-meal.component.spec.ts │ │ │ │ └── single-meal.component.ts │ │ │ └── store │ │ │ │ ├── actions │ │ │ │ ├── home.actions.ts │ │ │ │ └── index.ts │ │ │ │ ├── effects │ │ │ │ ├── home.effects.ts │ │ │ │ └── index.ts │ │ │ │ ├── home-store.facade.ts │ │ │ │ ├── reducers │ │ │ │ ├── home.reducer.ts │ │ │ │ └── index.ts │ │ │ │ └── selectors │ │ │ │ ├── home.selectors.ts │ │ │ │ └── index.ts │ │ ├── shared │ │ │ ├── components │ │ │ │ ├── footer │ │ │ │ │ ├── eMeail-footer.component.spec.ts │ │ │ │ │ ├── eMeal-footer.component.html │ │ │ │ │ └── eMeal-footer.component.ts │ │ │ │ └── navigation │ │ │ │ │ ├── navigation.component.html │ │ │ │ │ ├── navigation.component.spec.ts │ │ │ │ │ └── navigation.component.ts │ │ │ ├── configuration │ │ │ │ ├── app.configuration.spec.ts │ │ │ │ └── app.configuration.ts │ │ │ ├── models │ │ │ │ ├── foodItem.model.ts │ │ │ │ ├── ingredient.model.ts │ │ │ │ └── model.descriptor.ts │ │ │ └── shared.module.ts │ │ └── store │ │ │ ├── index.ts │ │ │ └── reducers │ │ │ ├── index.ts │ │ │ └── router.reducer.ts │ ├── assets │ │ └── .gitkeep │ ├── cordova.js │ ├── environments │ │ ├── environment.desktop.ts │ │ ├── environment.mobile.ts │ │ ├── environment.prod.ts │ │ └── environment.ts │ ├── favicon.ico │ ├── index.html │ ├── main.ts │ ├── polyfills.ts │ ├── styles.css │ ├── test.ts │ └── testing │ │ ├── CpuValueServiceMock.ts │ │ ├── abstractCameraServiceMock.ts │ │ ├── abstractNotificationServiceMock.ts │ │ └── foodServiceMock.ts ├── tsconfig.app.json ├── tsconfig.json ├── tsconfig.spec.json └── tslint.json └── server └── ASP.NETCore ├── FoodAPICore.sln └── src └── FoodAPICore ├── .vscode └── launch.json ├── Controllers ├── FoodsController.cs └── IngredientsController.cs ├── Dtos ├── FoodCreateDto.cs ├── FoodItemDto.cs ├── FoodUpdateDto.cs ├── IngredientDto.cs ├── IngredientUpdateDto.cs └── LinkDto.cs ├── Entities ├── FoodDbContext.cs ├── FoodItem.cs └── Ingredient.cs ├── FoodAPICore.csproj ├── FoodAPICore.csproj.user ├── Helpers ├── DynamicExtensions.cs └── QueryParametersExtensions.cs ├── Hubs └── FoodHub.cs ├── MappingProfiles ├── FoodMappings.cs └── IngredientMappings.cs ├── Migrations ├── 20170418041355_MyFirst.Designer.cs ├── 20170418041355_MyFirst.cs ├── 20180902180236_latest.Designer.cs ├── 20180902180236_latest.cs └── FoodDbContextModelSnapshot.cs ├── Models └── QueryParameters.cs ├── Program.cs ├── Properties └── launchSettings.json ├── Repositories ├── Food │ └── FoodRepository.cs ├── IFoodRepository.cs ├── IIngredientRepository.cs └── Ingredient │ └── IngredientRepository.cs ├── Services ├── EnsureDatabaseDataService.cs └── IEnsureDatabaseDataService.cs ├── Startup.cs ├── appsettings.json └── web.config /.github/screen.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FabianGosebrink/ASPNETCore-Angular-Ngrx/8c697557c83d8375a1ea06ab5fdfd19348e29204/.github/screen.gif -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | server/ASP.NETCore/.vs 2 | server/ASP.NETCore/src/FoodAPICore/bin 3 | server/ASP.NETCore/src/FoodAPICore/appsettings.production.json 4 | server/ASP.NETCore/src/FoodAPICore/Properties/PublishProfiles/ 5 | /client/.dist 6 | 7 | /client/src/app/**/*.js 8 | /client/src/app/**/*.js.map 9 | /server/ASP.NETCore/src/FoodAPICore/obj 10 | /server/ASP.NETCore/src/*.log 11 | /client/.temp/ 12 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [](https://travis-ci.org/FabianGosebrink/ASPNETCore-Angular-Ngrx) 2 | 3 | # ASP.NET Core WebAPI with SignalR & Angular Demo with NgRx store & NgRx effects, Component based design (Cross Platform) 4 | 5 |
6 |
7 |
8 |
9 |
29 | Name 30 | | 31 |32 | Calories 33 | | 34 |35 | Type 36 | | 37 |Actions | 38 |
---|---|---|---|
43 | {{ food.name }} 44 | | 45 |{{ food.calories }} | 46 |{{ food.type }} | 47 |
48 |
49 |
59 |
80 |
79 | |
81 |
12 | 19 |
20 |