Skip to content

Commit e0863e9

Browse files
Merge pull request #23 from unniznd/feature_ipns_apis
feature: Added all the IPNS APIs and tested
2 parents d95c8c0 + 8dc81c8 commit e0863e9

9 files changed

+327
-1
lines changed

src/lighthouseweb3/__init__.py

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,11 @@
99
download as _download,
1010
get_file_info as getFileInfo,
1111
get_balance as getBalance,
12-
get_api_key as getApiKey
12+
get_api_key as getApiKey,
13+
ipns_generate_key as ipnsGenerateKey,
14+
ipns_publish_record as ipnsPublishRecord,
15+
get_ipns_record as getIpnsRecord,
16+
remove_ipns_record as removeIpnsRecord,
1317
)
1418

1519

@@ -57,6 +61,51 @@ def getBalance(self):
5761
return getBalance.get_balance(self.token)
5862
except Exception as e:
5963
raise e
64+
65+
def generateKey(self):
66+
"""
67+
Generate a new IPNS key for the authenticated user.
68+
:return: dict, The generated IPNS key information.
69+
"""
70+
try:
71+
return ipnsGenerateKey.ipns_generate_key(self.token)
72+
except Exception as e:
73+
raise e
74+
75+
def publishRecord(self, cid: str, keyName: str):
76+
"""
77+
Publish an IPNS record for a given CID and key name.
78+
:param cid: str, Content Identifier to publish
79+
:param keyName: str, Name of the IPNS key to use
80+
:return: dict, The published IPNS record information
81+
"""
82+
try:
83+
return ipnsPublishRecord.ipns_publish_record(self.token, cid, keyName)
84+
except Exception as e:
85+
raise e
86+
87+
def getAllKeys(self):
88+
"""
89+
Retrieves all IPNS records associated with the current token.
90+
return: list A list of IPNS records retrieved using the provided token.
91+
"""
92+
93+
try:
94+
return getIpnsRecord.get_ipns_records(self.token)
95+
except Exception as e:
96+
raise e
97+
98+
def removeKey(self, keyName: str):
99+
"""
100+
Remove IPNS record of the given keyName
101+
:param keyName: str, Name of the IPNS key to use
102+
:return: dict, A dict of removed IPNS record.
103+
"""
104+
105+
try:
106+
return removeIpnsRecord.remove_ipns_record(self.token, keyName)
107+
except Exception as e:
108+
raise e
60109

