Backend/Flask 개발일지

8. 미니터(Miniter) API 개발 (타임라인)

Fullstacknology 2022. 1. 10. 23:57

이번에 구현할 기능은 타임라인 기능이다. 타임라인은 팔로우한 사용자의 글 목록을 보여주는 기능이다. 

 

코드는 다음과 같다. 

 

@app.route("timeline/<int:user_id>", methods=['GET'])
def timeline(user_id):
    if user_id not in app.users:
        return '사용자가 존재하지 않습니다.', 400
        
    follow_list = app.users[user_id].get('follow', set())
    follow_list.add(user_id)
    timeline = [tweet for tweet in app.tweets if tweet['user_id'] in follow_list]
    
    return jsonify({'user_id' : user_id, 'timeline' : timeline})

 

타임라인 기능 구현이 미니터의 마지막 기능이다. 지금껏 구현한 코드는 다음과 같다. 

 

from flask import Flask, jsonify, request
from flask.json import JSONEncoder

class CustomJSONEncoder(JSONEncoder):
    def default(self, obj):
        if isinstance(obj, set):
            return list(obj)
        
        return JSONEncoder.default(self, obj)

app                 = Flask(__name__)
app.id_count        = 1
app.users           = {}
app.tweets          = []
app.json_encoder    = CustomJSONEncoder

@app.route("/ping", methods=['GET'])
def ping():
    return "pong"

@app.route("/sign-up", methods=['POST'])
def sign_up():
    new_user                        = request.json
    new_user["id"]                  = app.id_count
    app.users[app.id_count]         = new_user
    app.id_count                    = app.id_count +1
    
    return jsonify(new_user)

@app.route("/tweet", methods=['POST'])
def tweet():
    payload     = request.json
    user_id     = int(payload['id'])
    tweet       = payload['tweet']

    if user_id not in app.users:
        return '사용자가 존재하지 않습니다.', 400
    
    if len(tweet) > 300:
        return '300자를 초과했습니다.', 400
    
    user_id = int(payload['id'])
    app.tweets.append({'user_id': user_id, 'tweet': tweet})
    
    return '', 200

@app.route("/follow", methods=['POST'])
def follow():
    payload              = request.json
    user_id              = int(payload['id'])
    user_id_to_follow    = int(payload['follow'])

    if user_id not in app.users or user_id_to_follow not in app.users:
        return '사용자가 존재하지 않습니다.', 400
    
    user = app.users[user_id]
    user.setdefault('follow', set()).add(user_id_to_follow)

    return jsonify(user)

@app.route("/unfollow", methods=['POST'])
def unfollow():
    payload             = request.json
    user_id             = int(payload['id'])
    user_id_to_follow   = int(payload['unfollow'])

    if user_id not in app.users or user_id_to_follow not in app.users:
        return '사용자가 존재하지 않습니다.', 400
    
    user = app.users[user_id]
    user.setdefault('follow', set()).discard(user_id_to_follow)

    return jsonify(user)

@app.route("timeline/<int:user_id>", methods=['GET'])
def timeline(user_id):
    if user_id not in app.users:
        return '사용자가 존재하지 않습니다.', 400
    
    follow_list = app.users[user_id].get('follow', set())
    follow_list.add(user_id)
    timeline = [tweet for tweet in app.tweets if tweet['user_id'] in follow_list]

    return jsonify({'user_id' : user_id, 'timeline' : timeline})

 

  이제 타임라인 기능이 제대로 작동하는지 확인하기 위해 사용자, 트윗, 팔로우를 생성해 보고 타임라인이 제대로 작동하는지 확인해 보자 

 

● 사용자 생성

 

 

● 트윗 생성

 

 

● 팔로우 하기

 

● 타임라인 확인 

 

 

문제 없이 잘 실행된다!