SocialNetwork
/
rest_api.py
126 строк · 4.4 Кб
1from flask import jsonify, make_response2from flask_login import current_user, login_required3from flask_restful import abort, Resource, reqparse4
5from data import db_session6from data.posts import Post7from data.users import User8
9
10def abort_if_user_not_found(user_id):11session = db_session.create_session()12user = session.query(User).filter(User.id == user_id)13if not user:14abort(404, message=f"User {user_id} not found")15
16
17def abort_if_user_posts_not_found(user_id):18session = db_session.create_session()19posts = session.query(Post).filter(Post.user_id == user_id)20if not posts:21abort(404, message=f"Posts for user {user_id} not found")22
23
24def abort_if_post_not_found(post_id):25session = db_session.create_session()26post = session.query(Post).get(post_id)27if not post:28abort(404, message=f"Posts {post} not found")29
30
31class PostResource(Resource):32def get(self, post_id):33abort_if_post_not_found(post_id)34session = db_session.create_session()35post = session.query(Post).get(post_id)36if current_user.id != post.user.id:37return make_response(jsonify({'error': 'method is not allowed for this account'}), 400)38return make_response(jsonify({39'posts': post.to_dict(only=('id', 'text', 'created_date', 'user_id'))40
41}), 200)42
43@login_required44def delete(self, post_id):45abort_if_post_not_found(post_id)46session = db_session.create_session()47post = session.query(Post).get(post_id)48if current_user.id != post.user.id:49return make_response(jsonify({'error': 'method is not allowed for this account'}), 400)50session.delete(post)51session.commit()52return make_response(jsonify({'success': 'OK'}), 200)53
54
55parser = reqparse.RequestParser()56parser.add_argument('text', required=True)57
58
59class PostListResource(Resource):60@login_required61def get(self, user_id):62if current_user.id != user_id:63return make_response(jsonify({'error': 'method is not allowed for this account'}), 400)64abort_if_user_posts_not_found(user_id)65session = db_session.create_session()66posts = session.query(Post).filter(Post.user_id == user_id)67return make_response(jsonify({68'user': user_id,69'posts': [item.to_dict(only=('id', 'text', 'created_date')) for item in posts]70
71}), 200)72
73@login_required74def post(self, user_id):75if current_user.id != user_id:76return make_response(jsonify({'error': 'method is not allowed for this account'}), 400)77args = parser.parse_args()78session = db_session.create_session()79post = Post(80text=args['text'],81user_id=user_id,82)83session.add(post)84session.commit()85return make_response(jsonify({'success': 'OK',86'post': {'id': post.id, 'author': f'{post.user.name} {post.user.surname}'}}), 200)87
88
89class FriendsResource(Resource):90@login_required91def post(self, user_id, friend_id):92if current_user.id != user_id and current_user.id != friend_id:93return make_response(jsonify({'error': 'method is not allowed for this account'}), 400)94
95abort_if_user_not_found(user_id)96abort_if_user_not_found(friend_id)97
98session = db_session.create_session()99user = session.query(User).get(user_id)100friend = session.query(User).get(friend_id)101
102if friend not in user.friends:103user.become_friends(friend)104session.commit()105return make_response(jsonify({'success': 'OK'}), 200)106else:107return make_response(jsonify({'error': 'users are already friends'}), 400)108
109@login_required110def delete(self, user_id, friend_id):111if current_user.id != user_id and current_user.id != friend_id:112return make_response(jsonify({'error': 'method is not allowed for this account'}), 400)113
114abort_if_user_not_found(user_id)115abort_if_user_not_found(friend_id)116
117session = db_session.create_session()118user = session.query(User).get(user_id)119friend = session.query(User).get(friend_id)120
121if friend not in user.friends:122return make_response(jsonify({'error': 'users are not friends'}), 400)123else:124user.delete_friend(friend)125session.commit()126return make_response(jsonify({'success': 'OK'}), 200)127