260 lines
8.7 KiB
JavaScript
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 |