mirror of https://gitlab.com/litecord/litecord.git
blueprints.users: use UPSERT when adding/patching a note
- blueprints.users: move get_mutual_friends to relationships blueprint
This commit is contained in:
parent
2df0d843c1
commit
8e3b5d79ab
|
|
@ -25,7 +25,6 @@ async def _sub_friend(user_id, peer_id):
|
||||||
await app.dispatcher.sub('friend', peer_id, user_id)
|
await app.dispatcher.sub('friend', peer_id, user_id)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
async def make_friend(user_id: int, peer_id: int,
|
async def make_friend(user_id: int, peer_id: int,
|
||||||
rel_type=RelationshipType.FRIEND.value):
|
rel_type=RelationshipType.FRIEND.value):
|
||||||
_friend = RelationshipType.FRIEND.value
|
_friend = RelationshipType.FRIEND.value
|
||||||
|
|
@ -240,3 +239,37 @@ async def remove_relationship(peer_id: int):
|
||||||
await _unsub_friend(user_id, peer_id)
|
await _unsub_friend(user_id, peer_id)
|
||||||
|
|
||||||
return '', 204
|
return '', 204
|
||||||
|
|
||||||
|
|
||||||
|
@bp.route('/<int:peer_id>/relationships', methods=['GET'])
|
||||||
|
async def get_mutual_friends(peer_id: int):
|
||||||
|
"""Fetch a users' mutual friends with the current user."""
|
||||||
|
user_id = await token_check()
|
||||||
|
_friend = RelationshipType.FRIEND.value
|
||||||
|
|
||||||
|
peer = await app.storage.get_user(peer_id)
|
||||||
|
|
||||||
|
if not peer:
|
||||||
|
return '', 204
|
||||||
|
|
||||||
|
# NOTE: maybe this could be better with pure SQL calculations
|
||||||
|
# but it would be beyond my current SQL knowledge, so...
|
||||||
|
user_rels = await app.storage.get_relationships(user_id)
|
||||||
|
peer_rels = await app.storage.get_relationships(peer_id)
|
||||||
|
|
||||||
|
user_friends = {rel['user']['id']
|
||||||
|
for rel in user_rels if rel['type'] == _friend}
|
||||||
|
peer_friends = {rel['user']['id']
|
||||||
|
for rel in peer_rels if rel['type'] == _friend}
|
||||||
|
|
||||||
|
# get the intersection, then map them to Storage.get_user() calls
|
||||||
|
mutual_ids = user_friends | peer_friends
|
||||||
|
|
||||||
|
mutual_friends = []
|
||||||
|
|
||||||
|
for friend_id in mutual_ids:
|
||||||
|
mutual_friends.append(
|
||||||
|
await app.storage.get_user(int(friend_id))
|
||||||
|
)
|
||||||
|
|
||||||
|
return jsonify(mutual_friends)
|
||||||
|
|
|
||||||
|
|
@ -352,16 +352,15 @@ async def put_note(target_id: int):
|
||||||
j = await request.get_json()
|
j = await request.get_json()
|
||||||
note = str(j['note'])
|
note = str(j['note'])
|
||||||
|
|
||||||
try:
|
# UPSERTs are beautiful
|
||||||
await app.db.execute("""
|
await app.db.execute("""
|
||||||
INSERT INTO notes (user_id, target_id, note)
|
INSERT INTO notes (user_id, target_id, note)
|
||||||
VALUES ($1, $2, $3)
|
VALUES ($1, $2, $3)
|
||||||
""", user_id, target_id, note)
|
|
||||||
except UniqueViolationError:
|
ON CONFLICT DO UPDATE SET
|
||||||
await app.db.execute("""
|
note = $3
|
||||||
UPDATE notes
|
WHERE
|
||||||
SET note = $3
|
user_id = $1 AND target_id = $2
|
||||||
WHERE user_id = $1 AND target_id = $2
|
|
||||||
""", user_id, target_id, note)
|
""", user_id, target_id, note)
|
||||||
|
|
||||||
await app.dispatcher.dispatch_user(user_id, 'USER_NOTE_UPDATE', {
|
await app.dispatcher.dispatch_user(user_id, 'USER_NOTE_UPDATE', {
|
||||||
|
|
@ -382,6 +381,11 @@ async def get_user_settings():
|
||||||
|
|
||||||
@bp.route('/@me/settings', methods=['PATCH'])
|
@bp.route('/@me/settings', methods=['PATCH'])
|
||||||
async def patch_current_settings():
|
async def patch_current_settings():
|
||||||
|
"""Patch the users' current settings.
|
||||||
|
|
||||||
|
More information on what settings exist
|
||||||
|
is at Storage.get_user_settings and the schema.sql file.
|
||||||
|
"""
|
||||||
user_id = await token_check()
|
user_id = await token_check()
|
||||||
j = validate(await request.get_json(), USER_SETTINGS)
|
j = validate(await request.get_json(), USER_SETTINGS)
|
||||||
|
|
||||||
|
|
@ -485,39 +489,6 @@ async def get_profile(peer_id: int):
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
@bp.route('/<int:peer_id>/relationships', methods=['GET'])
|
|
||||||
async def get_mutual_friends(peer_id: int):
|
|
||||||
user_id = await token_check()
|
|
||||||
_friend = RelationshipType.FRIEND.value
|
|
||||||
|
|
||||||
peer = await app.storage.get_user(peer_id)
|
|
||||||
|
|
||||||
if not peer:
|
|
||||||
return '', 204
|
|
||||||
|
|
||||||
# NOTE: maybe this could be better with pure SQL calculations
|
|
||||||
# but it would be beyond my current SQL knowledge, so...
|
|
||||||
user_rels = await app.storage.get_relationships(user_id)
|
|
||||||
peer_rels = await app.storage.get_relationships(peer_id)
|
|
||||||
|
|
||||||
user_friends = {rel['user']['id']
|
|
||||||
for rel in user_rels if rel['type'] == _friend}
|
|
||||||
peer_friends = {rel['user']['id']
|
|
||||||
for rel in peer_rels if rel['type'] == _friend}
|
|
||||||
|
|
||||||
# get the intersection, then map them to Storage.get_user() calls
|
|
||||||
mutual_ids = user_friends | peer_friends
|
|
||||||
|
|
||||||
mutual_friends = []
|
|
||||||
|
|
||||||
for friend_id in mutual_ids:
|
|
||||||
mutual_friends.append(
|
|
||||||
await app.storage.get_user(int(friend_id))
|
|
||||||
)
|
|
||||||
|
|
||||||
return jsonify(mutual_friends)
|
|
||||||
|
|
||||||
|
|
||||||
@bp.route('/@me/guilds/<int:guild_id>/settings', methods=['PATCH'])
|
@bp.route('/@me/guilds/<int:guild_id>/settings', methods=['PATCH'])
|
||||||
async def patch_guild_settings(guild_id: int):
|
async def patch_guild_settings(guild_id: int):
|
||||||
"""Update the users' guild settings for a given guild.
|
"""Update the users' guild settings for a given guild.
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue