コード例 #1
0
ファイル: DtoBuilder.cs プロジェクト: wi3land/craftsman
        public static void CreateDtos(string solutionDirectory, Entity entity)
        {
            try
            {
                // ****this class path will have an invalid FullClassPath. just need the directory
                var classPath = ClassPathHelper.DtoClassPath(solutionDirectory, "", entity.Name);

                if (!Directory.Exists(classPath.ClassDirectory))
                {
                    Directory.CreateDirectory(classPath.ClassDirectory);
                }

                CreateDtoFile(solutionDirectory, entity, Dto.Read);
                CreateDtoFile(solutionDirectory, entity, Dto.Manipulation);
                CreateDtoFile(solutionDirectory, entity, Dto.Creation);
                CreateDtoFile(solutionDirectory, entity, Dto.Update);
                CreateDtoFile(solutionDirectory, entity, Dto.ReadParamaters);
            }
            catch (FileAlreadyExistsException e)
            {
                WriteError(e.Message);
                throw;
            }
            catch (Exception e)
            {
                WriteError($"An unhandled exception occurred when running the API command.\nThe error details are: \n{e.Message}");
                throw;
            }
        }
コード例 #2
0
        public static string GetCommandFileText(string classNamespace, Entity entity, string contextName, string solutionDirectory, string srcDirectory, Feature feature, string projectBaseName)
        {
            var className      = feature.Name;
            var addCommandName = feature.Command;
            var readDto        = Utilities.GetDtoName(entity.Name, Dto.Read);

            readDto = $"IEnumerable<{readDto}>";
            var createDto = Utilities.GetDtoName(entity.Name, Dto.Creation);

            createDto = $"IEnumerable<{createDto}>";
            var featurePropNameLowerFirst = feature.BatchPropertyName.LowercaseFirstLetter();

            var entityName                 = entity.Name;
            var entityNameLowercase        = entity.Name.LowercaseFirstLetter();
            var entityNameLowercaseListVar = $"{entity.Name.LowercaseFirstLetter()}List";
            var primaryKeyPropName         = Entity.PrimaryKeyProperty.Name;
            var commandProp                = $"{entityName}ListToAdd";
            var newEntityProp              = $"{entityNameLowercaseListVar}ListToAdd";

            var entityClassPath     = ClassPathHelper.EntityClassPath(srcDirectory, "", entity.Plural, projectBaseName);
            var dtoClassPath        = ClassPathHelper.DtoClassPath(solutionDirectory, "", entity.Name, projectBaseName);
            var exceptionsClassPath = ClassPathHelper.ExceptionsClassPath(srcDirectory, "");
            var contextClassPath    = ClassPathHelper.DbContextClassPath(srcDirectory, "", projectBaseName);
            var validatorsClassPath = ClassPathHelper.ValidationClassPath(srcDirectory, "", entity.Plural, projectBaseName);

            var batchFkCheck = !string.IsNullOrEmpty(feature.BatchPropertyDbSetName)
                ? @$ "var fkEntity = await _db.{feature.BatchPropertyDbSetName}.Where(x => x.Id == request.{feature.BatchPropertyName}).FirstOrDefaultAsync(cancellationToken);
            if (fkEntity == null)
                throw new NotFoundException($" "No {feature.BatchPropertyName} found with an id of '{{request.{feature.BatchPropertyName}}}'" ");{Environment.NewLine}{Environment.NewLine}"
コード例 #3
0
        private static string WriteTestFileText(string solutionDirectory, string testDirectory, string srcDirectory, ClassPath classPath, string projectBaseName)
        {
            var testFixtureName = Utilities.GetIntegrationTestFixtureName();

            var servicesClassPath     = ClassPathHelper.WebApiServicesClassPath(srcDirectory, "", projectBaseName);
            var policyDomainClassPath = ClassPathHelper.PolicyDomainClassPath(srcDirectory, "", projectBaseName);
            var entityClassPath       = ClassPathHelper.EntityClassPath(testDirectory, "", "RolePermissions", projectBaseName);
            var dtoClassPath          = ClassPathHelper.DtoClassPath(solutionDirectory, "", "RolePermission", projectBaseName);
            var rolesClassPath        = ClassPathHelper.SharedKernelDomainClassPath(solutionDirectory, "");

            return(@$ "namespace {classPath.ClassNamespace};

using {servicesClassPath.ClassNamespace};
using {policyDomainClassPath.ClassNamespace};
using {entityClassPath.ClassNamespace};
using {dtoClassPath.ClassNamespace};
using {rolesClassPath.ClassNamespace};
using Bogus;
using FluentAssertions;
using HeimGuard;
using Microsoft.AspNetCore.Http;
using Moq;
using NUnit.Framework;
using System.Threading.Tasks;
using System.Security.Claims;
using static {testFixtureName};
コード例 #4
0
        private static string WriteTestFileText(string solutionDirectory, string testDirectory, string srcDirectory, ClassPath classPath, Entity entity, Feature feature, string projectBaseName)
        {
            var featureName     = Utilities.AddEntityFeatureClassName(entity.Name);
            var testFixtureName = Utilities.GetIntegrationTestFixtureName();
            var commandName     = feature.Command;

            var testUtilClassPath    = ClassPathHelper.IntegrationTestUtilitiesClassPath(testDirectory, projectBaseName, "");
            var dtoUtilClassPath     = ClassPathHelper.DtoClassPath(solutionDirectory, "", entity.Name, projectBaseName);
            var exceptionsClassPath  = ClassPathHelper.ExceptionsClassPath(testDirectory, "");
            var fakerClassPath       = ClassPathHelper.TestFakesClassPath(testDirectory, "", entity.Name, projectBaseName);
            var parentFakerClassPath = ClassPathHelper.TestFakesClassPath(testDirectory, "", feature.ParentEntity, projectBaseName);
            var featuresClassPath    = ClassPathHelper.FeaturesClassPath(srcDirectory, featureName, entity.Plural, projectBaseName);

            var foreignEntityUsings = Utilities.GetForeignEntityUsings(testDirectory, entity, projectBaseName);

            return(@$ "namespace {classPath.ClassNamespace};

using {dtoUtilClassPath.ClassNamespace};
using {fakerClassPath.ClassNamespace};
using {parentFakerClassPath.ClassNamespace};
using {testUtilClassPath.ClassNamespace};
using {featuresClassPath.ClassNamespace};
using {exceptionsClassPath.ClassNamespace};
using FluentAssertions;
using Microsoft.EntityFrameworkCore;
using NUnit.Framework;
using System.Threading.Tasks;
using static {testFixtureName};{foreignEntityUsings}
コード例 #5
0
        public static string GetQueryFileText(string classNamespace, Entity entity, string contextName, string solutionDirectory, string srcDirectory, string projectBaseName)
        {
            var className       = Utilities.GetEntityFeatureClassName(entity.Name);
            var queryRecordName = Utilities.QueryRecordName(entity.Name);
            var readDto         = Utilities.GetDtoName(entity.Name, Dto.Read);

            var primaryKeyPropType          = Entity.PrimaryKeyProperty.Type;
            var primaryKeyPropName          = Entity.PrimaryKeyProperty.Name;
            var primaryKeyPropNameLowercase = primaryKeyPropName.LowercaseFirstLetter();

            var dtoClassPath        = ClassPathHelper.DtoClassPath(solutionDirectory, "", entity.Name, projectBaseName);
            var exceptionsClassPath = ClassPathHelper.ExceptionsClassPath(srcDirectory, "");
            var contextClassPath    = ClassPathHelper.DbContextClassPath(srcDirectory, "", projectBaseName);

            return(@$ "namespace {classNamespace};

using {dtoClassPath.ClassNamespace};
using {exceptionsClassPath.ClassNamespace};
using {contextClassPath.ClassNamespace};
using AutoMapper;
using AutoMapper.QueryableExtensions;
using MediatR;
using Microsoft.EntityFrameworkCore;
using System.Threading;
using System.Threading.Tasks;
コード例 #6
0
        public static string GetCommandFileText(string classNamespace, Entity entity, string contextName, string solutionDirectory, string projectBaseName)
        {
            var className         = Utilities.DeleteEntityFeatureClassName(entity.Name);
            var deleteCommandName = Utilities.CommandDeleteName(entity.Name);

            var primaryKeyPropType  = entity.PrimaryKeyProperty.Type;
            var primaryKeyPropName  = entity.PrimaryKeyProperty.Name;
            var entityNameLowercase = entity.Name.LowercaseFirstLetter();

            var entityClassPath     = ClassPathHelper.EntityClassPath(solutionDirectory, "", projectBaseName);
            var dtoClassPath        = ClassPathHelper.DtoClassPath(solutionDirectory, "", entity.Name, projectBaseName);
            var exceptionsClassPath = ClassPathHelper.CoreExceptionClassPath(solutionDirectory, "", projectBaseName);
            var contextClassPath    = ClassPathHelper.DbContextClassPath(solutionDirectory, "", projectBaseName);

            return(@$ "namespace {classNamespace}
{{
    using {entityClassPath.ClassNamespace};
    using {dtoClassPath.ClassNamespace};
    using {exceptionsClassPath.ClassNamespace};
    using {contextClassPath.ClassNamespace};
    using AutoMapper;
    using AutoMapper.QueryableExtensions;
    using MediatR;
    using Microsoft.EntityFrameworkCore;
    using System;
    using System.Threading;
    using System.Threading.Tasks;
    using System.Collections.Generic;
コード例 #7
0
        public static string GetCommandFileText(string classNamespace, Entity entity, string contextName, string solutionDirectory, string srcDirectory, string projectBaseName)
        {
            var className             = Utilities.AddEntityFeatureClassName(entity.Name);
            var addCommandName        = Utilities.CommandAddName(entity.Name);
            var readDto               = Utilities.GetDtoName(entity.Name, Dto.Read);
            var createDto             = Utilities.GetDtoName(entity.Name, Dto.Creation);
            var manipulationValidator = Utilities.ValidatorNameGenerator(entity.Name, Validator.Manipulation);

            var entityName          = entity.Name;
            var entityNameLowercase = entity.Name.LowercaseFirstLetter();
            var primaryKeyPropName  = Entity.PrimaryKeyProperty.Name;
            var commandProp         = $"{entityName}ToAdd";
            var newEntityProp       = $"{entityNameLowercase}ToAdd";

            var entityClassPath     = ClassPathHelper.EntityClassPath(srcDirectory, "", entity.Plural, projectBaseName);
            var dtoClassPath        = ClassPathHelper.DtoClassPath(solutionDirectory, "", entity.Name, projectBaseName);
            var exceptionsClassPath = ClassPathHelper.ExceptionsClassPath(srcDirectory, "");
            var contextClassPath    = ClassPathHelper.DbContextClassPath(srcDirectory, "", projectBaseName);
            var validatorsClassPath = ClassPathHelper.ValidationClassPath(srcDirectory, "", entity.Plural, projectBaseName);

            return(@$ "namespace {classNamespace};

using {entityClassPath.ClassNamespace};
using {dtoClassPath.ClassNamespace};
using {exceptionsClassPath.ClassNamespace};
using {contextClassPath.ClassNamespace};
using {validatorsClassPath.ClassNamespace};
using AutoMapper;
using AutoMapper.QueryableExtensions;
using MediatR;
using Microsoft.EntityFrameworkCore;
using System.Threading;
using System.Threading.Tasks;
コード例 #8
0
        private static string WriteTestFileText(string solutionDirectory, string testDirectory, string srcDirectory, ClassPath classPath, Entity entity, string projectBaseName)
        {
            var featureName               = Utilities.UpdateEntityFeatureClassName(entity.Name);
            var testFixtureName           = Utilities.GetIntegrationTestFixtureName();
            var commandName               = Utilities.CommandUpdateName(entity.Name);
            var fakeEntity                = Utilities.FakerName(entity.Name);
            var fakeUpdateDto             = Utilities.FakerName(Utilities.GetDtoName(entity.Name, Dto.Update));
            var fakeCreationDto           = Utilities.FakerName(Utilities.GetDtoName(entity.Name, Dto.Creation));
            var updateDto                 = Utilities.GetDtoName(entity.Name, Dto.Update);
            var fakeEntityVariableName    = $"fake{entity.Name}One";
            var lowercaseEntityName       = entity.Name.LowercaseFirstLetter();
            var lowercaseEntityPluralName = entity.Plural.LowercaseFirstLetter();
            var pkName            = Entity.PrimaryKeyProperty.Name;
            var lowercaseEntityPk = pkName.LowercaseFirstLetter();

            var testUtilClassPath = ClassPathHelper.IntegrationTestUtilitiesClassPath(testDirectory, projectBaseName, "");
            var fakerClassPath    = ClassPathHelper.TestFakesClassPath(testDirectory, "", entity.Name, projectBaseName);
            var dtoClassPath      = ClassPathHelper.DtoClassPath(solutionDirectory, "", entity.Name, projectBaseName);
            var featuresClassPath = ClassPathHelper.FeaturesClassPath(srcDirectory, featureName, entity.Plural, projectBaseName);

            var fakeParent          = Utilities.FakeParentTestHelpers(entity, out var fakeParentIdRuleFor);
            var foreignEntityUsings = Utilities.GetForeignEntityUsings(testDirectory, entity, projectBaseName);

            return(@$ "namespace {classPath.ClassNamespace};

using {fakerClassPath.ClassNamespace};
using {testUtilClassPath.ClassNamespace};
using {dtoClassPath.ClassNamespace};
using FluentAssertions;
using Microsoft.EntityFrameworkCore;
using NUnit.Framework;
using System.Threading.Tasks;
using Microsoft.AspNetCore.JsonPatch;
using {featuresClassPath.ClassNamespace};
using static {testFixtureName};{foreignEntityUsings}
コード例 #9
0
        private static string WriteTestFileText(string solutionDirectory, ClassPath classPath, Entity entity, string projectBaseName)
        {
            var featureName     = Utilities.GetEntityListFeatureClassName(entity.Name);
            var testFixtureName = Utilities.GetIntegrationTestFixtureName();

            var fakerClassPath    = ClassPathHelper.TestFakesClassPath(solutionDirectory, "", entity.Name, projectBaseName);
            var dtoClassPath      = ClassPathHelper.DtoClassPath(solutionDirectory, "", entity.Name, projectBaseName);
            var featuresClassPath = ClassPathHelper.FeaturesClassPath(solutionDirectory, featureName, entity.Plural, projectBaseName);

            var sortTests   = "";
            var filterTests = "";

            foreach (var prop in entity.Properties.Where(e => e.CanSort && e.Type != "Guid").ToList())
            {
                sortTests += GetEntitiesListSortedInAscOrder(entity, prop);
                sortTests += GetEntitiesListSortedInDescOrder(entity, prop);
            }

            foreach (var prop in entity.Properties.Where(e => e.CanFilter).ToList())
            {
                filterTests += GetEntitiesListFiltered(entity, prop);
            }

            return(@$ "namespace {classPath.ClassNamespace}
{{
    using {dtoClassPath.ClassNamespace};
    using {fakerClassPath.ClassNamespace};
    using FluentAssertions;
    using NUnit.Framework;
    using System;
    using System.Linq;
    using System.Threading.Tasks;
    using static {featuresClassPath.ClassNamespace}.{featureName};
コード例 #10
0
        public static string GetCommandFileText(string classNamespace, Entity entity, string contextName, string srcDirectory, string projectBaseName)
        {
            var className             = Utilities.PatchEntityFeatureClassName(entity.Name);
            var patchCommandName      = Utilities.CommandPatchName(entity.Name);
            var updateDto             = Utilities.GetDtoName(entity.Name, Dto.Update);
            var manipulationValidator = Utilities.ValidatorNameGenerator(entity.Name, Validator.Manipulation);

            var primaryKeyPropType  = Entity.PrimaryKeyProperty.Type;
            var primaryKeyPropName  = Entity.PrimaryKeyProperty.Name;
            var entityNameLowercase = entity.Name.LowercaseFirstLetter();
            var updatedEntityProp   = $"{entityNameLowercase}ToUpdate";
            var patchedEntityProp   = $"{entityNameLowercase}ToPatch";

            var entityClassPath     = ClassPathHelper.EntityClassPath(srcDirectory, "", entity.Plural, projectBaseName);
            var dtoClassPath        = ClassPathHelper.DtoClassPath(srcDirectory, "", entity.Name, projectBaseName);
            var exceptionsClassPath = ClassPathHelper.ExceptionsClassPath(srcDirectory, "", projectBaseName);
            var contextClassPath    = ClassPathHelper.DbContextClassPath(srcDirectory, "", projectBaseName);
            var validatorsClassPath = ClassPathHelper.ValidationClassPath(srcDirectory, "", entity.Plural, projectBaseName);

            return(@$ "namespace {classNamespace};

using {entityClassPath.ClassNamespace};
using {dtoClassPath.ClassNamespace};
using {exceptionsClassPath.ClassNamespace};
using {contextClassPath.ClassNamespace};
using {validatorsClassPath.ClassNamespace};
using AutoMapper;
using AutoMapper.QueryableExtensions;
using FluentValidation.Results;
using MediatR;
using Microsoft.AspNetCore.JsonPatch;
using Microsoft.EntityFrameworkCore;
using System.Threading;
using System.Threading.Tasks;
コード例 #11
0
        private static string WriteTestFileText(string solutionDirectory, string srcDirectory, ClassPath classPath, Entity entity, bool isProtected, Feature feature, string projectBaseName)
        {
            var dtoUtilClassPath     = ClassPathHelper.DtoClassPath(solutionDirectory, "", entity.Name, projectBaseName);
            var testUtilClassPath    = ClassPathHelper.FunctionalTestUtilitiesClassPath(srcDirectory, projectBaseName, "");
            var fakerClassPath       = ClassPathHelper.TestFakesClassPath(srcDirectory, "", entity.Name, projectBaseName);
            var parentFakerClassPath = ClassPathHelper.TestFakesClassPath(srcDirectory, "", feature.ParentEntity, projectBaseName);
            var permissionsClassPath = ClassPathHelper.PolicyDomainClassPath(srcDirectory, "", projectBaseName);
            var rolesClassPath       = ClassPathHelper.SharedKernelDomainClassPath(solutionDirectory, "");

            var permissionsUsing = isProtected
                ? $"{Environment.NewLine}using {permissionsClassPath.ClassNamespace};{Environment.NewLine}using {rolesClassPath.ClassNamespace};"
                : string.Empty;

            var authOnlyTests = isProtected ? $@"
            {CreateEntityTestUnauthorized(entity)}
            {CreateEntityTestForbidden(entity)}" : "";

            return(@$ "namespace {classPath.ClassNamespace};

using {dtoUtilClassPath.ClassNamespace};
using {fakerClassPath.ClassNamespace};
using {parentFakerClassPath.ClassNamespace};
using {testUtilClassPath.ClassNamespace};{permissionsUsing}
using FluentAssertions;
using NUnit.Framework;
using System.Net;
using System.Threading.Tasks;
コード例 #12
0
        public static string GetQueryFileText(string classNamespace, Entity entity, string contextName, string solutionDirectory, string projectBaseName)
        {
            var className          = Utilities.GetEntityListFeatureClassName(entity.Name);
            var queryListName      = Utilities.QueryListName(entity.Name);
            var readDto            = Utilities.GetDtoName(entity.Name, Dto.Read);
            var paramsDto          = Utilities.GetDtoName(entity.Name, Dto.ReadParamaters);
            var primaryKeyPropName = entity.PrimaryKeyProperty.Name;

            var entityClassPath     = ClassPathHelper.EntityClassPath(solutionDirectory, "", projectBaseName);
            var dtoClassPath        = ClassPathHelper.DtoClassPath(solutionDirectory, "", entity.Name, projectBaseName);
            var exceptionsClassPath = ClassPathHelper.CoreExceptionClassPath(solutionDirectory, "", projectBaseName);
            var contextClassPath    = ClassPathHelper.DbContextClassPath(solutionDirectory, "", projectBaseName);
            var wrapperClassPath    = ClassPathHelper.WrappersClassPath(solutionDirectory, "", projectBaseName);

            return(@$ "namespace {classNamespace}
{{
    using {entityClassPath.ClassNamespace};
    using {dtoClassPath.ClassNamespace};
    using {exceptionsClassPath.ClassNamespace};
    using {contextClassPath.ClassNamespace};
    using {wrapperClassPath.ClassNamespace};
    using AutoMapper;
    using AutoMapper.QueryableExtensions;
    using MediatR;
    using Sieve.Models;
    using Sieve.Services;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading;
    using System.Threading.Tasks;
コード例 #13
0
        public static string GetCreationValidatorFileText(string solutionDirectory, string projectBaseName, string classNamespace, Entity entity)
        {
            var dtoClassPath = ClassPathHelper.DtoClassPath(solutionDirectory, "", entity.Name, projectBaseName);

            return(@$ "namespace {classNamespace}
{{
    using {dtoClassPath.ClassNamespace};
    using FluentValidation;
コード例 #14
0
ファイル: DtoModifier.cs プロジェクト: wi3land/craftsman
        private static void UpdateDtoFile(string solutionDirectory, string entityName, List <EntityProperty> props, Dto dto)
        {
            var dtoFileName = $"{Utilities.GetDtoName(entityName, dto)}.cs";
            var classPath   = ClassPathHelper.DtoClassPath(solutionDirectory, dtoFileName, entityName);

            if (!Directory.Exists(classPath.ClassDirectory))
            {
                throw new DirectoryNotFoundException($"The `{classPath.ClassDirectory}` directory could not be found.");
            }

            if (!File.Exists(classPath.FullClassPath))
            {
                throw new FileNotFoundException($"The `{classPath.FullClassPath}` file could not be found.");
            }

            var tempPath = $"{classPath.FullClassPath}temp";

            using (var input = File.OpenText(classPath.FullClassPath))
            {
                using (var output = new StreamWriter(tempPath))
                {
                    string line;
                    var    fkUsingStatements = "";

                    if (dto == Dto.Read)
                    {
                        foreach (var prop in props)
                        {
                            if (prop.IsForeignKey)
                            {
                                fkUsingStatements += DtoFileTextGenerator.GetForeignKeyUsingStatements(classPath, fkUsingStatements, prop, dto);
                            }
                        }
                    }

                    while (null != (line = input.ReadLine()))
                    {
                        var newText = $"{line}";
                        if (line.Contains($"add-on property marker"))
                        {
                            newText += @$ "{Environment.NewLine}{Environment.NewLine}{DtoFileTextGenerator.DtoPropBuilder(props, dto)}";
                        }
                        if (line.Contains("using System;"))
                        {
                            newText += fkUsingStatements;
                        }

                        output.WriteLine(newText);
                    }
                }
            }

            // delete the old file and set the name of the new one to the original name
            File.Delete(classPath.FullClassPath);
            File.Move(tempPath, classPath.FullClassPath);

            GlobalSingleton.AddUpdatedFile(classPath.FullClassPath.Replace($"{solutionDirectory}{Path.DirectorySeparatorChar}", ""));
        }
コード例 #15
0
ファイル: ProfileBuilder.cs プロジェクト: znedw/craftsman
        public static string GetProfileFileText(string classNamespace, Entity entity, string solutionDirectory, string projectBaseName)
        {
            var entitiesClassPath = ClassPathHelper.EntityClassPath(solutionDirectory, "", projectBaseName);
            var dtoClassPath      = ClassPathHelper.DtoClassPath(solutionDirectory, "", entity.Name, projectBaseName);

            return(@$ "namespace {classNamespace}
{{
    using {dtoClassPath.ClassNamespace};
    using AutoMapper;
    using {entitiesClassPath.ClassNamespace};
コード例 #16
0
        private static string GetFakeFileText(string classNamespace, string objectToFakeClassName, Entity entity, string solutionDirectory, string testDirectory, string projectBaseName)
        {
            var entitiesClassPath = ClassPathHelper.EntityClassPath(testDirectory, "", entity.Plural, projectBaseName);
            var dtoClassPath      = ClassPathHelper.DtoClassPath(solutionDirectory, "", entity.Name, projectBaseName);

            // this... is super fragile. Should really refactor this
            var usingStatement = objectToFakeClassName.Contains("DTO", StringComparison.InvariantCultureIgnoreCase) ? @$ "using {dtoClassPath.ClassNamespace};" : $"using {entitiesClassPath.ClassNamespace};";

            return(@$ "namespace {classNamespace};

using AutoBogus;
{usingStatement}
コード例 #17
0
        public static void RemoveDirectory(string solutionDirectory, string entityName)
        {
            var classPath = ClassPathHelper.DtoClassPath(solutionDirectory, "", entityName); // deleting directory, so I don't need to give a meaningful filename

            if (!Directory.Exists(classPath.ClassDirectory))
            {
                throw new DirectoryNotFoundException($"The `{classPath.ClassDirectory}` directory could not be found.");
            }

            var dir = new DirectoryInfo(classPath.ClassDirectory);

            dir.Delete(true);
        }
コード例 #18
0
ファイル: IdentityRemover.cs プロジェクト: dgncn/craftsman
        public static void RemoveDtos(string solutionDirectory)
        {
            var classPath = ClassPathHelper.DtoClassPath(solutionDirectory, "", "Auth");

            if (!Directory.Exists(classPath.ClassDirectory))
            {
                throw new DirectoryNotFoundException($"The `{classPath.ClassDirectory}` directory could not be found.");
            }

            var dir = new DirectoryInfo(classPath.ClassDirectory);

            dir.Delete(true);
        }
コード例 #19
0
        public static string GetControllerFileText(string classNamespace, string entityName, string entityPlural, string solutionDirectory, string srcDirectory, string projectBaseName, bool usesJwtAuth)
        {
            // TODO create an attribute factory that can order them how i want and work more dynamically

            var endpointBase = Utilities.EndpointBaseGenerator(entityPlural);

            var dtoClassPath         = ClassPathHelper.DtoClassPath(solutionDirectory, "", entityName, projectBaseName);
            var wrapperClassPath     = ClassPathHelper.WrappersClassPath(srcDirectory, "", projectBaseName);
            var featureClassPath     = ClassPathHelper.FeaturesClassPath(srcDirectory, "", entityPlural, projectBaseName);
            var permissionsClassPath = ClassPathHelper.PolicyDomainClassPath(srcDirectory, "", projectBaseName);
            var rolesClassPath       = ClassPathHelper.SharedKernelDomainClassPath(solutionDirectory, "");
            var permissionsUsing     = usesJwtAuth
                ? @$ "{Environment.NewLine}using {permissionsClassPath.ClassNamespace};
using {rolesClassPath.ClassNamespace};"
コード例 #20
0
        public static string GetControllerFileText(string classNamespace, Entity entity, bool AddSwaggerComments, List <Policy> policies, string solutionDirectory, string projectBaseName)
        {
            var lowercaseEntityVariable = entity.Name.LowercaseFirstLetter();
            var entityName                    = entity.Name;
            var entityNamePlural              = entity.Plural;
            var readDto                       = Utilities.GetDtoName(entityName, Dto.Read);
            var readParamDto                  = Utilities.GetDtoName(entityName, Dto.ReadParamaters);
            var creationDto                   = Utilities.GetDtoName(entityName, Dto.Creation);
            var updateDto                     = Utilities.GetDtoName(entityName, Dto.Update);
            var primaryKeyProp                = entity.PrimaryKeyProperty;
            var queryListMethodName           = Utilities.QueryListName(entityName);
            var queryRecordMethodName         = Utilities.QueryRecordName(entityName);
            var addRecordCommandMethodName    = Utilities.CommandAddName(entityName);
            var deleteRecordCommandMethodName = Utilities.CommandDeleteName(entityName);
            var updateRecordCommandMethodName = Utilities.CommandUpdateName(entityName);
            var patchRecordCommandMethodName  = Utilities.CommandPatchName(entityName);
            var pkPropertyType                = primaryKeyProp.Type;
            var listResponse                  = $@"Response<IEnumerable<{readDto}>>";
            var singleResponse                = $@"Response<{readDto}>";
            var getListEndpointName           = entity.Name == entity.Plural ? $@"Get{entityNamePlural}List" : $@"Get{entityNamePlural}";
            var getRecordEndpointName         = entity.Name == entity.Plural ? $@"Get{entityNamePlural}Record" : $@"Get{entity.Name}";
            var endpointBase                  = Utilities.EndpointBaseGenerator(entityNamePlural);
            var getListAuthorizations         = BuildAuthorizations(policies, Endpoint.GetList, entity.Name);
            var getRecordAuthorizations       = BuildAuthorizations(policies, Endpoint.GetRecord, entity.Name);
            var addRecordAuthorizations       = BuildAuthorizations(policies, Endpoint.AddRecord, entity.Name);
            var updateRecordAuthorizations    = BuildAuthorizations(policies, Endpoint.UpdateRecord, entity.Name);
            var updatePartialAuthorizations   = BuildAuthorizations(policies, Endpoint.UpdatePartial, entity.Name);
            var deleteRecordAuthorizations    = BuildAuthorizations(policies, Endpoint.DeleteRecord, entity.Name);
            var idParam                       = $@"{lowercaseEntityVariable}Id";

            var dtoClassPath     = ClassPathHelper.DtoClassPath(solutionDirectory, "", entityName, projectBaseName);
            var wrapperClassPath = ClassPathHelper.WrappersClassPath(solutionDirectory, "", projectBaseName);
            var featureClassPath = ClassPathHelper.FeaturesClassPath(solutionDirectory, "", entity.Plural, projectBaseName);

            return(@$ "namespace {classNamespace}
{{
    using System;
    using System.Collections.Generic;
    using System.Text.Json;
    using Microsoft.AspNetCore.JsonPatch;
    using Microsoft.AspNetCore.Mvc;
    using Microsoft.AspNetCore.Authorization;
    using System.Threading.Tasks;
    using {dtoClassPath.ClassNamespace};
    using {wrapperClassPath.ClassNamespace};
    using System.Threading;
    using MediatR;
    using static {featureClassPath.ClassNamespace}.{Utilities.GetEntityListFeatureClassName(entity.Name)};
コード例 #21
0
ファイル: DtoBuilder.cs プロジェクト: pdevito3/craftsman
        public static void CreateDtos(string solutionDirectory, Entity entity, string projectBaseName)
        {
            // ****this class path will have an invalid FullClassPath. just need the directory
            var classPath = ClassPathHelper.DtoClassPath(solutionDirectory, "", entity.Name, projectBaseName);

            if (!Directory.Exists(classPath.ClassDirectory))
            {
                Directory.CreateDirectory(classPath.ClassDirectory);
            }

            CreateDtoFile(solutionDirectory, entity, Dto.Read, projectBaseName);
            CreateDtoFile(solutionDirectory, entity, Dto.Manipulation, projectBaseName);
            CreateDtoFile(solutionDirectory, entity, Dto.Creation, projectBaseName);
            CreateDtoFile(solutionDirectory, entity, Dto.Update, projectBaseName);
            CreateDtoFile(solutionDirectory, entity, Dto.ReadParamaters, projectBaseName);
        }
コード例 #22
0
ファイル: DtoBuilder.cs プロジェクト: znedw/craftsman
        public static void CreateDtoFile(string solutionDirectory, Entity entity, Dto dto, string projectBaseName)
        {
            var dtoFileName = $"{Utilities.GetDtoName(entity.Name, dto)}.cs";
            var classPath   = ClassPathHelper.DtoClassPath(solutionDirectory, dtoFileName, entity.Name, projectBaseName);

            if (File.Exists(classPath.FullClassPath))
            {
                throw new FileAlreadyExistsException(classPath.FullClassPath);
            }

            using (FileStream fs = File.Create(classPath.FullClassPath))
            {
                var data = GetDtoFileText(solutionDirectory, classPath, entity, dto, projectBaseName);
                fs.Write(Encoding.UTF8.GetBytes(data));
            }
        }
コード例 #23
0
        private static string WriteTestFileText(string solutionDirectory, ClassPath classPath, Entity entity, string projectBaseName)
        {
            var featureName               = Utilities.PatchEntityFeatureClassName(entity.Name);
            var testFixtureName           = Utilities.GetIntegrationTestFixtureName();
            var commandName               = Utilities.CommandPatchName(entity.Name);
            var fakeEntity                = Utilities.FakerName(entity.Name);
            var updateDto                 = Utilities.GetDtoName(entity.Name, Dto.Update);
            var fakeEntityVariableName    = $"fake{entity.Name}One";
            var lowercaseEntityName       = entity.Name.LowercaseFirstLetter();
            var lowercaseEntityPluralName = entity.Plural.LowercaseFirstLetter();
            var pkName            = entity.PrimaryKeyProperty.Name;
            var lowercaseEntityPk = pkName.LowercaseFirstLetter();

            var testUtilClassPath = ClassPathHelper.IntegrationTestUtilitiesClassPath(solutionDirectory, projectBaseName, "");
            var fakerClassPath    = ClassPathHelper.TestFakesClassPath(solutionDirectory, "", entity.Name, projectBaseName);
            var dtoClassPath      = ClassPathHelper.DtoClassPath(solutionDirectory, "", entity.Name, projectBaseName);
            var featuresClassPath = ClassPathHelper.FeaturesClassPath(solutionDirectory, featureName, entity.Plural, projectBaseName);

            var myProp    = entity.Properties.Where(e => e.Type == "string" && e.CanManipulate).FirstOrDefault();
            var lookupVal = $@"""Easily Identified Value For Test""";

            // if no string properties, do one with an int
            if (myProp == null)
            {
                myProp    = entity.Properties.Where(e => e.Type.Contains("int") && e.CanManipulate).FirstOrDefault();
                lookupVal = "999999";
            }

            if (myProp == null)
            {
                return("// no patch tests were created");
            }

            return(@$ "namespace {classPath.ClassNamespace}
{{
    using {fakerClassPath.ClassNamespace};
    using {testUtilClassPath.ClassNamespace};
    using {dtoClassPath.ClassNamespace};
    using FluentAssertions;
    using Microsoft.EntityFrameworkCore;
    using NUnit.Framework;
    using System.Threading.Tasks;
    using Microsoft.AspNetCore.JsonPatch;
    using System.Linq;
    using static {featuresClassPath.ClassNamespace}.{featureName};
コード例 #24
0
        private static string WriteTestFileText(string solutionDirectory, string srcDirectory, ClassPath classPath, string projectBaseName)
        {
            var wrapperClassPath      = ClassPathHelper.WrappersClassPath(srcDirectory, "", projectBaseName);
            var domainPolicyClassPath = ClassPathHelper.PolicyDomainClassPath(srcDirectory, "", projectBaseName);
            var entityClassPath       = ClassPathHelper.EntityClassPath(srcDirectory, "", "RolePermissions", projectBaseName);
            var dtoClassPath          = ClassPathHelper.DtoClassPath(solutionDirectory, "", "RolePermission", projectBaseName);
            var rolesClassPath        = ClassPathHelper.SharedKernelDomainClassPath(solutionDirectory, "");

            return(@$ "namespace {classPath.ClassNamespace};

using {domainPolicyClassPath.ClassNamespace};
using {entityClassPath.ClassNamespace};
using {wrapperClassPath.ClassNamespace};
using {dtoClassPath.ClassNamespace};
using {rolesClassPath.ClassNamespace};
using Bogus;
using FluentAssertions;
using NUnit.Framework;
コード例 #25
0
ファイル: DtoBuilder.cs プロジェクト: wi3land/craftsman
        public static void CreateDtoFile(string solutionDirectory, Entity entity, Dto dto)
        {
            var dtoFileName = $"{Utilities.GetDtoName(entity.Name, dto)}.cs";
            var classPath   = ClassPathHelper.DtoClassPath(solutionDirectory, dtoFileName, entity.Name);

            if (File.Exists(classPath.FullClassPath))
            {
                throw new FileAlreadyExistsException(classPath.FullClassPath);
            }

            using (FileStream fs = File.Create(classPath.FullClassPath))
            {
                var data = GetDtoFileText(classPath, entity, dto);
                fs.Write(Encoding.UTF8.GetBytes(data));

                GlobalSingleton.AddCreatedFile(classPath.FullClassPath.Replace($"{solutionDirectory}{Path.DirectorySeparatorChar}", ""));
            }
        }
コード例 #26
0
        public static string GetEntitySeederFileText(string classNamespace, Entity entity, string dbContextName, string solutionDirectory, string projectBaseName)
        {
            var entitiesClassPath    = ClassPathHelper.EntityClassPath(solutionDirectory, "", entity.Plural, projectBaseName);
            var dtoClassPath         = ClassPathHelper.DtoClassPath(solutionDirectory, "", entity.Name, projectBaseName);
            var dbContextClassPath   = ClassPathHelper.DbContextClassPath(solutionDirectory, "", projectBaseName);
            var entityForCreationDto = $"{Utilities.GetDtoName(entity.Name, Dto.Creation)}";

            if (dbContextName is null)
            {
                throw new ArgumentNullException(nameof(dbContextName));
            }

            return(@$ "namespace {classNamespace};

using AutoBogus;
using {entitiesClassPath.ClassNamespace};
using {dtoClassPath.ClassNamespace};
using {dbContextClassPath.ClassNamespace};
using System.Linq;
コード例 #27
0
        private static string WriteTestFileText(string solutionDirectory, string testDirectory, string srcDirectory, ClassPath classPath, Entity entity, string projectBaseName)
        {
            var featureName     = Utilities.PatchEntityFeatureClassName(entity.Name);
            var testFixtureName = Utilities.GetIntegrationTestFixtureName();
            var commandName     = Utilities.CommandPatchName(entity.Name);

            var testUtilClassPath  = ClassPathHelper.IntegrationTestUtilitiesClassPath(testDirectory, projectBaseName, "");
            var fakerClassPath     = ClassPathHelper.TestFakesClassPath(testDirectory, "", entity.Name, projectBaseName);
            var exceptionClassPath = ClassPathHelper.ExceptionsClassPath(testDirectory, "");
            var dtoClassPath       = ClassPathHelper.DtoClassPath(solutionDirectory, "", entity.Name, projectBaseName);
            var featuresClassPath  = ClassPathHelper.FeaturesClassPath(srcDirectory, featureName, entity.Plural, projectBaseName);

            var myProp    = entity.Properties.Where(e => e.Type == "string" && e.CanManipulate).FirstOrDefault();
            var lookupVal = $@"""Easily Identified Value For Test""";

            // if no string properties, do one with an int
            if (myProp == null)
            {
                myProp    = entity.Properties.Where(e => e.Type.Contains("int") && e.CanManipulate).FirstOrDefault();
                lookupVal = "999999";
            }

            if (myProp == null)
            {
                return("// no patch tests were created");
            }

            var foreignEntityUsings = Utilities.GetForeignEntityUsings(testDirectory, entity, projectBaseName);

            return(@$ "namespace {classPath.ClassNamespace};

using {fakerClassPath.ClassNamespace};
using {testUtilClassPath.ClassNamespace};
using {dtoClassPath.ClassNamespace};
using {exceptionClassPath.ClassNamespace};
using {featuresClassPath.ClassNamespace};
using FluentAssertions;
using Microsoft.EntityFrameworkCore;
using NUnit.Framework;
using System.Threading.Tasks;
using Microsoft.AspNetCore.JsonPatch;
using static {testFixtureName};{foreignEntityUsings}
コード例 #28
0
ファイル: SolutionBuilder.cs プロジェクト: znedw/craftsman
        private static void BuildCoreProject(string solutionDirectory, string projectDirectory, string projectBaseName, IFileSystem fileSystem)
        {
            var solutionFolder       = projectDirectory.Replace(solutionDirectory, "").Replace(Path.DirectorySeparatorChar.ToString(), "");
            var coreProjectClassPath = ClassPathHelper.CoreProjectClassPath(projectDirectory, projectBaseName);

            CoreCsProjBuilder.CreateCoreCsProj(projectDirectory, projectBaseName);
            Utilities.ExecuteProcess("dotnet", $@"sln add ""{coreProjectClassPath.FullClassPath}"" --solution-folder {solutionFolder}", solutionDirectory);

            // dir won't show up in project until file is added
            Directory.CreateDirectory(ClassPathHelper.EntityClassPath(projectDirectory, "", projectBaseName).ClassDirectory);
            Directory.CreateDirectory(ClassPathHelper.DtoClassPath(projectDirectory, "", "", projectBaseName).ClassDirectory);
            Directory.CreateDirectory(ClassPathHelper.CoreExceptionClassPath(projectDirectory, "", projectBaseName).ClassDirectory);
            Directory.CreateDirectory(ClassPathHelper.WrappersClassPath(projectDirectory, "", projectBaseName).ClassDirectory);
            Directory.CreateDirectory(ClassPathHelper.SharedDtoClassPath(projectDirectory, "", projectBaseName).ClassDirectory);

            BasePaginationParametersBuilder.CreateBasePaginationParameters(projectDirectory, projectBaseName, fileSystem);
            PagedListBuilder.CreatePagedList(projectDirectory, projectBaseName, fileSystem);
            ResponseBuilder.CreateResponse(projectDirectory, projectBaseName, fileSystem);
            CoreExceptionsBuilder.CreateExceptions(projectDirectory, projectBaseName);
        }
コード例 #29
0
        private static string WriteTestFileText(string solutionDirectory, ClassPath classPath, Entity entity, List <Policy> policies, string projectBaseName)
        {
            var testUtilClassPath = ClassPathHelper.FunctionalTestUtilitiesClassPath(solutionDirectory, projectBaseName, "");
            var fakerClassPath    = ClassPathHelper.TestFakesClassPath(solutionDirectory, "", entity.Name, projectBaseName);
            var dtoClassPath      = ClassPathHelper.DtoClassPath(solutionDirectory, "", entity.Name, projectBaseName);

            var hasRestrictedEndpoints = policies.Count > 0;
            var authOnlyTests          = hasRestrictedEndpoints ? $@"
            {EntityTestUnauthorized(entity)}
            {EntityTestForbidden(entity)}" : "";

            return(@$ "namespace {classPath.ClassNamespace};

using {fakerClassPath.ClassNamespace};
using {dtoClassPath.ClassNamespace};
using {testUtilClassPath.ClassNamespace};
using Microsoft.AspNetCore.JsonPatch;
using FluentAssertions;
using NUnit.Framework;
using System.Net;
using System.Threading.Tasks;
コード例 #30
0
ファイル: DtoModifier.cs プロジェクト: p3s/craftsman
        private static void UpdateDtoFile(string solutionDirectory, string entityName, List <EntityProperty> props, Dto dto, string projectBaseName)
        {
            var dtoFileName = $"{Utilities.GetDtoName(entityName, dto)}.cs";
            var classPath   = ClassPathHelper.DtoClassPath(solutionDirectory, dtoFileName, entityName, projectBaseName);

            if (!Directory.Exists(classPath.ClassDirectory))
            {
                throw new DirectoryNotFoundException($"The `{classPath.ClassDirectory}` directory could not be found.");
            }

            if (!File.Exists(classPath.FullClassPath))
            {
                throw new FileNotFoundException($"The `{classPath.FullClassPath}` file could not be found.");
            }

            var tempPath = $"{classPath.FullClassPath}temp";

            using (var input = File.OpenText(classPath.FullClassPath))
            {
                using (var output = new StreamWriter(tempPath))
                {
                    string line;

                    while (null != (line = input.ReadLine()))
                    {
                        var newText = $"{line}";
                        if (line.Contains($"add-on property marker"))
                        {
                            newText += @$ "{Environment.NewLine}{Environment.NewLine}{DtoFileTextGenerator.DtoPropBuilder(props, dto)}";
                        }

                        output.WriteLine(newText);
                    }
                }
            }

            // delete the old file and set the name of the new one to the original name
            File.Delete(classPath.FullClassPath);
            File.Move(tempPath, classPath.FullClassPath);
        }