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

190 lines
11 KiB
TypeScript
Executable File

import myError from '../myError'
import { Currencies } from '../../db/currencies'
import * as bitcoin from '../walletApi/bitcoin'
import * as etheriuem from '../walletApi/etheriuem'
import * as tron from '../walletApi/tron'
import * as mongoose from 'mongoose'
import { User } from '../../db/user'
import * as _ from 'lodash'
import { PendingTransfers } from '../../db/pendingTransfers'
import { SuccessfulTransfers } from '../../db/successfulTransfers'
export const transferFromExchangeApi = async(currencyId, value, receiver, userId) => {
let info
let resObj
let checkStatus = () => {
return null
}
const session = await mongoose.startSession()
return session.withTransaction(async() => {
return User.findOne({_id:userId}).session(session)
.then(async (user)=>{
if(user){
return Currencies.findOne({_id:currencyId})
.then(async(cur) => {
let CurAbName = ""
if(cur){
let curInWall = _.find(user.wallet, (i) => { return i.currency.toString() === currencyId.toString()})
if(curInWall) {
if(curInWall.value >= Number(value)){
CurAbName = cur.ab_name
switch(CurAbName) {
case "BTC":
checkStatus = () => {
return bitcoin.bitcoinTransferFromExchange(value,receiver)
.then((txHash) => {
info = {
status:"pending",
txHash:txHash
}
})
.catch((err)=>{
throw err
})
}
case "ETH":
return etheriuem.sendEther(receiver.toString(),value)
.then(async (result) => {
if(result&&result.transactionHash) {
const bodySuccessfulOffer = {
userId: user._id ,
transactions : []
}
const bodyTransaction = {
txId : result.transactionHash,
currencyId : currencyId,
currencyName : CurAbName,
value : Number(value),
type : 'send'
}
bodySuccessfulOffer.transactions.push(bodyTransaction)
} else if(result) {
throw ("could not get any transaction "+ result)
} else {
throw ("could not get result ")
}
})
.catch((err) => {
throw err
})
case "TRX":
}
return Promise.all([checkStatus()])
.then(() =>{
return PendingTransfers.findOne({ userId:userId }).session(session)
.then(async (userPending) => {
if(userPending){
userPending.transactions.push({
txId: info.txHash,
currencyId: currencyId,
currencyName: CurAbName,
value: value,
type: "send"
})
await userPending.save()
} else {
const usrPending = {
userId: userId,
transactions: [{
txId: info.txHash,
currencyId: currencyId,
currencyName: CurAbName,
value: value,
type: "id"
}]
}
await PendingTransfers.create([usrPending],{ session })
}
curInWall.value -= value
await user.save()
resObj =
{
status:"success",
txValue:value,
txHash:info.txHash
}
}).catch((err)=>{
throw err
})
}).catch((err)=>{
throw err
})
} else {
const error = new myError(
'you do not have enough currency ',
400,
5,
'موجودی کافی نمی باشد',
'خطا رخ داد'
)
throw error
}
} else {
const error = new myError(
'currency not found in user wallet',
400,
5,
'ارز در کیف پول پیدا نشد',
'خطا رخ داد'
)
throw error
}
} else {
const error = new myError(
'currency not found',
400,
5,
'ارز پیدا نشد',
'خطا رخ داد'
)
throw error
}
}).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) => {
console.log("error in with Transaction",err)
throw("error in with transaction")
})
.finally(() => {
session.endSession()
})
.catch((err) => {
throw err
})
}