Added many queries

This commit is contained in:
Benoy Bose 2025-01-10 04:27:56 +05:30
parent cd9f800a99
commit c413f7aa73
3 changed files with 305 additions and 14 deletions

View File

@ -1,8 +1,185 @@
import dotenv from "dotenv"; import dotenv from "dotenv";
dotenv.config(); dotenv.config();
// /accounts
export const accountsQuery = `SELECT DISTINCT
line_item_usage_account_id AS accountId FROM ${process.env.ATHENA_CU_TABLE};`;
// /accounts/:accountId/regions
export const regionsQuery = `SELECT DISTINCT
line_item_usage_account_id AS accountId,
COALESCE(NULLIF(TRIM(product_region_code), ''), 'global') AS regionCode
FROM ${process.env.ATHENA_CU_TABLE}
WHERE line_item_usage_account_id = '%accountId%';`;
// /accounts/:accountId/regions/:regionCode/products
export const productsByRegionQuery = `SELECT DISTINCT
line_item_product_code AS productCode,
COALESCE(NULLIF(TRIM(product_region_code), ''), 'global') AS regionCode,
line_item_usage_account_id AS accountId,
line_item_resource_id AS resourceId
FROM ${process.env.ATHENA_CU_TABLE}
WHERE line_item_usage_account_id = '%accountId%' AND LOWER(product_region_code) = LOWER('%regionCode%');`;
// /accounts/:accountId/regions/:regionCode/products/:productCode
export const productByRegionQuery = `SELECT DISTINCT
line_item_product_code AS productCode,
COALESCE(NULLIF(TRIM(product_region_code), ''), 'global') AS regionCode,
line_item_usage_account_id AS accountId,
line_item_resource_id AS resourceId
FROM ${process.env.ATHENA_CU_TABLE}
WHERE
line_item_usage_account_id = '%accountId%' AND
product_region_code = '%regionCode%' AND
LOWER(line_item_product_code) = LOWER('%productCode%');`;
// /accounts/:accountId/regions/:regionCode/products/:productCode/usage
export const productUsageByRegionQuery = `SELECT DISTINCT
line_item_product_code AS productCode,
COALESCE(NULLIF(TRIM(product_region_code), ''), 'global') AS regionCode,
line_item_usage_account_id AS accountId,
line_item_resource_id AS resourceId,
line_item_usage_type AS usageType,
line_item_usage_amount AS usageAmount,
line_item_unblended_rate AS unblendedRate,
line_item_unblended_cost AS unblendedCost,
line_item_blended_rate AS blendedRate,
line_item_blended_cost AS blendedCost,
pricing_term AS pricingTerm,
pricing_unit AS pricingUnit,
pricing_rate_code AS pricingRateCode,
pricing_currency AS pricingCurrency,
line_item_usage_start_date AS startDate,
line_item_usage_end_date AS endDate
FROM ${process.env.ATHENA_CU_TABLE}
WHERE line_item_usage_account_id = '%accountId%'
AND product_region_code = '%regionCode%'
AND LOWER(line_item_product_code) = LOWER('%productCode%');`;
// /accounts/:accountId/regions/:regionCode/products/:productCode/usage/:year
export const productUsageByRegionYearQuery = `SELECT DISTINCT
line_item_product_code AS productCode,
COALESCE(NULLIF(TRIM(product_region_code), ''), 'global') AS regionCode,
line_item_usage_account_id AS accountId,
line_item_resource_id AS resourceId,
line_item_usage_type AS usageType,
line_item_usage_amount AS usageAmount,
line_item_unblended_rate AS unblendedRate,
line_item_unblended_cost AS unblendedCost,
line_item_blended_rate AS blendedRate,
line_item_blended_cost AS blendedCost,
pricing_term AS pricingTerm,
pricing_unit AS pricingUnit,
pricing_rate_code AS pricingRateCode,
pricing_currency AS pricingCurrency,
line_item_usage_start_date AS startDate,
line_item_usage_end_date AS endDate
FROM ${process.env.ATHENA_CU_TABLE}
WHERE line_item_usage_account_id = '%accountId%'
AND product_region_code = '%regionCode%'
AND LOWER(line_item_product_code) = LOWER('%productCode%')
AND year = '%year%';`;
// /accounts/:accountId/regions/:regionCode/products/:productCode/usage/:year/:month
export const productUsageByRegionYearMonthQuery = `SELECT DISTINCT
line_item_product_code AS productCode,
COALESCE(NULLIF(TRIM(product_region_code), ''), 'global') AS regionCode,
line_item_usage_account_id AS accountId,
line_item_resource_id AS resourceId,
line_item_usage_type AS usageType,
line_item_usage_amount AS usageAmount,
line_item_unblended_rate AS unblendedRate,
line_item_unblended_cost AS unblendedCost,
line_item_blended_rate AS blendedRate,
line_item_blended_cost AS blendedCost,
pricing_term AS pricingTerm,
pricing_unit AS pricingUnit,
pricing_rate_code AS pricingRateCode,
pricing_currency AS pricingCurrency,
line_item_usage_start_date AS startDate,
line_item_usage_end_date AS endDate
FROM ${process.env.ATHENA_CU_TABLE}
WHERE line_item_usage_account_id = '%accountId%'
AND product_region_code = '%regionCode%'
AND LOWER(line_item_product_code) = LOWER('%productCode%')
AND year = '%year%'
AND month = '%month%';`;
// /products
export const productQuery = `SELECT DISTINCT export const productQuery = `SELECT DISTINCT
line_item_resource_id AS resourceId,
line_item_product_code AS productCode, line_item_product_code AS productCode,
line_item_usage_account_id AS accountId COALESCE(NULLIF(TRIM(product_region_code), ''), 'global') AS regionCode,
FROM ${process.env.ATHENA_CU_TABLE};`; line_item_usage_account_id AS accountId,
line_item_resource_id AS resourceId
FROM ${process.env.ATHENA_CU_TABLE};`;
export const productByCodeQuery = `SELECT DISTINCT
line_item_product_code AS productCode,
COALESCE(NULLIF(TRIM(product_region_code), ''), 'global') AS regionCode,
line_item_usage_account_id AS accountId,
line_item_resource_id AS resourceId
FROM ${process.env.ATHENA_CU_TABLE}
WHERE LOWER(line_item_product_code) = LOWER('%productCode%');`;
export const productByCodeUsageQuery = `SELECT DISTINCT
line_item_product_code AS productCode,
COALESCE(NULLIF(TRIM(product_region_code), ''), 'global') AS regionCode,
line_item_usage_account_id AS accountId,
line_item_resource_id AS resourceId,
line_item_usage_type AS usageType,
line_item_usage_amount AS usageAmount,
line_item_unblended_rate AS unblendedRate,
line_item_unblended_cost AS unblendedCost,
line_item_blended_rate AS blendedRate,
line_item_blended_cost AS blendedCost,
pricing_term AS pricingTerm,
pricing_unit AS pricingUnit,
pricing_rate_code AS pricingRateCode,
pricing_currency AS pricingCurrency,
line_item_usage_start_date AS startDate,
line_item_usage_end_date AS endDate
FROM ${process.env.ATHENA_CU_TABLE}
WHERE LOWER(line_item_product_code) = LOWER('%productCode%');`;
export const productByCodeUsageYearQuery = `SELECT DISTINCT
line_item_product_code AS productCode,
COALESCE(NULLIF(TRIM(product_region_code), ''), 'global') AS regionCode,
line_item_usage_account_id AS accountId,
line_item_resource_id AS resourceId,
line_item_usage_type AS usageType,
line_item_usage_amount AS usageAmount,
line_item_unblended_rate AS unblendedRate,
line_item_unblended_cost AS unblendedCost,
line_item_blended_rate AS blendedRate,
line_item_blended_cost AS blendedCost,
pricing_term AS pricingTerm,
pricing_unit AS pricingUnit,
pricing_rate_code AS pricingRateCode,
pricing_currency AS pricingCurrency,
line_item_usage_start_date AS startDate,
line_item_usage_end_date AS endDate
FROM ${process.env.ATHENA_CU_TABLE}
WHERE LOWER(line_item_product_code) = LOWER('%productCode%')
AND year = '%year%';`;
export const productByCodeUsageYearMonthQuery = `SELECT DISTINCT
line_item_product_code AS productCode,
COALESCE(NULLIF(TRIM(product_region_code), ''), 'global') AS regionCode,
line_item_usage_account_id AS accountId,
line_item_resource_id AS resourceId,
line_item_usage_type AS usageType,
line_item_usage_amount AS usageAmount,
line_item_unblended_rate AS unblendedRate,
line_item_unblended_cost AS unblendedCost,
line_item_blended_rate AS blendedRate,
line_item_blended_cost AS blendedCost,
pricing_term AS pricingTerm,
pricing_unit AS pricingUnit,
pricing_rate_code AS pricingRateCode,
pricing_currency AS pricingCurrency,
line_item_usage_start_date AS startDate,
line_item_usage_end_date AS endDate
FROM ${process.env.ATHENA_CU_TABLE}
WHERE LOWER(line_item_product_code) = LOWER('%productCode%')
AND year = '%year%'
AND month = '%month%';`;

