Full Code Example

A full example of how to use the library

Here's how you can integrate the DB class into a web application using Google Apps Script's doGet function.

function doGet(e) {
  var Template = HtmlService.createTemplateFromFile("index").evaluate().setTitle("Test CRUD WebApp").setFaviconUrl("https://cdn-icons-png.freepik.com/512/9850/9850812.png").addMetaTag('viewport', 'width=device-width, initial-scale=1').setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL);
  return Template;
}

function include(filename) {
  return HtmlService.createHtmlOutputFromFile(filename).getContent();
}

const db = DB.init('testing-DB', YOUR_ID);

const categoryTableConfig = {
  tableName: "CATEGORY",
  historyTableName: "DELETED_CATEGORY",
  fields: {
    name: "string",
    created_at: "date"
  }
}

const productTableConfig = {
  tableName: "PRODUCT",
  historyTableName: "DELETED_PRODUCT",
  fields: {
    name: "string",
    price: "number",
    category_fk: "number",
    created_at: "date"
  }
}

const customerTableConfig = {
  tableName: "CUSTOMER",
  historyTableName: "DELETED_CUSTOMER",
  fields: {
    first_name: "string",
    last_name: "string",
    email: "string",
    address: "string",
    created_at: "date"
  }
}

const orderTableConfig = {
  tableName: "ORDER",
  historyTableName: "DELETED_ORDER",
  fields: {
    customer_fk: "number",
    created_at: "date"
  }
}

function createSchema(){
  console.log(db.createTable(categoryTableConfig));
  console.log(db.createTable(productTableConfig));
  console.log(db.createTable(customerTableConfig));
  console.log(db.createTable(orderTableConfig));
  console.log(db.createTable(orderDetailConfig))
}


console.log(db.putTableIntoDbContext(categoryTableConfig));
console.log(db.putTableIntoDbContext(productTableConfig));
console.log(db.putTableIntoDbContext(customerTableConfig));
console.log(db.putTableIntoDbContext(orderTableConfig));

const responseCreation = db.createManyToManyTableConfig({
  entity1TableName : orderTableConfig.tableName,
  entity2TableName : productTableConfig.tableName,
  fieldsRelatedToBothEntities: {
    quantity: "number"
  }
})


const orderDetailConfig = responseCreation.data;

console.log(db.putTableIntoDbContext(orderDetailConfig));


/**
 * ||=====================================================||
 * ||                   CRUD for CATEGORY                 ||
 * ||=====================================================||
 */

function getCategoryRelatedRecords(foreignKey, field="category_fk", fieldIndex = 4, options={}, useCache=false){
  const response = db.getRelatedRecords(
          foreignKey,
          productTableConfig.tableName,
          field,
          fieldIndex,
          options,
          useCache)
  return JSON.stringify(response);
}

function createCategory(newCategory){
  newCategory.created_at = new Date(newCategory.created_at);
  const response = db.create(
          categoryTableConfig.tableName,
          newCategory,
          Object.keys(categoryTableConfig.fields)
  )

  console.log(response);
  return JSON.stringify(response);
}



function readCategoryTable(){
  const response = db.getAll(
          categoryTableConfig.tableName,
          options={},
          useCache = false
  )
  console.log(response.status)
  console.log(response.message)

  return JSON.stringify(response);
}

function updateCategory(updatedCategory, id){
  // console.log("to update:",updatedCategory)
  // console.log("id",id)
  updatedCategory.created_at = new Date(updatedCategory.created_at);

  const response = db.update(
          categoryTableConfig.tableName,
          id,
          updatedCategory,
          Object.keys(categoryTableConfig.fields)
  )

  console.log(response);

  return JSON.stringify(response);
}

function readCategoryById (id){
  const response = db.read(
          categoryTableConfig.tableName,
          id
  )

  console.log(response)

  return JSON.stringify(response);
}

function removeCategory(id){
  const response = db.remove(
          categoryTableConfig.tableName,
          categoryTableConfig.historyTableName,
          id
  )

  console.log(response);

  return JSON.stringify(response);
}

/**
 * ||=====================================================||
 * ||               CRUD for PRODUCT TABLE                ||
 * ||=====================================================||
 */
function createProduct(newProduct) {
  // Convert dates as needed
  if (newProduct.created_at) {
    newProduct.created_at = new Date(newProduct.created_at);
  }
  const response = db.create(
          productTableConfig.tableName,
          newProduct,
          Object.keys(productTableConfig.fields)
  );
  return JSON.stringify(response);
}

function readProductTable() {
  const response = db.getAll(
          productTableConfig.tableName,
          {},      // options = {}
          false    // useCache = false
  );
  return JSON.stringify(response);
}

function readProductById(id) {
  const response = db.read(productTableConfig.tableName, id);
  return JSON.stringify(response);
}

function updateProduct(updatedProduct, id) {
  if (updatedProduct.created_at) {
    updatedProduct.created_at = new Date(updatedProduct.created_at);
  }
  const response = db.update(
          productTableConfig.tableName,
          id,
          updatedProduct,
          Object.keys(productTableConfig.fields)
  );
  return JSON.stringify(response);
}

function removeProduct(id) {
  const response = db.removeWithCascade(
          productTableConfig.tableName,
          productTableConfig.historyTableName,
          id
  );
  return JSON.stringify(response);
}


