Merge pull request #10584 from LvffY/master
[#10582] Use getEntitySourceLocation instead of custom method to get the entity source URL
This commit is contained in:
@@ -0,0 +1,5 @@
|
||||
---
|
||||
'@backstage/plugin-todo-backend': patch
|
||||
---
|
||||
|
||||
Fix method to get source-location.
|
||||
@@ -52,8 +52,9 @@ async function main() {
|
||||
|
||||
## Scanned Files
|
||||
|
||||
The included `TodoReaderService` and `TodoScmReader` works by reading source code of to the entity that is being viewed. The location source code is determined by the value of the [`backstage.io/source-location`
|
||||
](https://backstage.io/docs/features/software-catalog/well-known-annotations#backstageiosource-location) annotation of the entity, and if that is missing it falls back to the [`backstage.io/managed-by-location `](https://backstage.io/docs/features/software-catalog/well-known-annotations#backstageiomanaged-by-location) annotation. Only `url` locations are currently supported, meaning locally configured `file` locations won't work. Also note that dot-files and folders are ignored.
|
||||
The included `TodoReaderService` and `TodoScmReader` works by getting the entity source location from the catalog.
|
||||
|
||||
The location source code is determined automatically. In case of the source code of the component is not in the same place of the entity YAML file, you can explicitly set the value of the [`backstage.io/source-location`](https://backstage.io/docs/features/software-catalog/well-known-annotations#backstageiosource-location) annotation of the entity, and if that is missing it falls back to the [`backstage.io/managed-by-location `](https://backstage.io/docs/features/software-catalog/well-known-annotations#backstageiomanaged-by-location) annotation. Only `url` locations are currently supported, meaning locally configured `file` locations won't work. Also note that dot-files and folders are ignored.
|
||||
|
||||
## Parser Configuration
|
||||
|
||||
|
||||
@@ -310,7 +310,7 @@ describe('TodoReaderService', () => {
|
||||
});
|
||||
});
|
||||
|
||||
it('should throw if entity does not have a location', async () => {
|
||||
it('should not throw if entity does not have a location', async () => {
|
||||
const todoReader = mockTodoReader([]);
|
||||
const catalogClient = mockCatalogClient({
|
||||
...mockEntity,
|
||||
@@ -320,9 +320,8 @@ describe('TodoReaderService', () => {
|
||||
|
||||
await expect(service.listTodos({ entity: entityName })).rejects.toEqual(
|
||||
expect.objectContaining({
|
||||
name: 'InputError',
|
||||
message:
|
||||
'No entity location annotation found for component:default/my-component',
|
||||
name: 'Error',
|
||||
message: "Entity 'component:default/my-component' is missing location",
|
||||
}),
|
||||
);
|
||||
});
|
||||
@@ -334,7 +333,8 @@ describe('TodoReaderService', () => {
|
||||
metadata: {
|
||||
...mockEntity.metadata,
|
||||
annotations: {
|
||||
['backstage.io/managed-by-location']: 'file:../info.yaml',
|
||||
['backstage.io/managed-by-location']:
|
||||
'file:../managed-by-location.yaml',
|
||||
},
|
||||
},
|
||||
});
|
||||
@@ -343,7 +343,7 @@ describe('TodoReaderService', () => {
|
||||
await expect(service.listTodos({ entity: entityName })).rejects.toEqual(
|
||||
expect.objectContaining({
|
||||
name: 'InputError',
|
||||
message: `Invalid entity location type for component:default/my-component, got 'file'`,
|
||||
message: `Invalid entity location type for component:default/my-component, got 'file' for location ../managed-by-location.yaml`,
|
||||
}),
|
||||
);
|
||||
});
|
||||
@@ -355,7 +355,7 @@ describe('TodoReaderService', () => {
|
||||
metadata: {
|
||||
...mockEntity.metadata,
|
||||
annotations: {
|
||||
['backstage.io/source-location']: 'file:../info.yaml',
|
||||
['backstage.io/source-location']: 'file:../source-location.yaml',
|
||||
},
|
||||
},
|
||||
});
|
||||
@@ -364,7 +364,7 @@ describe('TodoReaderService', () => {
|
||||
await expect(service.listTodos({ entity: entityName })).rejects.toEqual(
|
||||
expect.objectContaining({
|
||||
name: 'InputError',
|
||||
message: `Invalid entity source location type for component:default/my-component, got 'file'`,
|
||||
message: `Invalid entity location type for component:default/my-component, got 'file' for location ../source-location.yaml`,
|
||||
}),
|
||||
);
|
||||
});
|
||||
|
||||
@@ -17,10 +17,7 @@
|
||||
import { InputError, NotFoundError } from '@backstage/errors';
|
||||
import { CatalogApi } from '@backstage/catalog-client';
|
||||
import {
|
||||
ANNOTATION_LOCATION,
|
||||
ANNOTATION_SOURCE_LOCATION,
|
||||
Entity,
|
||||
parseLocationRef,
|
||||
getEntitySourceLocation,
|
||||
stringifyEntityRef,
|
||||
} from '@backstage/catalog-model';
|
||||
import { TodoReader } from '../lib';
|
||||
@@ -74,8 +71,15 @@ export class TodoReaderService implements TodoService {
|
||||
`Entity not found, ${stringifyEntityRef(req.entity)}`,
|
||||
);
|
||||
}
|
||||
|
||||
const url = this.getEntitySourceUrl(entity);
|
||||
const entitySourceLocation = getEntitySourceLocation(entity);
|
||||
if (entitySourceLocation.type !== 'url') {
|
||||
throw new InputError(
|
||||
`Invalid entity location type for ${stringifyEntityRef(entity)}, got '${
|
||||
entitySourceLocation.type
|
||||
}' for location ${entitySourceLocation.target}`,
|
||||
);
|
||||
}
|
||||
const url = entitySourceLocation.target;
|
||||
const todos = await this.todoReader.readTodos({ url });
|
||||
|
||||
let limit = req.limit ?? this.defaultPageSize;
|
||||
@@ -125,36 +129,4 @@ export class TodoReaderService implements TodoService {
|
||||
limit,
|
||||
};
|
||||
}
|
||||
|
||||
private getEntitySourceUrl(entity: Entity) {
|
||||
const sourceLocation =
|
||||
entity.metadata.annotations?.[ANNOTATION_SOURCE_LOCATION];
|
||||
if (sourceLocation) {
|
||||
const parsed = parseLocationRef(sourceLocation);
|
||||
if (parsed.type !== 'url') {
|
||||
throw new InputError(
|
||||
`Invalid entity source location type for ${stringifyEntityRef(
|
||||
entity,
|
||||
)}, got '${parsed.type}'`,
|
||||
);
|
||||
}
|
||||
return parsed.target;
|
||||
}
|
||||
|
||||
const location = entity.metadata.annotations?.[ANNOTATION_LOCATION];
|
||||
if (location) {
|
||||
const parsed = parseLocationRef(location);
|
||||
if (parsed.type !== 'url') {
|
||||
throw new InputError(
|
||||
`Invalid entity location type for ${stringifyEntityRef(
|
||||
entity,
|
||||
)}, got '${parsed.type}'`,
|
||||
);
|
||||
}
|
||||
return parsed.target;
|
||||
}
|
||||
throw new InputError(
|
||||
`No entity location annotation found for ${stringifyEntityRef(entity)}`,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user