@lcap/asl
Version:
NetEase Application Specific Language
632 lines • 22.4 kB
JavaScript
;
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