@electrolux-oss/plugin-infrawallet-backend 1.1.0-20251202133021-aade8f1 → 1.1.0-20251204084512-e456a8a

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.
@@ -1 +1 @@
1
- {"version":3,"file":"router.cjs.js","sources":["../../src/service/router.ts"],"sourcesContent":["import { MiddlewareFactory } from '@backstage/backend-defaults/rootHttpRouter';\nimport { CacheService, DatabaseService, LoggerService, resolvePackagePath } from '@backstage/backend-plugin-api';\nimport { Config } from '@backstage/config/index';\nimport express from 'express';\nimport Router from 'express-promise-router';\nimport {\n deleteWalletMetricSetting,\n getWallet,\n getWalletMetricSettings,\n updateOrInsertWalletMetricSetting,\n} from '../controllers/MetricSettingController';\nimport { InfraWalletClient } from '../cost-clients/InfraWalletClient';\nimport { MetricProvider } from '../metric-providers/MetricProvider';\nimport { Budget, getBudget, getBudgets, upsertBudget } from '../models/Budget';\nimport { deleteCostItems } from '../models/CostItem';\nimport {\n CustomCost,\n createCustomCosts,\n deleteCustomCost,\n getCustomCosts,\n updateOrInsertCustomCost,\n} from '../models/CustomCost';\nimport { fetchAndSaveCosts } from '../tasks/fetchAndSaveCosts';\nimport { CategoryMappingService } from './CategoryMappingService';\nimport { COST_CLIENT_MAPPINGS, GRANULARITY, METRIC_PROVIDER_MAPPINGS } from './consts';\nimport { parseFilters, parseTags, tagsToString } from './functions';\nimport { CloudProviderError, Metric, MetricSetting, Report, ReportParameters, RouterOptions, Tag } from './types';\n\nasync function setUpDatabase(database: DatabaseService) {\n // check database migrations\n const client = await database.getClient();\n const migrationsDir = resolvePackagePath('@electrolux-oss/plugin-infrawallet-backend', 'migrations');\n if (!database.migrations?.skip) {\n await client.migrate.latest({\n directory: migrationsDir,\n });\n }\n\n // insert default category_mappings to the database\n const seedsDir = resolvePackagePath('@electrolux-oss/plugin-infrawallet-backend', 'seeds');\n await client.seed.run({ directory: seedsDir });\n}\n\nasync function getReports(\n queryParameters: ReportParameters,\n config: Config,\n database: DatabaseService,\n cache: CacheService,\n logger: LoggerService,\n): Promise<{ reports: Report[]; clientErrors: CloudProviderError[] }> {\n const { filters, tags, groups, granularityString, startTime, endTime } = queryParameters;\n const promises: Promise<void>[] = [];\n const results: Report[] = [];\n const errors: CloudProviderError[] = [];\n\n const granularity: GRANULARITY = Object.values(GRANULARITY).includes(granularityString as GRANULARITY)\n ? (granularityString as GRANULARITY)\n : GRANULARITY.MONTHLY;\n\n // group tags by providers\n const providerTags: Record<string, Tag[]> = {};\n for (const tag of tags) {\n const provider = tag.provider.toLowerCase();\n if (!providerTags[provider]) {\n providerTags[provider] = [];\n }\n\n providerTags[provider].push(tag);\n }\n\n const categoryMappingService = CategoryMappingService.getInstance();\n await categoryMappingService.refreshCategoryMappings();\n\n const conf = config.getConfig('backend.infraWallet.integrations');\n conf\n .keys()\n .concat(['custom'])\n .forEach((provider: string) => {\n if (provider in COST_CLIENT_MAPPINGS) {\n const client: InfraWalletClient = COST_CLIENT_MAPPINGS[provider].create(config, database, cache, logger);\n const fetchCloudCosts = (async () => {\n try {\n const clientResponse = await client.getCostReports({\n filters: filters,\n tags: tagsToString(providerTags[provider.toLowerCase()]),\n groups: groups,\n granularity: granularity,\n startTime: startTime,\n endTime: endTime,\n });\n clientResponse.errors.forEach((e: CloudProviderError) => {\n errors.push(e);\n });\n clientResponse.reports.forEach((cost: Report) => {\n results.push(cost);\n });\n } catch (e) {\n logger.error(e);\n errors.push({\n provider: client.constructor.name,\n name: client.constructor.name,\n error: e.message,\n });\n }\n })();\n promises.push(fetchCloudCosts);\n }\n });\n\n await Promise.all(promises);\n\n const parsedFilters = parseFilters(filters);\n\n const filteredResults = results.filter(report => {\n return Object.entries(parsedFilters).every(([key, values]) => {\n const reportValue = report[key];\n if (typeof reportValue !== 'string') {\n return false;\n }\n return values.includes(reportValue);\n });\n });\n\n return { reports: filteredResults, clientErrors: errors };\n}\n\nexport async function createRouter(options: RouterOptions): Promise<express.Router> {\n const { logger, config, scheduler, cache, database, additionalFilters } = options;\n // do database migrations here to support the legacy backend system\n await setUpDatabase(database);\n\n // init CategoryMappingService\n CategoryMappingService.initInstance(cache, logger);\n\n const router = Router();\n router.use(express.json());\n\n router.get('/health', (_, response) => {\n logger.info('PONG!');\n response.json({ status: 'ok' });\n });\n\n // Endpoint to trigger the fetchAndSaveCosts task manually\n router.get('/fetch_and_save_costs', async (_, response) => {\n try {\n // Trigger the scheduled task using the scheduler\n await scheduler.triggerTask('infrawallet-autoload-costs');\n\n response.json({\n status: 'ok',\n message: 'Cost data fetching task has been triggered. Check logs for execution details.',\n });\n } catch (error) {\n logger.error(`Error triggering cost data fetch task: ${error.message}`, { error });\n\n // Fall back to direct execution if task triggering fails\n try {\n logger.info('Falling back to direct execution of fetch and save costs');\n await fetchAndSaveCosts(options);\n response.json({\n status: 'ok',\n message: 'Cost data fetch completed successfully via direct execution.',\n });\n } catch (directError) {\n logger.error(`Direct cost data fetch failed: ${directError.message}`, { error: directError });\n response.status(500).json({\n status: 'error',\n message: 'Failed to fetch cost data. Check logs for more details.',\n });\n }\n }\n });\n\n router.post('/:walletName/delete_cost_items', async (request, response) => {\n const walletName = request.params.walletName;\n const granularity = request.body.granularity as string;\n const provider = request.body.provider as string;\n\n const wallet = await getWallet(database, walletName);\n if (wallet && granularity && provider) {\n const rowsDeleted = await deleteCostItems(database, wallet.id, provider, granularity);\n response.json({\n message: `Deleted ${rowsDeleted} ${granularity} ${provider} cost records in ${walletName}`,\n status: 'ok',\n });\n } else {\n response.status(404).json({ error: 'Wallet not found or missing parameters', status: 404 });\n }\n });\n\n router.get('/reports', async (request, response) => {\n const filters = request.query.filters as string;\n const tags = parseTags(request.query.tags as string);\n const groups = request.query.groups as string;\n const granularityString = request.query.granularity as string;\n const startTime = request.query.startTime as string;\n const endTime = request.query.endTime as string;\n const [entityNamespace, entityName] = decodeURI(request.query.entityName as string)?.split('/') || [];\n\n let reportFilters: ReportParameters = {\n filters,\n tags,\n groups,\n granularityString,\n startTime,\n endTime,\n entityNamespace,\n entityName,\n };\n if (additionalFilters.length > 0) {\n for (const filter of additionalFilters) {\n reportFilters = await filter.augmentFilters(reportFilters);\n }\n }\n\n const { reports, clientErrors } = await getReports(reportFilters, config, database, cache, logger);\n\n if (clientErrors.length > 0) {\n response.status(207).json({ data: reports, errors: clientErrors, status: 207 });\n } else {\n response.json({ data: reports, errors: clientErrors, status: 200 });\n }\n });\n\n router.get('/tag-keys', async (request, response) => {\n const tags: Tag[] = [];\n const errors: CloudProviderError[] = [];\n\n const tagProvider = request.query.provider as string;\n const startTime = request.query.startTime as string;\n const endTime = request.query.endTime as string;\n const promises: Promise<void>[] = [];\n\n const conf = config.getConfig('backend.infraWallet.integrations');\n conf.keys().forEach((provider: string) => {\n if (provider.toLowerCase() === tagProvider.toLowerCase() && provider in COST_CLIENT_MAPPINGS) {\n const client: InfraWalletClient = COST_CLIENT_MAPPINGS[provider].create(config, database, cache, logger);\n const getTagKeys = (async () => {\n try {\n const clientResponse = await client.getTagKeys({\n startTime: startTime,\n endTime: endTime,\n });\n clientResponse.errors.forEach((e: CloudProviderError) => {\n errors.push(e);\n });\n clientResponse.tags.forEach((tag: Tag) => {\n tags.push(tag);\n });\n } catch (e) {\n logger.error(e);\n errors.push({\n provider: client.constructor.name,\n name: client.constructor.name,\n error: e.message,\n });\n }\n })();\n promises.push(getTagKeys);\n }\n });\n\n await Promise.all(promises);\n\n if (errors.length > 0) {\n response.status(207).json({ data: tags, errors: errors, status: 207 });\n } else {\n response.json({ data: tags, errors: errors, status: 200 });\n }\n });\n\n router.get('/tag-values', async (request, response) => {\n const tags: Tag[] = [];\n const errors: CloudProviderError[] = [];\n\n const startTime = request.query.startTime as string;\n const endTime = request.query.endTime as string;\n const tagKey = request.query.tag as string;\n const tagProvider = request.query.provider as string;\n const promises: Promise<void>[] = [];\n\n const conf = config.getConfig('backend.infraWallet.integrations');\n conf.keys().forEach((provider: string) => {\n if (provider in COST_CLIENT_MAPPINGS && provider.toLowerCase() === tagProvider.toLowerCase()) {\n const client: InfraWalletClient = COST_CLIENT_MAPPINGS[provider].create(config, database, cache, logger);\n const getTagValues = (async () => {\n try {\n const clientResponse = await client.getTagValues(\n {\n startTime: startTime,\n endTime: endTime,\n },\n tagKey,\n );\n clientResponse.errors.forEach((e: CloudProviderError) => {\n errors.push(e);\n });\n clientResponse.tags.forEach((tag: Tag) => {\n tags.push(tag);\n });\n } catch (e) {\n logger.error(e);\n errors.push({\n provider: client.constructor.name,\n name: client.constructor.name,\n error: e.message,\n });\n }\n })();\n promises.push(getTagValues);\n }\n });\n\n await Promise.all(promises);\n\n if (errors.length > 0) {\n response.status(207).json({ data: tags, errors: errors, status: 207 });\n } else {\n response.json({ data: tags, errors: errors, status: 200 });\n }\n });\n\n router.get('/:walletName/budgets', async (request, response) => {\n const walletName = request.params.walletName;\n const provider = request.query.provider as string;\n let budgets;\n\n if (provider) {\n budgets = await getBudget(database, walletName, provider);\n } else {\n budgets = await getBudgets(database, walletName);\n }\n\n response.json({ data: budgets, status: 200 });\n });\n\n router.put('/:walletName/budgets', async (request, response) => {\n const walletName = request.params.walletName;\n const result = await upsertBudget(database, walletName, request.body as Budget);\n response.json({ updated: result, status: 200 });\n });\n\n router.get('/custom-costs', async (_request, response) => {\n const customCosts = await getCustomCosts(database);\n\n // make it compatible with the SQLite database\n for (const cost of customCosts) {\n if (typeof cost.tags === 'string') {\n try {\n cost.tags = JSON.parse(cost.tags);\n } catch (error) {\n cost.tags = {};\n }\n }\n }\n\n response.json({ data: customCosts, status: 200 });\n });\n\n router.post('/custom-costs', async (request, response) => {\n const readOnly = config.getOptionalBoolean('infraWallet.settings.readOnly') ?? false;\n\n if (readOnly) {\n response.status(403).json({ error: 'API not enabled in read-only mode', status: 403 });\n return;\n }\n\n const updatedCustomCost = await createCustomCosts(database, request.body as CustomCost[]);\n response.json({ created: updatedCustomCost, status: 200 });\n });\n\n router.put('/custom-cost', async (request, response) => {\n const readOnly = config.getOptionalBoolean('infraWallet.settings.readOnly') ?? false;\n\n if (readOnly) {\n response.status(403).json({ error: 'API not enabled in read-only mode', status: 403 });\n return;\n }\n\n const updatedCustomCost = await updateOrInsertCustomCost(database, request.body as CustomCost);\n response.json({ updated: updatedCustomCost, status: 200 });\n });\n\n router.delete('/custom-cost', async (request, response) => {\n const readOnly = config.getOptionalBoolean('infraWallet.settings.readOnly') ?? false;\n\n if (readOnly) {\n response.status(403).json({ error: 'API not enabled in read-only mode', status: 403 });\n return;\n }\n\n const deletedCustomCost = await deleteCustomCost(database, request.body as CustomCost);\n response.json({ deleted: deletedCustomCost, status: 200 });\n });\n\n router.get('/:walletName/metrics', async (request, response) => {\n const walletName = request.params.walletName;\n const granularity = request.query.granularity as string;\n const startTime = request.query.startTime as string;\n const endTime = request.query.endTime as string;\n const promises: Promise<void>[] = [];\n const results: Metric[] = [];\n const errors: CloudProviderError[] = [];\n\n const conf = config.getConfig('backend.infraWallet.metricProviders');\n conf.keys().forEach((provider: string) => {\n if (provider in METRIC_PROVIDER_MAPPINGS) {\n const client: MetricProvider = METRIC_PROVIDER_MAPPINGS[provider].create(config, database, cache, logger);\n const fetchMetrics = (async () => {\n try {\n const metricResponse = await client.getMetrics({\n walletName: walletName,\n granularity: granularity,\n startTime: startTime,\n endTime: endTime,\n });\n metricResponse.errors.forEach((e: CloudProviderError) => {\n errors.push(e);\n });\n metricResponse.metrics.forEach((metric: Metric) => {\n results.push(metric);\n });\n } catch (e) {\n logger.error(e);\n errors.push({\n provider: client.constructor.name,\n name: client.constructor.name,\n error: e.message,\n });\n }\n })();\n promises.push(fetchMetrics);\n }\n });\n\n await Promise.all(promises);\n\n if (errors.length > 0) {\n response.status(207).json({ data: results, errors: errors, status: 207 });\n } else {\n response.json({ data: results, errors: errors, status: 200 });\n }\n });\n\n router.get('/:walletName', async (request, response) => {\n const walletName = request.params.walletName;\n const wallet = await getWallet(database, walletName);\n if (wallet === undefined) {\n response.status(404).json({ error: 'Wallet not found', status: 404 });\n return;\n }\n\n response.json({ data: wallet, status: 200 });\n });\n\n router.get('/:walletName/metrics-setting', async (request, response) => {\n const walletName = request.params.walletName;\n const metricSettings = await getWalletMetricSettings(database, walletName);\n response.json({ data: metricSettings, status: 200 });\n });\n\n router.get('/metric/metric-configs', async (_request, response) => {\n const conf = config.getConfig('backend.infraWallet.metricProviders');\n const configNames: { metric_provider: string; config_name: string }[] = [];\n conf.keys().forEach((provider: string) => {\n const configs = conf.getOptionalConfigArray(provider);\n if (configs) {\n configs.forEach(c => {\n configNames.push({ metric_provider: provider, config_name: c.getString('name') });\n });\n }\n });\n\n response.json({ data: configNames, status: 200 });\n });\n\n router.put('/:walletName/metrics-setting', async (request, response) => {\n const readOnly = config.getOptionalBoolean('infraWallet.settings.readOnly') ?? false;\n\n if (readOnly) {\n response.status(403).json({ error: 'API not enabled in read-only mode', status: 403 });\n return;\n }\n\n const updatedMetricSetting = await updateOrInsertWalletMetricSetting(database, request.body as MetricSetting);\n response.json({ updated: updatedMetricSetting, status: 200 });\n });\n\n router.delete('/:walletName/metrics-setting', async (request, response) => {\n const readOnly = config.getOptionalBoolean('infraWallet.settings.readOnly') ?? false;\n\n if (readOnly) {\n response.status(403).json({ error: 'API not enabled in read-only mode', status: 403 });\n return;\n }\n\n const deletedMetricSetting = await deleteWalletMetricSetting(database, request.body as MetricSetting);\n response.json({ deleted: deletedMetricSetting, status: 200 });\n });\n\n const middleware = MiddlewareFactory.create({ config, logger });\n router.use(middleware.error());\n\n return router;\n}\n"],"names":["resolvePackagePath","GRANULARITY","CategoryMappingService","COST_CLIENT_MAPPINGS","tagsToString","parseFilters","Router","express","fetchAndSaveCosts","getWallet","deleteCostItems","parseTags","getBudget","getBudgets","upsertBudget","getCustomCosts","createCustomCosts","updateOrInsertCustomCost","deleteCustomCost","METRIC_PROVIDER_MAPPINGS","getWalletMetricSettings","updateOrInsertWalletMetricSetting","deleteWalletMetricSetting","MiddlewareFactory"],"mappings":"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"}
1
+ {"version":3,"file":"router.cjs.js","sources":["../../src/service/router.ts"],"sourcesContent":["import { MiddlewareFactory } from '@backstage/backend-defaults/rootHttpRouter';\nimport { CacheService, DatabaseService, LoggerService, resolvePackagePath } from '@backstage/backend-plugin-api';\nimport { Config } from '@backstage/config';\nimport express from 'express';\nimport Router from 'express-promise-router';\nimport {\n deleteWalletMetricSetting,\n getWallet,\n getWalletMetricSettings,\n updateOrInsertWalletMetricSetting,\n} from '../controllers/MetricSettingController';\nimport { InfraWalletClient } from '../cost-clients/InfraWalletClient';\nimport { MetricProvider } from '../metric-providers/MetricProvider';\nimport { Budget, getBudget, getBudgets, upsertBudget } from '../models/Budget';\nimport { deleteCostItems } from '../models/CostItem';\nimport {\n CustomCost,\n createCustomCosts,\n deleteCustomCost,\n getCustomCosts,\n updateOrInsertCustomCost,\n} from '../models/CustomCost';\nimport { fetchAndSaveCosts } from '../tasks/fetchAndSaveCosts';\nimport { CategoryMappingService } from './CategoryMappingService';\nimport { COST_CLIENT_MAPPINGS, GRANULARITY, METRIC_PROVIDER_MAPPINGS } from './consts';\nimport { parseFilters, parseTags, tagsToString } from './functions';\nimport { CloudProviderError, Metric, MetricSetting, Report, ReportParameters, RouterOptions, Tag } from './types';\n\nasync function setUpDatabase(database: DatabaseService) {\n // check database migrations\n const client = await database.getClient();\n const migrationsDir = resolvePackagePath('@electrolux-oss/plugin-infrawallet-backend', 'migrations');\n if (!database.migrations?.skip) {\n await client.migrate.latest({\n directory: migrationsDir,\n });\n }\n\n // insert default category_mappings to the database\n const seedsDir = resolvePackagePath('@electrolux-oss/plugin-infrawallet-backend', 'seeds');\n await client.seed.run({ directory: seedsDir });\n}\n\nasync function getReports(\n queryParameters: ReportParameters,\n config: Config,\n database: DatabaseService,\n cache: CacheService,\n logger: LoggerService,\n): Promise<{ reports: Report[]; clientErrors: CloudProviderError[] }> {\n const { filters, tags, groups, granularityString, startTime, endTime } = queryParameters;\n const promises: Promise<void>[] = [];\n const results: Report[] = [];\n const errors: CloudProviderError[] = [];\n\n const granularity: GRANULARITY = Object.values(GRANULARITY).includes(granularityString as GRANULARITY)\n ? (granularityString as GRANULARITY)\n : GRANULARITY.MONTHLY;\n\n // group tags by providers\n const providerTags: Record<string, Tag[]> = {};\n for (const tag of tags) {\n const provider = tag.provider.toLowerCase();\n if (!providerTags[provider]) {\n providerTags[provider] = [];\n }\n\n providerTags[provider].push(tag);\n }\n\n const categoryMappingService = CategoryMappingService.getInstance();\n await categoryMappingService.refreshCategoryMappings();\n\n const conf = config.getConfig('backend.infraWallet.integrations');\n conf\n .keys()\n .concat(['custom'])\n .forEach((provider: string) => {\n if (provider in COST_CLIENT_MAPPINGS) {\n const client: InfraWalletClient = COST_CLIENT_MAPPINGS[provider].create(config, database, cache, logger);\n const fetchCloudCosts = (async () => {\n try {\n const clientResponse = await client.getCostReports({\n filters: filters,\n tags: tagsToString(providerTags[provider.toLowerCase()]),\n groups: groups,\n granularity: granularity,\n startTime: startTime,\n endTime: endTime,\n });\n clientResponse.errors.forEach((e: CloudProviderError) => {\n errors.push(e);\n });\n clientResponse.reports.forEach((cost: Report) => {\n results.push(cost);\n });\n } catch (e) {\n logger.error(e);\n errors.push({\n provider: client.constructor.name,\n name: client.constructor.name,\n error: e.message,\n });\n }\n })();\n promises.push(fetchCloudCosts);\n }\n });\n\n await Promise.all(promises);\n\n const parsedFilters = parseFilters(filters);\n\n const filteredResults = results.filter(report => {\n return Object.entries(parsedFilters).every(([key, values]) => {\n const reportValue = report[key];\n if (typeof reportValue !== 'string') {\n return false;\n }\n return values.includes(reportValue);\n });\n });\n\n return { reports: filteredResults, clientErrors: errors };\n}\n\nexport async function createRouter(options: RouterOptions): Promise<express.Router> {\n const { logger, config, scheduler, cache, database, additionalFilters } = options;\n // do database migrations here to support the legacy backend system\n await setUpDatabase(database);\n\n // init CategoryMappingService\n CategoryMappingService.initInstance(cache, logger);\n\n const router = Router();\n router.use(express.json());\n\n router.get('/health', (_, response) => {\n logger.info('PONG!');\n response.json({ status: 'ok' });\n });\n\n // Endpoint to trigger the fetchAndSaveCosts task manually\n router.get('/fetch_and_save_costs', async (_, response) => {\n try {\n // Trigger the scheduled task using the scheduler\n await scheduler.triggerTask('infrawallet-autoload-costs');\n\n response.json({\n status: 'ok',\n message: 'Cost data fetching task has been triggered. Check logs for execution details.',\n });\n } catch (error) {\n logger.error(`Error triggering cost data fetch task: ${error.message}`, { error });\n\n // Fall back to direct execution if task triggering fails\n try {\n logger.info('Falling back to direct execution of fetch and save costs');\n await fetchAndSaveCosts(options);\n response.json({\n status: 'ok',\n message: 'Cost data fetch completed successfully via direct execution.',\n });\n } catch (directError) {\n logger.error(`Direct cost data fetch failed: ${directError.message}`, { error: directError });\n response.status(500).json({\n status: 'error',\n message: 'Failed to fetch cost data. Check logs for more details.',\n });\n }\n }\n });\n\n router.post('/:walletName/delete_cost_items', async (request, response) => {\n const walletName = request.params.walletName;\n const granularity = request.body.granularity as string;\n const provider = request.body.provider as string;\n\n const wallet = await getWallet(database, walletName);\n if (wallet && granularity && provider) {\n const rowsDeleted = await deleteCostItems(database, wallet.id, provider, granularity);\n response.json({\n message: `Deleted ${rowsDeleted} ${granularity} ${provider} cost records in ${walletName}`,\n status: 'ok',\n });\n } else {\n response.status(404).json({ error: 'Wallet not found or missing parameters', status: 404 });\n }\n });\n\n router.get('/reports', async (request, response) => {\n const filters = request.query.filters as string;\n const tags = parseTags(request.query.tags as string);\n const groups = request.query.groups as string;\n const granularityString = request.query.granularity as string;\n const startTime = request.query.startTime as string;\n const endTime = request.query.endTime as string;\n const [entityNamespace, entityName] = decodeURI(request.query.entityName as string)?.split('/') || [];\n\n let reportFilters: ReportParameters = {\n filters,\n tags,\n groups,\n granularityString,\n startTime,\n endTime,\n entityNamespace,\n entityName,\n };\n if (additionalFilters.length > 0) {\n for (const filter of additionalFilters) {\n reportFilters = await filter.augmentFilters(reportFilters);\n }\n }\n\n const { reports, clientErrors } = await getReports(reportFilters, config, database, cache, logger);\n\n if (clientErrors.length > 0) {\n response.status(207).json({ data: reports, errors: clientErrors, status: 207 });\n } else {\n response.json({ data: reports, errors: clientErrors, status: 200 });\n }\n });\n\n router.get('/tag-keys', async (request, response) => {\n const tags: Tag[] = [];\n const errors: CloudProviderError[] = [];\n\n const tagProvider = request.query.provider as string;\n const startTime = request.query.startTime as string;\n const endTime = request.query.endTime as string;\n const promises: Promise<void>[] = [];\n\n const conf = config.getConfig('backend.infraWallet.integrations');\n conf.keys().forEach((provider: string) => {\n if (provider.toLowerCase() === tagProvider.toLowerCase() && provider in COST_CLIENT_MAPPINGS) {\n const client: InfraWalletClient = COST_CLIENT_MAPPINGS[provider].create(config, database, cache, logger);\n const getTagKeys = (async () => {\n try {\n const clientResponse = await client.getTagKeys({\n startTime: startTime,\n endTime: endTime,\n });\n clientResponse.errors.forEach((e: CloudProviderError) => {\n errors.push(e);\n });\n clientResponse.tags.forEach((tag: Tag) => {\n tags.push(tag);\n });\n } catch (e) {\n logger.error(e);\n errors.push({\n provider: client.constructor.name,\n name: client.constructor.name,\n error: e.message,\n });\n }\n })();\n promises.push(getTagKeys);\n }\n });\n\n await Promise.all(promises);\n\n if (errors.length > 0) {\n response.status(207).json({ data: tags, errors: errors, status: 207 });\n } else {\n response.json({ data: tags, errors: errors, status: 200 });\n }\n });\n\n router.get('/tag-values', async (request, response) => {\n const tags: Tag[] = [];\n const errors: CloudProviderError[] = [];\n\n const startTime = request.query.startTime as string;\n const endTime = request.query.endTime as string;\n const tagKey = request.query.tag as string;\n const tagProvider = request.query.provider as string;\n const promises: Promise<void>[] = [];\n\n const conf = config.getConfig('backend.infraWallet.integrations');\n conf.keys().forEach((provider: string) => {\n if (provider in COST_CLIENT_MAPPINGS && provider.toLowerCase() === tagProvider.toLowerCase()) {\n const client: InfraWalletClient = COST_CLIENT_MAPPINGS[provider].create(config, database, cache, logger);\n const getTagValues = (async () => {\n try {\n const clientResponse = await client.getTagValues(\n {\n startTime: startTime,\n endTime: endTime,\n },\n tagKey,\n );\n clientResponse.errors.forEach((e: CloudProviderError) => {\n errors.push(e);\n });\n clientResponse.tags.forEach((tag: Tag) => {\n tags.push(tag);\n });\n } catch (e) {\n logger.error(e);\n errors.push({\n provider: client.constructor.name,\n name: client.constructor.name,\n error: e.message,\n });\n }\n })();\n promises.push(getTagValues);\n }\n });\n\n await Promise.all(promises);\n\n if (errors.length > 0) {\n response.status(207).json({ data: tags, errors: errors, status: 207 });\n } else {\n response.json({ data: tags, errors: errors, status: 200 });\n }\n });\n\n router.get('/:walletName/budgets', async (request, response) => {\n const walletName = request.params.walletName;\n const provider = request.query.provider as string;\n let budgets;\n\n if (provider) {\n budgets = await getBudget(database, walletName, provider);\n } else {\n budgets = await getBudgets(database, walletName);\n }\n\n response.json({ data: budgets, status: 200 });\n });\n\n router.put('/:walletName/budgets', async (request, response) => {\n const walletName = request.params.walletName;\n const result = await upsertBudget(database, walletName, request.body as Budget);\n response.json({ updated: result, status: 200 });\n });\n\n router.get('/custom-costs', async (_request, response) => {\n const customCosts = await getCustomCosts(database);\n\n // make it compatible with the SQLite database\n for (const cost of customCosts) {\n if (typeof cost.tags === 'string') {\n try {\n cost.tags = JSON.parse(cost.tags);\n } catch (error) {\n cost.tags = {};\n }\n }\n }\n\n response.json({ data: customCosts, status: 200 });\n });\n\n router.post('/custom-costs', async (request, response) => {\n const readOnly = config.getOptionalBoolean('infraWallet.settings.readOnly') ?? false;\n\n if (readOnly) {\n response.status(403).json({ error: 'API not enabled in read-only mode', status: 403 });\n return;\n }\n\n const updatedCustomCost = await createCustomCosts(database, request.body as CustomCost[]);\n response.json({ created: updatedCustomCost, status: 200 });\n });\n\n router.put('/custom-cost', async (request, response) => {\n const readOnly = config.getOptionalBoolean('infraWallet.settings.readOnly') ?? false;\n\n if (readOnly) {\n response.status(403).json({ error: 'API not enabled in read-only mode', status: 403 });\n return;\n }\n\n const updatedCustomCost = await updateOrInsertCustomCost(database, request.body as CustomCost);\n response.json({ updated: updatedCustomCost, status: 200 });\n });\n\n router.delete('/custom-cost', async (request, response) => {\n const readOnly = config.getOptionalBoolean('infraWallet.settings.readOnly') ?? false;\n\n if (readOnly) {\n response.status(403).json({ error: 'API not enabled in read-only mode', status: 403 });\n return;\n }\n\n const deletedCustomCost = await deleteCustomCost(database, request.body as CustomCost);\n response.json({ deleted: deletedCustomCost, status: 200 });\n });\n\n router.get('/:walletName/metrics', async (request, response) => {\n const walletName = request.params.walletName;\n const granularity = request.query.granularity as string;\n const startTime = request.query.startTime as string;\n const endTime = request.query.endTime as string;\n const promises: Promise<void>[] = [];\n const results: Metric[] = [];\n const errors: CloudProviderError[] = [];\n\n const conf = config.getConfig('backend.infraWallet.metricProviders');\n conf.keys().forEach((provider: string) => {\n if (provider in METRIC_PROVIDER_MAPPINGS) {\n const client: MetricProvider = METRIC_PROVIDER_MAPPINGS[provider].create(config, database, cache, logger);\n const fetchMetrics = (async () => {\n try {\n const metricResponse = await client.getMetrics({\n walletName: walletName,\n granularity: granularity,\n startTime: startTime,\n endTime: endTime,\n });\n metricResponse.errors.forEach((e: CloudProviderError) => {\n errors.push(e);\n });\n metricResponse.metrics.forEach((metric: Metric) => {\n results.push(metric);\n });\n } catch (e) {\n logger.error(e);\n errors.push({\n provider: client.constructor.name,\n name: client.constructor.name,\n error: e.message,\n });\n }\n })();\n promises.push(fetchMetrics);\n }\n });\n\n await Promise.all(promises);\n\n if (errors.length > 0) {\n response.status(207).json({ data: results, errors: errors, status: 207 });\n } else {\n response.json({ data: results, errors: errors, status: 200 });\n }\n });\n\n router.get('/:walletName', async (request, response) => {\n const walletName = request.params.walletName;\n const wallet = await getWallet(database, walletName);\n if (wallet === undefined) {\n response.status(404).json({ error: 'Wallet not found', status: 404 });\n return;\n }\n\n response.json({ data: wallet, status: 200 });\n });\n\n router.get('/:walletName/metrics-setting', async (request, response) => {\n const walletName = request.params.walletName;\n const metricSettings = await getWalletMetricSettings(database, walletName);\n response.json({ data: metricSettings, status: 200 });\n });\n\n router.get('/metric/metric-configs', async (_request, response) => {\n const conf = config.getConfig('backend.infraWallet.metricProviders');\n const configNames: { metric_provider: string; config_name: string }[] = [];\n conf.keys().forEach((provider: string) => {\n const configs = conf.getOptionalConfigArray(provider);\n if (configs) {\n configs.forEach(c => {\n configNames.push({ metric_provider: provider, config_name: c.getString('name') });\n });\n }\n });\n\n response.json({ data: configNames, status: 200 });\n });\n\n router.put('/:walletName/metrics-setting', async (request, response) => {\n const readOnly = config.getOptionalBoolean('infraWallet.settings.readOnly') ?? false;\n\n if (readOnly) {\n response.status(403).json({ error: 'API not enabled in read-only mode', status: 403 });\n return;\n }\n\n const updatedMetricSetting = await updateOrInsertWalletMetricSetting(database, request.body as MetricSetting);\n response.json({ updated: updatedMetricSetting, status: 200 });\n });\n\n router.delete('/:walletName/metrics-setting', async (request, response) => {\n const readOnly = config.getOptionalBoolean('infraWallet.settings.readOnly') ?? false;\n\n if (readOnly) {\n response.status(403).json({ error: 'API not enabled in read-only mode', status: 403 });\n return;\n }\n\n const deletedMetricSetting = await deleteWalletMetricSetting(database, request.body as MetricSetting);\n response.json({ deleted: deletedMetricSetting, status: 200 });\n });\n\n const middleware = MiddlewareFactory.create({ config, logger });\n router.use(middleware.error());\n\n return router;\n}\n"],"names":["resolvePackagePath","GRANULARITY","CategoryMappingService","COST_CLIENT_MAPPINGS","tagsToString","parseFilters","Router","express","fetchAndSaveCosts","getWallet","deleteCostItems","parseTags","getBudget","getBudgets","upsertBudget","getCustomCosts","createCustomCosts","updateOrInsertCustomCost","deleteCustomCost","METRIC_PROVIDER_MAPPINGS","getWalletMetricSettings","updateOrInsertWalletMetricSetting","deleteWalletMetricSetting","MiddlewareFactory"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@electrolux-oss/plugin-infrawallet-backend",
3
- "version": "1.1.0-20251202133021-aade8f1",
3
+ "version": "1.1.0-20251204084512-e456a8a",
4
4
  "backstage": {
5
5
  "role": "backend-plugin",
6
6
  "pluginId": "infrawallet",
@@ -48,11 +48,11 @@
48
48
  "@azure/arm-costmanagement": "1.0.0-beta.1",
49
49
  "@azure/core-rest-pipeline": "1.17.0",
50
50
  "@azure/identity": "4.5.0",
51
- "@backstage/backend-defaults": "^0.11.0",
52
- "@backstage/backend-plugin-api": "^1.4.0",
53
- "@backstage/catalog-model": "^1.7.5",
54
- "@backstage/config": "^1.3.2",
55
- "@backstage/types": "^1.2.1",
51
+ "@backstage/backend-defaults": "^0.13.1",
52
+ "@backstage/backend-plugin-api": "^1.5.0",
53
+ "@backstage/catalog-model": "^1.7.6",
54
+ "@backstage/config": "^1.3.6",
55
+ "@backstage/types": "^1.2.2",
56
56
  "@datadog/datadog-api-client": "^1.29.0",
57
57
  "@google-cloud/bigquery": "7.9.1",
58
58
  "@types/express": "^4.17.6",
@@ -69,9 +69,9 @@
69
69
  "zod": "^3.24.2"
70
70
  },
71
71
  "devDependencies": {
72
- "@backstage/cli": "^0.33.0",
73
- "@backstage/plugin-auth-backend": "^0.25.1",
74
- "@backstage/plugin-auth-backend-module-guest-provider": "^0.2.9",
72
+ "@backstage/cli": "^0.34.5",
73
+ "@backstage/plugin-auth-backend": "^0.25.6",
74
+ "@backstage/plugin-auth-backend-module-guest-provider": "^0.2.14",
75
75
  "@types/supertest": "^2.0.8",
76
76
  "knex": "^3.1.0",
77
77
  "msw": "^1.0.0",