web3.db-fileconnector
Version:
GraphQL System Built on web3 technologies. Web3.DB is an open database built on top of web3 technologies. It is a decentralized, open-source database that allows users to store and query data in a secure and efficient manner. The system is designed to be
158 lines (143 loc) • 4.36 kB
text/typescript
// Client-side adapter for the Neon PostgreSQL data source
import axios from "axios";
/**
* NeonDataSource class provides methods to interact with a Neon PostgreSQL database
* through the web3db-connector plugin system
*/
export class NeonDataSource {
/**
* Create a new NeonDataSource instance
* @param {Object} options - Configuration options
* @param {string} options.contextUuid - The UUID of the context with the Neon database plugin
* @param {string} options.jwt - Authentication JWT token
*/
constructor(options = {}) {
this.contextUuid = options.contextUuid;
this.jwt = options.jwt;
if (!this.contextUuid) {
throw new Error("Context UUID is required for NeonDataSource");
}
}
/**
* Set the JWT token for authentication
* @param {string} jwt - The JWT token
*/
setJwt(jwt) {
this.jwt = jwt;
}
/**
* Get the list of tables from the Neon database
* @returns {Promise<Array>} - List of tables and their columns
*/
async getTables() {
try {
const response = await axios.get(
`/api/plugins/${this.contextUuid}/routes/tables`,
{
headers: {
Authorization: this.jwt ? `Bearer ${this.jwt}` : undefined,
},
}
);
return response.data.tables || [];
} catch (error) {
console.error("Error retrieving tables from Neon database:", error);
throw error;
}
}
/**
* Execute a SQL query on the Neon database
* @param {string} query - SQL query to execute
* @param {Array} params - Query parameters (for prepared statements)
* @returns {Promise<Object>} - Query results
*/
async query(query, params = []) {
try {
const response = await axios.post(
`/api/plugins/${this.contextUuid}/routes/query`,
{
query,
params,
},
{
headers: {
Authorization: this.jwt ? `Bearer ${this.jwt}` : undefined,
},
}
);
return response.data;
} catch (error) {
console.error("Error executing query on Neon database:", error);
throw error;
}
}
/**
* Import a table schema from the Neon database to create a Ceramic model
* @param {string} tableName - Name of the table to import
* @returns {Promise<Object>} - Schema definition for the model
*/
async importTableSchema(tableName) {
try {
const response = await axios.post(
`/api/plugins/${this.contextUuid}/routes/import-schema`,
{
tableName,
},
{
headers: {
Authorization: this.jwt ? `Bearer ${this.jwt}` : undefined,
},
}
);
return response.data.schema;
} catch (error) {
console.error("Error importing schema from Neon database:", error);
throw error;
}
}
/**
* Create a new model based on a Neon database table
* @param {string} tableName - Name of the table to create a model for
* @param {string} modelName - Optional custom name for the model
* @returns {Promise<Object>} - Created model information
*/
async createModelFromTable(tableName, modelName = null) {
try {
// First import the table schema
const schema = await this.importTableSchema(tableName);
// If a custom model name is provided, use it
if (modelName) {
schema.name = modelName;
}
// Create a model using the schema
// This would typically interact with the web3db-connector model creation API
const response = await axios.post(
"/api/models",
{
schema,
},
{
headers: {
Authorization: this.jwt ? `Bearer ${this.jwt}` : undefined,
},
}
);
return response.data;
} catch (error) {
console.error("Error creating model from Neon table:", error);
throw error;
}
}
/**
* Test the connection to the Neon database
* @returns {Promise<boolean>} - True if connection is successful
*/
async testConnection() {
try {
await this.query("SELECT 1");
return true;
} catch (error) {
return false;
}
}
}