60 lines
1.8 KiB
JavaScript
60 lines
1.8 KiB
JavaScript
import { randomBytes } from 'crypto'
|
|
import { bech32 } from 'bech32'
|
|
import { GraphQLError } from 'graphql'
|
|
import assertGofacYourself from './ofac'
|
|
import assertApiKeyNotPermitted from './apiKey'
|
|
|
|
function encodedUrl (iurl, tag, k1) {
|
|
const url = new URL(iurl)
|
|
url.searchParams.set('tag', tag)
|
|
url.searchParams.set('k1', k1)
|
|
// bech32 encode url
|
|
const words = bech32.toWords(Buffer.from(url.toString(), 'utf8'))
|
|
return bech32.encode('lnurl', words, 1023)
|
|
}
|
|
|
|
function k1 () {
|
|
return randomBytes(32).toString('hex')
|
|
}
|
|
|
|
export default {
|
|
Query: {
|
|
lnAuth: async (parent, { k1 }, { models }) => {
|
|
return await models.lnAuth.findUnique({ where: { k1 } })
|
|
},
|
|
lnWith: async (parent, { k1 }, { models }) => {
|
|
return await models.lnWith.findUnique({ where: { k1 } })
|
|
}
|
|
},
|
|
Mutation: {
|
|
createAuth: async (parent, args, { models, me }) => {
|
|
assertApiKeyNotPermitted({ me })
|
|
return await models.lnAuth.create({ data: { k1: k1() } })
|
|
},
|
|
createWith: async (parent, args, { me, models, headers }) => {
|
|
await assertGofacYourself({ models, headers })
|
|
|
|
if (!me) {
|
|
throw new GraphQLError('you must be logged in', { extensions: { code: 'UNAUTHENTICATED' } })
|
|
}
|
|
|
|
assertApiKeyNotPermitted({ me })
|
|
|
|
return await models.lnWith.create({ data: { k1: k1(), userId: me.id } })
|
|
}
|
|
},
|
|
LnAuth: {
|
|
encodedUrl: async (lnAuth, args, { models }) => {
|
|
return encodedUrl(process.env.LNAUTH_URL, 'login', lnAuth.k1)
|
|
}
|
|
},
|
|
LnWith: {
|
|
encodedUrl: async (lnWith, args, { models }) => {
|
|
return encodedUrl(process.env.LNWITH_URL, 'withdrawRequest', lnWith.k1)
|
|
},
|
|
user: async (lnWith, args, { models }) => {
|
|
return await models.user.findUnique({ where: { id: lnWith.userId } })
|
|
}
|
|
}
|
|
}
|