From b81bae4c4491b669ec4ec4ae7dbc9a619ddfcb49 Mon Sep 17 00:00:00 2001
From: furion <_@furion.me>
Date: Mon, 8 May 2017 10:14:56 +0200
Subject: [PATCH] [api] shared api/db methods

---
 hive/db/methods.py     | 22 +++++++++++++++++++++-
 hive/indexer/cli.py    |  7 ++-----
 hive/server/methods.py | 24 ++++++++++++++++++++++++
 hive/server/serve.py   |  9 +++++----
 setup.py               |  1 -
 5 files changed, 52 insertions(+), 11 deletions(-)

diff --git a/hive/db/methods.py b/hive/db/methods.py
index b559bb2b3..0d8f00034 100644
--- a/hive/db/methods.py
+++ b/hive/db/methods.py
@@ -1,8 +1,13 @@
 from funcy.seqs import first
 from hive.db import conn
-from sqlalchemy import text
+from hive.db.schema import (
+    hive_follows,
+)
+from sqlalchemy import text, select
 
 
+# generic
+# -------
 def query(sql):
     res = conn.execute(text(sql).execution_options(autocommit=False))
     return res
@@ -18,3 +23,18 @@ def query_one(sql):
 def db_last_block():
     return query_one("SELECT MAX(num) FROM hive_blocks") or 0
 
+
+# api specific
+# ------------
+def get_followers(account: str, skip: int, limit: int, db=conn):
+    q = select([hive_follows]). \
+        where(hive_follows.c.following == account). \
+        skip(skip).limit(limit)
+    return db.execute(q)
+
+
+def get_following(account: str, skip: int, limit: int, db=conn):
+    q = select([hive_follows]). \
+        where(hive_follows.c.follower == account). \
+        skip(skip).limit(limit)
+    return db.execute(q)
diff --git a/hive/indexer/cli.py b/hive/indexer/cli.py
index 660e5e5ea..cfbc7b176 100644
--- a/hive/indexer/cli.py
+++ b/hive/indexer/cli.py
@@ -1,6 +1,5 @@
 # -*- coding: utf-8 -*-
 import click
-import click_spinner
 from click import echo
 from hive.indexer.core import sync_from_file, sync_from_steemd, head_state
 from prettytable import PrettyTable
@@ -20,16 +19,14 @@ def indexer():
 def index_from_file(filename):
     """import blocks from steemd"""
     echo('Loading blocks from %s...' % filename)
-    with click_spinner.spinner():
-        sync_from_file(filename)
+    sync_from_file(filename)
 
 
 @indexer.command(name='from-steemd')
 def index_from_steemd():
     """import blocks from .json.lst file"""
     echo('Loading blocks from steemd...')
-    with click_spinner.spinner():
-        sync_from_steemd()
+    sync_from_steemd()
 
 
 @indexer.command(name='show-status')
diff --git a/hive/server/methods.py b/hive/server/methods.py
index e69de29bb..58060549e 100644
--- a/hive/server/methods.py
+++ b/hive/server/methods.py
@@ -0,0 +1,24 @@
+from hive.db.methods import (
+    get_followers,
+    get_following,
+)
+
+
+def api_get_followers(db, bottle, app, params):
+    _ = bottle, app
+    return get_followers(
+        account=params.get('account'),
+        skip=params.get('skip'),
+        limit=params.get('limit'),
+        db=db,
+    )
+
+
+def api_get_following(db, bottle, app, params):
+    _ = bottle, app
+    return get_following(
+        account=params.get('account'),
+        skip=params.get('skip'),
+        limit=params.get('limit'),
+        db=db,
+    )
diff --git a/hive/server/serve.py b/hive/server/serve.py
index 43e03a584..91a66da10 100644
--- a/hive/server/serve.py
+++ b/hive/server/serve.py
@@ -5,17 +5,17 @@ import os
 from datetime import datetime
 
 import bottle
+import hive.server.methods as rpcmethods
 from bottle import abort
 from bottle_errorsrest import ErrorsRestPlugin
 from bottle_sqlalchemy import Plugin
 from hive.db.schema import metadata as hive_metadata
 from hive.indexer.core import db_last_block, head_state
+from hive.sbds.jsonrpc import register_endpoint
+from hive.sbds.sbds_json import ToStringJSONEncoder
 from sqlalchemy import create_engine
 from steem.steemd import Steemd
 
-from hive.sbds.sbds_json import ToStringJSONEncoder
-from hive.sbds.jsonrpc import register_endpoint
-
 logger = logging.getLogger(__name__)
 
 app = bottle.Bottle()
@@ -81,11 +81,12 @@ jsonrpc = register_endpoint(path='/', app=app, namespace='hive')
 
 json_rpc_methods = {
     'head_state': head_state,
+    'get_followers': rpcmethods.get_followers,
+    'get_following': rpcmethods.get_following,
 }
 for method_name, fn_call in json_rpc_methods.items():
     jsonrpc.register_method(method=fn_call, method_name=method_name)
 
-
 # WSGI application
 # ----------------
 application = app
diff --git a/setup.py b/setup.py
index 5aef802a4..99ee8d720 100644
--- a/setup.py
+++ b/setup.py
@@ -32,7 +32,6 @@ setup(
         'sqlalchemy',
         'mysqlclient',
         'click',
-        'click-spinner',
         'funcy',
         'toolz',
         'maya',
-- 
GitLab