@axis-backstage/plugin-jira-dashboard-backend 4.3.0 → 4.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,136 @@
1
+ 'use strict';
2
+
3
+ var api = require('../api.cjs.js');
4
+ var queries = require('../queries.cjs.js');
5
+
6
+ const getProjectResponse = async (project, cache) => {
7
+ let projectResponse;
8
+ projectResponse = await cache.get(project.fullProjectKey);
9
+ if (projectResponse) {
10
+ return projectResponse;
11
+ }
12
+ try {
13
+ projectResponse = await api.getProjectInfo(project);
14
+ cache.set(project.fullProjectKey, projectResponse);
15
+ } catch (err) {
16
+ if (err.message !== 200) {
17
+ throw Error(
18
+ `Failed to get project info for project key ${project.fullProjectKey} with error: ${err.message}`
19
+ );
20
+ }
21
+ }
22
+ return projectResponse;
23
+ };
24
+ const getJqlResponse = async (jql, config, cache, searchOptions) => {
25
+ let issuesResponse;
26
+ const cacheKey = `${config.baseUrl} ${jql}`;
27
+ issuesResponse = await cache.get(cacheKey);
28
+ if (issuesResponse) {
29
+ return issuesResponse;
30
+ }
31
+ try {
32
+ issuesResponse = (await api.searchJira(config, jql, searchOptions)).issues;
33
+ cache.set(cacheKey, issuesResponse);
34
+ } catch (err) {
35
+ if (err.message !== 200) {
36
+ throw Error(
37
+ `Failed to get issues for JQL ${jql} with error: ${err.message}`
38
+ );
39
+ }
40
+ }
41
+ return issuesResponse;
42
+ };
43
+ const getUserIssues = async (username, maxResults, config, cache, filterName) => {
44
+ let jql = `assignee = "${username}" AND resolution = Unresolved ORDER BY priority DESC, updated DESC`;
45
+ if (filterName !== "default") {
46
+ for (const filter of config.defaultFilters || []) {
47
+ if (filterName === filter.name) {
48
+ jql = `assignee = "${username}" AND ${filter.query}`;
49
+ }
50
+ }
51
+ }
52
+ return getJqlResponse(jql, config, cache, {
53
+ fields: [
54
+ "key",
55
+ "issuetype",
56
+ "summary",
57
+ "status",
58
+ "priority",
59
+ "created",
60
+ "updated"
61
+ ],
62
+ maxResults
63
+ });
64
+ };
65
+ const getFiltersFromAnnotations = async (annotations, config) => {
66
+ const filters = [];
67
+ for (const filter of annotations) {
68
+ try {
69
+ const response = await api.getFilterById(filter, config);
70
+ filters.push(response);
71
+ } catch (err) {
72
+ console.warn(
73
+ `${err.message} : Could not find filter with filter id ${filter}`
74
+ );
75
+ }
76
+ }
77
+ return filters;
78
+ };
79
+ async function getJiraProjectsFromKeys(projectKeys, instance, cache) {
80
+ const jiraProjects = [];
81
+ for (const key of projectKeys) {
82
+ const cachedProject = await cache.get(key);
83
+ let projectInfo;
84
+ if (cachedProject) {
85
+ projectInfo = cachedProject;
86
+ } else {
87
+ projectInfo = await api.getProjectInfo({
88
+ projectKey: key,
89
+ instance});
90
+ cache.set(key, projectInfo);
91
+ }
92
+ jiraProjects.push({
93
+ instance,
94
+ fullProjectKey: projectInfo.key,
95
+ projectKey: projectInfo.key
96
+ });
97
+ }
98
+ return jiraProjects;
99
+ }
100
+ const getIssuesFromFilters = async (projectKeys, components, filters, instance, cache) => {
101
+ const projects = await getJiraProjectsFromKeys(projectKeys, instance, cache);
102
+ return await Promise.all(
103
+ filters.map(async (filter) => ({
104
+ name: filter.name,
105
+ query: queries.jqlQueryBuilder({
106
+ project: projectKeys,
107
+ components,
108
+ query: filter.query
109
+ }),
110
+ type: "filter",
111
+ issues: await api.getIssuesByFilter(projects, components, filter.query)
112
+ }))
113
+ );
114
+ };
115
+ const getIssuesFromComponents = async (projectKeys, componentAnnotations, instance, cache) => {
116
+ const projects = await getJiraProjectsFromKeys(projectKeys, instance, cache);
117
+ return await Promise.all(
118
+ componentAnnotations.map(async (componentKey) => ({
119
+ name: componentKey,
120
+ query: queries.jqlQueryBuilder({
121
+ project: projectKeys,
122
+ components: [componentKey]
123
+ }),
124
+ type: "component",
125
+ issues: await api.getIssuesByComponent(projects, componentKey)
126
+ }))
127
+ );
128
+ };
129
+
130
+ exports.getFiltersFromAnnotations = getFiltersFromAnnotations;
131
+ exports.getIssuesFromComponents = getIssuesFromComponents;
132
+ exports.getIssuesFromFilters = getIssuesFromFilters;
133
+ exports.getJqlResponse = getJqlResponse;
134
+ exports.getProjectResponse = getProjectResponse;
135
+ exports.getUserIssues = getUserIssues;
136
+ //# sourceMappingURL=service.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.cjs.js","sources":["../../src/service/service.ts"],"sourcesContent":["import { CacheService } from '@backstage/backend-plugin-api';\nimport {\n type Filter,\n Issue,\n type JiraDataResponse,\n type Project,\n} from '@axis-backstage/plugin-jira-dashboard-common';\nimport {\n getFilterById,\n getIssuesByComponent,\n getIssuesByFilter,\n getProjectInfo,\n searchJira,\n SearchOptions,\n} from '../api';\nimport { jqlQueryBuilder } from '../queries';\nimport type { ConfigInstance } from '../config';\nimport { JiraProject } from '../lib';\n\nexport const getProjectResponse = async (\n project: JiraProject,\n cache: CacheService,\n): Promise<Project> => {\n let projectResponse: Project;\n\n projectResponse = (await cache.get(project.fullProjectKey)) as Project;\n\n if (projectResponse) {\n return projectResponse as Project;\n }\n\n try {\n projectResponse = await getProjectInfo(project);\n cache.set(project.fullProjectKey, projectResponse);\n } catch (err: any) {\n if (err.message !== 200) {\n throw Error(\n `Failed to get project info for project key ${project.fullProjectKey} with error: ${err.message}`,\n );\n }\n }\n return projectResponse;\n};\n\nexport const getJqlResponse = async (\n jql: string,\n config: ConfigInstance,\n cache: CacheService,\n searchOptions: SearchOptions,\n): Promise<Issue[]> => {\n let issuesResponse: Issue[];\n\n const cacheKey = `${config.baseUrl} ${jql}`;\n\n issuesResponse = (await cache.get(cacheKey)) as Issue[];\n\n if (issuesResponse) {\n return issuesResponse;\n }\n\n try {\n issuesResponse = (await searchJira(config, jql, searchOptions)).issues;\n cache.set(cacheKey, issuesResponse);\n } catch (err: any) {\n if (err.message !== 200) {\n throw Error(\n `Failed to get issues for JQL ${jql} with error: ${err.message}`,\n );\n }\n }\n return issuesResponse;\n};\n\nexport const getUserIssues = async (\n username: string,\n maxResults: number,\n config: ConfigInstance,\n cache: CacheService,\n filterName: string,\n): Promise<Issue[]> => {\n let jql = `assignee = \"${username}\" AND resolution = Unresolved ORDER BY priority DESC, updated DESC`;\n if (filterName !== 'default') {\n for (const filter of config.defaultFilters || []) {\n if (filterName === filter.name) {\n jql = `assignee = \"${username}\" AND ${filter.query}`;\n }\n }\n }\n\n return getJqlResponse(jql, config, cache, {\n fields: [\n 'key',\n 'issuetype',\n 'summary',\n 'status',\n 'priority',\n 'created',\n 'updated',\n ],\n maxResults,\n });\n};\n\nexport const getFiltersFromAnnotations = async (\n annotations: string[],\n config: ConfigInstance,\n): Promise<Filter[]> => {\n const filters: Filter[] = [];\n\n for (const filter of annotations) {\n try {\n const response = await getFilterById(filter, config);\n filters.push(response);\n } catch (err: any) {\n console.warn(\n `${err.message} : Could not find filter with filter id ${filter}`,\n );\n }\n }\n return filters;\n};\nasync function getJiraProjectsFromKeys(\n projectKeys: string[],\n instance: ConfigInstance,\n cache: CacheService,\n): Promise<JiraProject[]> {\n const jiraProjects: JiraProject[] = [];\n for (const key of projectKeys) {\n const cachedProject = (await cache.get(key)) as Project;\n let projectInfo: Project;\n\n if (cachedProject) {\n projectInfo = cachedProject;\n } else {\n projectInfo = await getProjectInfo({\n projectKey: key,\n instance,\n fullProjectKey: '',\n });\n cache.set(key, projectInfo);\n }\n\n jiraProjects.push({\n instance,\n fullProjectKey: projectInfo.key,\n projectKey: projectInfo.key,\n });\n }\n return jiraProjects;\n}\nexport const getIssuesFromFilters = async (\n projectKeys: string[],\n components: string[],\n filters: Filter[],\n instance: ConfigInstance,\n cache: CacheService,\n): Promise<JiraDataResponse[]> => {\n const projects = await getJiraProjectsFromKeys(projectKeys, instance, cache);\n return await Promise.all(\n filters.map(async filter => ({\n name: filter.name,\n query: jqlQueryBuilder({\n project: projectKeys,\n components,\n query: filter.query,\n }),\n type: 'filter',\n issues: await getIssuesByFilter(projects, components, filter.query),\n })),\n );\n};\n\nexport const getIssuesFromComponents = async (\n projectKeys: string[],\n componentAnnotations: string[],\n instance: ConfigInstance,\n cache: CacheService,\n): Promise<JiraDataResponse[]> => {\n const projects = await getJiraProjectsFromKeys(projectKeys, instance, cache);\n return await Promise.all(\n componentAnnotations.map(async componentKey => ({\n name: componentKey,\n query: jqlQueryBuilder({\n project: projectKeys,\n components: [componentKey],\n }),\n type: 'component',\n issues: await getIssuesByComponent(projects, componentKey),\n })),\n );\n};\n"],"names":["getProjectInfo","searchJira","getFilterById","jqlQueryBuilder","getIssuesByFilter","getIssuesByComponent"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@axis-backstage/plugin-jira-dashboard-backend",
3
- "version": "4.3.0",
3
+ "version": "4.4.0",
4
4
  "main": "dist/index.cjs.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "license": "Apache-2.0",
