Skip to content
Snippets Groups Projects
Commit 5b602514 authored by arcange's avatar arcange
Browse files

Merge branch 'arc-get-content-deleted' into 'deployed_20200928'

Fix get_content returns cache error when post is deleted #73

See merge request !276
parents 8e55c93b 21faf589
No related branches found
No related tags found
1 merge request!276Fix get_content returns cache error when post is deleted #73
......@@ -197,7 +197,7 @@ SELECT hp.id,
JOIN hive_permlink_data hpd_pp ON hpd_pp.id = pp.permlink_id
JOIN hive_accounts ha_rp ON ha_rp.id = rp.author_id
JOIN hive_permlink_data hpd_rp ON hpd_rp.id = rp.permlink_id
JOIN hive_post_data rpd ON rpd.id = rp.id
LEFT JOIN hive_post_data rpd ON rpd.id = rp.id
JOIN hive_category_data hcd ON hcd.id = hp.category_id
JOIN hive_category_data rcd ON rcd.id = rp.category_id
LEFT JOIN hive_communities hc ON hp.community_id = hc.id
......
......@@ -19,7 +19,94 @@ from hive.server.database_api.methods import find_votes_impl, VotesPresentation
from hive.utils.normalize import time_string_with_t
# pylint: disable=too-many-arguments,line-too-long,too-many-lines
SQL_CONTENT = """
SELECT
hp.id,
hp.counter_deleted,
ha_a.name AS author,
hp.active,
hp.author_rewards,
hpd_p.permlink,
hpd.title,
hpd.body,
hcd.category,
hp.depth,
hp.promoted,
hp.payout,
hp.pending_payout,
hp.payout_at,
hp.last_payout_at,
hp.cashout_time,
hp.is_paidout,
hp.children,
0 AS active_votes,
hp.created_at,
hp.updated_at,
COALESCE(( SELECT sum(v.rshares) AS sum
FROM hive_votes v
WHERE (v.post_id = hp.id)
GROUP BY v.post_id), (0)::numeric) AS rshares,
COALESCE(( SELECT sum(
CASE (v.rshares >= 0)
WHEN true THEN v.rshares
ELSE (- v.rshares)
END) AS sum
FROM hive_votes v
WHERE ((v.post_id = hp.id) AND (NOT (v.rshares = 0)))
GROUP BY v.post_id), (0)::numeric) AS abs_rshares,
COALESCE(( SELECT count(1) AS count
FROM hive_votes v
WHERE ((v.post_id = hp.id) AND v.is_effective)
GROUP BY v.post_id), (0)::bigint) AS total_votes,
COALESCE(( SELECT sum(
CASE (v.rshares > 0)
WHEN true THEN 1
ELSE '-1'::integer
END) AS sum
FROM hive_votes v
WHERE ((v.post_id = hp.id) AND (NOT (v.rshares = 0)))
GROUP BY v.post_id), (0)::bigint) AS net_votes,
hpd.json,
ha_a.reputation AS author_rep,
hp.total_vote_weight,
ha_pp.name AS parent_author,
ha_pp.id AS parent_author_id,
CASE (hp.depth > 0)
WHEN true THEN hpd_pp.permlink
ELSE hcd.category
END AS parent_permlink_or_category,
hp.curator_payout_value,
ha_rp.name AS root_author,
hpd_rp.permlink AS root_permlink,
hp.max_accepted_payout,
hp.percent_hbd,
true AS allow_replies,
hp.allow_votes,
hp.allow_curation_rewards,
hp.beneficiaries,
concat('/', rcd.category, '/@', ha_rp.name, '/', hpd_rp.permlink,
CASE rp.id
WHEN hp.id THEN ''::text
ELSE concat('#@', ha_a.name, '/', hpd_p.permlink)
END) AS url,
rpd.title AS root_title
FROM
hive_posts hp
JOIN hive_accounts_view ha_a ON ha_a.id = hp.author_id
JOIN hive_permlink_data hpd_p ON hpd_p.id = hp.permlink_id
JOIN hive_post_data hpd ON hpd.id = hp.id
JOIN hive_category_data hcd ON hcd.id = hp.category_id
JOIN hive_posts pp ON pp.id = hp.parent_id
JOIN hive_accounts ha_pp ON ha_pp.id = pp.author_id
JOIN hive_permlink_data hpd_pp ON hpd_pp.id = pp.permlink_id
JOIN hive_posts rp ON rp.id = hp.root_id
JOIN hive_accounts ha_rp ON ha_rp.id = rp.author_id
JOIN hive_permlink_data hpd_rp ON hpd_rp.id = rp.permlink_id
JOIN hive_category_data rcd ON rcd.id = rp.category_id
LEFT JOIN hive_post_data rpd ON rpd.id = rp.id
WHERE
ha_a.name = :author AND hpd_p.permlink = :permlink
"""
SQL_TEMPLATE = """
SELECT
hp.id,
......@@ -151,23 +238,23 @@ async def get_content(context, author: str, permlink: str, observer=None):
valid_account(author)
valid_permlink(permlink)
#force copy
sql = str(SQL_TEMPLATE)
sql += """
WHERE
hp.author = :author AND hp.permlink = :permlink
"""
sql = str(SQL_CONTENT)
post = None
result = await db.query_all(sql, author=author, permlink=permlink)
if result:
result = dict(result[0])
post = _condenser_post_object(result, 0, True)
post['active_votes'] = await find_votes_impl(db, author, permlink, VotesPresentation.ActiveVotes)
if not observer:
post['active_votes'] = _mute_votes(post['active_votes'], Mutes.all())
deleted = result['counter_deleted']
post = _condenser_post_object(result, 0, True, deleted)
if deleted:
post['active_votes'] = []
else:
blacklists_for_user = await Mutes.get_blacklists_for_observer(observer, context)
post['active_votes'] = _mute_votes(post['active_votes'], blacklists_for_user.keys())
post['active_votes'] = await find_votes_impl(db, author, permlink, VotesPresentation.ActiveVotes)
if not observer:
post['active_votes'] = _mute_votes(post['active_votes'], Mutes.all())
else:
blacklists_for_user = await Mutes.get_blacklists_for_observer(observer, context)
post['active_votes'] = _mute_votes(post['active_votes'], blacklists_for_user.keys())
assert post, 'post was not found in cache'
return post
......
......@@ -175,9 +175,10 @@ def _condenser_account_object(row):
'profile_image': profile['profile_image'],
}})}
def _condenser_post_object(row, truncate_body=0, get_content_additions=False):
def _condenser_post_object(row, truncate_body=0, get_content_additions=False, deleted=False):
"""Given a hive_posts row, create a legacy-style post object."""
paid = row['is_paidout']
date_default = '1970-01-01 00:00:00'
# condenser#3424 mitigation
if not row['category']:
......@@ -185,67 +186,67 @@ def _condenser_post_object(row, truncate_body=0, get_content_additions=False):
full_payout = row['pending_payout'] + row['payout'];
post = {}
post['post_id'] = row['id']
post['author'] = row['author']
post['permlink'] = row['permlink']
post['category'] = row['category']
post['post_id'] = row['id'] if not deleted else 0
post['author'] = row['author'] if not deleted else ''
post['permlink'] = row['permlink'] if not deleted else ''
post['category'] = row['category'] if not deleted else ''
post['title'] = row['title']
post['body'] = row['body'][0:truncate_body] if truncate_body else row['body']
post['json_metadata'] = row['json']
post['title'] = row['title'] if not deleted else ''
post['body'] = (row['body'][0:truncate_body] if truncate_body else row['body']) if not deleted else ''
post['json_metadata'] = row['json'] if not deleted else ''
post['created'] = json_date(row['created_at'])
post['last_update'] = json_date(row['updated_at'])
post['depth'] = row['depth']
post['children'] = row['children']
post['net_rshares'] = row['rshares']
post['created'] = json_date(row['created_at'] if not deleted else date_default)
post['last_update'] = json_date(row['updated_at'] if not deleted else date_default)
post['depth'] = row['depth'] if not deleted else 0
post['children'] = row['children'] if not deleted else 0
post['net_rshares'] = row['rshares'] if not deleted else 0
post['last_payout'] = json_date(row['payout_at'] if paid else None)
post['cashout_time'] = json_date(None if paid else row['payout_at'])
post['last_payout'] = json_date(row['payout_at'] if paid and not deleted else date_default)
post['cashout_time'] = json_date(None if paid or deleted else row['payout_at'])
post['total_payout_value'] = _amount(row['payout'] if paid else 0)
post['curator_payout_value'] = _amount(0)
post['pending_payout_value'] = _amount(0 if paid else full_payout)
post['promoted'] = _amount(row['promoted'])
post['pending_payout_value'] = _amount(0 if paid or deleted else full_payout)
post['promoted'] = _amount(row['promoted'] if not deleted else 0)
post['replies'] = []
post['body_length'] = len(row['body'])
post['author_reputation'] = row['author_rep']
post['body_length'] = len(row['body']) if not deleted else 0
post['author_reputation'] = row['author_rep'] if not deleted else 0
post['parent_author'] = row['parent_author']
post['parent_permlink'] = row['parent_permlink_or_category']
post['parent_author'] = row['parent_author'] if not deleted else ''
post['parent_permlink'] = row['parent_permlink_or_category'] if not deleted else ''
post['url'] = row['url']
post['root_title'] = row['root_title']
post['beneficiaries'] = row['beneficiaries']
post['max_accepted_payout'] = row['max_accepted_payout']
post['percent_hbd'] = row['percent_hbd']
post['url'] = row['url'] if not deleted else ''
post['root_title'] = row['root_title'] if not deleted else ''
post['beneficiaries'] = row['beneficiaries'] if not deleted else []
post['max_accepted_payout'] = row['max_accepted_payout'] if not deleted else '0.000 HBD'
post['percent_hbd'] = row['percent_hbd'] if not deleted else 0
if get_content_additions:
post['id'] = row['id'] # let's be compatible with old code until this API is supported.
post['active'] = json_date(row['active'])
post['author_rewards'] = row['author_rewards']
post['max_cashout_time'] = json_date(None) # ABW: only relevant up to HF17, timestamp::max for all posts later (and also all paid)
post['id'] = row['id'] if not deleted else 0 # let's be compatible with old code until this API is supported.
post['active'] = json_date(row['active'] if not deleted else date_default)
post['author_rewards'] = row['author_rewards'] if not deleted else 0
post['max_cashout_time'] = json_date(None) if not deleted else date_default # ABW: only relevant up to HF17, timestamp::max for all posts later (and also all paid)
curator_payout = sbd_amount(row['curator_payout_value'])
post['curator_payout_value'] = _amount(curator_payout)
post['total_payout_value'] = _amount(row['payout'] - curator_payout)
post['curator_payout_value'] = _amount(curator_payout if not deleted else 0)
post['total_payout_value'] = _amount(row['payout'] - curator_payout if not deleted else 0)
post['reward_weight'] = 10000
post['reward_weight'] = 10000 if not deleted else 0
post['root_author'] = row['root_author']
post['root_permlink'] = row['root_permlink']
post['root_author'] = row['root_author'] if not deleted else ''
post['root_permlink'] = row['root_permlink'] if not deleted else ''
post['allow_replies'] = row['allow_replies']
post['allow_votes'] = row['allow_votes']
post['allow_curation_rewards'] = row['allow_curation_rewards']
post['allow_replies'] = row['allow_replies'] if not deleted else False
post['allow_votes'] = row['allow_votes'] if not deleted else False
post['allow_curation_rewards'] = row['allow_curation_rewards'] if not deleted else False
post['reblogged_by'] = []
post['net_votes'] = row['net_votes']
post['net_votes'] = row['net_votes'] if not deleted else 0
post['children_abs_rshares'] = 0 # see: hive/server/database_api/objects.py:68
post['total_pending_payout_value'] = '0.000 HBD' # no data
if paid:
if paid or deleted:
post['total_vote_weight'] = 0
post['vote_rshares'] = 0
post['abs_rshares'] = 0
......@@ -255,9 +256,9 @@ def _condenser_post_object(row, truncate_body=0, get_content_additions=False):
post['abs_rshares'] = row['abs_rshares']
else:
if paid:
curator_payout = sbd_amount(row['curator_payout_value'])
post['curator_payout_value'] = _amount(curator_payout)
post['total_payout_value'] = _amount(row['payout'] - curator_payout)
curator_payout = sbd_amount(row['curator_payout_value'] if not deleted else 0)
post['curator_payout_value'] = _amount(curator_payout if not deleted else 0)
post['total_payout_value'] = _amount(row['payout'] - curator_payout if not deleted else 0)
return post
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment