0.1.3Updated 6 months ago
import { DataTypeQuery } from "@infinity-beyond/classes/query.ts";

interface UpdatedEntry {
  id: number
  remaining: number
  deducted: number
}
interface ConsumptionResponse {
  updated_entries: UpdatedEntry[]
  new_entry_id: number
  new_user_balance: number
}

interface ConsumptionResponseSuccess {
  updated_entries: UpdatedEntry[]
  new_entry_id: number
  new_user_balance: number
  error_message: null
}

interface ConsumptionResponseFailure {
  updated_entries: null
  new_entry_id: null
  new_user_balance: null
  error_message: string
}

export type ConsumptionResponseMapped = ConsumptionResponseSuccess | ConsumptionResponseFailure

export const ConsumeFromLedger = new DataTypeQuery<
  [
    /* $1  */ p_key: string,
    /* $2  */ p_amount: number,
    /* $3  */ p_source: string,
    /* $4  */ p_reference: string | undefined,
    /* $5  */ p_description: string | undefined,
    /* $6  */ p_request_id: string | undefined,
  ], {
    slug: string
  }, ConsumptionResponseMapped
>(
  `SELECT * FROM {slug}_process_consumption($1, $2, $3, $4, $5, $6)`,
  (rows: ConsumptionResponse[]) => rows.map(row => {
    return {
      new_entry_id: row.new_entry_id,
      updated_entries: row.updated_entries,
      new_user_balance: row.new_user_balance,
    } as ConsumptionResponseMapped;
  })
);