Skip to content

Commit

Permalink
Connect /add-sub-account to PG
Browse files Browse the repository at this point in the history
  • Loading branch information
ccali11 committed Mar 27, 2023
1 parent cbc46fe commit 7d6e29e
Show file tree
Hide file tree
Showing 4 changed files with 57 additions and 65 deletions.
50 changes: 15 additions & 35 deletions apps/web/src/composables/users.ts
Original file line number Diff line number Diff line change
Expand Up @@ -62,42 +62,22 @@ export default function useUsers () {

async function addAccount(provider: ProviderString, address: string, currency: Currency): Promise<{ error: boolean, message: string, data: User | null }> {
address = address.toLowerCase()
const account = user.value?.accounts?.find((account: Account) => {
const accountAddress = account.address.toLowerCase()
const accountProvider = account.walletProvider
const accountCurrency = account.currency
const addressIsEqual = accountAddress === address
const providerIsEqual = accountProvider === provider
const currencyIsEqual = accountCurrency === currency
const isEqual = addressIsEqual && providerIsEqual && currencyIsEqual
return isEqual
}) as Account
if (account) {
return { error: false, message: `Account already exists on user: ${account}`, data: user.value }
} else {
const accountToAdd = {
address,
currency,
balance: '0', // TODO: Decide how we want to handle this
balanceSnapshots: [],
roi: 0,
walletProvider: provider
}
const requestOptions = {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
address: user.value?.address,
account: accountToAdd
})
}
const response = await fetch(`${usersBaseURL}/user/add-sub-account`, requestOptions)
const { data: userAccount } = await response.json()
user.value = userAccount
return { error: false, message: `Account added to user: ${userAccount}`, data: userAccount }
const accountToAdd = {
address,
walletProvider: provider,
ownerAddress: user.value?.Address,
}
const requestOptions = {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ account: accountToAdd })
}
const response = await fetch(`${usersBaseURL}/user/add-sub-account`, requestOptions)
const { data: userAccount } = await response.json()
user.value = userAccount
return { error: false, message: `Account added to user: ${userAccount}`, data: userAccount }
}

// TODO: Refactor this next. 2/14
Expand Down
17 changes: 14 additions & 3 deletions apps/web/src/composables/wallet.ts
Original file line number Diff line number Diff line change
Expand Up @@ -127,12 +127,23 @@ export default function useWallet() {
console.log('already logged in! attempting to add account')
const connectedAddress = await getConnectedAddressFromProvider(provider, currency) // TODO: Remove currency from here? Maybe not.
const connectedCurrency = await detectCurrencyInProvider(provider, currency) as Currency
const response = await addAccount(provider, connectedAddress, connectedCurrency)
if (!response?.error) {
const accountExists = user.value?.Accounts?.some((account: Account) => account.address === connectedAddress && account.wallet_provider === provider)
if (accountExists) {
alert('Account already exists; setting provider, address, and currency')
setSelectedProvider(provider)
setSelectedAddress(connectedAddress)
setSelectedCurrency(connectedCurrency)
primaryAddress.value = response.data?.address as string
return user.value
} else {
// If no, add account using users api
const response = await addAccount(provider, connectedAddress, connectedCurrency)
// If api query is successful, set the user.value = to the response data (which should be the user)
if (!response?.error) {
setSelectedProvider(provider)
setSelectedAddress(connectedAddress)
setSelectedCurrency(connectedCurrency)
primaryAddress.value = response.data?.address as string
}
}
}
console.log('user.value after connecting wallet :>> ', user.value)
Expand Down
4 changes: 2 additions & 2 deletions services/users/src/providers/db.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,9 @@ export default function useDB() {
*/
async function addAccount(account: Account, createdAt?: string) : Promise<Account> {
if (!createdAt) createdAt = new Date().toISOString()
const { address: accountAddress, ownerAddress, walletProvider } = account
const { address, ownerAddress, walletProvider } = account
const text = 'INSERT INTO accounts (address, owner_address, wallet_provider, created_at) VALUES ($1, $2, $3, $4) RETURNING *;'
const params = [accountAddress, ownerAddress, walletProvider, createdAt]
const params = [address, ownerAddress, walletProvider, createdAt]
const rows = await postgres.query(text, params)
return rows[0] as Account
}
Expand Down
51 changes: 26 additions & 25 deletions services/users/src/routes/user.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { SessionRequest } from 'supertokens-node/framework/express'
import useDB from '../providers/db'

const router = express.Router()
const { getUser } = useDB()
const { getUser, addAccount } = useDB()

router.get('/', verifySession(), async (req: SessionRequest, res: express.Response) => {
const address = req.session?.getUserId() as string
Expand All @@ -21,31 +21,13 @@ router.get('/', verifySession(), async (req: SessionRequest, res: express.Respon
})
})

// TODO: Think through handling changing primary address with SuperTokens Sessions.
router.put('/update-primary-account', async (req: express.Request, res: express.Response) => {
let { primaryAddress, updatedProvider, updatedAddress } = req.body
primaryAddress = primaryAddress.toLowerCase()
updatedProvider = updatedProvider.toLowerCase()
updatedAddress = updatedAddress.toLowerCase()
const user = userCollection.find(user => user.address === primaryAddress)
if (user) {
user.address = updatedAddress
}
res.setHeader('Content-Type', 'application/json')
res.status(200)
res.json({
message: 'Primary account updated',
error: false,
data: user
})
})

router.post('/add-sub-account', verifySession(), async (req: SessionRequest, res: express.Response) => {
try {
console.log('ADDING ACCOUNT!')
const { account } = req.body
const { address } = req.body
const { ownerAddress } = account
const userSessionsAddress = req.session?.getUserId()
const validatedAddress = validateAddress(userSessionsAddress, address)
const validatedAddress = validateAddress(userSessionsAddress, ownerAddress)
if (!validatedAddress) {
res.setHeader('Content-Type', 'application/json')
res.status(200)
Expand All @@ -56,14 +38,14 @@ router.post('/add-sub-account', verifySession(), async (req: SessionRequest, res
})
return
}
const existingUser = userCollection.find(user => user.address === address)
if (existingUser) existingUser.accounts?.push(account)
await addAccount(account)
const user = await getUser(ownerAddress)
res.setHeader('Content-Type', 'application/json')
res.status(200)
res.json({
message: 'Account added',
error: false,
data: existingUser
data: user
})
} catch (err) {
console.log('err :>> ', err)
Expand Down Expand Up @@ -119,6 +101,25 @@ router.post('/remove-sub-account', verifySession(), async (req: express.Request,
}
})

// TODO: Think through handling changing primary address with SuperTokens Sessions.
router.put('/update-primary-account', async (req: express.Request, res: express.Response) => {
let { primaryAddress, updatedProvider, updatedAddress } = req.body
primaryAddress = primaryAddress.toLowerCase()
updatedProvider = updatedProvider.toLowerCase()
updatedAddress = updatedAddress.toLowerCase()
const user = userCollection.find(user => user.address === primaryAddress)
if (user) {
user.address = updatedAddress
}
res.setHeader('Content-Type', 'application/json')
res.status(200)
res.json({
message: 'Primary account updated',
error: false,
data: user
})
})

function validateAddress(userSessionsAddress:string | undefined, address:string) {
return userSessionsAddress === address
}
Expand Down

0 comments on commit 7d6e29e

Please sign in to comment.