content reveal order
This commit is contained in:
parent
f4e6cb76c1
commit
f43982d541
1 changed files with 88 additions and 2 deletions
|
|
@ -21,6 +21,7 @@ const {
|
||||||
const { writeCoordinate } = require('../../../coordinates')
|
const { writeCoordinate } = require('../../../coordinates')
|
||||||
const Key = require('../key')
|
const Key = require('../key')
|
||||||
const Utils = require('../utils')
|
const Utils = require('../utils')
|
||||||
|
const { gunUUID } = require('../../../../utils')
|
||||||
|
|
||||||
const getUser = () => require('../../Mediator').getUser()
|
const getUser = () => require('../../Mediator').getUser()
|
||||||
|
|
||||||
|
|
@ -220,7 +221,7 @@ const listenerForAddr = (addr, SEA) => async (order, orderID) => {
|
||||||
/**
|
/**
|
||||||
* @param {Common.InvoiceWhenListed} invoice
|
* @param {Common.InvoiceWhenListed} invoice
|
||||||
*/
|
*/
|
||||||
const onData = invoice => {
|
const onData = async invoice => {
|
||||||
if (invoice.settled) {
|
if (invoice.settled) {
|
||||||
writeCoordinate(invoice.r_hash.toString(), coord)
|
writeCoordinate(invoice.r_hash.toString(), coord)
|
||||||
|
|
||||||
|
|
@ -231,7 +232,92 @@ const listenerForAddr = (addr, SEA) => async (order, orderID) => {
|
||||||
.get(/** @type {string} */ (order.ackInfo))
|
.get(/** @type {string} */ (order.ackInfo))
|
||||||
.set(null) // each item in the set is a tip
|
.set(null) // each item in the set is a tip
|
||||||
} else if (order.targetType === 'contentReveal') {
|
} else if (order.targetType === 'contentReveal') {
|
||||||
// TODO
|
// -----------------------------------------
|
||||||
|
logger.debug('Content Reveal')
|
||||||
|
|
||||||
|
//assuming digital product that only requires to be unlocked
|
||||||
|
const postID = order.ackInfo
|
||||||
|
|
||||||
|
if (!Common.isPopulatedString(postID)) {
|
||||||
|
logger.error(`Invalid post ID`)
|
||||||
|
logger.error(postID)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: do this reactively
|
||||||
|
const selectedPost = await new Promise(res => {
|
||||||
|
getUser()
|
||||||
|
.get(Key.POSTS_NEW)
|
||||||
|
.get(postID)
|
||||||
|
.load(res)
|
||||||
|
})
|
||||||
|
|
||||||
|
logger.debug(selectedPost)
|
||||||
|
|
||||||
|
if (Common.isPost(selectedPost)) {
|
||||||
|
logger.error('Post id provided does not correspond to a valid post')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @type {Record<string,string>} <contentID,decryptedRef>
|
||||||
|
*/
|
||||||
|
const contentsToSend = {}
|
||||||
|
const mySecret = require('../../Mediator').getMySecret()
|
||||||
|
logger.debug('SECRET OK')
|
||||||
|
let privateFound = false
|
||||||
|
await Common.Utils.asyncForEach(
|
||||||
|
Object.entries(selectedPost.contentItems),
|
||||||
|
async ([contentID, item]) => {
|
||||||
|
if (
|
||||||
|
item.type !== 'image/embedded' &&
|
||||||
|
item.type !== 'video/embedded'
|
||||||
|
) {
|
||||||
|
return //only visual content can be private
|
||||||
|
}
|
||||||
|
if (!item.isPrivate) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
privateFound = true
|
||||||
|
const decrypted = await SEA.decrypt(item.magnetURI, mySecret)
|
||||||
|
contentsToSend[contentID] = decrypted
|
||||||
|
}
|
||||||
|
)
|
||||||
|
if (!privateFound) {
|
||||||
|
logger.error(`Post provided does not contain private content`)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
const ackData = { unlockedContents: contentsToSend }
|
||||||
|
const toSend = JSON.stringify(ackData)
|
||||||
|
const encrypted = await SEA.encrypt(toSend, secret)
|
||||||
|
const ordResponse = {
|
||||||
|
type: 'orderAck',
|
||||||
|
response: encrypted
|
||||||
|
}
|
||||||
|
logger.debug('RES READY')
|
||||||
|
|
||||||
|
const uuid = gunUUID()
|
||||||
|
orderResponse.ackNode = uuid
|
||||||
|
|
||||||
|
await /** @type {Promise<void>} */ (new Promise((res, rej) => {
|
||||||
|
getUser()
|
||||||
|
.get(Key.ORDER_TO_RESPONSE)
|
||||||
|
.get(uuid)
|
||||||
|
.put(ordResponse, ack => {
|
||||||
|
if (ack.err && typeof ack.err !== 'number') {
|
||||||
|
rej(
|
||||||
|
new Error(
|
||||||
|
`Error saving encrypted orderAck to order to response usergraph: ${ack}`
|
||||||
|
)
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
res()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}))
|
||||||
|
logger.debug('RES SENT CONTENT')
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
} else if (order.targetType === 'spontaneousPayment') {
|
} else if (order.targetType === 'spontaneousPayment') {
|
||||||
// no action required
|
// no action required
|
||||||
} else if (order.targetType === 'torrentSeed') {
|
} else if (order.targetType === 'torrentSeed') {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue