diff --git a/backend/api/account/accountController.js b/backend/api/account/accountController.js index f36a56a..074f6f1 100644 --- a/backend/api/account/accountController.js +++ b/backend/api/account/accountController.js @@ -3,12 +3,13 @@ const accountService = require('./accountService'); const getAccountAllowance = async (req, res) => { try { - const username = req.body.username; - const response = await accountService.getAccountAllowance(username); - debug.info(`Account Allowance Response: ${JSON.stringify(response)}`); + // TODO: Input verification logic? + const accountName = req.params.username; + const response = await accountService.getAccountAllowance(accountName); + debug.info(`Response for getting an account's allowance: ${JSON.stringify(response)}`); + if (!response.success) res.status(500).json(response); else res.status(200).json(response); - } catch (error) { debug.error(error.stack); res.status(500).json({ message: error.message, error: error.stack }); @@ -44,6 +45,21 @@ const getAccountBalance = async (req, res) => { } }; +const getAccountPermissions = async (req, res) => { + try { + // TODO: Input verification logic? + const accountName = req.params.username; + const response = await accountService.getAccountPermissions(accountName); + debug.info(`Response for getting an account's permissions: ${JSON.stringify(response)}`); + + if (!response.success) res.status(500).json(response); + else res.status(200).json(response); + } catch (error) { + debug.error(error.stack); + res.status(500).json({ message: error.message, error: error.stack }); + } +}; + const createInvoice = async (req, res) => { try { const amountMillisats = req.body.amountMillisats; @@ -58,4 +74,4 @@ const createInvoice = async (req, res) => { } }; -module.exports = { getAccountAllowance, payInvoice, createInvoice, getAccountBalance }; +module.exports = { getAccountAllowance, payInvoice, createInvoice, getAccountBalance, getAccountPermissions }; diff --git a/backend/api/account/accountService.js b/backend/api/account/accountService.js index 16c000a..636ab81 100644 --- a/backend/api/account/accountService.js +++ b/backend/api/account/accountService.js @@ -1,15 +1,23 @@ const debug = require('../../utils/debug'); const senseiNodes = require('../../sensei/nodes'); -const accounts = require('../../db/collection'); +const collection = require('../../db/collection'); -const getAccountAllowance = async (username) => { - try { - // get allowance from firestore - return { success: true, message: nodes }; - } catch (error) { - debug.error(error.stack); - throw new Error(error); +const DOC_NAME = 'nicks-family'; +const MEMBERS_SUBCOLLECTION_NAME = 'members'; + +const getAccountAllowance = async (accountName) => { + const docRef = await collection.doc(DOC_NAME).collection(MEMBERS_SUBCOLLECTION_NAME).doc(accountName); + const doc = await docRef.get(); + if (!doc.exists) { + const errMsg = `Firestore document "${docName}/${subcollectionName}/${accountName}" does not exist in the families collection`; + debug.error(errMsg); + throw new Error(errMsg); } + + // TODO: Error handling? + const allowance = doc.data().allowance; + return { success: true, allowance }; + }; const getAccountBalance = async () => { @@ -22,6 +30,20 @@ const getAccountBalance = async () => { } }; +const getAccountPermissions = async (accountName) => { + const docRef = await collection.doc(DOC_NAME).collection(MEMBERS_SUBCOLLECTION_NAME).doc(accountName); + const doc = await docRef.get(); + if (!doc.exists) { + const errMsg = `Firestore document "${docName}/${subcollectionName}/${accountName}" does not exist in the families collection`; + debug.error(errMsg); + throw new Error(errMsg); + } + + // TODO: Error handling? + const permissions = doc.data().permissions; + return { success: true, permissions }; +}; + const payInvoice = async (invoice) => { try { const response = await senseiNodes.payInvoice(invoice); @@ -42,4 +64,4 @@ const createInvoice = async (amountMillisats, description) => { } }; -module.exports = { getAccountAllowance, payInvoice, createInvoice, getAccountBalance }; +module.exports = { getAccountAllowance, payInvoice, createInvoice, getAccountBalance, getAccountPermissions }; diff --git a/backend/api/account/index.js b/backend/api/account/index.js index 98ac1ff..c8de08a 100644 --- a/backend/api/account/index.js +++ b/backend/api/account/index.js @@ -1,10 +1,11 @@ const express = require('express'); const router = express(); -const { getAccountAllowance, payInvoice, createInvoice, getAccountBalance } = require('./accountController'); +const { getAccountAllowance, payInvoice, createInvoice, getAccountBalance, getAccountPermissions } = require('./accountController'); router.get('/account/balance', getAccountBalance); -router.get('/allowance', getAccountAllowance); +router.get('/:username/permissions', getAccountPermissions); +router.get('/:username/allowance', getAccountAllowance); router.get('/payment/send', payInvoice); router.get('/payment/receive', createInvoice); diff --git a/frontend/src/routes/Receive.js b/frontend/src/routes/Receive.js index 92a42c1..c9bae78 100644 --- a/frontend/src/routes/Receive.js +++ b/frontend/src/routes/Receive.js @@ -1,4 +1,4 @@ -import {CaretDownIcon, ContactsIcon, CopyIcon, QrCodeIcon, ShareIcon} from "@bitcoin-design/bitcoin-icons-react/filled"; +import { CaretDownIcon, ContactsIcon, CopyIcon, EditIcon, QrCodeIcon, ShareIcon } from "@bitcoin-design/bitcoin-icons-react/filled"; import Button from "../components/Button"; import InputText from "../components/InputText"; @@ -28,7 +28,7 @@ const Receive = () => { -