From 5866d2fd9984d89cf9572d96e1855d1780ac7e4d Mon Sep 17 00:00:00 2001 From: Roland Osborne Date: Tue, 5 Apr 2022 16:52:39 -0700 Subject: [PATCH] added remaining profile actions --- .../internal/api_getAccountListingMessage.go | 48 +++++++++++++++++ net/server/internal/api_getCloseMessage.go | 2 +- net/server/internal/api_setCloseMessage.go | 9 +--- net/server/internal/api_setOpenMessage.go | 1 + net/web/src/Api/getCardCloseMessage.js | 8 +++ net/web/src/Api/setCardCloseMessage.js | 8 +++ net/web/src/User/Contact/Contact.jsx | 28 +++++----- net/web/src/User/Contact/useContact.hook.js | 52 +++++++++++++++---- 8 files changed, 122 insertions(+), 34 deletions(-) create mode 100644 net/server/internal/api_getAccountListingMessage.go create mode 100644 net/web/src/Api/getCardCloseMessage.js create mode 100644 net/web/src/Api/setCardCloseMessage.js diff --git a/net/server/internal/api_getAccountListingMessage.go b/net/server/internal/api_getAccountListingMessage.go new file mode 100644 index 00000000..d9800de9 --- /dev/null +++ b/net/server/internal/api_getAccountListingMessage.go @@ -0,0 +1,48 @@ +package databag + +import ( + "errors" + "net/http" + "gorm.io/gorm" + "databag/internal/store" + "github.com/gorilla/mux" +) + +func GetAccountListingMessage(w http.ResponseWriter, r *http.Request) { + + // get referenced account guid + params := mux.Vars(r) + guid := params["guid"] + + var account store.Account + if err := store.DB.Preload("AccountDetail").Where("guid = ? AND searchable = ? AND disabled = ?", guid, true, false).First(&account).Error; err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + ErrResponse(w, http.StatusNotFound, err) + } else { + ErrResponse(w, http.StatusInternalServerError, err) + } + return + } + detail := account.AccountDetail; + + // generate identity DataMessage + identity := Identity{ + Revision: account.ProfileRevision, + Handle: account.Username, + Name: detail.Name, + Description: detail.Description, + Location: detail.Location, + Image: detail.Image, + Version: APP_VERSION, + Node: getStrConfigValue(CONFIG_DOMAIN, ""), + } + msg, res := WriteDataMessage(detail.PrivateKey, detail.PublicKey, detail.KeyType, + APP_SIGNPKCS1V15, account.Guid, APP_MSGIDENTITY, &identity) + if res != nil { + ErrResponse(w, http.StatusInternalServerError, res) + return + } + + WriteResponse(w, msg) +} + diff --git a/net/server/internal/api_getCloseMessage.go b/net/server/internal/api_getCloseMessage.go index f40d7a9d..3ca87d58 100644 --- a/net/server/internal/api_getCloseMessage.go +++ b/net/server/internal/api_getCloseMessage.go @@ -10,7 +10,7 @@ import ( func GetCloseMessage(w http.ResponseWriter, r *http.Request) { - account, code, res := BearerAppToken(r, true); + account, code, res := ParamAgentToken(r, true); if res != nil { ErrResponse(w, code, res) return diff --git a/net/server/internal/api_setCloseMessage.go b/net/server/internal/api_setCloseMessage.go index 4ea7b739..b9d68862 100644 --- a/net/server/internal/api_setCloseMessage.go +++ b/net/server/internal/api_setCloseMessage.go @@ -51,14 +51,7 @@ func SetCloseMessage(w http.ResponseWriter, r *http.Request) { slot := card.CardSlot err = store.DB.Transaction(func(tx *gorm.DB) error { - if card.Status == APP_CARDPENDING { - if res := tx.Model(&slot).Update("card_id", 0).Error; res != nil { - return res - } - if res := tx.Delete(&card).Error; res != nil { - return res - } - } else { + if card.Status != APP_CARDPENDING { if res := tx.Model(&card).Update("status", APP_CARDCONFIRMED).Error; res != nil { return res } diff --git a/net/server/internal/api_setOpenMessage.go b/net/server/internal/api_setOpenMessage.go index 9c95d4e6..12a2900d 100644 --- a/net/server/internal/api_setOpenMessage.go +++ b/net/server/internal/api_setOpenMessage.go @@ -128,6 +128,7 @@ func SetOpenMessage(w http.ResponseWriter, r *http.Request) { card.Status = APP_CARDCONNECTED } card.OutToken = connect.Token + card.DetailRevision = account.CardRevision + 1 // save contact card err = store.DB.Transaction(func(tx *gorm.DB) error { diff --git a/net/web/src/Api/getCardCloseMessage.js b/net/web/src/Api/getCardCloseMessage.js new file mode 100644 index 00000000..a769c2f0 --- /dev/null +++ b/net/web/src/Api/getCardCloseMessage.js @@ -0,0 +1,8 @@ +import { checkResponse, fetchWithTimeout } from './fetchUtil'; + +export async function getCardCloseMessage(token, cardId) { + let message = await fetchWithTimeout(`/contact/cards/${cardId}/closeMessage?agent=${token}`, { method: 'GET' }); + checkResponse(message); + return await message.json(); +} + diff --git a/net/web/src/Api/setCardCloseMessage.js b/net/web/src/Api/setCardCloseMessage.js new file mode 100644 index 00000000..4e0a64b2 --- /dev/null +++ b/net/web/src/Api/setCardCloseMessage.js @@ -0,0 +1,8 @@ +import { checkResponse, fetchWithTimeout } from './fetchUtil'; + +export async function setCardCloseMessage(server, message) { + let status = await fetchWithTimeout(`https://${server}/contact/closeMessage`, { method: 'PUT', body: JSON.stringify(message) }); + checkResponse(status); + return await status.json(); +} + diff --git a/net/web/src/User/Contact/Contact.jsx b/net/web/src/User/Contact/Contact.jsx index 087df8ef..99e1ca0d 100644 --- a/net/web/src/User/Contact/Contact.jsx +++ b/net/web/src/User/Contact/Contact.jsx @@ -41,7 +41,7 @@ export function Contact() { const Disconnect = () => { if (state.showButtons.disconnect) { - return Disconnect + return actions.disconnect()}>Disconnect } return <> } @@ -55,14 +55,21 @@ export function Contact() { const Cancel = () => { if (state.showButtons.cancel) { - return Cancel Request + return actions.disconnect()}>Cancel Request } return <> } const Ignore = () => { if (state.showButtons.ignore) { - return Ignore Request + return actions.remove()}>Ignore Request + } + return <> + } + + const Deny = () => { + if (state.showButtons.deny) { + return actions.disconnect()}>Ignore Request } return <> } @@ -83,7 +90,7 @@ export function Contact() { const SaveRequest = () => { if (state.showButtons.saveRequest) { - return Save & Request + return actions.saveConnect()}>Save & Connect } return <> } @@ -95,16 +102,9 @@ export function Contact() { return <> } - const SaveAccept = () => { - if (state.showButtons.saveAccept) { - return Save & Accept - } - return <> - } - const Accept = () => { if (state.showButtons.accept) { - return Accept Connection + return actions.connect()}>Accept Connection } return <> } @@ -115,15 +115,15 @@ export function Contact() {
{ state.handle }
- + + -
actions.close()} icon={} /> diff --git a/net/web/src/User/Contact/useContact.hook.js b/net/web/src/User/Contact/useContact.hook.js index 8e55d9a1..caefbbf6 100644 --- a/net/web/src/User/Contact/useContact.hook.js +++ b/net/web/src/User/Contact/useContact.hook.js @@ -7,6 +7,8 @@ import { removeCard } from '../../Api/removeCard'; import { setCardConnecting, setCardConnected, setCardConfirmed } from '../../Api/setCardStatus'; import { getCardOpenMessage } from '../../Api/getCardOpenMessage'; import { setCardOpenMessage } from '../../Api/setCardOpenMessage'; +import { getCardCloseMessage } from '../../Api/getCardCloseMessage'; +import { setCardCloseMessage } from '../../Api/setCardCloseMessage'; export function useContact() { @@ -60,7 +62,7 @@ export function useContact() { } updateState({ busy: false }); } - }, + }, connect: async () => { if (!state.busy) { updateState({ busy: true }); @@ -78,11 +80,24 @@ export function useContact() { updateState({ busy: false }); } }, - disconnect: () => { - }, - ignore: () => { - }, - cancel: () => { + disconnect: async () => { + if (!state.busy) { + updateState({ busy: true }); + try { + await setCardConfirmed(app.state.token, state.cardId); + try { + let message = await getCardCloseMessage(app.state.token, state.cardId); + await setCardCloseMessage(state.node, message); + } + catch (err) { + console.log(err); + } + } + catch (err) { + window.alert(err); + } + updateState({ busy: false }); + } }, remove: async () => { if (!state.busy) { @@ -97,9 +112,24 @@ export function useContact() { updateState({ busy: false }); } }, - saveRequest: () => { - }, - saveAccept: () => { + saveConnect: async () => { + if (!state.busy) { + updateState({ busy: true }); + try { + let profile = await getListingMessage(state.node, guid); + let card = await addCard(app.state.token, profile); + await setCardConnecting(app.state.token, card.id); + let open = await getCardOpenMessage(app.state.token, card.id); + let contact = await setCardOpenMessage(state.node, open); + if (contact.status === 'connected') { + await setCardConnected(app.state.token, card.id, contact.token, contact.viewRevision, contact.articleRevision, contact.channelRevision, contact.profileRevision); + } + } + catch (err) { + window.alert(err); + } + updateState({ busy: false }); + } }, }; @@ -131,7 +161,7 @@ export function useContact() { } if (status === 'pending') { updateState({ status: 'pending' }); - updateState({ showButtons: { ignore: true, confirm: true, saveAccept: true }}); + updateState({ showButtons: { ignore: true, confirm: true, saveRequest: true }}); } if (status === 'confirmed') { updateState({ status: 'confirmed' }); @@ -139,7 +169,7 @@ export function useContact() { } if (status === 'requested') { updateState({ status: 'requested' }); - updateState({ showButtons: { ignore: true, accept: true }}); + updateState({ showButtons: { deny: true, accept: true }}); } } else if (data.state) {