diff --git a/src/database/ddl.py b/src/database/ddl.py index 6593cd0..51d2de8 100644 --- a/src/database/ddl.py +++ b/src/database/ddl.py @@ -64,27 +64,34 @@ class Comment(BaseModel): ) -COMMENT_FIELDS = [ - Comment.comment, - Comment.comment_id, - Comment.claim_id, - Comment.timestamp, - Comment.signature, - Comment.signing_ts, - Comment.is_hidden, - Comment.parent.alias('parent_id'), -] - -CHANNEL_FIELDS = [ - Channel.claim_id.alias('channel_id'), - Channel.name.alias('channel_name') -] +FIELDS = { + 'comment': Comment.comment, + 'comment_id': Comment.comment_id, + 'claim_id': Comment.claim_id, + 'timestamp': Comment.timestamp, + 'signature': Comment.signature, + 'signing_ts': Comment.signing_ts, + 'is_hidden': Comment.is_hidden, + 'parent_id': Comment.parent.alias('parent_id'), + 'channel_id': Channel.claim_id.alias('channel_id'), + 'channel_name': Channel.name.alias('channel_name'), + 'channel_url': ('lbry://' + Channel.name + '#' + Channel.claim_id).alias('channel_url') +} -def get_comment_list(claim_id: str = None, parent_id: str = None, - top_level: bool = False, exclude_mode: str = None, - page: int = 1, page_size: int = 50, expressions=None) -> dict: - query = Comment.select(*COMMENT_FIELDS, *CHANNEL_FIELDS) +def comment_list(claim_id: str = None, parent_id: str = None, + top_level: bool = False, exclude_mode: str = None, + page: int = 1, page_size: int = 50, expressions=None, + select_fields: list = None, exclude_fields: list = None) -> dict: + fields = FIELDS.keys() + if exclude_fields: + fields -= set(exclude_fields) + if select_fields: + fields &= set(select_fields) + attributes = [FIELDS[field] for field in fields] + query = Comment.select(*attributes) + + # todo: allow this process to be more automated, so it can just be an expression if claim_id: query = query.where(Comment.claim_id == claim_id) if top_level: @@ -96,10 +103,13 @@ def get_comment_list(claim_id: str = None, parent_id: str = None, if exclude_mode: show_hidden = exclude_mode.lower() == 'hidden' query = query.where((Comment.is_hidden == show_hidden)) + + if expressions: + query = query.where(expressions) + total = query.count() query = (query .join(Channel, JOIN.LEFT_OUTER) - .where(expressions) .order_by(Comment.timestamp.desc()) .paginate(page, page_size)) items = [clean(item) for item in query.dicts()] @@ -132,7 +142,7 @@ def get_comment(comment_id: str) -> dict: 'channel_name': comment.channel.name, 'signature': comment.signature, 'signing_ts': comment.signing_ts, - 'channel_url': f'lbry://{comment.channel.name}#{comment.channel_id}' + 'channel_url': comment.channel.channel_url }) if comment.parent: as_dict.update({ @@ -141,19 +151,55 @@ def get_comment(comment_id: str) -> dict: return clean(as_dict) +def get_comment_ids(claim_id: str = None, parent_id: str = None, + page: int = 1, page_size: int = 50, flattened=False) -> dict: + results = comment_list( + claim_id, parent_id, + top_level=(parent_id is None), + page=page, page_size=page_size, + select_fields=['comment_id', 'parent_id'] + ) + if flattened: + results.update({ + 'items': [item['comment_id'] for item in results['items']], + 'replies': [(item['comment_id'], item.get('parent_id')) for item in results['items']] + }) + return results + + +def get_comments_by_id(comment_ids: typing.Union[list, tuple]) -> dict: + expression = Comment.comment_id.in_(comment_ids) + return comment_list(expressions=expression, page_size=len(comment_ids)) + + +def get_channel_from_comment_id(comment_id: str) -> dict: + try: + comment = Comment.get_by_id(comment_id) + except DoesNotExist as e: + raise ValueError from e + else: + channel = comment.channel + if not channel: + raise ValueError('The provided comment does not belong to a channel.') + return { + 'channel_name': channel.name, + 'channel_id': channel.claim_id, + 'channel_url': 'lbry://' + channel.name + '#' + channel.claim_id + } + + if __name__ == '__main__': logger = logging.getLogger('peewee') logger.addHandler(logging.StreamHandler()) logger.setLevel(logging.DEBUG) - comment_list = get_comment_list( - page_size=1, - expressions=(Comment.channel.is_null()) + comments = comment_list( + page_size=20, + expressions=((Comment.timestamp < 1583272089) & + (Comment.claim_id ** '420%')) ) - comment = comment_list['items'].pop() - print(json.dumps(comment, indent=4)) - other_comment = get_comment(comment['comment_id']) + ids = get_comment_ids('4207d2378bf4340e68c9d88faf7ee24ea1a1f95a') - print(json.dumps(other_comment, indent=4)) - print(comment == other_comment) + print(json.dumps(comments, indent=4)) + print(json.dumps(ids, indent=4)) \ No newline at end of file diff --git a/src/database/queries.py b/src/database/queries.py index 03815aa..662c22f 100644 --- a/src/database/queries.py +++ b/src/database/queries.py @@ -35,6 +35,7 @@ def get_claim_comments(conn: sqlite3.Connection, claim_id: str, parent_id: str = page: int = 1, page_size: int = 50, top_level=False): with conn: if top_level: + # doesn't include any results = [clean(dict(row)) for row in conn.execute( SELECT_COMMENTS_ON_CLAIMS + " WHERE claim_id = ? AND parent_id IS NULL LIMIT ? OFFSET ?", (claim_id, page_size, page_size * (page - 1)) @@ -44,6 +45,7 @@ def get_claim_comments(conn: sqlite3.Connection, claim_id: str, parent_id: str = (claim_id,) ) elif parent_id is None: + # include all, no specific parent comment results = [clean(dict(row)) for row in conn.execute( SELECT_COMMENTS_ON_CLAIMS + "WHERE claim_id = ? LIMIT ? OFFSET ? ", (claim_id, page_size, page_size * (page - 1)) diff --git a/src/server/handles.py b/src/server/handles.py index 6f629a0..c2d5f3e 100644 --- a/src/server/handles.py +++ b/src/server/handles.py @@ -55,16 +55,16 @@ async def handle_edit_comment(app, params): METHODS = { 'ping': ping, - 'get_claim_comments': handle_get_claim_comments, - 'get_claim_hidden_comments': handle_get_claim_hidden_comments, + 'get_claim_comments': handle_get_claim_comments, # this gets used + 'get_claim_hidden_comments': handle_get_claim_hidden_comments, # this gets used 'get_comment_ids': handle_get_comment_ids, - 'get_comments_by_id': handle_get_comments_by_id, - 'get_channel_from_comment_id': handle_get_channel_from_comment_id, - 'create_comment': create_comment, + 'get_comments_by_id': handle_get_comments_by_id, # this gets used + 'get_channel_from_comment_id': handle_get_channel_from_comment_id, # this gets used + 'create_comment': create_comment, # this gets used 'delete_comment': handle_abandon_comment, - 'abandon_comment': handle_abandon_comment, - 'hide_comments': handle_hide_comments, - 'edit_comment': handle_edit_comment + 'abandon_comment': handle_abandon_comment, # this gets used + 'hide_comments': handle_hide_comments, # this gets used + 'edit_comment': handle_edit_comment # this gets used }