61110
@staticmethod
62111
def downloadBlob(dist: io.BufferedWriter, cid: str, chunk_size=1024*1024*10):
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
from .config import Config
2+
import requests as req
3+
4+
def get_ipns_records(token: str):
5+
headers = {
6+
"Authorization": f"Bearer {token}",
7+
}
8+
url = f"{Config.lighthouse_api}/api/ipns/get_ipns_records"
9+
try:
10+
response = req.get(url, headers=headers)
11+
except Exception as e:
12+
raise Exception("Failed to get ipns records")
13+
14+
if response.status_code != 200:
15+
return response.json()
16+
17+
return {
18+
"data": response.json()
19+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
from .config import Config
2+
import requests as req
3+
4+
def ipns_generate_key(token: str):
5+
headers = {
6+
"Authorization": f"Bearer {token}",
7+
}
8+
url = f"{Config.lighthouse_api}/api/ipns/generate_key"
9+
try:
10+
response = req.get(url, headers=headers)
11+
except Exception as e:
12+
raise Exception("Failed to ipns generate key")
13+
14+
if response.status_code != 200:
15+
return response.json()
16+
17+
return {
18+
"data": response.json()
19+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
from .config import Config
2+
import requests as req
3+
4+
def ipns_publish_record(token: str, cid: str, keyName: str):
5+
headers = {
6+
"Authorization": f"Bearer {token}",
7+
}
8+
url = f"{Config.lighthouse_api}/api/ipns/publish_record?cid={cid}&keyName={keyName}"
9+
try:
10+
response = req.get(url, headers=headers)
11+
except Exception as e:
12+
raise Exception("Failed to ipns generate key")
13+
14+
if response.status_code != 200:
15+
return response.json()
16+
17+
return {
18+
"data": response.json()
19+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
from .config import Config
2+
import requests as req
3+
4+
def remove_ipns_record(token: str, keyName: str):
5+
headers = {
6+
"Authorization": f"Bearer {token}",
7+
}
8+
url = f"{Config.lighthouse_api}/api/ipns/remove_key?keyName={keyName}"
9+
try:
10+
response = req.delete(url, headers=headers)
11+
except Exception as e:
12+
raise Exception("Failed to remove ipns record")
13+
14+
if response.status_code != 200:
15+
return response.json()
16+
17+
return {
18+
"data": response.json()
19+
}

tests/test_get_ipns_record.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
#!/usr/bin/env python3
2+
import os
3+
import unittest
4+
from src.lighthouseweb3 import Lighthouse
5+
from .setup import parse_env
6+
7+
8+
class TestGetIPNSRecord(unittest.TestCase):
9+
10+
def test_get_ipns_records(self):
11+
"""test get_ipns_records function"""
12+
parse_env()
13+
l = Lighthouse(os.environ.get("LIGHTHOUSE_TOKEN"))
14+
res = l.getAllKeys()
15+
self.assertIsInstance(res, dict, "result is a dict")
16+
self.assertIsInstance(res.get("data"), list , "data is a dict")
17+
self.assertIsInstance(res.get("data")[0].get("ipnsName"), str , "ipnsName is a str")
18+
self.assertIsInstance(res.get("data")[0].get("ipnsId"), str , "ipnsId is a str")
19+
self.assertIsInstance(res.get("data")[0].get("publicKey"), str , "publicKey is a str")
20+
self.assertIsInstance(res.get("data")[0].get("cid"), str , "cid is a str")
21+
self.assertIsInstance(res.get("data")[0].get("lastUpdate"), int , "lastUpdate is a int")
22+
23+
def test_get_ipns_records_invalid_token(self):
24+
"""test get_ipns_records with invalid token"""
25+
parse_env()
26+
l = Lighthouse("invalid_token")
27+
with self.assertRaises(Exception) as context:
28+
l.generateKey()
29+
self.assertIn("authentication failed", str(context.exception).lower())

tests/test_ipns_generate_key.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
#!/usr/bin/env python3
2+
import os
3+
import unittest
4+
from src.lighthouseweb3 import Lighthouse
5+
from .setup import parse_env
6+
7+
8+
class TestIPNSGenerateKey(unittest.TestCase):
9+
10+
def test_ipns_generate_key(self):
11+
"""test ipns_generate_key function"""
12+
parse_env()
13+
l = Lighthouse(os.environ.get("LIGHTHOUSE_TOKEN"))
14+
res = l.generateKey()
15+
self.assertIsInstance(res, dict, "result is a dict")
16+
self.assertIsInstance(res.get("data"), dict , "data is a dict")
17+
self.assertIsInstance(res.get("data").get("ipnsName"), str , "ipnsName is a str")
18+
self.assertIsInstance(res.get("data").get("ipnsId"), str , "ipnsId is a dict")
19+
20+
def test_ipns_generate_key_invalid_token(self):
21+
"""test ipns_generate_key with invalid token"""
22+
parse_env()
23+
l = Lighthouse("invalid_token")
24+
with self.assertRaises(Exception) as context:
25+
l.generateKey()
26+
self.assertIn("authentication failed", str(context.exception).lower())
27+
28+

tests/test_ipns_publish_record.py

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
#!/usr/bin/env python3
2+
import os
3+
import unittest
4+
from src.lighthouseweb3 import Lighthouse
5+
from .setup import parse_env
6+
7+
8+
class TestIPNSPublishRecord(unittest.TestCase):
9+
10+
def test_ipns_publish_record(self):
11+
"""test ipns_publish_record function"""
12+
parse_env()
13+
14+
l = Lighthouse(os.environ.get("LIGHTHOUSE_TOKEN"))
15+
res = l.generateKey()
16+
17+
self.assertIsInstance(res, dict, "result is a dict")
18+
self.assertIsInstance(res.get("data"), dict , "data is a dict")
19+
self.assertIsInstance(res.get("data").get("ipnsName"), str , "ipnsName is a str")
20+
self.assertIsInstance(res.get("data").get("ipnsId"), str , "ipnsId is a dict")
21+
22+
record = l.publishRecord(
23+
'QmeMsykMDyD76zpAbinCy1cjb1KL6CVNBfB44am15U1XHh',
24+
res.get('data').get('ipnsName')
25+
)
26+
27+
self.assertIsInstance(record, dict, "record is a dict")
28+
self.assertIsInstance(record.get("data"), dict, "data is a dict")
29+
self.assertIsInstance(record.get("data").get("Name"), str, "name is a str")
30+
self.assertIsInstance(record.get("data").get("Value"), str, "value is a str")
31+
self.assertEqual(record.get("data").get("Value"), "/ipfs/QmeMsykMDyD76zpAbinCy1cjb1KL6CVNBfB44am15U1XHh")
32+
33+
def test_ipns_publish_record_invalid_token(self):
34+
"""test ipns_generate_key with invalid token"""
35+
parse_env()
36+
l = Lighthouse(os.environ.get("LIGHTHOUSE_TOKEN"))
37+
res = l.generateKey()
38+
39+
self.assertIsInstance(res, dict, "result is a dict")
40+
self.assertIsInstance(res.get("data"), dict , "data is a dict")
41+
self.assertIsInstance(res.get("data").get("ipnsName"), str , "ipnsName is a str")
42+
self.assertIsInstance(res.get("data").get("ipnsId"), str , "ipnsId is a dict")
43+
44+
l = Lighthouse("invalid_token")
45+
with self.assertRaises(Exception) as context:
46+
l.publishRecord(
47+
'QmeMsykMDyD76zpAbinCy1cjb1KL6CVNBfB44am15U1XHh',
48+
res.get('data').get('ipnsName')
49+
)
50+
self.assertIn("authentication failed", str(context.exception).lower())
51+
52+
def test_ipns_publish_record_invalid_cid(self):
53+
"""test ipns_generate_key with invalid cid"""
54+
l = Lighthouse(os.environ.get("LIGHTHOUSE_TOKEN"))
55+
res = l.generateKey()
56+
57+
self.assertIsInstance(res, dict, "result is a dict")
58+
self.assertIsInstance(res.get("data"), dict , "data is a dict")
59+
self.assertIsInstance(res.get("data").get("ipnsName"), str , "ipnsName is a str")
60+
self.assertIsInstance(res.get("data").get("ipnsId"), str , "ipnsId is a dict")
61+
62+
record = l.publishRecord(
63+
'invalid_cid',
64+
res.get('data').get('ipnsName')
65+
)
66+
self.assertIsInstance(record, dict, "record is a dict")
67+
self.assertIsInstance(record.get("error"), list, "error is a list")
68+
self.assertEqual(record.get("error")[0]['message'], 'Something went wrong.' )
69+
70+
def test_ipns_publish_record_invalid_key_name(self):
71+
"""test ipns_generate_key with invalid key name"""
72+
parse_env()
73+
74+
l = Lighthouse(os.environ.get("LIGHTHOUSE_TOKEN"))
75+
res = l.generateKey()
76+
77+
self.assertIsInstance(res, dict, "result is a dict")
78+
self.assertIsInstance(res.get("data"), dict , "data is a dict")
79+
self.assertIsInstance(res.get("data").get("ipnsName"), str , "ipnsName is a str")
80+
self.assertIsInstance(res.get("data").get("ipnsId"), str , "ipnsId is a dict")
81+
82+
record = l.publishRecord(
83+
'QmeMsykMDyD76zpAbinCy1cjb1KL6CVNBfB44am15U1XHh',
84+
'invalid_key_name'
85+
)
86+
self.assertIsInstance(record, dict, "record is a dict")
87+
self.assertIsInstance(record.get("error"), list, "error is a list")
88+
self.assertEqual(record.get("error")[0]['message'], 'Something went wrong.' )

tests/test_remove_ipns_record.py

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
#!/usr/bin/env python3
2+
import os
3+
import unittest
4+
from src.lighthouseweb3 import Lighthouse
5+
from .setup import parse_env
6+
7+
8+
class TestRemoveIPNSRecord(unittest.TestCase):
9+
10+
def test_ipns_remove_key(self):
11+
"""test ipns_remove_key function"""
12+
parse_env()
13+
l = Lighthouse(os.environ.get("LIGHTHOUSE_TOKEN"))
14+
15+
key = l.generateKey()
16+
17+
self.assertIsInstance(key, dict, "result is a dict")
18+
self.assertIsInstance(key.get("data"), dict , "data is a dict")
19+
self.assertIsInstance(key.get("data").get("ipnsName"), str , "ipnsName is a str")
20+
self.assertIsInstance(key.get("data").get("ipnsId"), str , "ipnsId is a dict")
21+
22+
23+
res = l.removeKey(key.get('data').get('ipnsName'))
24+
self.assertIsInstance(res, dict, "result is a dict")
25+
self.assertIsInstance(res.get("data"), dict , "data is a dict")
26+
self.assertIsInstance(res.get("data").get("Keys"), list , "Keys is a list")
27+
self.assertEqual(res.get("data").get("Keys")[0].get('Name'), key.get('data').get('ipnsName'))
28+
self.assertEqual(res.get("data").get("Keys")[0].get('Id'), key.get('data').get('ipnsId'))
29+
30+
def test_ipns_remove_key_invalid_token(self):
31+
"""test ipns_remove_key with invalid token"""
32+
parse_env()
33+
l = Lighthouse(os.environ.get("LIGHTHOUSE_TOKEN"))
34+
35+
key = l.generateKey()
36+
37+
self.assertIsInstance(key, dict, "result is a dict")
38+
self.assertIsInstance(key.get("data"), dict , "data is a dict")
39+
self.assertIsInstance(key.get("data").get("ipnsName"), str , "ipnsName is a str")
40+
self.assertIsInstance(key.get("data").get("ipnsId"), str , "ipnsId is a dict")
41+
42+
l = Lighthouse("invalid_token")
43+
key_name = key.get('data').get('ipnsName')
44+
with self.assertRaises(Exception) as context:
45+
l.removeKey(key_name)
46+
self.assertIn("authentication failed", str(context.exception).lower())
47+
48+
def test_ipns_remove_key_invalid_key_name(self):
49+
"""test ipns_remove_key with invalid key name"""
50+
parse_env()
51+
52+
l = Lighthouse(os.environ.get("LIGHTHOUSE_TOKEN"))
53+
res = l.removeKey('invalid_key_name')
54+
self.assertIsInstance(res, dict, "record is a dict")
55+
self.assertIsInstance(res.get("error"), list, "error is a list")
56+
self.assertEqual(res.get("error")[0]['message'], 'Something went wrong.' )

0 commit comments

Comments
 (0)