It's very easy to set up asynchronous validation in Angular Form. You can check whether provided email/date/name etc. already exists in the server with an HTTP call.
updateOn: 'blur' and updateOn: 'submit' are the options we were really craving for while working with Angular Forms. Now it's available out of the box and you don't need any custom implementations.
If you are adding API versioning to your existing API project, you can tell ASP.NET Core to treat the undercoated controllers and actions to have version 1.0 by default. To do that, configure the AddApiVersioning() service with AssumeDefaultVersionNumberUnspecified flag.
Working with HttpClient is kind of low-level stuff. Refit eases that problem for us. It creates an abstraction over HttpClient and allows us to work with an interface representing REST endpoints
We have N + 1 problem in our solution. To overcome this problem, we introduce DataLoader. DataLoader adds support for batching and caching in your GraphQL queries.
By default, graphql-dotnet executes queries in parallel. Most of the time that's a desired behaviour. But there is a catch when a parent graph type has dependencies on a child graph type which also uses asynchronous task to resolve field values.
By EF conventions, in a many-to-many relation, you have two standalone entities and a third entity between them which represents a relationship bridge.
Application state is subjected to change. A reducer is a pure function that takes the current state and an action been dispatched upon it. Depending on the action type it produces a new state and returns it. States are immutable.