diff --git a/src/generators/index.js b/src/generators/index.js index 019affd..961b30a 100644 --- a/src/generators/index.js +++ b/src/generators/index.js @@ -22,6 +22,13 @@ module.exports = { description: "Java Event Models for Axon.", attributes: [], invocation: require('./java-axon-events-generator') - } + }, + nclazz_java_jpa_entites: { + key: "nclazz_jpa_entities", + name: "Java JPA Entities", + description: "Java JPA/Hibernate Entities.", + attributes: [], + invocation: require('./java-jpa-entities.generator') + }, } \ No newline at end of file diff --git a/src/generators/java-jpa-entities.generator.js b/src/generators/java-jpa-entities.generator.js new file mode 100644 index 0000000..865ce3f --- /dev/null +++ b/src/generators/java-jpa-entities.generator.js @@ -0,0 +1,28 @@ +const Mustache = require('mustache') +const fs = require('fs') +const path = require('path') + +const jpaEntites = require('../java-jpa-entity'); + +const templateEntities = fs.readFileSync(path.resolve(path.join('templates', 'jpa-entity.java.mustache')), 'utf-8') + +module.exports = (service) => { + + const jpaModels = service.models.filter(model => model.attributes.find(attr => attr.name == 'jpa_sql')) + const models = jpaEntites.mapJavaJpaEntity(jpaModels, service.namespace) + + const modelFiles = models.map(model => { + return { + name: `${model.name}.java`, + dir: model.dir, + contents: Mustache.render(templateModel, { service, ...model }) + } + }) + return [ + ...modelFiles, + ...enumFiles, + ...unionFiles + ] + + +} \ No newline at end of file diff --git a/src/java-jpa-entity.js b/src/java-jpa-entity.js new file mode 100644 index 0000000..79a77f8 --- /dev/null +++ b/src/java-jpa-entity.js @@ -0,0 +1,35 @@ +const utils = require('./utils') +const javaType = require('./java-type') + +module.exports = { + mapJavaJpaEntity: (models, namespace, suffix='models') => { + return models.map(model => { + + let jpa = model.attributes.find(attr => attr.name == 'jpa_sql'); + + model.name = utils.pascalcase(model.name) + model.package = `${namespace}.${suffix}`; + model.dir = model.package.replace(/\./g, '/') + model.fields = model.fields.map(field => { + field.name = utils.camelcase(field.name) + field.type = javaType.mapJavaType(field.type, namespace) + field.default = javaType.mapDefaultValue(field.type, field.default) + return field + }) + + let imports = [] + for(let field of model.fields) { + imports = [ ...imports, ...field.type.imports ] + } + model.imports = [ ...new Set(imports) ] + model.implements = model.implements || [] + if(model.implements.length) { + model['implements'][ model['implements'].length - 1 ].last = true + } + + model.table = jpa.table || model.plural + + return model + }) + } +} \ No newline at end of file diff --git a/templates/jpa-entity.java.mustache b/templates/jpa-entity.java.mustache new file mode 100644 index 0000000..417bdeb --- /dev/null +++ b/templates/jpa-entity.java.mustache @@ -0,0 +1,32 @@ +/** + * Auto-generated from apibuilder.io service specification. + * apidoc-version : {{service.apidoc.version}} + * organisation : {{service.organization.key}} + * service-version : {{service.version}} + * + * Documentation at: + * https://app.apibuilder.io/{{service.organization.key}}/{{service.name}}/{{service.version}} + * +**/ +package {{package}}; + +import javax.persistence.*; +{{#imports}} +import {{{.}}}; +{{/imports}} + +/** + * {{description}} + * See https://app.apibuilder.io/{{service.organization.key}}/{{service.name}}/{{service.version}}#model-{{model.name}} + * +**/ +@Entity +@Data +@Table( + name = "{{table}}" +) +public class {{name}}Entity { + + + +} \ No newline at end of file