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

335 lines
14 KiB
TypeScript
Executable File

import * as _ from 'lodash'
import * as redis from '../api/redis'
import { Accepted_Offers } from '../db/acceptedOffers';
import { Active_Offers } from '../db/ActiveOffers';
export const searchOnTxs = ({ curId, txType, rial }) => {
const itemsMap = new Map()
const items = ['curId']
const definedItems = []
itemsMap.set('curId', curId)
items.map((element) => {
if(itemsMap.get(element)) {
definedItems.push(element)
}
})
let query = []
let queryMap = new Map()
queryMap.set('curId', [ { $or: [
{ $and: [{ curGivenId: curId }, { curTakenId: rial._id } ] },
{ $and: [{ curTakenId: curId }, { curGivenId: rial._id } ] }
] } ] )
const definedItemsMap = definedItems.map((element) => {
query.push.apply(query, queryMap.get(element))
})
if(query.length === 0) {
query = [ { $or: [ { curTakenId: rial._id }, { curGivenId: rial._id } ] } ]
}
console.log('query: ', query)
return Promise.all(definedItemsMap)
.then(() => {
return Accepted_Offers.find({ $and: query })
.then((result) => {
let modifiedResult = []
if(itemsMap.get('curId')) {
return redis.hashGetAll(curId.toString())
.then((curObj: any) => {
result.map((e) => {
if (e.curTakenId.toString() === rial._id.toString() && txType === 'sell') {
modifiedResult.push ({
GcurrencyName: curObj.currencyName,
GpersianName: curObj.per_name,
GshortName: curObj.ab_name,
Gvalue: e.curGivenVal,
Gicon: curObj.icon,
acceptedDate: e.created_at,
TcurrencyName: rial.currencyName,
TpersianName: rial.per_name,
TshortName: rial.ab_name,
Tvalue: e.curTakenVal,
Ticon: rial.icon,
txType: 'sell'
})
} else if (e.curGivenId.toString() === rial._id.toString() && txType === 'buy') {
modifiedResult.push ({
GcurrencyName: curObj.currencyName,
GpersianName: curObj.per_name,
GshortName: curObj.ab_name,
Gvalue: e.curTakenVal,
Gicon: curObj.icon,
acceptedDate: e.created_at,
TcurrencyName: rial.currencyName,
TpersianName: rial.per_name,
TshortName: rial.ab_name,
Tvalue: e.curGivenVal,
Ticon: rial.icon,
txType: 'buy'
})
} else if (txType === 'all') {
if (e.curTakenId.toString() === rial._id.toString()) {
modifiedResult.push ({
GcurrencyName: curObj.currencyName,
GpersianName: curObj.per_name,
GshortName: curObj.ab_name,
Gvalue: e.curGivenVal,
Gicon: curObj.icon,
acceptedDate: e.created_at,
TcurrencyName: rial.currencyName,
TpersianName: rial.per_name,
TshortName: rial.ab_name,
Tvalue: e.curTakenVal,
Ticon: rial.icon,
txType: 'sell'
})
} else if (e.curGivenId.toString() === rial._id.toString()) {
modifiedResult.push ({
GcurrencyName: curObj.currencyName,
GpersianName: curObj.per_name,
GshortName: curObj.ab_name,
Gvalue: e.curTakenVal,
Gicon: curObj.icon,
acceptedDate: e.created_at,
TcurrencyName: rial.currencyName,
TpersianName: rial.per_name,
TshortName: rial.ab_name,
Tvalue: e.curGivenVal,
Ticon: rial.icon,
txType: 'buy'
})
}
}
})
return modifiedResult
})
.catch((err) => {
throw err
})
} else {
const resultMap = result.map((e) => {
console.log('eeeeeeeee: ', e)
if (e.curTakenId.toString() === rial._id.toString() && txType === 'sell') {
return redis.hashGetAll(e.curGivenId.toString())
.then((curGivenObj: any) => {
modifiedResult.push ({
GcurrencyName: curGivenObj.currencyName,
GpersianName: curGivenObj.per_name,
GshortName: curGivenObj.ab_name,
Gvalue: e.curGivenVal,
Gicon: curGivenObj.icon,
acceptedDate: e.created_at,
TcurrencyName: rial.currencyName,
TpersianName: rial.per_name,
TshortName: rial.ab_name,
Tvalue: e.curTakenVal,
Ticon: rial.icon,
txType: 'sell'
})
})
.catch((err) => {
console.log(err)
})
} else if (e.curGivenId.toString() === rial._id.toString() && txType === 'buy') {
return redis.hashGetAll(e.curTakenId.toString())
.then((curTakenObj: any) => {
modifiedResult.push({
GcurrencyName: curTakenObj.currencyName,
GpersianName: curTakenObj.per_name,
GshortName: curTakenObj.ab_name,
Gvalue: e.curTakenVal,
Gicon: curTakenObj.icon,
acceptedDate: e.created_at,
TcurrencyName: rial.currencyName,
TpersianName: rial.per_name,
TshortName: rial.ab_name,
Tvalue: e.curGivenVal,
Ticon: rial.icon,
txType: 'buy'
})
})
.catch((err) => {
console.log(err)
})
} else if (txType === 'all') {
if (e.curTakenId.toString() === rial._id.toString()) {
return redis.hashGetAll(e.curGivenId.toString())
.then((curGivenObj: any) => {
modifiedResult.push ({
GcurrencyName: curGivenObj.currencyName,
GpersianName: curGivenObj.per_name,
GshortName: curGivenObj.ab_name,
Gvalue: e.curGivenVal,
Gicon: curGivenObj.icon,
acceptedDate: e.created_at,
TcurrencyName: rial.currencyName,
TpersianName: rial.per_name,
TshortName: rial.ab_name,
Tvalue: e.curTakenVal,
Ticon: rial.icon,
txType: 'sell'
})
})
.catch((err) => {
console.log(err)
})
} else if (e.curGivenId.toString() === rial._id.toString()) {
return redis.hashGetAll(e.curTakenId.toString())
.then((curTakenObj: any) => {
modifiedResult.push ({
GcurrencyName: curTakenObj.currencyName,
GpersianName: curTakenObj.per_name,
GshortName: curTakenObj.ab_name,
Gvalue: e.curTakenVal,
Gicon: curTakenObj.icon,
acceptedDate: e.created_at,
TcurrencyName: rial.currencyName,
TpersianName: rial.per_name,
TshortName: rial.ab_name,
Tvalue: e.curGivenVal,
Ticon: rial.icon,
txType: 'buy'
})
})
.catch((err) => {
console.log(err)
})
}
}
})
return Promise.all(resultMap)
.then(() => {
return modifiedResult
})
.catch((err) => {
throw err
})
}
})
.catch((err) => {
throw err
})
})
.catch((err) => {
throw err
})
}
export const searchOnActiveOffers = ({ offerId, curGivenId, curGivenVal, curTakenId, curTakenVal, expDate, created_at }) => {
const itemsMap = new Map()
const items = ['offerId', 'curGivenId', 'curGivenVal', 'curTakenId', 'curTakenVal', 'expDate', 'created_at']
const definedItems = []
itemsMap.set('offerId', offerId)
itemsMap.set('curGivenId', curGivenId)
itemsMap.set('curGivenVal', curGivenVal)
itemsMap.set('curTakenId', curTakenId)
itemsMap.set('curTakenVal', curTakenVal)
itemsMap.set('expDate', expDate)
itemsMap.set('created_at', created_at)
items.map((element) => {
if(itemsMap.get(element)) {
if (element === 'expDate') {
if(expDate.from || expDate.to) {
definedItems.push(element)
}
} else if (element === 'created_at') {
if(created_at.from || created_at.to) {
definedItems.push(element)
}
} else if (element === 'curGivenVal') {
if(curGivenVal.from || curGivenVal.to) {
definedItems.push(element)
}
} else if (element === 'curTakenVal') {
if(curTakenVal.from || curTakenVal.to) {
definedItems.push(element)
}
} else {
definedItems.push(element)
}
}
})
let query = [ { expDate: { $gt: Date.now() } } ]
let queryMap = new Map()
let queryExpDate
let queryCreatedAt
let queryCurGivenVal
let queryCurTakenVal
if (definedItems.includes('expDate')) {
if (expDate.from && expDate.to) {
queryExpDate = { expDate: { $gt: expDate.from, $lt: expDate.to } }
} else if (expDate.from && !expDate.to) {
queryExpDate = { expDate: { $gt: expDate.from } }
} else if (!expDate.from && expDate.to) {
queryExpDate = { expDate: { $lt: expDate.to } }
}
}
if (definedItems.includes('created_at')) {
if (created_at.from && created_at.to) {
queryCreatedAt = { created_at: { $gt: created_at.from, $lt: created_at.to } }
} else if (created_at.from && !created_at.to) {
queryCreatedAt = { created_at: { $gt: created_at.from } }
} else if (!created_at.from && created_at.to) {
queryCreatedAt = { created_at: { $lt: created_at.to } }
}
}
if (definedItems.includes('curGivenVal')) {
if (curGivenVal.from && curGivenVal.to) {
queryCurGivenVal = { curGivenVal: { $gte: curGivenVal.from, $lte: curGivenVal.to } }
} else if (curGivenVal.from && !curGivenVal.to) {
queryCurGivenVal = { curGivenVal: { $gte: curGivenVal.from } }
} else if (!curGivenVal.from && curGivenVal.to) {
queryCurGivenVal = { curGivenVal: { $lte: curGivenVal.to } }
}
}
if (definedItems.includes('curTakenVal')) {
if (curTakenVal.from && curTakenVal.to) {
queryCurTakenVal = { curTakenVal: { $gte: curTakenVal.from, $lte: curTakenVal.to } }
} else if (curTakenVal.from && !curTakenVal.to) {
queryCurTakenVal = { curTakenVal: { $gte: curTakenVal.from } }
} else if (!curTakenVal.from && curTakenVal.to) {
queryCurTakenVal = { curTakenVal: { $lte: curTakenVal.to } }
}
}
queryMap.set('offerId', { offerId: offerId })
queryMap.set('curGivenId', { curGivenId: curGivenId })
queryMap.set('curGivenVal', queryCurGivenVal)
queryMap.set('curTakenId', { curTakenId: curTakenId })
queryMap.set('curTakenVal', queryCurTakenVal)
queryMap.set('expDate', queryExpDate)
queryMap.set('created_at', queryCreatedAt)
const definedItemsMap = definedItems.map((element) => {
query.push(queryMap.get(element))
})
return Promise.all(definedItemsMap)
.then(() => {
return Active_Offers.find({ $and: query })
.then((result) => {
return result
})
.catch((err) => {
throw err
})
})
.catch((err) => {
throw err
})
}