All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog,
and this project adheres to Semantic Versioning.
Semantic versioning will come once I hit v1, but at this point each
0.x
release may have breaking changes as I iron out the kinks of the framework.
- Entities will now have private setters, a static
Create
method and anUpdate
method to promote a DDD workflow- This includes base entity and the dbcontext setters for the auditable fields
- A huge permissions overhaul
-
SuperAdmin
role is added by default and will automatically be given all permissions. -
A
User
role with also be created. This role will not have any permissions assigned to it by default and can be removed if you would like as long as you add another role in addition toSuperAdmin
. This will allow for integration tests of theUserPolicyHandler
to be fully scoped. -
A permission will be added for each feature with a default name of
CanFEATURENAME
, but can be overridden if desired. -
Role-permission mappings outside of this need tobe done manually
-
You will be responsible for managing permissions outside of super admin
-
Policies are no longer part of the craftsman api, but a single policy will be added with each api boundary to swagger to dictate access to that boundary. It has a default of a snake case of
ProjectName
, but can be overridden- Call out in docs. Also docs note that scope added in boundary for access should match the scope on your auth server,
- If using the built in auth server, this will be added for you. if not, make sure it mataches an appropriate scope in your auth server for this api boundary
-
Features now have a prop for
IsProtected
that, if true, will add an authorization attribute to your endpoint with thePolicyName
and add tests that check for access -
Integration tests for
UserPolicyHandler
-
Unit tests for
RolePermission
-
Policies
prop removed from Feature -
Added
SetUserRole
andSetUserRoles
methods to integreation tests'TestFixture
for easy role management in integration tests -
Functional tests auth helper method now sets
role
instead ofscope
-
Alice is a
SuperAdmin
and bob is aUser
-
- Updated FK and basic examples to have more features on the entities
- Updated tests to work with new private entity workflow
- CurrentUserServer has a method to get the User from the ClaimsPrincipal
- Swagger question removed from
add:feature
as it wasn't being used. Will be set to true. - Removed unused
Unauthorized
andForbidden
MediatR filters
- Batch endpoint route updated to
batch
along with a functional testing route - Batch add using update to controller
IHttpContextAccessor
fixted to a singleton in integration tests'TestFixture
- Can enter null for
add:feature
batch list options where needed
- Updated Craftsman to .NET 6
- Fixed bulk add file and variable names
- Removed unused response class and endpoint reference
- Removed
Consumes
from Get list
-
Added
BaseEntity
that all entities will inherit from.- Contains a
Guid
ofId
marked as the primary key - Contains
CreatedOn
,CreatedBy
,LastModifiedOn
, andLastModifiedBy
properties
- Contains a
-
Added a
CurrentUserService
to add a user to theCreatedBy
andLastModifiedBy
properties if a user is found. Built into db context -
Added built in features to the
add:feature
command -
New
AddListByFk
option for theadd:feature
command andFeature
property of an entity. -
New
craftsman example
orcraftsman new:example
command to create an example project with a prompted workflow to select.Basic
,WithAuth
,AuthServer
,WithBus
-
Added
.DS_Store
and.env
to gitignore -
Added Consumer test
-
Added
provider
to test fixture when adding a bus -
Added a mock
IPublishEndpoint
service toTestFixture
when using MassTransit- update docs that mediatr handler tests aren't broken when pubilshing anymore
-
New policies added to swagger on
add:entity
scaffolding -
New
add:authserver
command as well as anAuthServer
option when creating a domain- No consent support (yet)
-
Added helper
GetService
method toTestFixture
-
Added Creation and Update Validators back to scaffolding. Easy enough to delete if you aren't using them
-
Added a
NamingConvention
property to the db template-
options are:
Class SnakeCase LowerCase CamelCase UpperCase
-
-
Updated to .NET 6
-
Updated nuget packages
- Inlcudes a major release of Fluent Assertions that required updates to:
- Functional test assertions (use
HttpStatusCode.XXX
) - Integration tests
TestBase
update for postgresto include1.Seconds()
- Integration test updates to
await act.Should().ThrowAsync<
where appropriate
- Functional test assertions (use
- Inlcudes a major release of Fluent Assertions that required updates to:
-
Moved Policies to Feature
-
There is no more primary key property. A Guid with a name
Id
will be inherited by all entities. -
Docker utilities for integration test refactored to use Fluent Docker wherever possible for better readability. Some enhancements were made as well (e.g. better container/volume naming, proper volume mounting).
-
Removed
ErrorHandlerMiddleware
and replaced it withErrorHandlerFilterAttribute
- Updated built in Exceptions
- Updated thrown errors and associated tests in the features
-
Cleaned up test names
-
Modified CORS util to take in env
-
Added
Secret
back to Environment options -
Added local config utilities for testing environments
-
Remove
UseInMemoryDb
app setting in favor of environment specific checks -
Remove
UseInMemoryBus
app setting in favor of environment specific checks -
Using statement shortening for reset function in test fixture
-
Consolidated multiple environments startups to one startup file
-
Update logging registration in
Program.cs
to no longer rely onappsettings
-
Updated FK support to better API
-
Moved env config from appsettings to environment variables
-
Production env no longer added by default
-
Features now include missing cancellation tokens as well as
AsNoTracking
properties -
Removed automatic fluent validation to allow more control in domain operations. For example:
var validator = new RecipeForCreationDtoValidator(); validator.ValidateAndThrow(recipeForCreationDto);
- this can be turned back on in
WebApiServiceExtension
by updating.AddFluentValidation(cfg => { cfg.AutomaticValidationEnabled = false; });
- this can be turned back on in
- Removed the broken patch validation from command
- No more
409
produced response annotation on POST - Descending sort tests now actually test desc instead of mirroring asc
- Removed error handler comments in controller
- Empty controller no longer added when no features present (fixes #40)
- Messages project will be properly referenced when using a bus
- Swagger policies won't get duplicates
- Better variable name on delete integ test
- Removed extra parentheses on endpoint names
- Added an
add:feature
command (also works withnew:feature
) - Non-nullable guids will now have a default of
Guid.NewGuid()
unless otherwise specified - Added XML docs to release in csproj
- Added a new
features
option to entities to allow for granular feature control. The accepted values areAdHoc
,GetRecord
,GetList
,DeleteRecord
,UpdateRecord
,PatchRecord
,AddRecord
, andCreateRecord
(same asAddRecord
but available as an alias in case you can't remember!)
- Instead of 3 BC projects (Core, Infra, Api) there will now be one. This helps with colocation and does force premature optimization for something like a model library and a heavily separated infra project.
- Features dir changed to Domain with a features directory inside of it
- Entities live on their respective entity folder in the domain with their feature
- Removed the
webapi
suffix on the api project - Core directories moved to web api
Contexts
dir changed toDatabases
- Removed save successful checks on add and update commands
- Added better naming to PUT command variables
- Guid PKs will no longer be added to the creation DTO
- POST commands will no longer have a conflict check since you can't add a PK anymore
- A conflict integration test will not be added anymore
NoKeyGenerated
commands are no longer in dbcontext- Controller url all lowercase
- Swagger comments on by default
- 409 no longer shown on swagegr comments for POST
- No more save successful check on delete command
- Seeders have a sub
DummyData
directory - Sieve service registration moved to webapi service class
SolutionName
toProjectName
- Seeder indentation in startup fixed
- PUT commands will no longer throw 500 when entity is not modified (#31)
- Route indentation fixed
- Removed annoying comments from features
- Fixed test name for basic gets in functional tests
- Seeders in startup will newline when there are multiple entities
- Unicode now onlyenforced on windows (for better emoji support)
- Fixed
isRequired
property - Command prop for
Update
command has proper casing
- Removed the
add:property
cli command
- Added SpectreConsole for a better CLI experience
- Added
add:bus
command - Added
add:consumer
andadd:producer
commands for direct, topic, and fanout messages - Added Bus, Producers, and Consumers props to BC template
- Added Messages to the domain template
- Added
add:message
command - Added conflict test for add command when using a guid
- Added tests for command and query exceptions
- Didn't do them in the controller as that is not the dependency. Can test the exceptions causing the correct httpstatus code in the exception separately
- Changed the
new:domain
output to a single solution with directories for each bounded context for easier management - Changed the seeder regions in
StartupDevelopment.cs
to comments - Changed the Logger settings in
Program.cs
- Updated
add:entity
andadd:prop
to now be called from the BC directory - Updated
ProducesResponseType
in controllers to genericResponse
type where applicable - Updated App Registrations to separate files
- Updated Service Registrations to separate files
- Updated entity name and entity prop names first letter to always be capitalized
- Better namespacing for features in controllers using static classes for features
- Updated functional test to pass without conflict
- Updated nuget packages
- Updated
Program.cs
to async - Changed migrations to happen after all bounded contexts are added
- Removed the custom fluent validation boilderplate from the add, update, patch, and ad hoc commands
- Removed verbosity option from commands due to simplified spectre console
- Removed legacy comment for include statement marker
- Removed BC readme and updated sln readme
- Fixed double error messages
- Fixed incorrect help message for
new:domain
command (#24) - Fixed help text on
list
command - Fixed controllers to inherit from
ControllerBase
instead ofController
. fixes (#26) - Fixed extra space in the class in the dto classes when not abstract and trailing new line
- If using a guid for a PK, it will be added to the creation dto (not manipulation or update) -- fixes #28
- Guid PKs will have a default value of
Guid.NewGuid()
in their creation dto
- Guid PKs will have a default value of
- PK already exists guard will be added for GUIDs and will be performed when adding a new entity and throw a 409 conflict via a new conflict exception if a record already exists with that guid. -- fixes #29
- Fixed issue where POST would throw 500 when primary key != EntityNameId (e.g. PK of ReportId would break for an entity of ReportRequest) - fixes #30
- Fixed default value for strings on entities to use quotes
- Fixed missing exception handling on
add:bc
command
- Fixed autogen identity
- Lingering dbcontext and dbname mix up
- Db context will now be used instead of name in api scaffolding
- Test utilities in functional tests will now be added when not using auth
- Added a new vertical slice architecture
- Projects have been consolidated and will now have a prefix of the solution name before each project type. For example, the api project with a solution name of
ordering
isordering.webapi
- Projects have been consolidated and will now have a prefix of the solution name before each project type. For example, the api project with a solution name of
- Added a
new:domain
command to create a ddd based domain with various bounded contexts inside of it. this is recommended for long term maintainability - Added the
add:bc
command which will add a new bounded context to your ddd project - Testing completely rebuilt from the ground up. Now has unit, integration, and functional tests. Integration and Functional Tests can spin up their own docker db on their own to run against a real database.
- Moved 'addGit' property from the api template to the domain template
- Added a
version
or-v
command to get the craftsman version - Added an initial db migration to run automatically on project creation
- Added verbosity option to new domain and add bc
- Added a version checker to make sure you are alerted if out of date
- Added an
add:prop
alias - Added explicit add entity template with auth policies available to add
- Added a production app settings by default
- Changed the startup marker for dynamic services to a comment instead of a region
- Readme will now be generated in the domain directory
- Updated environment to have production as a reserved word instead of startup to be consistent with dotnet process
- Will use startup and appsettings.production
- Normal appsettings will be empty, but have all the config keys required to make migrations and builds possible
- Updated the default Cors policy name
- Consolidated launchsettings to have the same setup for all environments as it is just a setting for the IDE and not used for the release package
- Removed
micro
command to consolidate and reduce complexity. if you still want to build a microservice, you can build a domain and deploy each bounded context as a microservice- Gateways were removed and may be added back with better integration in a future release
- Removed the
new:api
command to focus on the DDD driven style - Removed
ClientSecret
to promote code+PKCE flow
- Existing auth policies will now be skipped for registration when adding a new entity
- Fixed documented response codes for delete, put, and patch from 201 > 204
- Foreign keys will no longer be automatically included in features or DTOs for better performance (#2)
- Fixed issue where xml comments would throw an error on non windows machines (#16)
- fixed bug when creating an api with auth settings
- New
add:micro
command that scaffolds a new microservice template as well as an ocelot gateway - New
port
property on thenew:api
template to let you customize and api or microservice port on localhost - Added
https
default on local - Added additional startup middleware
UseHsts
for non dev environmentsUseHttpsRedirection
with notes on even more secure options
- New
AuthorizationSettings
object and authorization based properties on the environments for thenew:api
andnew:micro
commands - Added new
GetEntity
andDeleteEntity
integration tests with and without auth - Added 401/403 response types to swagger comments when using auth
- Added auth to swagger setup
- note that secret is currently stored in appsettings
- Auth added to integration tests when required
- The
CurrentStartIndex
calculation in thePagedList
class was broken and now has a new calculation. - Added null conditional operator (
?.
) to certain tests before.Data
to make them fail more gracefully- Get{entity.Plural}_ReturnsSuccessCodeAndResourceWithAccurateFields()
- Put{entity.Name}ReturnsBodyAndFieldsWereSuccessfullyUpdated
- Cleaned up
WebApplicationFactory
to remove deprecated services. - Removed
[Collection(""Sequential"")]
from repo tests
- Internal tests now passing
- refactored out template drilling
- removed old auth debt from earlier alpha
- Removed the dependency on the foundation api template!
- Fixed
UseEnvironment
in WebAppFactory to useDevelopment
- Fixed integration tests to use the new
Response
wrapper - Updated pagination tests to have proper keys due to default sort order possibly breaking these tests
- XML comment info is now properly added to
WebApi.csproj
and the Swagger config - Extra line will no longer be added when no swagger contact url is provided
- Repository now sets default sort order for proper sql compatibility in lists (issue #9)
-
Added table name and schema properties to entity
-
Added column name attribute to entity properties
-
Added Serilog by default in all new projects. This includes Console and Seq logging by default in
Development
. For non-Development environments, you'll need to add whatever logging you're interested in to their respective app-settings projects. There are just too many options to create a whole API on top of Serilog. -
Updated swagger implementation from nswag
-
Added Consumes and Produces headers to the controller endpoints
-
Added an option to manage additional swagger settings to your API endpoints. This will be turned off by default for now as dealing the with xml docs path is potentially burdensome, but will add a lot of valuable details for users consuming your API. If you are looking to add additional XML details, this is highly recommended.
-
Added a custom Response Wrapper to the GET and POST endpoints
- Fixed launch settings to have null environment variable for Startup (Production). If you'd like to change this, be sure to update the appsetting lookup in
Program.cs
- Fixed POST endpoint that was lacking a
[FromBody]
marker BasePaginationParameters
will now haveMaxPageSizee
andDefaultPageSize
set asinternal
properties so they don't show up in swagger. These can be overridden in the distinct entity classes like so:internal override int MaxPageSize { get; } = 30;
- Fixed controllers to be able to handle a name and plural with the same value (e.g. Buffalo)
- Added
add:entities
alias for theadd:entity
command - Can now add Guid or other non-integer primary key
- Fixed bug where postgres library was getting added every time
- Seeder was not getting added to
StartupDevelopment
when usingadd:entity
command
- Async method in controller POST wasn't awaited
- Default
Startup.cs
class can now be configured using the reservedStartup
keyword
- Fixed
craftsman add:property -h
help text - The appsettings connection string will now escape backslash
- Foreign key using statement will now be dynamic on DTOs
- Added
new:webapi
alias that acts the same asnew:api
- Fixed
craftsman add:property -h
to point to the correct help page
- Updated the API to run on NET 5.0
- Pagination metadata enhancements on PagedList that is returned in GET list endpoint will now include more metadata for the current page including the current size as well as the start and end indices. I also removed the Next and Previous Page URI links to reduce complexity.
- Updated all controller calls to be asynchronous, including the get list
- Saves updated to be asynchronous
- One major capability I want to add into this is a good basis for auth generation. I've started to build this out, but it could (and very likely will) change drastically. With that said, I left it in as an alpha feature in case anyone is interested in trying it.
- Add Entity bug in repository fixed
- Fixed some builder options when not using auth