190 lines
11 KiB
TypeScript
Executable File
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
|
|
})
|
|
}
|