Files
Exchange/server/api/walletApi/transferToExchangeById.ts
2025-11-07 22:24:40 +01:00

292 lines
16 KiB
TypeScript
Executable File

import * as _ from 'lodash'
import myError from '../myError'
import { Currencies } from '../../db/currencies'
import { User } from '../../db/user'
import * as mongoose from 'mongoose'
import * as bitcoin from '../walletApi/bitcoin'
import * as etherium from './etheriuem'
import * as tron from './tron'
import { PendingTransfers } from '../../db/pendingTransfers'
import { SuccessfulTransfers } from '../../db/successfulTransfers'
export const transferToExchangeByIdApi = async(currencyId, txId, userId) => {
let info
let resObj
let userHaveDoc = false
let checkStatus = () => {
return null
}
const session = await mongoose.startSession()
return session.withTransaction(() => {
return User.findOne({ _id: userId }).session(session)
.then((user) => {
if(user) {
return PendingTransfers.findOne({ userId: userId })
.then((userPending) => {
if(userPending && userPending.userId.toString() === userId.toString()) {
userHaveDoc = true
let pendingTx = _.find(userPending.transactions, (i) => { return i.txId.toString() === txId.toString() })
if(pendingTx) {
const error = new myError(
'transaction already exsist',
400,
5,
'تراکنش قبلا وجود دارد',
'خطا رخ داد'
)
throw error
}
}
return Currencies.findOne({ _id: currencyId })
.then((cur) => {
let CurAbName = ""
if(cur) {
CurAbName = cur.ab_name
switch(CurAbName) {
case "BTC":
checkStatus = () => {
return bitcoin.bitcoinTransferToExchangeById(txId)
.then((result) => {
info = result
})
.catch((err) => {
throw err
})
}
break;
case "ETH":
return etherium.checkTransaction(txId)
.then((transaction) => {
if(transaction && transaction.hash.toString() === txId.toString()) {
let curInWall = _.find(user.wallet, (i) => { return i.currency.toString()=== currencyId.toString()})
if(curInWall) {
curInWall.value += Number(transaction.value)
} else {
}
return
} else {
throw "transaction not valid"
}
})
.catch((err)=>{
console.log("api error: ",err)
})
//
case "TRX":
return tron.validateByTXId(txId)
.then((transaction: any) => {
if(transaction.result) {
const resObj = {
status:"successful",
txValue : transaction
}
return resObj
} else {
const resObj = {
status:"pending",
txValue : transaction
}
}
})
.catch((err) => {
throw(err)
})
// default
}
return Promise.all([checkStatus()])
.then(() => {
if(userHaveDoc) {
userPending.transactions.push({
txId:txId,
currencyId:currencyId,
currencyName:CurAbName,
value:info.txAmount,
type:"id"
})
userPending.save()
.then(() => {
if(info.status === 'Confirmed') {
return SuccessfulTransfers.findOne({ userId: userId }).session(session)
.then(async (userSuccess) => {
if(userSuccess && userSuccess.userId.toString() === userId.toString()) {
userSuccess.transactions.push({
txId,
currencyId,
currencyName: CurAbName,
value: info.txAmount,
type: "id"
})
await userSuccess.save()
} else {
const usrSuccess = {
userId:userId,
transactions: [{
txId,
currencyId,
currencyName: CurAbName,
value: info.txAmount,
type: "id"
}]
}
await SuccessfulTransfers.create([usrSuccess], { session })
}
return PendingTransfers.findOne({ userId:userId }).session(session)
.then(async (userPendinAfterSave) => {
userPendinAfterSave.transactions = _.filter(userPendinAfterSave.transactions, (i) => { return i.txId.toString() !== txId.toString() })
await userPendinAfterSave.save()
let cur = _.find(user.wallet, (i) => { return i.currency.toString() === currencyId.toString()})
if(cur) {
cur.value +=info.txAmount
await user.save()
} else {
user.wallet.push({
currency: currencyId,
value: info.txAmount
})
await user.save()
}
resObj = {
status: 'successful',
value: info.txAmount
}
}).catch((err)=>{
throw err
})
}).catch((err)=>{
throw err
})
} else {
resObj = {
status: 'pending',
value: info.txAmount
}
}
})
.catch((err) => {
throw err
})
} else {
const usrPending = {
userId:userId,
transactions: [{
txId,
currencyId,
currencyName: CurAbName,
value: info.txAmount,
type: "id"
}]
}
PendingTransfers.create([usrPending])
.then(() => {
if(info.status === 'Confirmed') {
return SuccessfulTransfers.findOne({ userId: userId }).session(session)
.then(async (userSuccess) => {
if(userSuccess && userSuccess.userId.toString() === userId.toString()) {
userSuccess.transactions.push({
txId,
currencyId,
currencyName: CurAbName,
value: info.txAmount,
type: "id"
})
await userSuccess.save()
} else {
const usrSuccess = {
userId:userId,
transactions: [{
txId,
currencyId,
currencyName: CurAbName,
value: info.txAmount,
type: "id"
}]
}
await SuccessfulTransfers.create([usrSuccess], { session })
}
return PendingTransfers.findOne({ userId:userId }).session(session)
.then(async (userPendinAfterSave) => {
userPendinAfterSave.transactions = _.filter(userPendinAfterSave.transactions, (i) => { return i.txId.toString() !== txId.toString() })
await userPendinAfterSave.save()
let cur = _.find(user.wallet, (i) => { return i.currency.toString() === currencyId.toString()})
if(cur) {
cur.value +=info.txAmount
await user.save()
} else {
user.wallet.push({
currency: currencyId,
value: info.txAmount
})
await user.save()
}
resObj = {
status: 'successful',
value: info.txAmount
}
}).catch((err)=>{
throw err
})
}).catch((err)=>{
throw err
})
} else {
resObj = {
status: 'pending',
value: info.txAmount
}
}
})
.catch((err) => {
throw err
})
}
})
.catch((err) => {
throw err
})
} else {
const error = new myError(
'currency not found',
400,
5,
'ارز مربوطه پیدا نشد.',
'خطا رخ داد'
)
throw error
}
})
.catch((err) => {
throw err
})
})
.catch((err) => {
throw err
})
} else {
const error = new myError(
'user not found',
400,
5,
'کاربر پیدا نشد.',
'خطا رخ داد'
)
throw error
}
})
.catch((err) => {
throw err
})
})
.then(() => {
return resObj
})
.catch((err) => {
throw ("error in with Transaction"+ ":" + err)
})
.finally(() => {
session.endSession()
})
}