/**
 * ||=====================================================||
 * ||              CRUD for CUSTOMER TABLE                ||
 * ||=====================================================||
 */

function getRelatedCustomerRecords(foreignKey, field="customer_fk", fieldIndex= 2,options={}, useCache=false){
  const response = db.getRelatedRecords(
          foreignKey,
          orderTableConfig.tableName,
          field,
          fieldIndex,
          options,
          useCache
  )

  return JSON.stringify(response);
}

function createCustomer(newCustomer) {
  if (newCustomer.created_at) {
    newCustomer.created_at = new Date(newCustomer.created_at);
  }
  const response = db.create(
          customerTableConfig.tableName,
          newCustomer,
          Object.keys(customerTableConfig.fields)
  );
  return JSON.stringify(response);
}

function readCustomerTable() {
  const response = db.getAll(
          customerTableConfig.tableName,
          {},
          false
  );
  return JSON.stringify(response);
}

function readCustomerById(id) {
  const response = db.read(customerTableConfig.tableName, id);
  return JSON.stringify(response);
}

function updateCustomer(updatedCustomer, id) {
  if (updatedCustomer.created_at) {
    updatedCustomer.created_at = new Date(updatedCustomer.created_at);
  }
  const response = db.update(
          customerTableConfig.tableName,
          id,
          updatedCustomer,
          Object.keys(customerTableConfig.fields)
  );
  return JSON.stringify(response);
}

function removeCustomer(id) {
  const response = db.remove(
          customerTableConfig.tableName,
          customerTableConfig.historyTableName,
          id
  );
  return JSON.stringify(response);
}


/**
 * ||=====================================================||
 * ||                 CRUD for ORDER TABLE                ||
 * ||=====================================================||
 */
function createOrder(newOrder) {
  if (newOrder.created_at) {
    newOrder.created_at = new Date(newOrder.created_at);
  }
  const response = db.create(
          orderTableConfig.tableName,
          newOrder,
          Object.keys(orderTableConfig.fields)
  );
  return JSON.stringify(response);
}

function readOrderTable() {
  const response = db.getAll(orderTableConfig.tableName, {}, false);
  return JSON.stringify(response);
}

function readOrderById(id) {
  const response = db.read(orderTableConfig.tableName, id);
  return JSON.stringify(response);
}

function updateOrder(updatedOrder, id) {
  if (updatedOrder.created_at) {
    updatedOrder.created_at = new Date(updatedOrder.created_at);
  }
  const response = db.update(
          orderTableConfig.tableName,
          id,
          updatedOrder,
          Object.keys(orderTableConfig.fields)
  );
  return JSON.stringify(response);
}

function removeOrder(id) {
  const response = db.removeWithCascade(
          orderTableConfig.tableName,
          orderTableConfig.historyTableName,
          id
  );
  return JSON.stringify(response);
}


/**
 * ||=====================================================||
 * ||         CRUD for ORDER_DETAIL (Many-to-Many)        ||
 * ||=====================================================||
 * The 'orderDetailConfig' object was generated via:
 * const responseCreation = db.createManyToManyTableConfig({ ... });
 * const orderDetailConfig = responseCreation.data;
 */
function createOrderDetail(newOrderDetail) {
  if (newOrderDetail.created_at) {
    newOrderDetail.created_at = new Date(newOrderDetail.created_at);
  }
  // orderDetailConfig.fields => { created_at, order_id, product_id, quantity, ... }
  const response = db.create(
          orderDetailConfig.tableName,
          newOrderDetail,
          Object.keys(orderDetailConfig.fields)
  );
  return JSON.stringify(response);
}

function readOrderDetailTable() {
  const response = db.getAll(orderDetailConfig.tableName, {}, false);
  return JSON.stringify(response);
}

function readOrderDetailById(id) {
  const response = db.read(orderDetailConfig.tableName, id);
  return JSON.stringify(response);
}

function updateOrderDetail(updatedOrderDetail, id) {
  if (updatedOrderDetail.created_at) {
    updatedOrderDetail.created_at = new Date(updatedOrderDetail.created_at);
  }
  const response = db.update(
          orderDetailConfig.tableName,
          id,
          updatedOrderDetail,
          Object.keys(orderDetailConfig.fields)
  );
  return JSON.stringify(response);
}

function removeOrderDetail(id) {
  const response = db.remove(
          orderDetailConfig.tableName,
          orderDetailConfig.historyTableName,
          id
  );
  return JSON.stringify(response);
}

function readOrderDetailFromOrder(sourceId){
  const response = db.getJunctionRecords(
          orderDetailConfig.tableName,
          orderTableConfig.tableName,
          productTableConfig.tableName,
          sourceId,
          options = {}
  )

  console.log(response.status);
  console.log(response.message);
  console.log(response.metadata);

  for (record of response.data){
    console.log(record);
  }

  return JSON.stringify(response);
}

function readOrderDetailFromProduct(sourceId){
  const response = db.getJunctionRecords(
          orderDetailConfig.tableName,
          productTableConfig.tableName,
          orderTableConfig.tableName,
          sourceId,
          options = {}
  )

  console.log(response.status);
  console.log(response.message);
  console.log(response.metadata);

  for (record of response.data){
    console.log(record);
  }

  return JSON.stringify(response);
}