@@ -17,7 +17,10 @@
17
17
  "@axis-backstage/plugin-jira-dashboard",
18
18
  "@axis-backstage/plugin-jira-dashboard-backend",
19
19
  "@axis-backstage/plugin-jira-dashboard-common"
20
- ]
20
+ ],
21
+ "features": {
22
+ ".": "@backstage/BackendFeature"
23
+ }
21
24
  },
22
25
  "scripts": {
23
26
  "start": "backstage-cli package start",
@@ -29,22 +32,21 @@
29
32
  "postpack": "backstage-cli package postpack"
30
33
  },
31
34
  "dependencies": {
32
- "@axis-backstage/plugin-jira-dashboard-common": "^1.9.1",
33
- "@backstage/backend-common": "^0.24.0",
34
- "@backstage/backend-defaults": "^0.4.3",
35
- "@backstage/backend-plugin-api": "^0.8.0",
36
- "@backstage/catalog-client": "^1.6.6",
37
- "@backstage/catalog-model": "^1.6.0",
38
- "@backstage/errors": "^1.2.4",
35
+ "@axis-backstage/plugin-jira-dashboard-common": "^1.10.0",
36
+ "@backstage/backend-defaults": "^0.8.1",
37
+ "@backstage/backend-plugin-api": "^1.2.0",
38
+ "@backstage/catalog-client": "^1.9.1",
39
+ "@backstage/catalog-model": "^1.7.3",
40
+ "@backstage/errors": "^1.2.7",
39
41
  "express": "^4.17.1",
40
42
  "express-promise-router": "^4.1.0",
41
43
  "node-fetch": "^2.6.7"
42
44
  },
43
45
  "devDependencies": {
44
- "@backstage/backend-test-utils": "^0.5.0",
45
- "@backstage/cli": "^0.27.0",
46
- "@backstage/plugin-auth-backend": "^0.23.0",
47
- "@backstage/plugin-auth-backend-module-guest-provider": "^0.2.0",
46
+ "@backstage/backend-test-utils": "^1.3.0",
47
+ "@backstage/cli": "^0.30.0",
48
+ "@backstage/plugin-auth-backend": "^0.24.3",
49
+ "@backstage/plugin-auth-backend-module-guest-provider": "^0.2.5",
48
50
  "@types/express": "*",
49
51
  "@types/supertest": "^2.0.12",
50
52
  "msw": "^1.0.0",
@@ -55,5 +57,12 @@
55
57
  "config.d.ts"
56
58
  ],
57
59
  "configSchema": "config.d.ts",
60
+ "typesVersions": {
61
+ "*": {
62
+ "index": [
63
+ "dist/index.d.ts"
64
+ ]
65
+ }
66
+ },
58
67
  "directory": "_release/package"
59
68
  }