Skip to content

Commit

Permalink
multiple databases
Browse files Browse the repository at this point in the history
  • Loading branch information
AdamDawidKrol committed Apr 12, 2024
1 parent 87adb31 commit 4f3a903
Show file tree
Hide file tree
Showing 10 changed files with 206 additions and 112 deletions.
3 changes: 3 additions & 0 deletions .env.test
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,6 @@ DATA_DB_USER=postgres
DATA_DB_PASSWORD=postgres
DATA_DB_NAMES=azero_testnet_squid,reef_mainnet_squid,polkadot_mainnet_squid,arbitrum_mainnet_squid,azero_mainnet_squid,kusama_mainnet_squid,astar_mainnet_squid,crosschain,moonbeam_mainnet_squid,offchain
DATA_DB_PORT=5432

NODE_ENV=development
PORT=8082
2 changes: 2 additions & 0 deletions dev.Dockerfile
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@

FROM node:18-alpine

RUN apk add --no-cache bash
RUN mkdir -p /usr/src/node-app && chown -R node:node /usr/src/node-app
WORKDIR /usr/src/node-app
USER node
Expand Down
20 changes: 15 additions & 5 deletions docker-compose-local.yaml
Original file line number Diff line number Diff line change
@@ -1,14 +1,24 @@
version: "3.8"

services:
postgres-test:
build:
context: .
dockerfile: test.Dockerfile
environment:
POSTGRES_PASSWORD: postgres
ports:
- "5432:5432"
db-api:
build:
context: .
dockerfile: Dockerfile
dockerfile: dev.Dockerfile
ports:
- "3000:3000"
command: npm run start
- '8082:8082'
command: ["sh", "-c", "./wait-for-it.sh postgres-test:5432 -- npm run migrate && npm run watch-node"]
volumes:
- .:/app
- .:/usr/src/node-app
depends_on:
- postgres-test
env_file:
- ./.env
- ./.env.development.local
13 changes: 13 additions & 0 deletions migrations/20240412103207_change_database_name_to_databases.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import type { Knex } from "knex";

exports.up = function (knex: Knex): Promise<void> {
return knex.schema.table("queries", function (table) {
table.renameColumn("database", "databases");
});
};

