Meteor-back/routes/marketplace.js

260 lines
8.7 KiB
JavaScript

const express = require("express")
const router = express.Router()
const games = require('./../model/games.js')
const User = require('./../model/user.js')
const item = require("./../model/item.js")
const { requireAuth } = require("../middleware/authmiddleware.js")
var rgx = /^[0-9]*\.?[0-9]*$/;
router.get("/marketplace/productinfo", async (req, res) => {
const sanitizedid = req.query.assetId.match(rgx)
let json = {"TargetId":5009,"ProductType":"User Product","AssetId":93722443,"ProductId":13831621,"Name":"rrr","Description":"","AssetTypeId":19,"Creator":{"Id":1,"Name":"","CreatorType":"User","CreatorTargetId":1},"IconImageAssetId":0,"Created":"2012-09-28T01:09:47.077Z","Updated":"2017-01-03T00:25:45.8813192Z","PriceInRobux":null,"PriceInTickets":null,"Sales":0,"IsNew":false,"IsForSale":true,"IsPublicDomain":false,"IsLimited":false,"IsLimitedUnique":false,"Remaining":null,"MinimumMembershipLevel":0,"ContentRatingTypeId":0}
let response = await games.findOne({idofgame: parseFloat(sanitizedid)}).lean()
if (!response){
response = await item.findOne({ItemId: parseFloat(sanitizedid)}).lean()
json.PriceInRobux = parseFloat(response.Price)
json.AssetTypeId = 34
json.IconImageAssetId = parseFloat(req.query.assetId)
if (!response){
return res.status(404).end()
}
}
const creator = await User.findOne({userid: parseFloat(response.useridofowner??response.Creator)}).lean()
json.AssetId = parseFloat(req.query.assetId)
json.ProductId = parseFloat(req.query.assetId)
json.TargetId = parseFloat(req.query.assetId)
json.Name = response.nameofgame??response.Name
json.Description = response.descrption??""
json.Creator.Id = parseFloat(response.useridofowner??response.Creator)
json.Creator.Name = creator.username
json.Creator.CreatorTargetId = parseFloat(response.useridofowner??response.Creator)
res.json(json)
})
router.post("/marketplace/purchase",requireAuth, async (req, res) => {
const productId = parseInt(req.body.productId)
if (!productId){
res.json({success: false,status: "Error",receipt: ""})
}
const itemdoc = await item.findOne({ItemId: productId})//.lean()
if (typeof req.userdocument.inventory !== "undefined"){
// check if user already owns item
for (var v of req.userdocument.inventory){
if (v.ItemId === itemdoc.ItemId){
// they already own it
return res.json({status: 'error', error: "You already own this!"})
}
}
}
if (itemdoc.Type === "Mesh" || itemdoc.Type === "Audio" || itemdoc.Type === "Mesh"){
return res.json({status: 'error', error: "You can't buy assets."})
}
if (itemdoc.Hidden){
return res.json({success: false,status: "Error",receipt: ""})
}
if (req.userdocument.coins >= itemdoc.Price){
// has enough money to purcahse item
try{
User.updateOne({userid: req.userdocument.userid}, {
$set: {
coins: req.userdocument.coins - itemdoc.Price
},
$push: {
inventory: {Type: itemdoc.Type,ItemId: itemdoc.ItemId, Equipped: false}
}
},
function(err, doc) {
//console.log(err)
})
// give owner cash
User.updateOne({userid: itemdoc.Creator}, {
$inc: {
coins: itemdoc.Price
}
},
function(err, doc) {
//console.log(err)
})
itemdoc.Sales += 1
if (!itemdoc.Sales){
itemdoc.Sales = 1
}
//console.log(itemdoc.Sales)
itemdoc.markModified('Sales')
await itemdoc.save()
}catch{
}
return res.json(({success: true,status: "Bought",receipt: ""}))
}
// too poor
return res.json({success: false,status: "Error",receipt: ""})
})
router.get('/ownership/hasasset',async (req, res) => {
const userid = req.query?.userId
const assetId = req.query?.assetId
const doc = await User.findOne({userid: userid})
const itemdoc = await item.findOne({ItemId: assetId})
if (!doc){
return res.send("false")
}
if (!itemdoc){
return res.send("false")
}
if (typeof doc.inventory !== "undefined"){
// check if user already owns item
for (var v of doc.inventory){
if (v.ItemId === itemdoc.ItemId){
// they already own it
return res.send("true")
}
}
}
return res.send("false")
})
router.get('/v1/users/:userId/items/gamepass/:assetId',async (req, res) => {
const userid = req.params?.userId
const assetId = req.params?.assetId
const doc = await User.findOne({userid: userid})
const itemdoc = await item.findOne({ItemId: assetId})
let data = {"previousPageCursor":null,"nextPageCursor":null,"data":[]}
if (!doc){
return res.json(data)
}
if (!itemdoc){
return res.json(data)
}
if (typeof doc.inventory !== "undefined"){
// check if user already owns item
for (var v of doc.inventory){
if (v.ItemId === itemdoc.ItemId){
// they already own it
data.data.push({"type": "GamePass","id": req.params?.assetId,"name": itemdoc.Name,"instanceId": null})
return res.json(data)
}
}
}
return res.json(data)
})
router.post('/v1/purchases/products/:assetId',requireAuth,async (req, res) => {
const assetId = req.params?.assetId
const itemdoc = await item.findOne({ItemId: assetId})
let error = {
"purchased": false,
"reason": "InsufficientFunds",
"productId": 15194787,
"statusCode": 500,
"title": "Not Enough Robux",
"errorMsg": "You do not have enough Robux to purchase this item.",
"showDivId": "InsufficientFundsView",
"shortfallPrice": 29,
"balanceAfterSale": -29,
"expectedPrice": 150,
"currency": 1,
"price": 150,
"assetId": 106690045
}
if (!itemdoc){
error.productId = assetId
error.title = "Not found"
return res.json(error)
}
error.price = itemdoc.Price
error.productId = assetId
error.assetId = assetId
error.expectedPrice = itemdoc.Price
error.balanceAfterSale = req.userdocument.coins - itemdoc.Price
error.shortfallPrice = Math.abs(req.userdocument.coins - itemdoc.Price)
if (typeof req.userdocument.inventory !== "undefined"){
// check if user already owns item
for (var v of req.userdocument.inventory){
if (v.ItemId === itemdoc.ItemId){
// they already own it
return res.json({status: 'error', error: "You already own this!"})
}
}
}
if (itemdoc.Type === "Mesh" || itemdoc.Type === "Audio" || itemdoc.Type === "Mesh"){
return res.json({status: 'error', error: "You can't buy assets."})
}
if (itemdoc.Hidden){
return res.json({status: 'error', error: "You can't buy this!"})
}
if (req.userdocument.coins >= itemdoc.Price){
// has enough money to purcahse item
try{
User.updateOne({userid: req.userdocument.userid}, {
$set: {
coins: req.userdocument.coins - itemdoc.Price
},
$push: {
inventory: {Type: itemdoc.Type,ItemId: itemdoc.ItemId, Equipped: false}
}
},
function(err, doc) {
//console.log(err)
})
// give owner cash
User.updateOne({userid: itemdoc.Creator}, {
$inc: {
coins: itemdoc.Price
}
},
function(err, doc) {
//console.log(err)
})
itemdoc.Sales += 1
if (!itemdoc.Sales){
itemdoc.Sales = 1
}
//console.log(itemdoc.Sales)
itemdoc.markModified('Sales')
await itemdoc.save()
}catch{
}
return res.json({
"purchased": true,
"reason": "Success",
"productId": assetId,
"currency": 1,
"price": itemdoc.Price,
"assetId": assetId,
"assetName": itemdoc.Name,
"assetType": "Gamepass",
"assetTypeDisplayName": "Gamepass",
"assetIsWearable": false,
"sellerName": "Robloxxx",
"transactionVerb": "bought",
"isMultiPrivateSale": false
})
}
return res.json(error)
})
module.exports = router