Minor fix to operation-id rule
This commit is contained in:
Родитель
d396248da3
Коммит
1399ab263e
|
@ -42,7 +42,7 @@ The `Verb` of the `operationId` should be or contain a specific value depending
|
||||||
| operation method | verb should contain | notes |
|
| operation method | verb should contain | notes |
|
||||||
| ---------------- | ------------------- | ------ |
|
| ---------------- | ------------------- | ------ |
|
||||||
| get | "Get" or "List" | should be "List" if response is pageable |
|
| get | "Get" or "List" | should be "List" if response is pageable |
|
||||||
| put | "Create" | could be "CreateOrUpdate" |
|
| put | "Create" or "Update" | could be "CreateOrUpdate" |
|
||||||
| patch | "Update" | could be "CreateOrUpdate" |
|
| patch | "Update" | could be "CreateOrUpdate" |
|
||||||
| delete | "Delete" | |
|
| delete | "Delete" | |
|
||||||
|
|
||||||
|
@ -52,7 +52,7 @@ Operation should have a summary or description.
|
||||||
|
|
||||||
### az-pagination-response
|
### az-pagination-response
|
||||||
|
|
||||||
If the operation returns a list that is potentially large, it should [support pagination](../opeapi-style-guidelines.md#).
|
If the operation returns a list that is potentially large, it should [support pagination](../opeapi-style-guidelines.md#support-for-pagination).
|
||||||
|
|
||||||
### az-parameter-default-not-allowed
|
### az-parameter-default-not-allowed
|
||||||
|
|
||||||
|
|
|
@ -6,21 +6,21 @@
|
||||||
// - patch operation should have "update" in the operationId verb [R1007]
|
// - patch operation should have "update" in the operationId verb [R1007]
|
||||||
// - delete operations should have "delete" in the "verb" component of the operationId [R1009]
|
// - delete operations should have "delete" in the "verb" component of the operationId [R1009]
|
||||||
|
|
||||||
module.exports = (targetVal, _opts, paths) => {
|
module.exports = (operation, _opts, paths) => {
|
||||||
// targetVal should be an operation
|
// targetVal should be an operation
|
||||||
if (targetVal === null || typeof targetVal !== 'object') {
|
if (operation === null || typeof operation !== 'object') {
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
const path = paths.target || paths.given;
|
const path = paths.target || paths.given;
|
||||||
|
|
||||||
const errors = [];
|
const errors = [];
|
||||||
|
|
||||||
if (!targetVal.operationId) {
|
if (!operation.operationId) {
|
||||||
// Missing operationId is caught elsewhere, so just return
|
// Missing operationId is caught elsewhere, so just return
|
||||||
return errors;
|
return errors;
|
||||||
}
|
}
|
||||||
|
|
||||||
const m = targetVal.operationId.match(/[A-Za-z0-9]+_([A-Za-z0-9]+)/);
|
const m = operation.operationId.match(/[A-Za-z0-9]+_([A-Za-z0-9]+)/);
|
||||||
if (!m) {
|
if (!m) {
|
||||||
errors.push({
|
errors.push({
|
||||||
message: 'OperationId should be of the form "Noun_Verb"',
|
message: 'OperationId should be of the form "Noun_Verb"',
|
||||||
|
@ -28,13 +28,13 @@ module.exports = (targetVal, _opts, paths) => {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
const verb = m ? m[1] : targetVal.operationId;
|
const verb = m ? m[1] : operation.operationId;
|
||||||
const method = path[path.length - 1];
|
const method = path[path.length - 1];
|
||||||
|
|
||||||
const isCreateOrUpdate = ['put', 'patch'].includes(method)
|
const isCreate = ['put', 'patch'].includes(method) && operation.responses?.['201'];
|
||||||
&& (targetVal.responses?.['200'] && targetVal.responses?.['201']);
|
const isUpdate = ['put', 'patch'].includes(method) && operation.responses?.['200'];
|
||||||
|
|
||||||
if (isCreateOrUpdate) {
|
if (isCreate && isUpdate) {
|
||||||
if (!verb.match(/create/i) || !verb.match(/update/i)) {
|
if (!verb.match(/create/i) || !verb.match(/update/i)) {
|
||||||
errors.push({
|
errors.push({
|
||||||
message: `OperationId for ${method} method should contain both "Create" and "Update"`,
|
message: `OperationId for ${method} method should contain both "Create" and "Update"`,
|
||||||
|
@ -42,16 +42,16 @@ module.exports = (targetVal, _opts, paths) => {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
const isList = method === 'get' && targetVal['x-ms-pageable'];
|
const isList = method === 'get' && operation['x-ms-pageable'];
|
||||||
const patterns = {
|
const patterns = {
|
||||||
get: isList ? /list/i : /(get|list)/i,
|
get: isList ? /list/i : /(get|list)/i,
|
||||||
put: /create/i,
|
put: isCreate ? /create/i : /(create|update)/i,
|
||||||
patch: /update/i,
|
patch: /update/i,
|
||||||
delete: /delete/i,
|
delete: /delete/i,
|
||||||
};
|
};
|
||||||
const frags = {
|
const frags = {
|
||||||
get: isList ? '"List"' : '"Get" or "list"',
|
get: isList ? '"List"' : '"Get" or "list"',
|
||||||
put: '"Create"',
|
put: isCreate ? '"Create"' : '"Create" or "Update"',
|
||||||
patch: '"Update"',
|
patch: '"Update"',
|
||||||
delete: '"Delete"',
|
delete: '"Delete"',
|
||||||
};
|
};
|
||||||
|
|
|
@ -95,7 +95,7 @@ The `Verb` of the `operationId` should be or contain a specific value depending
|
||||||
| operation method | verb should contain | notes |
|
| operation method | verb should contain | notes |
|
||||||
| ---------------- | ------------------- | ------ |
|
| ---------------- | ------------------- | ------ |
|
||||||
| get | "Get" or "List" | should be "List" if response is pageable |
|
| get | "Get" or "List" | should be "List" if response is pageable |
|
||||||
| put | "Create" | could be "CreateOrUpdate" |
|
| put | "Create" or "Update" | could be "CreateOrUpdate" |
|
||||||
| patch | "Update" | could be "CreateOrUpdate" |
|
| patch | "Update" | could be "CreateOrUpdate" |
|
||||||
| delete | "Delete" | |
|
| delete | "Delete" | |
|
||||||
|
|
||||||
|
|
|
@ -175,6 +175,14 @@ test('az-operation-id should find no errors', () => {
|
||||||
operationId: 'noun_delete',
|
operationId: 'noun_delete',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
'/api/test6': {
|
||||||
|
put: {
|
||||||
|
operationId: 'noun_update',
|
||||||
|
200: {
|
||||||
|
description: 'Success',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
return linter.run(oasDoc).then((results) => {
|
return linter.run(oasDoc).then((results) => {
|
||||||
|
|
Загрузка…
Ссылка в новой задаче