UNPKG

@lcap/asl

Version:

NetEase Application Specific Language

632 lines 22.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getEntityInterfaces = exports.getEntityPropertyParams = exports.getEntityGetAllQueryParams = exports.getEntityStructures = exports.getEntityStructureNames = exports.ENTITY_INTERFACE_PREFIX = exports.ENTITY_STRUCTURE_PREFIX = void 0; const utils_1 = require("../utils"); const pluralize = require("pluralize"); const lodash_1 = require("lodash"); const __1 = require(".."); const dataTypes_1 = require("./dataTypes"); exports.ENTITY_STRUCTURE_PREFIX = [ 'Sort', 'PageOf', 'ApiReturnOfPageOf', 'ApiReturnOf', 'ApiReturnOflong', 'ScopeOf', ]; exports.ENTITY_INTERFACE_PREFIX = [ 'get', 'delete', 'count', 'update', 'create', 'getAll', 'import', 'export', ]; const resolverNormal = { ast: { type: 'MemberExpression', object: { type: 'Identifier', name: 'data', }, property: { type: 'Identifier', name: 'Data', }, }, code: 'data.Data', }; const resolverPageOf = { ast: { type: 'MemberExpression', object: { type: 'MemberExpression', object: { type: 'Identifier', name: 'data', }, property: { type: 'Identifier', name: 'Data', }, }, property: { type: 'Identifier', name: 'content', }, }, code: 'data.Data.content', }; /** * 获取实体相关的所有数据结构的名称 * @param entityName 实体名称 */ const getEntityStructureNames = (entityName) => exports.ENTITY_STRUCTURE_PREFIX.map((key) => `${key}${utils_1.firstUpperCase(entityName)}`); exports.getEntityStructureNames = getEntityStructureNames; /** * 获取实体相关的所有数据结构 * @param entity 实体 */ function getEntityStructures(entity) { const service = entity.dataNode.service; return [ { name: `Sort${utils_1.firstUpperCase(entity.name)}`, type: 'object', propertyList: [ { level: 'property', name: 'empty', description: '', $ref: '#/basicTypes/Boolean', }, { level: 'property', name: 'sorted', description: '', $ref: '#/basicTypes/Boolean', }, { level: 'property', name: 'unsorted', description: '', $ref: '#/basicTypes/Boolean', }, ], }, { name: `PageOf${utils_1.firstUpperCase(entity.name)}`, type: 'object', propertyList: [ { level: 'property', name: 'content', description: '', $ref: `#/${service.id}/${entity.id}`, isArray: true, }, { level: 'property', name: 'empty', description: '', $ref: '#/basicTypes/Boolean', }, { level: 'property', name: 'first', description: '', $ref: '#/basicTypes/Boolean', }, { level: 'property', name: 'last', description: '', $ref: '#/basicTypes/Boolean', }, { level: 'property', name: 'number', description: '', $ref: '#/basicTypes/Integer', }, { level: 'property', name: 'numberOfElements', description: '', $ref: '#/basicTypes/Integer', }, { level: 'property', name: 'size', description: '', $ref: '#/basicTypes/Integer', }, { level: 'property', name: 'totalElements', description: '', $ref: '#/basicTypes/Integer', }, { level: 'property', name: 'totalPages', description: '', $ref: '#/basicTypes/Integer', }, ], }, { name: `ApiReturnOfPageOf${utils_1.firstUpperCase(entity.name)}`, type: 'object', propertyList: [ { level: 'property', name: 'Code', description: '', $ref: '#/basicTypes/Integer', }, { level: 'property', name: 'Data', description: '', $ref: `PageOf${utils_1.firstUpperCase(entity.name)}`, }, { level: 'property', name: 'Message', description: '', type: 'string', format: '', $ref: '#/basicTypes/String', }, ], structureRef: `PageOf${utils_1.firstUpperCase(entity.name)}`, }, { name: `ApiReturnOf${utils_1.firstUpperCase(entity.name)}`, type: 'object', propertyList: [ { level: 'property', name: 'Code', description: '', $ref: '#/basicTypes/Integer', }, { level: 'property', name: 'Data', description: '', $ref: `#/${service.id}/${entity.id}`, }, { level: 'property', name: 'Message', description: '', $ref: '#/basicTypes/String', }, ], }, { name: `ApiReturnOflong${utils_1.firstUpperCase(entity.name)}`, type: 'object', propertyList: [ { level: 'property', name: 'Code', description: '', $ref: '#/basicTypes/Integer', }, { level: 'property', name: 'Data', description: '', $ref: '#/basicTypes/Decimal', }, { level: 'property', name: 'Message', description: '', $ref: '#/basicTypes/String', }, ], }, { name: `ScopeOf${utils_1.firstUpperCase(entity.name)}`, type: 'object', propertyList: [ { level: 'property', name: 'item', $ref: `#/${service.id}/${entity.id}`, }, { level: 'property', name: 'value', $ref: '#/basicTypes/String', }, { level: 'property', name: 'rowIndex', $ref: '#/basicTypes/Integer', }, { level: 'property', name: 'columnIndex', $ref: '#/basicTypes/Integer', }, { level: 'property', name: 'index', $ref: '#/basicTypes/Integer', }, ], }, ]; } exports.getEntityStructures = getEntityStructures; /** * 获取实体相关的所有 GET 接口请求参数 * @param entity 实体 */ function getEntityGetAllQueryParams(entity) { const parameters = {}; if (!entity) return parameters; function addJDLQueryParam(property, operator, type) { const name = `${property.name}.${operator}`; const schema = dataTypes_1.dataTypesMap[property.$ref]; const parameter = { name, in: 'query', required: false, schema: Object.assign({}, schema), entityFieldId: property.id, }; if (type === 'array') parameter.schema = { type: 'array', items: Object.assign({}, schema) }; else if (type === 'boolean') parameter.schema = { type: 'boolean', format: '' }; parameters[name] = parameter; } parameters.page = { name: 'page', in: 'query', required: false, schema: { type: 'integer', format: 'int' }, }; parameters.size = { name: 'size', in: 'query', required: false, schema: { type: 'integer', format: 'int' }, }; parameters.sort = { name: 'sort', in: 'query', required: false, schema: { type: 'array', items: { type: 'string', format: '' }, }, }; entity.propertyList.forEach((property) => { if (!property.$ref) { console.error('property.$ref undefined', entity.name, property.name); return; } const schema = dataTypes_1.dataTypesMap[property.$ref]; if (!property.$ref.startsWith('#/basicTypes/') && schema.type !== 'enum') { // 这里有枚举和非枚举的问题 property = new __1.EntityProperty({ name: property.name + 'Id', $ref: '#/basicTypes/Long', }); } addJDLQueryParam(property, 'equals'); addJDLQueryParam(property, 'notEquals'); addJDLQueryParam(property, 'in', 'array'); addJDLQueryParam(property, 'notIn', 'array'); addJDLQueryParam(property, 'specified', 'boolean'); if (property.$ref === '#/basicTypes/Integer' || property.$ref === '#/basicTypes/Long' || property.$ref === '#/basicTypes/Decimal') { addJDLQueryParam(property, 'greaterThan'); addJDLQueryParam(property, 'greaterThanOrEqual'); addJDLQueryParam(property, 'lessThan'); addJDLQueryParam(property, 'lessThanOrEqual'); } if (property.$ref === '#/basicTypes/Date' || property.$ref === '#/basicTypes/Time' || property.$ref === '#/basicTypes/DateTime') { addJDLQueryParam(property, 'greaterThan'); addJDLQueryParam(property, 'greaterThanOrEqual'); addJDLQueryParam(property, 'lessThan'); addJDLQueryParam(property, 'lessThanOrEqual'); } if (property.$ref === '#/basicTypes/String' || property.$ref === '#/basicTypes/Text') { addJDLQueryParam(property, 'contains'); addJDLQueryParam(property, 'doesNotContain'); } }); return parameters; } exports.getEntityGetAllQueryParams = getEntityGetAllQueryParams; /** * 获取实体相关的所有导出请求参数 * @param entity 实体 */ function getEntityExportQueryParams(entity) { const parameters = getEntityGetAllQueryParams(entity); parameters.fields = { name: 'fields', in: 'query', required: false, schema: dataTypes_1.dataTypesMap['#/basicTypes/String'], }; return parameters; } /** * 获取实体某个属性相关的所有接口参数 * @param property 实体属性 * @param dataTypesMap */ function getEntityPropertyParams(property) { const parameters = {}; if (!property) return parameters; function addJDLQueryParam(property, operator, type) { const name = `${property.name}.${operator}`; const schema = dataTypes_1.dataTypesMap[property.$ref]; const parameter = { name, in: 'query', required: false, schema: Object.assign({}, schema), entityFieldId: property.id, }; if (type === 'array') parameter.schema = { type: 'array', items: Object.assign({}, schema) }; else if (type === 'boolean') parameter.schema = { type: 'boolean', format: '' }; parameters[name] = parameter; } if (!property.$ref) { console.error('property.$ref undefined', property.name); return; } const schema = dataTypes_1.dataTypesMap[property.$ref]; if (!property.$ref.startsWith('#/basicTypes/') && schema.type !== 'enum') { // 这里有枚举和非枚举的问题 property = new __1.EntityProperty({ name: property.name + 'Id', $ref: '#/basicTypes/Long', }); } addJDLQueryParam(property, 'equals'); addJDLQueryParam(property, 'notEquals'); addJDLQueryParam(property, 'in', 'array'); addJDLQueryParam(property, 'notIn', 'array'); addJDLQueryParam(property, 'specified', 'boolean'); if (property.$ref === '#/basicTypes/Integer' || property.$ref === '#/basicTypes/Long' || property.$ref === '#/basicTypes/Decimal') { addJDLQueryParam(property, 'greaterThan'); addJDLQueryParam(property, 'greaterThanOrEqual'); addJDLQueryParam(property, 'lessThan'); addJDLQueryParam(property, 'lessThanOrEqual'); } if (property.$ref === '#/basicTypes/Date' || property.$ref === '#/basicTypes/Time' || property.$ref === '#/basicTypes/DateTime') { addJDLQueryParam(property, 'greaterThan'); addJDLQueryParam(property, 'greaterThanOrEqual'); addJDLQueryParam(property, 'lessThan'); addJDLQueryParam(property, 'lessThanOrEqual'); } if (property.$ref === '#/basicTypes/String' || property.$ref === '#/basicTypes/Text') { addJDLQueryParam(property, 'contains'); addJDLQueryParam(property, 'doesNotContain'); } return parameters; } exports.getEntityPropertyParams = getEntityPropertyParams; /** * 获取实体相关的所有接口 * @param entity 实体 */ function getEntityInterfaces(entity) { const pluralized = pluralize(entity.name); const service = entity.dataNode.service; return [ { data: { name: `getAll${utils_1.firstUpperCase(pluralized)}`, method: 'GET', path: `/api/${lodash_1.kebabCase(pluralized)}`, description: `getAll${utils_1.firstUpperCase(pluralized)}`, parameters: JSON.stringify(getEntityGetAllQueryParams(entity)), responses: JSON.stringify({ 200: { description: '', content: { 'application/json': { schema: { $ref: `<#/ApiReturnOfPageOf${utils_1.firstUpperCase(entity.name)}>`, }, }, }, }, }), }, resolver: resolverPageOf, }, { data: { name: `get${utils_1.firstUpperCase(entity.name)}`, method: 'GET', path: `/api/${lodash_1.kebabCase(pluralized)}/{id}`, description: `get${utils_1.firstUpperCase(entity.name)}`, parameters: JSON.stringify({ id: { name: 'id', in: 'path', required: true, schema: { type: 'integer', format: 'long' }, }, }), responses: JSON.stringify({ 200: { description: '', content: { 'application/json': { schema: { $ref: `<#/ApiReturnOf${utils_1.firstUpperCase(entity.name)}>`, }, }, }, }, }), }, resolver: resolverNormal, }, { data: { name: `create${utils_1.firstUpperCase(entity.name)}`, method: 'POST', path: `/api/${lodash_1.kebabCase(pluralized)}`, description: `create${utils_1.firstUpperCase(entity.name)}`, parameters: '{}', requestBody: JSON.stringify({ description: '', content: { 'application/json': { schema: { $ref: `#/${service.id}/${entity.id}`, }, }, }, }), responses: JSON.stringify({ 200: { description: '', content: { 'application/json': { schema: { $ref: `<#/ApiReturnOf${utils_1.firstUpperCase(entity.name)}>`, }, }, }, }, }), }, resolver: {}, }, { data: { name: `delete${utils_1.firstUpperCase(entity.name)}`, method: 'DELETE', path: `/api/${lodash_1.kebabCase(pluralized)}/{id}`, description: `delete${utils_1.firstUpperCase(entity.name)}`, parameters: JSON.stringify({ id: { name: 'id', in: 'path', required: true, schema: { type: 'integer', format: 'long' }, }, }), responses: '{}', }, resolver: {}, }, { data: { name: `update${utils_1.firstUpperCase(entity.name)}`, method: 'PUT', path: `/api/${lodash_1.kebabCase(pluralized)}`, description: `update${utils_1.firstUpperCase(entity.name)}`, parameters: '{}', requestBody: JSON.stringify({ description: '', content: { 'application/json': { schema: { $ref: `#/${service.id}/${entity.id}`, }, }, }, }), responses: JSON.stringify({ 200: { description: '', content: { 'application/json': { schema: { $ref: `<#/ApiReturnOf${utils_1.firstUpperCase(entity.name)}>`, }, }, }, }, }), }, resolver: {}, }, { data: { name: `count${utils_1.firstUpperCase(entity.name)}`, method: 'GET', path: `/api/${lodash_1.kebabCase(pluralized)}/count`, description: `count${utils_1.firstUpperCase(entity.name)}`, parameters: JSON.stringify(getEntityGetAllQueryParams(entity)), responses: JSON.stringify({ 200: { description: '', content: { 'application/json': { schema: { $ref: `<#/ApiReturnOflong${utils_1.firstUpperCase(entity.name)}>`, }, }, }, }, }), }, resolver: {}, }, { data: { name: `import${utils_1.firstUpperCase(entity.name)}`, method: 'POST', path: `/api/${lodash_1.kebabCase(pluralized)}/import`, description: `import${utils_1.firstUpperCase(entity.name)}`, parameters: '{}', responses: JSON.stringify({ 200: { description: '', content: { 'application/json': { schema: { $ref: `<#/ApiReturnOflong${utils_1.firstUpperCase(entity.name)}>`, }, }, }, }, }), }, resolver: {}, }, { data: { name: `export${utils_1.firstUpperCase(entity.name)}`, method: 'GET', path: `/api/${lodash_1.kebabCase(pluralized)}/export`, description: `export${utils_1.firstUpperCase(entity.name)}`, parameters: JSON.stringify(getEntityExportQueryParams(entity)), responses: JSON.stringify({ 200: { description: '', content: { 'application/json': { schema: { $ref: `<#/ApiReturnOflong${utils_1.firstUpperCase(entity.name)}>`, }, }, }, }, }), }, resolver: {}, }, ]; } exports.getEntityInterfaces = getEntityInterfaces; //# sourceMappingURL=entityUtils.js.map