feat: typesafe query and more UI changes
This commit is contained in:
parent
d73bb88f1d
commit
64e358f61c
13 changed files with 1347 additions and 109 deletions
159
packages/typesafe-db/src/customers.ts
Normal file
159
packages/typesafe-db/src/customers.ts
Normal file
|
|
@ -0,0 +1,159 @@
|
|||
import db from './db.js'
|
||||
import { ExpressionBuilder, sql } from 'kysely'
|
||||
import { Customers, DB } from './types/types.js'
|
||||
import { jsonObjectFrom } from 'kysely/helpers/postgres'
|
||||
|
||||
type CustomerEB = ExpressionBuilder<DB & { c: Customers }, 'c'>
|
||||
|
||||
const TX_PASSTHROUGH_ERROR_CODES = [
|
||||
'operatorCancel',
|
||||
'scoreThresholdReached',
|
||||
'walletScoringError',
|
||||
]
|
||||
|
||||
function transactionUnion(eb: CustomerEB) {
|
||||
return eb
|
||||
.selectFrom('cashInTxs')
|
||||
.select([
|
||||
'created',
|
||||
'fiat',
|
||||
'fiatCode',
|
||||
'errorCode',
|
||||
eb.val('cashIn').as('txClass'),
|
||||
])
|
||||
.where(({ eb, and, or, ref }) =>
|
||||
and([
|
||||
eb('customerId', '=', ref('c.id')),
|
||||
or([eb('sendConfirmed', '=', true), eb('batched', '=', true)]),
|
||||
]),
|
||||
)
|
||||
.unionAll(
|
||||
eb
|
||||
.selectFrom('cashOutTxs')
|
||||
.select([
|
||||
'created',
|
||||
'fiat',
|
||||
'fiatCode',
|
||||
'errorCode',
|
||||
eb.val('cashOut').as('txClass'),
|
||||
])
|
||||
.where(({ eb, and, ref }) =>
|
||||
and([
|
||||
eb('customerId', '=', ref('c.id')),
|
||||
eb('confirmedAt', 'is not', null),
|
||||
]),
|
||||
),
|
||||
)
|
||||
}
|
||||
|
||||
function joinLatestTx(eb: CustomerEB) {
|
||||
return eb
|
||||
.selectFrom(eb =>
|
||||
transactionUnion(eb).orderBy('created', 'desc').limit(1).as('lastTx'),
|
||||
)
|
||||
.select(['fiatCode', 'fiat', 'txClass', 'created'])
|
||||
.as('lastTx')
|
||||
}
|
||||
|
||||
function joinTxsTotals(eb: CustomerEB) {
|
||||
return eb
|
||||
.selectFrom(eb => transactionUnion(eb).as('combinedTxs'))
|
||||
.select([
|
||||
eb => eb.fn.coalesce(eb.fn.countAll(), eb.val(0)).as('totalTxs'),
|
||||
eb =>
|
||||
eb.fn
|
||||
.coalesce(
|
||||
eb.fn.sum(
|
||||
eb
|
||||
.case()
|
||||
.when(
|
||||
eb.or([
|
||||
eb('combinedTxs.errorCode', 'is', null),
|
||||
eb(
|
||||
'combinedTxs.errorCode',
|
||||
'not in',
|
||||
TX_PASSTHROUGH_ERROR_CODES,
|
||||
),
|
||||
]),
|
||||
)
|
||||
.then(eb.ref('combinedTxs.fiat'))
|
||||
.else(0)
|
||||
.end(),
|
||||
),
|
||||
eb.val(0),
|
||||
)
|
||||
.as('totalSpent'),
|
||||
])
|
||||
.as('txStats')
|
||||
}
|
||||
|
||||
interface GetCustomerListOptions {
|
||||
withCustomInfoRequest: boolean
|
||||
}
|
||||
|
||||
const defaultOptions: GetCustomerListOptions = {
|
||||
withCustomInfoRequest: false,
|
||||
}
|
||||
|
||||
// TODO left join lateral is having issues deriving type
|
||||
function getCustomerList(
|
||||
options: GetCustomerListOptions = defaultOptions,
|
||||
): Promise<any[]> {
|
||||
return db
|
||||
.selectFrom('customers as c')
|
||||
.leftJoinLateral(joinTxsTotals, join => join.onTrue())
|
||||
.leftJoinLateral(joinLatestTx, join => join.onTrue())
|
||||
.select(({ eb, fn, val, ref }) => [
|
||||
'id',
|
||||
'authorizedOverride',
|
||||
'frontCameraPath',
|
||||
'frontCameraOverride',
|
||||
'idCardPhotoPath',
|
||||
'idCardPhotoOverride',
|
||||
'idCardData',
|
||||
'idCardDataOverride',
|
||||
'email',
|
||||
'usSsn',
|
||||
'usSsnOverride',
|
||||
'sanctions',
|
||||
'sanctionsOverride',
|
||||
'txStats.totalSpent',
|
||||
'txStats.totalTxs',
|
||||
ref('lastTx.fiatCode').as('lastTxFiatCode'),
|
||||
ref('lastTx.fiat').as('lastTxFiat'),
|
||||
ref('lastTx.txClass').as('lastTxClass'),
|
||||
fn<Date>('GREATEST', [
|
||||
'c.created',
|
||||
// 'lastTx.created',
|
||||
'c.phoneAt',
|
||||
'c.emailAt',
|
||||
'c.idCardDataAt',
|
||||
'c.frontCameraAt',
|
||||
'c.idCardPhotoAt',
|
||||
'c.usSsnAt',
|
||||
'c.lastAuthAttempt',
|
||||
]).as('lastActive'),
|
||||
eb('c.suspendedUntil', '>', fn<Date>('NOW', [])).as('isSuspended'),
|
||||
fn<number>('GREATEST', [
|
||||
val(0),
|
||||
fn<number>('date_part', [
|
||||
val('day'),
|
||||
eb('c.suspendedUntil', '-', fn<Date>('NOW', [])),
|
||||
]),
|
||||
]).as('daysSuspended'),
|
||||
])
|
||||
.$if(options.withCustomInfoRequest, qb =>
|
||||
qb.select(({ eb, ref }) =>
|
||||
jsonObjectFrom(
|
||||
eb
|
||||
.selectFrom('customersCustomInfoRequests')
|
||||
.selectAll()
|
||||
.where('customerId', '=', ref('c.id')),
|
||||
).as('customInfoRequestData'),
|
||||
),
|
||||
)
|
||||
.orderBy('lastActive', 'desc')
|
||||
.execute()
|
||||
}
|
||||
|
||||
export { getCustomerList }
|
||||
24
packages/typesafe-db/src/db.ts
Normal file
24
packages/typesafe-db/src/db.ts
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
import { DB } from './types/types.js'
|
||||
import { Pool } from 'pg'
|
||||
import { Kysely, PostgresDialect, CamelCasePlugin } from 'kysely'
|
||||
import { PSQL_URL } from 'lamassu-server/lib/constants.js'
|
||||
|
||||
const dialect = new PostgresDialect({
|
||||
pool: new Pool({
|
||||
connectionString: PSQL_URL,
|
||||
max: 5,
|
||||
}),
|
||||
})
|
||||
|
||||
export default new Kysely<DB>({
|
||||
dialect,
|
||||
plugins: [new CamelCasePlugin()],
|
||||
log(event) {
|
||||
if (event.level === 'query') {
|
||||
console.log('Query:', event.query.sql)
|
||||
console.log('Parameters:', event.query.parameters)
|
||||
console.log('Duration:', event.queryDurationMillis + 'ms')
|
||||
console.log('---')
|
||||
}
|
||||
},
|
||||
})
|
||||
745
packages/typesafe-db/src/types/types.d.ts
vendored
Normal file
745
packages/typesafe-db/src/types/types.d.ts
vendored
Normal file
|
|
@ -0,0 +1,745 @@
|
|||
/**
|
||||
* This file was generated by kysely-codegen.
|
||||
* Please do not edit it manually.
|
||||
*/
|
||||
|
||||
import type { ColumnType } from 'kysely'
|
||||
|
||||
export type AuthTokenType = 'reset_password' | 'reset_twofa'
|
||||
|
||||
export type CashUnit =
|
||||
| 'cashbox'
|
||||
| 'cassette1'
|
||||
| 'cassette2'
|
||||
| 'cassette3'
|
||||
| 'cassette4'
|
||||
| 'recycler1'
|
||||
| 'recycler2'
|
||||
| 'recycler3'
|
||||
| 'recycler4'
|
||||
| 'recycler5'
|
||||
| 'recycler6'
|
||||
|
||||
export type CashUnitOperationType =
|
||||
| 'cash-box-empty'
|
||||
| 'cash-box-refill'
|
||||
| 'cash-cassette-1-count-change'
|
||||
| 'cash-cassette-1-empty'
|
||||
| 'cash-cassette-1-refill'
|
||||
| 'cash-cassette-2-count-change'
|
||||
| 'cash-cassette-2-empty'
|
||||
| 'cash-cassette-2-refill'
|
||||
| 'cash-cassette-3-count-change'
|
||||
| 'cash-cassette-3-empty'
|
||||
| 'cash-cassette-3-refill'
|
||||
| 'cash-cassette-4-count-change'
|
||||
| 'cash-cassette-4-empty'
|
||||
| 'cash-cassette-4-refill'
|
||||
| 'cash-recycler-1-count-change'
|
||||
| 'cash-recycler-1-empty'
|
||||
| 'cash-recycler-1-refill'
|
||||
| 'cash-recycler-2-count-change'
|
||||
| 'cash-recycler-2-empty'
|
||||
| 'cash-recycler-2-refill'
|
||||
| 'cash-recycler-3-count-change'
|
||||
| 'cash-recycler-3-empty'
|
||||
| 'cash-recycler-3-refill'
|
||||
| 'cash-recycler-4-count-change'
|
||||
| 'cash-recycler-4-empty'
|
||||
| 'cash-recycler-4-refill'
|
||||
| 'cash-recycler-5-count-change'
|
||||
| 'cash-recycler-5-empty'
|
||||
| 'cash-recycler-5-refill'
|
||||
| 'cash-recycler-6-count-change'
|
||||
| 'cash-recycler-6-empty'
|
||||
| 'cash-recycler-6-refill'
|
||||
|
||||
export type ComplianceType =
|
||||
| 'authorized'
|
||||
| 'front_camera'
|
||||
| 'hard_limit'
|
||||
| 'id_card_data'
|
||||
| 'id_card_photo'
|
||||
| 'sanctions'
|
||||
| 'sms'
|
||||
| 'us_ssn'
|
||||
|
||||
export type DiscountSource = 'individualDiscount' | 'promoCode'
|
||||
|
||||
export type ExternalComplianceStatus =
|
||||
| 'APPROVED'
|
||||
| 'PENDING'
|
||||
| 'REJECTED'
|
||||
| 'RETRY'
|
||||
|
||||
export type Generated<T> =
|
||||
T extends ColumnType<infer S, infer I, infer U>
|
||||
? ColumnType<S, I | undefined, U>
|
||||
: ColumnType<T, T | undefined, T>
|
||||
|
||||
export type Int8 = ColumnType<
|
||||
string,
|
||||
bigint | number | string,
|
||||
bigint | number | string
|
||||
>
|
||||
|
||||
export type Json = JsonValue
|
||||
|
||||
export type JsonArray = JsonValue[]
|
||||
|
||||
export type JsonObject = {
|
||||
[x: string]: JsonValue | undefined
|
||||
}
|
||||
|
||||
export type JsonPrimitive = boolean | number | string | null
|
||||
|
||||
export type JsonValue = JsonArray | JsonObject | JsonPrimitive
|
||||
|
||||
export type NotificationType =
|
||||
| 'compliance'
|
||||
| 'cryptoBalance'
|
||||
| 'error'
|
||||
| 'fiatBalance'
|
||||
| 'highValueTransaction'
|
||||
| 'security'
|
||||
| 'transaction'
|
||||
|
||||
export type Numeric = ColumnType<string, number | string, number | string>
|
||||
|
||||
export type Role = 'superuser' | 'user'
|
||||
|
||||
export type SmsNoticeEvent =
|
||||
| 'cash_out_dispense_ready'
|
||||
| 'sms_code'
|
||||
| 'sms_receipt'
|
||||
|
||||
export type StatusStage =
|
||||
| 'authorized'
|
||||
| 'confirmed'
|
||||
| 'instant'
|
||||
| 'insufficientFunds'
|
||||
| 'notSeen'
|
||||
| 'published'
|
||||
| 'rejected'
|
||||
|
||||
export type Timestamp = ColumnType<Date, Date | string, Date | string>
|
||||
|
||||
export type TradeType = 'buy' | 'sell'
|
||||
|
||||
export type TransactionBatchStatus = 'failed' | 'open' | 'ready' | 'sent'
|
||||
|
||||
export type VerificationType = 'automatic' | 'blocked' | 'verified'
|
||||
|
||||
export interface AuthTokens {
|
||||
expire: Generated<Timestamp>
|
||||
token: string
|
||||
type: AuthTokenType
|
||||
userId: string | null
|
||||
}
|
||||
|
||||
export interface Bills {
|
||||
cashboxBatchId: string | null
|
||||
cashInFee: Numeric
|
||||
cashInTxsId: string
|
||||
created: Generated<Timestamp>
|
||||
cryptoCode: Generated<string | null>
|
||||
destinationUnit: Generated<CashUnit>
|
||||
deviceTime: Int8
|
||||
fiat: number
|
||||
fiatCode: string
|
||||
id: string
|
||||
legacy: Generated<boolean | null>
|
||||
}
|
||||
|
||||
export interface Blacklist {
|
||||
address: string
|
||||
blacklistMessageId: Generated<string>
|
||||
}
|
||||
|
||||
export interface BlacklistMessages {
|
||||
allowToggle: Generated<boolean>
|
||||
content: string
|
||||
id: string
|
||||
label: string
|
||||
}
|
||||
|
||||
export interface CashInActions {
|
||||
action: string
|
||||
created: Generated<Timestamp>
|
||||
error: string | null
|
||||
errorCode: string | null
|
||||
id: Generated<number>
|
||||
txHash: string | null
|
||||
txId: string
|
||||
}
|
||||
|
||||
export interface CashInTxs {
|
||||
batched: Generated<boolean>
|
||||
batchId: string | null
|
||||
batchTime: Timestamp | null
|
||||
cashInFee: Numeric
|
||||
commissionPercentage: Generated<Numeric | null>
|
||||
created: Generated<Timestamp>
|
||||
cryptoAtoms: Numeric
|
||||
cryptoCode: string
|
||||
customerId: Generated<string | null>
|
||||
deviceId: string
|
||||
discount: number | null
|
||||
discountSource: DiscountSource | null
|
||||
email: string | null
|
||||
error: string | null
|
||||
errorCode: string | null
|
||||
fee: Int8 | null
|
||||
fiat: Numeric
|
||||
fiatCode: string
|
||||
id: string
|
||||
isPaperWallet: Generated<boolean | null>
|
||||
minimumTx: number
|
||||
operatorCompleted: Generated<boolean>
|
||||
phone: string | null
|
||||
rawTickerPrice: Generated<Numeric | null>
|
||||
send: Generated<boolean>
|
||||
sendConfirmed: Generated<boolean>
|
||||
sendPending: Generated<boolean>
|
||||
sendTime: Timestamp | null
|
||||
termsAccepted: Generated<boolean>
|
||||
timedout: Generated<boolean>
|
||||
toAddress: string
|
||||
txCustomerPhotoAt: Timestamp | null
|
||||
txCustomerPhotoPath: string | null
|
||||
txHash: string | null
|
||||
txVersion: number
|
||||
walletScore: number | null
|
||||
}
|
||||
|
||||
export interface CashinTxTrades {
|
||||
tradeId: Generated<number>
|
||||
txId: string
|
||||
}
|
||||
|
||||
export interface CashOutActions {
|
||||
action: string
|
||||
created: Generated<Timestamp>
|
||||
denomination1: number | null
|
||||
denomination2: number | null
|
||||
denomination3: number | null
|
||||
denomination4: number | null
|
||||
denominationRecycler1: number | null
|
||||
denominationRecycler2: number | null
|
||||
denominationRecycler3: number | null
|
||||
denominationRecycler4: number | null
|
||||
denominationRecycler5: number | null
|
||||
denominationRecycler6: number | null
|
||||
deviceId: Generated<string>
|
||||
deviceTime: Int8 | null
|
||||
dispensed1: number | null
|
||||
dispensed2: number | null
|
||||
dispensed3: number | null
|
||||
dispensed4: number | null
|
||||
dispensedRecycler1: number | null
|
||||
dispensedRecycler2: number | null
|
||||
dispensedRecycler3: number | null
|
||||
dispensedRecycler4: number | null
|
||||
dispensedRecycler5: number | null
|
||||
dispensedRecycler6: number | null
|
||||
error: string | null
|
||||
errorCode: string | null
|
||||
id: Generated<number>
|
||||
layer2Address: string | null
|
||||
provisioned1: number | null
|
||||
provisioned2: number | null
|
||||
provisioned3: number | null
|
||||
provisioned4: number | null
|
||||
provisionedRecycler1: number | null
|
||||
provisionedRecycler2: number | null
|
||||
provisionedRecycler3: number | null
|
||||
provisionedRecycler4: number | null
|
||||
provisionedRecycler5: number | null
|
||||
provisionedRecycler6: number | null
|
||||
redeem: Generated<boolean>
|
||||
rejected1: number | null
|
||||
rejected2: number | null
|
||||
rejected3: number | null
|
||||
rejected4: number | null
|
||||
rejectedRecycler1: number | null
|
||||
rejectedRecycler2: number | null
|
||||
rejectedRecycler3: number | null
|
||||
rejectedRecycler4: number | null
|
||||
rejectedRecycler5: number | null
|
||||
rejectedRecycler6: number | null
|
||||
toAddress: string | null
|
||||
txHash: string | null
|
||||
txId: string
|
||||
}
|
||||
|
||||
export interface CashOutTxs {
|
||||
commissionPercentage: Generated<Numeric | null>
|
||||
confirmedAt: Timestamp | null
|
||||
created: Generated<Timestamp>
|
||||
cryptoAtoms: Numeric
|
||||
cryptoCode: string
|
||||
customerId: Generated<string | null>
|
||||
denomination1: number | null
|
||||
denomination2: number | null
|
||||
denomination3: number | null
|
||||
denomination4: number | null
|
||||
denominationRecycler1: number | null
|
||||
denominationRecycler2: number | null
|
||||
denominationRecycler3: number | null
|
||||
denominationRecycler4: number | null
|
||||
denominationRecycler5: number | null
|
||||
denominationRecycler6: number | null
|
||||
deviceId: string
|
||||
discount: number | null
|
||||
discountSource: DiscountSource | null
|
||||
dispense: Generated<boolean>
|
||||
dispenseConfirmed: Generated<boolean | null>
|
||||
email: string | null
|
||||
error: string | null
|
||||
errorCode: string | null
|
||||
fiat: Numeric
|
||||
fiatCode: string
|
||||
fixedFee: Generated<Numeric>
|
||||
hdIndex: Generated<number | null>
|
||||
id: string
|
||||
layer2Address: string | null
|
||||
notified: Generated<boolean>
|
||||
phone: string | null
|
||||
provisioned1: number | null
|
||||
provisioned2: number | null
|
||||
provisioned3: number | null
|
||||
provisioned4: number | null
|
||||
provisionedRecycler1: number | null
|
||||
provisionedRecycler2: number | null
|
||||
provisionedRecycler3: number | null
|
||||
provisionedRecycler4: number | null
|
||||
provisionedRecycler5: number | null
|
||||
provisionedRecycler6: number | null
|
||||
publishedAt: Timestamp | null
|
||||
rawTickerPrice: Generated<Numeric | null>
|
||||
receivedCryptoAtoms: Generated<Numeric | null>
|
||||
redeem: Generated<boolean>
|
||||
status: Generated<StatusStage>
|
||||
swept: Generated<boolean>
|
||||
termsAccepted: Generated<boolean>
|
||||
timedout: Generated<boolean>
|
||||
toAddress: string
|
||||
txCustomerPhotoAt: Timestamp | null
|
||||
txCustomerPhotoPath: string | null
|
||||
txVersion: number
|
||||
walletScore: number | null
|
||||
}
|
||||
|
||||
export interface CashoutTxTrades {
|
||||
tradeId: Generated<number>
|
||||
txId: string
|
||||
}
|
||||
|
||||
export interface CashUnitOperation {
|
||||
billCountOverride: number | null
|
||||
created: Generated<Timestamp>
|
||||
deviceId: string | null
|
||||
id: string
|
||||
operationType: CashUnitOperationType
|
||||
performedBy: string | null
|
||||
}
|
||||
|
||||
export interface ComplianceOverrides {
|
||||
complianceType: ComplianceType
|
||||
customerId: string | null
|
||||
id: string
|
||||
overrideAt: Timestamp
|
||||
overrideBy: string | null
|
||||
verification: VerificationType
|
||||
}
|
||||
|
||||
export interface Coupons {
|
||||
code: string
|
||||
discount: number
|
||||
id: string
|
||||
softDeleted: Generated<boolean | null>
|
||||
}
|
||||
|
||||
export interface CustomerCustomFieldPairs {
|
||||
customerId: string
|
||||
customFieldId: string
|
||||
value: string
|
||||
}
|
||||
|
||||
export interface CustomerExternalCompliance {
|
||||
customerId: string
|
||||
externalId: string
|
||||
lastKnownStatus: ExternalComplianceStatus | null
|
||||
lastUpdated: Generated<Timestamp>
|
||||
service: string
|
||||
}
|
||||
|
||||
export interface CustomerNotes {
|
||||
content: Generated<string>
|
||||
created: Generated<Timestamp>
|
||||
customerId: string
|
||||
id: string
|
||||
lastEditedAt: Timestamp | null
|
||||
lastEditedBy: string | null
|
||||
title: Generated<string>
|
||||
}
|
||||
|
||||
export interface Customers {
|
||||
address: string | null
|
||||
authorizedAt: Timestamp | null
|
||||
authorizedOverride: Generated<VerificationType>
|
||||
authorizedOverrideAt: Timestamp | null
|
||||
authorizedOverrideBy: string | null
|
||||
created: Generated<Timestamp>
|
||||
email: string | null
|
||||
emailAt: Timestamp | null
|
||||
frontCameraAt: Timestamp | null
|
||||
frontCameraOverride: Generated<VerificationType>
|
||||
frontCameraOverrideAt: Timestamp | null
|
||||
frontCameraOverrideBy: string | null
|
||||
frontCameraPath: string | null
|
||||
id: string
|
||||
idCardData: Json | null
|
||||
idCardDataAt: Timestamp | null
|
||||
idCardDataExpiration: Timestamp | null
|
||||
idCardDataNumber: string | null
|
||||
idCardDataOverride: Generated<VerificationType>
|
||||
idCardDataOverrideAt: Timestamp | null
|
||||
idCardDataOverrideBy: string | null
|
||||
idCardDataRaw: string | null
|
||||
idCardPhotoAt: Timestamp | null
|
||||
idCardPhotoOverride: Generated<VerificationType>
|
||||
idCardPhotoOverrideAt: Timestamp | null
|
||||
idCardPhotoOverrideBy: string | null
|
||||
idCardPhotoPath: string | null
|
||||
isTestCustomer: Generated<boolean>
|
||||
lastAuthAttempt: Timestamp | null
|
||||
lastUsedMachine: string | null
|
||||
name: string | null
|
||||
phone: string | null
|
||||
phoneAt: Timestamp | null
|
||||
phoneOverride: Generated<VerificationType>
|
||||
phoneOverrideAt: Timestamp | null
|
||||
phoneOverrideBy: string | null
|
||||
sanctions: boolean | null
|
||||
sanctionsAt: Timestamp | null
|
||||
sanctionsOverride: Generated<VerificationType>
|
||||
sanctionsOverrideAt: Timestamp | null
|
||||
sanctionsOverrideBy: string | null
|
||||
smsOverride: Generated<VerificationType>
|
||||
smsOverrideAt: Timestamp | null
|
||||
smsOverrideBy: string | null
|
||||
subscriberInfo: Json | null
|
||||
subscriberInfoAt: Timestamp | null
|
||||
subscriberInfoBy: string | null
|
||||
suspendedUntil: Timestamp | null
|
||||
usSsn: string | null
|
||||
usSsnAt: Timestamp | null
|
||||
usSsnOverride: Generated<VerificationType>
|
||||
usSsnOverrideAt: Timestamp | null
|
||||
usSsnOverrideBy: string | null
|
||||
}
|
||||
|
||||
export interface CustomersCustomInfoRequests {
|
||||
customerData: Json
|
||||
customerId: string
|
||||
infoRequestId: string
|
||||
override: Generated<VerificationType>
|
||||
overrideAt: Timestamp | null
|
||||
overrideBy: string | null
|
||||
}
|
||||
|
||||
export interface CustomFieldDefinitions {
|
||||
active: Generated<boolean | null>
|
||||
id: string
|
||||
label: string
|
||||
}
|
||||
|
||||
export interface CustomInfoRequests {
|
||||
customRequest: Json | null
|
||||
enabled: Generated<boolean>
|
||||
id: string
|
||||
}
|
||||
|
||||
export interface Devices {
|
||||
cassette1: Generated<number>
|
||||
cassette2: Generated<number>
|
||||
cassette3: Generated<number>
|
||||
cassette4: Generated<number>
|
||||
created: Generated<Timestamp>
|
||||
deviceId: string
|
||||
diagnosticsFrontUpdatedAt: Timestamp | null
|
||||
diagnosticsScanUpdatedAt: Timestamp | null
|
||||
diagnosticsTimestamp: Timestamp | null
|
||||
display: Generated<boolean>
|
||||
lastOnline: Generated<Timestamp>
|
||||
location: Generated<Json>
|
||||
model: string | null
|
||||
name: string
|
||||
numberOfCassettes: Generated<number>
|
||||
numberOfRecyclers: Generated<number>
|
||||
paired: Generated<boolean>
|
||||
recycler1: Generated<number>
|
||||
recycler2: Generated<number>
|
||||
recycler3: Generated<number>
|
||||
recycler4: Generated<number>
|
||||
recycler5: Generated<number>
|
||||
recycler6: Generated<number>
|
||||
userConfigId: number | null
|
||||
version: string | null
|
||||
}
|
||||
|
||||
export interface EditedCustomerData {
|
||||
created: Generated<Timestamp>
|
||||
customerId: string
|
||||
frontCameraAt: Timestamp | null
|
||||
frontCameraBy: string | null
|
||||
frontCameraPath: string | null
|
||||
idCardData: Json | null
|
||||
idCardDataAt: Timestamp | null
|
||||
idCardDataBy: string | null
|
||||
idCardPhotoAt: Timestamp | null
|
||||
idCardPhotoBy: string | null
|
||||
idCardPhotoPath: string | null
|
||||
name: string | null
|
||||
nameAt: Timestamp | null
|
||||
nameBy: string | null
|
||||
subscriberInfo: Json | null
|
||||
subscriberInfoAt: Timestamp | null
|
||||
subscriberInfoBy: string | null
|
||||
usSsn: string | null
|
||||
usSsnAt: Timestamp | null
|
||||
usSsnBy: string | null
|
||||
}
|
||||
|
||||
export interface EmptyUnitBills {
|
||||
cashboxBatchId: string | null
|
||||
created: Generated<Timestamp>
|
||||
deviceId: string
|
||||
fiat: number
|
||||
fiatCode: string
|
||||
id: string
|
||||
}
|
||||
|
||||
export interface HardwareCredentials {
|
||||
created: Generated<Timestamp | null>
|
||||
data: Json
|
||||
id: string
|
||||
lastUsed: Generated<Timestamp | null>
|
||||
userId: string
|
||||
}
|
||||
|
||||
export interface IndividualDiscounts {
|
||||
customerId: string
|
||||
discount: number
|
||||
id: string
|
||||
softDeleted: Generated<boolean | null>
|
||||
}
|
||||
|
||||
export interface Logs {
|
||||
deviceId: string | null
|
||||
id: string
|
||||
logLevel: string | null
|
||||
message: string | null
|
||||
serial: Generated<number>
|
||||
serverTimestamp: Generated<Timestamp>
|
||||
timestamp: Timestamp | null
|
||||
}
|
||||
|
||||
export interface MachineEvents {
|
||||
created: Generated<Timestamp>
|
||||
deviceId: string
|
||||
deviceTime: Timestamp | null
|
||||
eventType: string
|
||||
id: string
|
||||
note: string | null
|
||||
}
|
||||
|
||||
export interface MachineNetworkHeartbeat {
|
||||
averagePacketLoss: Numeric
|
||||
averageResponseTime: Numeric
|
||||
created: Generated<Timestamp>
|
||||
deviceId: string
|
||||
id: string
|
||||
}
|
||||
|
||||
export interface MachineNetworkPerformance {
|
||||
created: Generated<Timestamp>
|
||||
deviceId: string
|
||||
downloadSpeed: Numeric
|
||||
}
|
||||
|
||||
export interface MachinePings {
|
||||
deviceId: string
|
||||
deviceTime: Timestamp
|
||||
updated: Generated<Timestamp>
|
||||
}
|
||||
|
||||
export interface Migrations {
|
||||
data: Json
|
||||
id: Generated<number>
|
||||
}
|
||||
|
||||
export interface Notifications {
|
||||
created: Generated<Timestamp>
|
||||
detail: Json | null
|
||||
id: string
|
||||
message: string
|
||||
read: Generated<boolean>
|
||||
type: NotificationType
|
||||
valid: Generated<boolean>
|
||||
}
|
||||
|
||||
export interface OperatorIds {
|
||||
id: Generated<number>
|
||||
operatorId: string
|
||||
service: string
|
||||
}
|
||||
|
||||
export interface PairingTokens {
|
||||
created: Generated<Timestamp>
|
||||
id: Generated<number>
|
||||
name: string
|
||||
token: string | null
|
||||
}
|
||||
|
||||
export interface SanctionsLogs {
|
||||
created: Generated<Timestamp>
|
||||
customerId: string
|
||||
deviceId: string
|
||||
id: string
|
||||
sanctionedAliasFullName: string
|
||||
sanctionedAliasId: string | null
|
||||
sanctionedId: string
|
||||
}
|
||||
|
||||
export interface ServerLogs {
|
||||
deviceId: string | null
|
||||
id: string
|
||||
logLevel: string | null
|
||||
message: string | null
|
||||
meta: Json | null
|
||||
timestamp: Generated<Timestamp | null>
|
||||
}
|
||||
|
||||
export interface SmsNotices {
|
||||
allowToggle: Generated<boolean>
|
||||
created: Generated<Timestamp>
|
||||
enabled: Generated<boolean>
|
||||
event: SmsNoticeEvent
|
||||
id: string
|
||||
message: string
|
||||
messageName: string
|
||||
}
|
||||
|
||||
export interface Trades {
|
||||
created: Generated<Timestamp>
|
||||
cryptoAtoms: Numeric
|
||||
cryptoCode: string
|
||||
error: string | null
|
||||
fiatCode: string
|
||||
id: Generated<number>
|
||||
type: TradeType
|
||||
}
|
||||
|
||||
export interface TransactionBatches {
|
||||
closedAt: Timestamp | null
|
||||
createdAt: Generated<Timestamp>
|
||||
cryptoCode: string
|
||||
errorMessage: string | null
|
||||
id: string
|
||||
status: Generated<TransactionBatchStatus>
|
||||
}
|
||||
|
||||
export interface UnpairedDevices {
|
||||
deviceId: string
|
||||
id: string
|
||||
model: string | null
|
||||
name: string | null
|
||||
paired: Timestamp
|
||||
unpaired: Timestamp
|
||||
}
|
||||
|
||||
export interface UserConfig {
|
||||
created: Generated<Timestamp>
|
||||
data: Json
|
||||
id: Generated<number>
|
||||
schemaVersion: Generated<number>
|
||||
type: string
|
||||
valid: boolean
|
||||
}
|
||||
|
||||
export interface UserRegisterTokens {
|
||||
expire: Generated<Timestamp>
|
||||
role: Generated<Role | null>
|
||||
token: string
|
||||
useFido: Generated<boolean | null>
|
||||
username: string
|
||||
}
|
||||
|
||||
export interface Users {
|
||||
created: Generated<Timestamp>
|
||||
enabled: Generated<boolean | null>
|
||||
id: string
|
||||
lastAccessed: Generated<Timestamp>
|
||||
lastAccessedAddress: string | null
|
||||
lastAccessedFrom: string | null
|
||||
password: string | null
|
||||
role: Generated<Role>
|
||||
tempTwofaCode: string | null
|
||||
twofaCode: string | null
|
||||
username: string
|
||||
}
|
||||
|
||||
export interface UserSessions {
|
||||
expire: Timestamp
|
||||
sess: Json
|
||||
sid: string
|
||||
}
|
||||
|
||||
export interface DB {
|
||||
authTokens: AuthTokens
|
||||
bills: Bills
|
||||
blacklist: Blacklist
|
||||
blacklistMessages: BlacklistMessages
|
||||
cashInActions: CashInActions
|
||||
cashInTxs: CashInTxs
|
||||
cashinTxTrades: CashinTxTrades
|
||||
cashOutActions: CashOutActions
|
||||
cashOutTxs: CashOutTxs
|
||||
cashoutTxTrades: CashoutTxTrades
|
||||
cashUnitOperation: CashUnitOperation
|
||||
complianceOverrides: ComplianceOverrides
|
||||
coupons: Coupons
|
||||
customerCustomFieldPairs: CustomerCustomFieldPairs
|
||||
customerExternalCompliance: CustomerExternalCompliance
|
||||
customerNotes: CustomerNotes
|
||||
customers: Customers
|
||||
customersCustomInfoRequests: CustomersCustomInfoRequests
|
||||
customFieldDefinitions: CustomFieldDefinitions
|
||||
customInfoRequests: CustomInfoRequests
|
||||
devices: Devices
|
||||
editedCustomerData: EditedCustomerData
|
||||
emptyUnitBills: EmptyUnitBills
|
||||
hardwareCredentials: HardwareCredentials
|
||||
individualDiscounts: IndividualDiscounts
|
||||
logs: Logs
|
||||
machineEvents: MachineEvents
|
||||
machineNetworkHeartbeat: MachineNetworkHeartbeat
|
||||
machineNetworkPerformance: MachineNetworkPerformance
|
||||
machinePings: MachinePings
|
||||
migrations: Migrations
|
||||
notifications: Notifications
|
||||
operatorIds: OperatorIds
|
||||
pairingTokens: PairingTokens
|
||||
sanctionsLogs: SanctionsLogs
|
||||
serverLogs: ServerLogs
|
||||
smsNotices: SmsNotices
|
||||
trades: Trades
|
||||
transactionBatches: TransactionBatches
|
||||
unpairedDevices: UnpairedDevices
|
||||
userConfig: UserConfig
|
||||
userRegisterTokens: UserRegisterTokens
|
||||
users: Users
|
||||
userSessions: UserSessions
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue