Unified Address support #8
2 changed files with 136 additions and 15 deletions
|
@ -1244,7 +1244,10 @@ routes pipe config = do
|
||||||
else status forbidden403
|
else status forbidden403
|
||||||
else case decodeUfvk (C.pack q) of
|
else case decodeUfvk (C.pack q) of
|
||||||
Nothing -> status badRequest400
|
Nothing -> status badRequest400
|
||||||
Just fvk ->
|
Just fvk -> do
|
||||||
|
if isValidUnifiedAddress $
|
||||||
|
C.pack . T.unpack $ uaddress u'
|
||||||
|
then do
|
||||||
if matchOrchardAddress
|
if matchOrchardAddress
|
||||||
(C.pack q)
|
(C.pack q)
|
||||||
(C.pack . T.unpack $ uaddress u')
|
(C.pack . T.unpack $ uaddress u')
|
||||||
|
@ -1255,7 +1258,24 @@ routes pipe config = do
|
||||||
Nothing -> status badRequest400
|
Nothing -> status badRequest400
|
||||||
Just o' -> do
|
Just o' -> do
|
||||||
unless (oviewkey o' /= "") $ do
|
unless (oviewkey o' /= "") $ do
|
||||||
liftAndCatchIO $ run (upsertViewingKey o' q)
|
liftAndCatchIO $
|
||||||
|
run (upsertViewingKey o' q)
|
||||||
|
status created201
|
||||||
|
else status forbidden403
|
||||||
|
else do
|
||||||
|
if matchSaplingAddress
|
||||||
|
(s_key fvk)
|
||||||
|
(bytes . decodeBech32 . C.pack . T.unpack $
|
||||||
|
uaddress u')
|
||||||
|
then do
|
||||||
|
owner <-
|
||||||
|
liftAndCatchIO $ run (findOwner $ uaddress u')
|
||||||
|
case cast' . Doc =<< owner of
|
||||||
|
Nothing -> status badRequest400
|
||||||
|
Just o' -> do
|
||||||
|
unless (oviewkey o' /= "") $ do
|
||||||
|
liftAndCatchIO $
|
||||||
|
run (upsertViewingKey o' q)
|
||||||
status created201
|
status created201
|
||||||
else status forbidden403
|
else status forbidden403
|
||||||
--Get items associated with the given address
|
--Get items associated with the given address
|
||||||
|
|
105
test/Spec.hs
105
test/Spec.hs
|
@ -691,6 +691,8 @@ main = do
|
||||||
"zxviews1qdjagrrpqqqqpq8es75mlu6rref0qyrstchf8dxzeygtsejwfqu8ckhwl2qj5m8am7lmupxk3vkvdjm8pawjpmesjfapvsqw96pa46c2z0kk7letrxf7mkltwz54fwpxc7kc79mm5kce3rwn5ssl009zwsra2spppwgrx25s9k5hq65f69l4jz2tjmqgy0pl49qmtaj3nudk6wglwe2hpa327hydlchtyq9av6wjd6hu68e04ahwk9a9n2kt0kj3nj99nue65awtu5cwwcpjs"
|
"zxviews1qdjagrrpqqqqpq8es75mlu6rref0qyrstchf8dxzeygtsejwfqu8ckhwl2qj5m8am7lmupxk3vkvdjm8pawjpmesjfapvsqw96pa46c2z0kk7letrxf7mkltwz54fwpxc7kc79mm5kce3rwn5ssl009zwsra2spppwgrx25s9k5hq65f69l4jz2tjmqgy0pl49qmtaj3nudk6wglwe2hpa327hydlchtyq9av6wjd6hu68e04ahwk9a9n2kt0kj3nj99nue65awtu5cwwcpjs"
|
||||||
let vk2 =
|
let vk2 =
|
||||||
"zxviews1qdjagrrpqqqqpq8es75mlufakef0qyrstchf8dxzeygtsejwfqu8ckhwl2qj5m8am7lmupxk3vkvdjm8pawjpmesjfapvsqw96pa46c2z0kk7letrxf7mkltwz54fwpxc7kc79mm5kce3rwn5ssl009zwsra2spppwgrx25s9k5hq65f69l4jz2tjmqgy0pl49qmtaj3nudk6wglwe2hpa327hydlchtyq9av6wjd6hu68e04ahwk9a9n2kt0kj3nj99nue65awtu5cwwcpjs"
|
"zxviews1qdjagrrpqqqqpq8es75mlufakef0qyrstchf8dxzeygtsejwfqu8ckhwl2qj5m8am7lmupxk3vkvdjm8pawjpmesjfapvsqw96pa46c2z0kk7letrxf7mkltwz54fwpxc7kc79mm5kce3rwn5ssl009zwsra2spppwgrx25s9k5hq65f69l4jz2tjmqgy0pl49qmtaj3nudk6wglwe2hpa327hydlchtyq9av6wjd6hu68e04ahwk9a9n2kt0kj3nj99nue65awtu5cwwcpjs"
|
||||||
|
let vk3 =
|
||||||
|
"uview1u833rp8yykd7h4druwht6xp6k8krle45fx8hqsw6vzw63n24atxpcatws82z092kryazuu6d7rayyut8m36wm4wpjy2z8r9hj48fx5pf49gw4sjrq8503qpz3vqj5hg0vg9vsqeasg5qjuyh94uyfm7v76udqcm2m0wfc25hcyqswcn56xxduq3xkgxkr0l73cjy88fdvf90eq5fda9g6x7yv7d0uckpevxg6540wc76xrc4axxvlt03ptaa2a0rektglmdy68656f3uzcdgqqyu0t7wk5cvwghyyvgqc0rp3vgu5ye4nd236ml57rjh083a2755qemf6dk6pw0qrnfm7246s8eg2hhzkzpf9h73chhng7xhmyem2sjh8rs2m9nhfcslsgenm"
|
||||||
it "returns 401 with bad session" $ do
|
it "returns 401 with bad session" $ do
|
||||||
req <-
|
req <-
|
||||||
testPostJson "/api/ownervk" $
|
testPostJson "/api/ownervk" $
|
||||||
|
@ -731,7 +733,7 @@ main = do
|
||||||
[("session", Just "35bfb9c2-9ad2-4fe5-adda-99d63b8dcdcd")]
|
[("session", Just "35bfb9c2-9ad2-4fe5-adda-99d63b8dcdcd")]
|
||||||
req
|
req
|
||||||
getResponseStatus res `shouldBe` badRequest400
|
getResponseStatus res `shouldBe` badRequest400
|
||||||
it "succeeds with correct key" $ do
|
it "succeeds with correct Sapling key" $ do
|
||||||
req <-
|
req <-
|
||||||
testPostJson "/api/ownervk" $
|
testPostJson "/api/ownervk" $
|
||||||
A.object ["payload" A..= (vk1 :: String)]
|
A.object ["payload" A..= (vk1 :: String)]
|
||||||
|
@ -741,6 +743,26 @@ main = do
|
||||||
[("session", Just "35bfb9c2-9ad2-4fe5-adda-99d63b8dcdcd")]
|
[("session", Just "35bfb9c2-9ad2-4fe5-adda-99d63b8dcdcd")]
|
||||||
req
|
req
|
||||||
getResponseStatus res `shouldBe` created201
|
getResponseStatus res `shouldBe` created201
|
||||||
|
it "succeeds with correct Unified key and UA" $ do
|
||||||
|
req <-
|
||||||
|
testPostJson "/api/ownervk" $
|
||||||
|
A.object ["payload" A..= (vk3 :: String)]
|
||||||
|
res <-
|
||||||
|
httpLBS $
|
||||||
|
setRequestQueryString
|
||||||
|
[("session", Just "35bfb9c2-9ad2-4fe5-daad-99d63b8dcdaa")]
|
||||||
|
req
|
||||||
|
getResponseStatus res `shouldBe` created201
|
||||||
|
xit "succeeds with correct Unified key and Sapling address" $ do
|
||||||
|
req <-
|
||||||
|
testPostJson "/api/ownervk" $
|
||||||
|
A.object ["payload" A..= (vk3 :: String)]
|
||||||
|
res <-
|
||||||
|
httpLBS $
|
||||||
|
setRequestQueryString
|
||||||
|
[("session", Just "35bfb9c2-a92d-4fe5-daad-99d63b8dcdaa")]
|
||||||
|
req
|
||||||
|
getResponseStatus res `shouldBe` created201
|
||||||
around handleDb $
|
around handleDb $
|
||||||
describe "Database actions" $ do
|
describe "Database actions" $ do
|
||||||
describe "authentication" $ do
|
describe "authentication" $ do
|
||||||
|
@ -1179,8 +1201,25 @@ startAPI config = do
|
||||||
1613487
|
1613487
|
||||||
"8ea140fbb30615d6cae383c4f62f3ad9afb10b804f63138d5b53990bd56e0162"
|
"8ea140fbb30615d6cae383c4f62f3ad9afb10b804f63138d5b53990bd56e0162"
|
||||||
True
|
True
|
||||||
|
let myUser3 =
|
||||||
|
User
|
||||||
|
(Just (read "6272a90f2b05a74cf1500003" :: ObjectId))
|
||||||
|
"u15hjz9v46azzmdept050heh8795qxzwy2pykg097lg69jpk4qzah90cj2q4amq0c07gta60x8qgw00qewcy3hg9kv9h6zjkh3jc66vr40u6uu2dxmqkqhypud95vm0gq7y5ga7c8psdqgthsrwvgd676a2pavpcd4euwwapgackxa3qhvga0wnl0k6vncskxlq94vqwjd7zepy3qd5jh"
|
||||||
|
"35bfb9c2-9ad2-4fe5-daad-99d63b8dcdaa"
|
||||||
|
1613487
|
||||||
|
"8ea140fbb30615d6cae383c4f62f3ad9afb10b804f63138d5b53990bd56e0162"
|
||||||
|
True
|
||||||
|
let myUser4 =
|
||||||
|
User
|
||||||
|
(Just (read "6272a90f2b05a74cf7500003" :: ObjectId))
|
||||||
|
"zs1fau9x305eztcdm5f08q9uc4hmvvjpjrgjcwcj0mjwhd83pdj0j92rxwqp6zkjmz3e49ej4xrcc8"
|
||||||
|
"35bfb9c2-a92d-4fe5-daad-99d63b8dcdaa"
|
||||||
|
1613487
|
||||||
|
"8ea140fbb30615d6cae383c4f62f3ad9afb10b804f63138d5b53990bd56e0162"
|
||||||
|
True
|
||||||
let userList =
|
let userList =
|
||||||
map unwrapDoc $ filter filterDocs $ val <$> [myUser, myUser1, myUser2]
|
map unwrapDoc $
|
||||||
|
filter filterDocs $ val <$> [myUser, myUser1, myUser2, myUser3, myUser4]
|
||||||
_ <- access pipe master "test" (insertAll_ "users" userList)
|
_ <- access pipe master "test" (insertAll_ "users" userList)
|
||||||
let myOwner =
|
let myOwner =
|
||||||
Owner
|
Owner
|
||||||
|
@ -1236,6 +1275,60 @@ startAPI config = do
|
||||||
False
|
False
|
||||||
""
|
""
|
||||||
""
|
""
|
||||||
|
let myOwner2 =
|
||||||
|
Owner
|
||||||
|
(Just (read "627ad3492b05a76be3700008"))
|
||||||
|
"u15hjz9v46azzmdept050heh8795qxzwy2pykg097lg69jpk4qzah90cj2q4amq0c07gta60x8qgw00qewcy3hg9kv9h6zjkh3jc66vr40u6uu2dxmqkqhypud95vm0gq7y5ga7c8psdqgthsrwvgd676a2pavpcd4euwwapgackxa3qhvga0wnl0k6vncskxlq94vqwjd7zepy3qd5jh"
|
||||||
|
"Test shop 3"
|
||||||
|
"usd"
|
||||||
|
False
|
||||||
|
0
|
||||||
|
False
|
||||||
|
0
|
||||||
|
"Roxy"
|
||||||
|
"Foo"
|
||||||
|
"roxy@zgo.cash"
|
||||||
|
"1 Main St"
|
||||||
|
"Mpls"
|
||||||
|
"Minnesota"
|
||||||
|
"55401"
|
||||||
|
""
|
||||||
|
"missyfoo.io"
|
||||||
|
"United States"
|
||||||
|
True
|
||||||
|
False
|
||||||
|
False
|
||||||
|
(UTCTime (fromGregorian 2024 8 6) (secondsToDiffTime 0))
|
||||||
|
False
|
||||||
|
""
|
||||||
|
""
|
||||||
|
let myOwner3 =
|
||||||
|
Owner
|
||||||
|
(Just (read "627ad3492b05a76be3750008"))
|
||||||
|
"zs1fau9x305eztcdm5f08q9uc4hmvvjpjrgjcwcj0mjwhd83pdj0j92rxwqp6zkjmz3e49ej4xrcc8"
|
||||||
|
"Test shop 4"
|
||||||
|
"usd"
|
||||||
|
False
|
||||||
|
0
|
||||||
|
False
|
||||||
|
0
|
||||||
|
"Roxy"
|
||||||
|
"Foo"
|
||||||
|
"roxy@zgo.cash"
|
||||||
|
"1 Main St"
|
||||||
|
"Mpls"
|
||||||
|
"Minnesota"
|
||||||
|
"55401"
|
||||||
|
""
|
||||||
|
"missyfoo.io"
|
||||||
|
"United States"
|
||||||
|
True
|
||||||
|
False
|
||||||
|
False
|
||||||
|
(UTCTime (fromGregorian 2024 8 6) (secondsToDiffTime 0))
|
||||||
|
False
|
||||||
|
""
|
||||||
|
""
|
||||||
_ <- access pipe master "test" (Database.MongoDB.delete (select [] "owners"))
|
_ <- access pipe master "test" (Database.MongoDB.delete (select [] "owners"))
|
||||||
let o = val myOwner
|
let o = val myOwner
|
||||||
case o of
|
case o of
|
||||||
|
@ -1245,6 +1338,14 @@ startAPI config = do
|
||||||
case o1 of
|
case o1 of
|
||||||
Doc d1 -> access pipe master "test" (insert_ "owners" d1)
|
Doc d1 -> access pipe master "test" (insert_ "owners" d1)
|
||||||
_ -> fail "Couldn't save Owner1 in DB"
|
_ -> fail "Couldn't save Owner1 in DB"
|
||||||
|
let o2 = val myOwner2
|
||||||
|
case o2 of
|
||||||
|
Doc d2 -> access pipe master "test" (insert_ "owners" d2)
|
||||||
|
_ -> fail "Couldn't save Owner2 in DB"
|
||||||
|
let o3 = val myOwner3
|
||||||
|
case o3 of
|
||||||
|
Doc d3 -> access pipe master "test" (insert_ "owners" d3)
|
||||||
|
_ -> fail "Couldn't save Owner2 in DB"
|
||||||
_ <- access pipe master "test" (Database.MongoDB.delete (select [] "orders"))
|
_ <- access pipe master "test" (Database.MongoDB.delete (select [] "orders"))
|
||||||
myTs <- liftIO getCurrentTime
|
myTs <- liftIO getCurrentTime
|
||||||
let myOrder =
|
let myOrder =
|
||||||
|
|
Loading…
Reference in a new issue