exports.down = function (knex: Knex): Promise<void> {
return knex.schema.table("queries", function (table) {
table.renameColumn("databases", "database");
});
};
75 changes: 49 additions & 26 deletions src/controllers/query.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,20 @@ export const saveQuery = async (
res: Response
): Promise<Response> => {
const requestBody = req.body as SaveQueryRequestBody;
const { query, database, label, parameters, description } = requestBody;
const { query, databases, label, parameters, description } = requestBody;

const values = parameters?.values ?? [];

// Check if the specified database exists in pgInstances
if (!externalKnexConfigs[database]) {
// Handle databases being either a string or an array of strings
const databasesList = Array.isArray(databases) ? databases : [databases];

// Check if the specified databases exist in pgInstances
const allDatabasesExist = databasesList.every(
(db) => externalKnexConfigs[db]
);
if (!allDatabasesExist) {
return res.status(400).json({
message: "Specified database is not available",
message: "One or more specified databases are not available",
});
}

Expand Down Expand Up @@ -71,10 +77,15 @@ export const saveQuery = async (
? JSON.stringify(parametersToStore)
: null;

const serializedDatabases =
databasesList.length === 1
? databasesList[0]
: JSON.stringify(databasesList);

try {
const queryId = await queriesDbQueryService.saveQuery(
decodedQuery,
database,
serializedDatabases,
label,
serializedParameters as any,
description || null
Expand All @@ -91,22 +102,16 @@ export const saveQuery = async (
}
};

// function transformQueryResult210(result: any[]): any {
// return result.reduce((acc, { dimension_value, date, value }) => {
// if (!acc[dimension_value]) {
// acc[dimension_value] = [];
// }
// acc[dimension_value].push({ date, value });
// return acc;
// }, {});
// }

export const executeQuery = async (
req: Request,
res: Response
): Promise<Response> => {
const requestBody = req.body as ExecuteQueryRequestBody;
const { id, parameters = { values: [], identifiers: [] } } = requestBody;
const {
id,
parameters = { values: [], identifiers: [] },
database,
} = requestBody;

let sqlQuery: string;
const bindConfig: BindConfig = {};
Expand All @@ -121,7 +126,7 @@ export const executeQuery = async (
const { values: savedValues = [], identifiers: savedIdentifiers = [] } =
savedQuery?.parameters ?? {};

console.log("log savedQuery", savedQuery?.parameters);
console.log("log savedQuery", savedQuery);

const {
values: providedValues = [],
Expand Down Expand Up @@ -197,20 +202,38 @@ export const executeQuery = async (
bindConfig[item.name] = item.value;
});

let targetDatabase = savedQuery.databases;
console.log("savedQuery.database", savedQuery.databases);
const availableDatabases = Array.isArray(targetDatabase)
? targetDatabase
: [targetDatabase];

if (database) {
console.log("availableDatabases", availableDatabases);
if (!availableDatabases.includes(database)) {
return res.status(400).json({
message: `The specified database is not one of the available databases for this query: ${availableDatabases.join(
", "
)}`,
});
}
targetDatabase = database;
} else if (availableDatabases.length > 1) {
return res.status(400).json({
message: `No database selected among the available databases: ${availableDatabases.join(
", "
)}`,
});
} else {
targetDatabase = availableDatabases[0];
}

const result = await dataDbQueryService.executeQuery(
savedQuery.database,
targetDatabase,
sqlQuery,
bindConfig
);

// if (id === 210) {
// const transformedData = transformQueryResult210(result);
// return res
// .status(200)
// .json({ data: transformedData, message: "Query executed" });
// } else {
// return res.status(200).json({ data: result, message: "Query executed" });
// }
return res.status(200).json({ data: result, message: "Query executed" });
} catch (error) {
console.error("Error executing the query:", error);
Expand Down
4 changes: 2 additions & 2 deletions src/db/models/public/Queries.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ export default interface Queries {

parameters: StoredParameters | null;

database: string;
databases: string;

created_at: Date | null;

Expand All @@ -34,7 +34,7 @@ export interface QueriesInitializer {

parameters?: StoredParameters | null;

database: string;
databases: string;

/** Default value: CURRENT_TIMESTAMP */
created_at?: Date | null;
Expand Down
16 changes: 10 additions & 6 deletions src/db/services/queriesDbQueryService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,19 @@ import { StoredParameters } from "queries";

export const saveQuery = async (
query: string,
database: string,
databases: string,
label: string,
parameters: StoredParameters,
description?: string
): Promise<Pick<Queries, "id">> => {
const serializedDatabases = Array.isArray(databases)
? JSON.stringify(databases)
: databases;

const [result] = await internalKnexInstance("queries")
.insert({
query,
database,
databases: serializedDatabases,
label,
parameters,
description,
Expand All @@ -33,7 +37,7 @@ export const getSavedQuery = async (id: number): Promise<Queries> => {
export const updateQuery = async (
id: number,
query?: string,
database?: string,
databases?: string,
label?: string,
parameters?: StoredParameters
): Promise<boolean> => {
Expand Down Expand Up @@ -65,7 +69,7 @@ export const updateQuery = async (

const currentVersion = {
query: currentQuery.query,
database: currentQuery.database,
databases: currentQuery.databases,
label: currentQuery.label,
parameters: currentQuery.parameters,
updatedAt: currentQuery.updated_at,
Expand All @@ -76,7 +80,7 @@ export const updateQuery = async (

const newVersion = {
query: query || currentQuery.query,
database: database || currentQuery.database,
databases: databases || currentQuery.databases,
label: label || currentQuery.label,
parameters: parameters || currentQuery.parameters,
updatedAt: new Date(),
Expand All @@ -85,7 +89,7 @@ export const updateQuery = async (

const updates = {
...(query !== undefined && { query }),
...(database !== undefined && { database }),
...(databases !== undefined && { databases }),
...(label !== undefined && { label }),
...(parameters !== undefined && { parameters }),
version_history: JSON.stringify(versionHistory),
Expand Down
Loading

0 comments on commit 4f3a903

Please sign in to comment.