UNPKG

generator-springboot-hexagonal

Version:

A code generator for SpringBoot microservices in Hexagonal Architecture

150 lines (119 loc) 6.24 kB
'use strict'; const BaseGenerator = require('../base-generator'); const constants = require('../constants'); const _ = require('lodash'); module.exports = class extends BaseGenerator { constructor(args, opts) { super(args, opts); this.configOptions = this.options.configOptions || {}; } get initializing() { this.logSuccess('Generating JPA entity, repository, service and controller'); return { validateEntityName() { const context = this.context; //this.env.error("The entity name is invalid"); } } } /*get prompting() { return prompts.prompting; }*/ configuring() { this.configOptions = Object.assign({}, this.configOptions, this.config.getAll()); this.configOptions.basePath = this.options['base-path']; this.configOptions.entityName = 'Auth'; this.configOptions.entityVarName = 'auth'; this.configOptions.security = true; this.configOptions.rabbit = this.config.get('rabbit'); this.configOptions.webclient = this.config.get('webclient'); this.configOptions.tableName = _.lowerCase(this.configOptions.entityName)+'s'; this.config.set('security', true); Object.assign(this.configOptions, constants); } writing() { this._generateAppCode(this.configOptions); this._generateDbMigrationConfig(this.configOptions) this._copyMavenWrapper(this.configOptions); this._generateMavenPOMXml(this.configOptions); } end() { //TODO; Disabling this temporarily to fix test failures. //this._formatCode(this.configOptions); } _generateAppCode(configOptions) { const mainJavaTemplates = [ {src: 'adapters/security/WebSecurityConfig.java', dest: 'adapters/security/WebSecurityConfig.java'}, {src: 'adapters/security/services/UserDetailsImpl.java', dest: 'adapters/security/services/UserDetailsImpl.java'}, {src: 'adapters/security/services/UserDetailsServiceImpl.java', dest: 'adapters/security/services/UserDetailsServiceImpl.java'}, {src: 'adapters/security/jwt/AuthEntryPointJwt.java', dest: 'adapters/security/jwt/AuthEntryPointJwt.java'}, {src: 'adapters/security/jwt/AuthTokenFilter.java', dest: 'adapters/security/jwt/AuthTokenFilter.java'}, {src: 'adapters/security/jwt/JwtTokenUtil.java', dest: 'adapters/security/jwt/JwtTokenUtil.java'}, {src: 'adapters/security/jwt/JwtUtils.java', dest: 'adapters/security/jwt/JwtUtils.java'}, {src: 'adapters/inbound/controllers/JwtAuthenticationController.java', dest: 'adapters/inbound/controllers/JwtAuthenticationController.java'}, {src: 'adapters/inbound/controllers/RegistrationController.java', dest: 'adapters/inbound/controllers/RegistrationController.java'}, {src: 'adapters/entities/Entity.java', dest: 'adapters/entities/'+configOptions.entityName+'.java'}, {src: 'adapters/outbound/repositories/UserRepository.java', dest: 'adapters/outbound/repositories/'+configOptions.entityName+'Repository.java'}, {src: 'adapters/outbound/RepositoryAdapter.java', dest: 'adapters/outbound/'+configOptions.entityName+'RepositoryAdapter.java'}, {src: 'adapters/dto/Entity.java', dest: 'adapters/dto/'+configOptions.entityName+'DTO.java'}, {src: 'adapters/dto/JwtRequest.java', dest: 'adapters/dto/JwtRequest.java'}, {src: 'adapters/dto/JwtResponse.java', dest: 'adapters/dto/JwtResponse.java'}, {src: 'adapters/mapper/Entity.java', dest: 'adapters/mapper/'+configOptions.entityName+'Mapper.java'}, {src: 'adapters/mapper/Converter.java', dest: 'adapters/mapper/Converter.java'}, {src: 'ports/out/Port.java', dest: 'ports/out/'+configOptions.entityName+'RepositoryPort.java'}, ]; this.generateMainJavaCode(configOptions, mainJavaTemplates); } _generateDbMigrationConfig(configOptions) { if(configOptions.dbMigrationTool === 'flywaydb') { this._generateFlywayMigration(configOptions) } } _generateFlywayMigration(configOptions) { const counter = configOptions[constants.KEY_FLYWAY_MIGRATION_COUNTER] + 1; let vendor = configOptions.databaseType; if(vendor === "mariadb") { vendor = "mysql"; } this.fs.copyTpl( this.templatePath('app/src/main/resources/db/migration/flyway/V1__security.sql'), this.destinationPath('src/main/resources/db/migration/h2/V'+counter+'__create_security_table.sql'), configOptions ); this.fs.copyTpl( this.templatePath('app/src/main/resources/db/migration/flyway/V1__security.sql'), this.destinationPath('src/main/resources/db/migration/'+vendor+ '/V'+counter+'__create_security_table.sql'), configOptions ); const flywayMigrantCounter = { [constants.KEY_FLYWAY_MIGRATION_COUNTER]: counter }; this.config.set(flywayMigrantCounter); } _copyMavenWrapper(configOptions) { const commonMavenConfigDir = '../../common/files/maven/'; ['mvnw', 'mvnw.cmd'].forEach(tmpl => { this.fs.copyTpl( this.templatePath(commonMavenConfigDir + tmpl), this.destinationPath(tmpl) ); }); this.fs.copyTpl( this.templatePath(commonMavenConfigDir + 'gitignore'), this.destinationPath('.gitignore') ); this.fs.copy( this.templatePath(commonMavenConfigDir + '.mvn'), this.destinationPath('.mvn') ); } _generateMavenPOMXml(configOptions) { const mavenConfigDir = '../../common/files/maven/'; this.fs.copyTpl( this.templatePath(mavenConfigDir + 'pom.xml'), this.destinationPath('pom.xml'), configOptions ); } };