diff --git a/basicswap/basicswap.py b/basicswap/basicswap.py index 83b1413..6372e74 100644 --- a/basicswap/basicswap.py +++ b/basicswap/basicswap.py @@ -1259,7 +1259,7 @@ class BasicSwap(BaseApp): finally: self.closeSession(session) - def listIdentities(self, filters): + def listIdentities(self, filters={}): try: session = self.openSession() @@ -1303,7 +1303,7 @@ class BasicSwap(BaseApp): rv.append(identity) return rv finally: - self.closeSession(session) + self.closeSession(session, commit=False) def vacuumDB(self): try: @@ -6109,10 +6109,9 @@ class BasicSwap(BaseApp): self.mxDB.release() def listAutomationStrategies(self, filters={}): - self.mxDB.acquire() try: + session = self.openSession() rv = [] - session = scoped_session(self.session_factory) query_str = 'SELECT strats.record_id, strats.label, strats.type_ind FROM automationstrategies AS strats' query_str += ' WHERE strats.active_ind = 1 ' @@ -6137,9 +6136,7 @@ class BasicSwap(BaseApp): rv.append(row) return rv finally: - session.close() - session.remove() - self.mxDB.release() + self.closeSession(session, commit=False) def getAutomationStrategy(self, strategy_id: int): try: @@ -6158,19 +6155,16 @@ class BasicSwap(BaseApp): finally: self.closeSession(session) - def getLinkedStrategy(self, linked_type, linked_id): - self.mxDB.acquire() + def getLinkedStrategy(self, linked_type: int, linked_id): try: - session = scoped_session(self.session_factory) + session = self.openSession() query_str = 'SELECT links.strategy_id, strats.label FROM automationlinks links' + \ ' LEFT JOIN automationstrategies strats ON strats.record_id = links.strategy_id' + \ ' WHERE links.linked_type = {} AND links.linked_id = x\'{}\' AND links.active_ind = 1'.format(int(linked_type), linked_id.hex()) q = session.execute(query_str).first() return q finally: - session.close() - session.remove() - self.mxDB.release() + self.closeSession(session, commit=False) def newSMSGAddress(self, use_type=AddressTypes.RECV_OFFER, addressnote=None, session=None): now = int(time.time()) diff --git a/basicswap/js_server.py b/basicswap/js_server.py index 87f01fc..09d9e29 100644 --- a/basicswap/js_server.py +++ b/basicswap/js_server.py @@ -533,6 +533,56 @@ def js_identities(self, url_split, post_string: str, is_json: bool) -> bytes: return bytes(json.dumps(swap_client.listIdentities(filters)), 'UTF-8') +def js_automationstrategies(self, url_split, post_string: str, is_json: bool) -> bytes: + swap_client = self.server.swap_client + swap_client.checkSystemStatus() + + filters = { + 'page_no': 1, + 'limit': PAGE_LIMIT, + 'sort_by': 'created_at', + 'sort_dir': 'desc', + } + + if post_string != '': + post_data = getFormData(post_string, is_json) + + if have_data_entry(post_data, 'sort_by'): + sort_by = get_data_entry(post_data, 'sort_by') + assert (sort_by in ['created_at', 'rate']), 'Invalid sort by' + filters['sort_by'] = sort_by + if have_data_entry(post_data, 'sort_dir'): + sort_dir = get_data_entry(post_data, 'sort_dir') + assert (sort_dir in ['asc', 'desc']), 'Invalid sort dir' + filters['sort_dir'] = sort_dir + + if have_data_entry(post_data, 'offset'): + filters['offset'] = int(get_data_entry(post_data, 'offset')) + if have_data_entry(post_data, 'limit'): + filters['limit'] = int(get_data_entry(post_data, 'limit')) + assert (filters['limit'] > 0 and filters['limit'] <= PAGE_LIMIT), 'Invalid limit' + + if len(url_split) > 3: + strat_id = int(url_split[3]) + strat_data = swap_client.getAutomationStrategy(strat_id) + rv = { + 'record_id': strat_data.record_id, + 'label': strat_data.label, + 'type_ind': strat_data.type_ind, + 'only_known_identities': strat_data.only_known_identities, + 'num_concurrent': strat_data.num_concurrent, + 'data': json.loads(strat_data.data.decode('utf-8')), + 'note': '' if strat_data.note is None else strat_data.note, + } + return bytes(json.dumps(rv), 'UTF-8') + + rv = [] + strats = swap_client.listAutomationStrategies(filters) + for row in strats: + rv.append((row[0], row[1], row[2])) + return bytes(json.dumps(rv), 'UTF-8') + + def js_vacuumdb(self, url_split, post_string, is_json) -> bytes: swap_client = self.server.swap_client swap_client.checkSystemStatus() @@ -647,6 +697,7 @@ pages = { 'generatenotification': js_generatenotification, 'notifications': js_notifications, 'identities': js_identities, + 'automationstrategies': js_automationstrategies, 'vacuumdb': js_vacuumdb, 'getcoinseed': js_getcoinseed, 'setpassword': js_setpassword, diff --git a/tests/basicswap/test_run.py b/tests/basicswap/test_run.py index 4e4dd1c..1646ed3 100644 --- a/tests/basicswap/test_run.py +++ b/tests/basicswap/test_run.py @@ -160,6 +160,12 @@ class Test(BaseTest): assert (len(rv) == 1) assert (rv[0]['visibility_override'] == 1) + rv = read_json_api(1800, 'automationstrategies') + assert (len(rv) == 2) + + rv = read_json_api(1800, 'automationstrategies/1') + assert (rv['label'] == 'Accept All') + def test_01_verifyrawtransaction(self): txn = '0200000001eb6e5c4ebba4efa32f40c7314cad456a64008e91ee30b2dd0235ab9bb67fbdbb01000000ee47304402200956933242dde94f6cf8f195a470f8d02aef21ec5c9b66c5d3871594bdb74c9d02201d7e1b440de8f4da672d689f9e37e98815fb63dbc1706353290887eb6e8f7235012103dc1b24feb32841bc2f4375da91fa97834e5983668c2a39a6b7eadb60e7033f9d205a803b28fe2f86c17db91fa99d7ed2598f79b5677ffe869de2e478c0d1c02cc7514c606382012088a8201fe90717abb84b481c2a59112414ae56ec8acc72273642ca26cc7a5812fdc8f68876a914225fbfa4cb725b75e511810ac4d6f74069bdded26703520140b27576a914207eb66b2fd6ed9924d6217efc7fa7b38dfabe666888acffffffff01e0167118020000001976a9140044e188928710cecba8311f1cf412135b98145c88ac00000000' prevout = {