XYOracleNetwork/sdk-archivist-nodejs

View on GitHub
src/repository/dynamodb/table/table.ts

Summary

Maintainability
A
1 hr
Test Coverage
/* eslint-disable require-await */
/*
 * File: main-table.ts
 * Project: @xyo-network/sdk-archivist-nodejs
 * File Created: Tuesday, 23rd April 2019 8:14:51 am
 * Author: XYO Development Team (support@xyo.network)
 * -----
 * Last Modified: Friday, 13th November 2020 2:55:01 pm
 * Modified By: XYO Development Team (support@xyo.network>)
 * -----
 * Copyright 2017 - 2019 XY - The Persistent Company
 */

import { XyoBase } from '@xyo-network/sdk-base-nodejs'
import { DynamoDB } from 'aws-sdk'

export class Table extends XyoBase {
  protected createTableInput?: DynamoDB.Types.CreateTableInput
  protected dynamodb: DynamoDB
  private tableInfo: any

  constructor(protected readonly tableName: string, region = 'us-east-1') {
    super()
    this.dynamodb = new DynamoDB({
      region,
    })
  }

  public async initialize() {
    this.tableInfo = await this.getTableInfo()
    return true
  }

  public async getRecordCount() {
    const description = await this.readTableDescription()
    return description.ItemCount
  }

  protected async readTableDescription(): Promise<DynamoDB.Types.TableDescription> {
    return new Promise((resolve, reject) => {
      try {
        this.dynamodb.describeTable(
          { TableName: this.tableName },
          (
            describeErr: any,
            describeData: DynamoDB.Types.DescribeTableOutput
          ) => {
            if (describeErr) {
              reject(describeErr)
              return
            }
            if (describeData.Table) {
              resolve(describeData.Table)
            } else {
              reject()
            }
          }
        )
      } catch (ex) {
        this.logError(ex)
        reject(ex)
      }
    })
  }

  private async createTable() {
    return new Promise((resolve, reject) => {
      try {
        if (this.createTableInput) {
          this.dynamodb.createTable(
            this.createTableInput,
            (createErr: any, tableData: DynamoDB.Types.CreateTableOutput) => {
              if (createErr) {
                this.logError(createErr)
                reject(createErr)
                return
              }
              resolve(tableData)
            }
          )
        } else {
          reject('createTableInput Required')
        }
      } catch (ex) {
        this.logError(ex)
        reject(ex)
      }
    })
  }

  private async createTableIfNeeded() {
    return new Promise((resolve, reject) => {
      try {
        this.dynamodb.listTables(async (listErr, listData) => {
          if (listErr) {
            reject(listErr)
            return
          }
          let found = false
          if (listData.TableNames) {
            for (const table of listData.TableNames) {
              if (table === this.tableName) {
                found = true
              }
            }
          }
          if (!found) {
            resolve(await this.createTable())
          } else {
            resolve(await this.readTableDescription())
          }
        })
      } catch (ex) {
        this.logError(ex)
        reject(ex)
      }
    })
  }

  private async getTableInfo() {
    if (!this.tableInfo) {
      this.tableInfo = await this.createTableIfNeeded()
    }
    return this.tableInfo
  }
}