126
server.js
View File

@ -15,16 +15,136 @@ server.get("/", async (request, reply) => {
return { hello: "world" }; return { hello: "world" };
}); });
server.get("/accounts", async (request, reply) => {
const queryExecutionId = await executeQueryAsync(queries.accountsQuery);
const results = await retrieveResultsAsync(queryExecutionId);
return results;
});
server.get("/accounts/:accountId/regions", async (request, reply) => {
const query = queries.regionsQuery.replace('%accountId%', request.params.accountId);
const queryExecutionId = await executeQueryAsync(query);
const results = await retrieveResultsAsync(queryExecutionId);
return results;
});
server.get("/accounts/:accountId/regions/:regionCode/products", async (request, reply) => {
let regionCode = request.params.regionCode;
if (!regionCode || regionCode === 'global') {
regionCode = '';
}
const query = queries.productsByRegionQuery
.replace('%accountId%', request.params.accountId)
.replace('%regionCode%', regionCode);
const queryExecutionId = await executeQueryAsync(query);
const results = await retrieveResultsAsync(queryExecutionId);
return results;
});
server.get("/accounts/:accountId/regions/:regionCode/products/:productCode", async (request, reply) => {
let regionCode = request.params.regionCode;
if (!regionCode || regionCode === 'global') {
regionCode = '';
}
const query = queries.productByRegionQuery
.replace('%accountId%', request.params.accountId)
.replace('%regionCode%', regionCode)
.replace('%productCode%', request.params.productCode);
const queryExecutionId = await executeQueryAsync(query);
const results = await retrieveResultsAsync(queryExecutionId);
return results;
});
server.get("/accounts/:accountId/regions/:regionCode/products/:productCode/usage", async (request, reply) => {
let regionCode = request.params.regionCode;
if (!regionCode || regionCode === 'global') {
regionCode = '';
}
const query = queries.productUsageByRegionQuery
.replace('%accountId%', request.params.accountId)
.replace('%regionCode%', regionCode)
.replace('%productCode%', request.params.productCode);
const queryExecutionId = await executeQueryAsync(query);
const results = await retrieveResultsAsync(queryExecutionId);
return results;
});
server.get("/accounts/:accountId/regions/:regionCode/products/:productCode/usage/:year", async (request, reply) => {
let regionCode = request.params.regionCode;
if (!regionCode || regionCode === 'global') {
regionCode = '';
}
const query = queries.productUsageByRegionYearQuery
.replace('%accountId%', request.params.accountId)
.replace('%regionCode%', regionCode)
.replace('%productCode%', request.params.productCode)
.replace('%year%', request.params.year);
const queryExecutionId = await executeQueryAsync(query);
const results = await retrieveResultsAsync(queryExecutionId);
return results;
});
server.get("/accounts/:accountId/regions/:regionCode/products/:productCode/usage/:year/:month", async (request, reply) => {
let regionCode = request.params.regionCode;
if (!regionCode || regionCode === 'global') {
regionCode = '';
}
const query = queries.productUsageByRegionYearMonthQuery
.replace('%accountId%', request.params.accountId)
.replace('%regionCode%', regionCode)
.replace('%productCode%', request.params.productCode)
.replace('%year%', request.params.year)
.replace('%month%', request.params.month);
const queryExecutionId = await executeQueryAsync(query);
const results = await retrieveResultsAsync(queryExecutionId);
return results;
});
server.get("/products", async (request, reply) => { server.get("/products", async (request, reply) => {
const query = queries.productQuery; const query = queries.productQuery;
const queryExecutionId = await executeQueryAsync(query); const queryExecutionId = await executeQueryAsync(query);
const results = await retrieveResultsAsync(queryExecutionId); const results = await retrieveResultsAsync(queryExecutionId);
return { results }; return results;
});
server.get("/products/:productCode", async (request, reply) => {
const query = queries.productByCodeQuery
.replace('%productCode%', request.params.productCode);
const queryExecutionId = await executeQueryAsync(query);
const results = await retrieveResultsAsync(queryExecutionId);
return results;
});
server.get("/products/:productCode/usage", async (request, reply) => {
const query = queries.productByCodeUsageQuery
.replace('%productCode%', request.params.productCode);
const queryExecutionId = await executeQueryAsync(query);
const results = await retrieveResultsAsync(queryExecutionId);
return results;
});
server.get("/products/:productCode/usage/:year", async (request, reply) => {
const query = queries.productByCodeUsageYearQuery
.replace('%productCode%', request.params.productCode)
.replace('%year%', request.params.year);
const queryExecutionId = await executeQueryAsync(query);
const results = await retrieveResultsAsync(queryExecutionId);
return results;
});
server.get("/products/:productCode/usage/:year/:month", async (request, reply) => {
const query = queries.productByCodeUsageYearMonthQuery
.replace('%productCode%', request.params.productCode)
.replace('%year%', request.params.year)
.replace('%month%', request.params.month);
const queryExecutionId = await executeQueryAsync(query);
const results = await retrieveResultsAsync(queryExecutionId);
return results;
}); });
try { try {
await server.listen({ port: 3000 }) await server.listen({ port: 3000 })
} catch (err) { } catch (err) {
server.log.error(err) server.log.error(err);
process.exit(1) process.exit(1);
} }

View File

@ -45,17 +45,11 @@ export const retrieveResultsAsync = async (queryExecutionId) => {
const result = await athenaClient.send(getQueryResultsCommand); const result = await athenaClient.send(getQueryResultsCommand);
if (!result || !result.ResultSet || !result.ResultSet.Rows) { if (!result || !result.ResultSet || !result.ResultSet.Rows) {
return { throw new Error('No results');
statusCode: 404,
body: JSON.stringify([]),
};
} }
let rows = result.ResultSet.Rows; let rows = result.ResultSet.Rows;
if (0 == rows.length || 1 == rows.length) { if (0 == rows.length || 1 == rows.length) {
return { throw new Error('No result data');
statusCode: 400,
body: JSON.stringify([]),
};
} }
const columnNames = rows[0].Data.map(item => item.VarCharValue); const columnNames = rows[0].Data.map(item => item.VarCharValue);
const items = []; const items = [];