Пример #1
0
def test_user_email_current(db_conn, users_table):
    """
    Ensure an email is only provided when current user.
    """
    user, errors = insert_user({"name": "test", "email": "*****@*****.**", "password": "******"}, db_conn)
    json = deliver_user(user)
    assert "email" not in json
    json = deliver_user(user, access="private")
    assert "email" in json
Пример #2
0
def test_user_email_current(db_conn, users_table):
    """
    Ensure an email is only provided when current user.
    """
    user, errors = insert_user(
        {
            'name': 'test',
            'email': '*****@*****.**',
            'password': '******'
        }, db_conn)
    json = deliver_user(user)
    assert 'email' not in json
    json = deliver_user(user, access='private')
    assert 'email' in json
Пример #3
0
def get_sitemap_route(request):
    """
  Generate a sitemap so Google can find Sagefy's content.
  Should be linked to from https://sagefy.org/robots.txt
  Sitemap: https://sagefy.org/s/sitemap.txt
  """

    # TODO-1 cache in redis
    db_conn = request['db_conn']
    sitemap = DEFAULTS | set()
    # Card, unit, subject
    kinds = {
        'card': list_all_card_entity_ids(db_conn),
        'unit': list_all_unit_entity_ids(db_conn),
        'subject': list_all_subject_entity_ids(db_conn),
    }
    for kind, entity_ids in kinds.items():
        for entity_id in entity_ids:
            sitemap.add('https://sagefy.org/{kind}s/{id}'.format(
                id=convert_uuid_to_slug(entity_id),
                kind=kind,
            ))
            # TODO-2 ...and versions pages
    # Topic
    for topic in list_topics(db_conn, {}):
        sitemap.add('https://sagefy.org/topics/{id}'.format(
            id=convert_uuid_to_slug(topic['id'])))
    # User
    users = [deliver_user(user) for user in list_users(db_conn, {})]
    for user in users:
        sitemap.add('https://sagefy.org/users/{id}'.format(
            id=convert_uuid_to_slug(user['id'])))
    sitemap = '\n'.join(sitemap)
    return 200, sitemap
Пример #4
0
    def save(self, db_conn):
        """
        Overwrite save method to add to Elasticsearch.
        """

        # TODO-2 should we validate the save worked before going to ES?

        from database.topic import get_topic, deliver_topic
        from database.user import get_user, deliver_user

        data = json_prep(self.deliver())
        topic = get_topic({'id': self['topic_id']}, db_conn)
        if topic:
            data['topic'] = json_prep(deliver_topic(topic))
        user = get_user({'id': self['user_id']}, db_conn)
        if user:
            data['user'] = json_prep(deliver_user(user))

        es.index(
            index='entity',
            doc_type='post',
            body=data,
            id=self['id'],
        )
        return super().save(db_conn)
Пример #5
0
def sitemap_route(request):
    """
    Generate a sitemap so Google can find Sagefy's content.
    Should be linked to from https://sagefy.org/robots.txt
    Sitemap: https://sagefy.org/s/sitemap.txt
    """

    # TODO-1 cache in redis

    db_conn = request['db_conn']
    sitemap = defaults | set()

    # Card, unit, set
    kinds = {'card': Card, 'unit': Unit, 'set': Set}
    for kind, Model in kinds.items():
        query = Model.start_accepted_query()
        entities = [Model(data).deliver() for data in query.run(db_conn)]
        for entity in entities:
            sitemap.add('https://sagefy.org/{kind}s/{id}'.format(
                id=entity['entity_id'], kind=kind))
            # TODO-2 ...and versions pages
            # TODO-2 set tree

    # Topic
    for topic in list_topics({}, db_conn):
        sitemap.add('https://sagefy.org/topics/{id}'.format(id=topic['id']))

    # User
    users = [deliver_user(user) for user in list_users({}, db_conn)]
    for user in users:
        sitemap.add('https://sagefy.org/users/{id}'.format(id=user['id']))

    sitemap = '\n'.join(sitemap)
    return 200, sitemap
Пример #6
0
def test_user_no_password(db_conn, users_table):
    """
    Ensure an password isn't provided ever.
    """
    user, errors = insert_user({"name": "test", "email": "*****@*****.**", "password": "******"}, db_conn)
    json = deliver_user(user, access="private")
    assert "password" not in json
Пример #7
0
def get_user_route(request, user_id):
    """
    Get the user by their ID.
    """

    db_conn = request["db_conn"]
    user = get_user({"id": user_id}, db_conn)
    current_user = get_current_user(request)
    # Posts if in request params
    # Sets if in request params and allowed
    # Follows if in request params and allowed
    if not user:
        return abort(404)

    data = {}
    data["user"] = deliver_user(user, access="private" if current_user and user["id"] == current_user["id"] else None)

    # TODO-2 SPLITUP create new endpoints for these instead
    if "posts" in request["params"]:
        data["posts"] = [post.deliver() for post in get_posts_facade(db_conn, user_id=user["id"])]
    if "sets" in request["params"] and user["settings"]["view_sets"] == "public":
        u_sets = UserSets.get(db_conn, user_id=user["id"])
        data["sets"] = [set_.deliver() for set_ in u_sets.list_sets(db_conn)]
    if "follows" in request["params"] and user["settings"]["view_follows"] == "public":
        data["follows"] = [follow.deliver() for follow in Follow.list(db_conn, user_id=user["id"])]
    if "avatar" in request["params"]:
        size = int(request["params"]["avatar"])
        data["avatar"] = get_avatar(user["email"], size if size else None)

    return 200, data
Пример #8
0
def get_current_user_route(request):
    """
    Get current user's information.
    """

    current_user = get_current_user(request)
    if not current_user:
        return abort(401)
    return 200, {"user": deliver_user(current_user, access="private")}
Пример #9
0
def test_deliver_user(db_conn):
    create_test_users(db_conn)
    user = get_user_by_id(db_conn, {'id': user_a_uuid})
    user = deliver_user(user, access=None)
    assert user
    assert not user.get('email')
    assert not user.get('password')
    assert user.get('settings')
    assert not user.get('settings').get('email_frequency')
Пример #10
0
def get_current_user_route(request):
  """
  Get current user's information.
  """

  current_user = get_current_user(request)
  if not current_user:
    return abort(401, 'l9BCKn1zQ5KRgFRYujqU7g')
  return 200, {'user': deliver_user(current_user, access='private')}
Пример #11
0
def _log_in(user):
    """
    Log in a given user, and return an appropriate response.
    Used by sign up, log in, and reset password.
    """

    session_id = log_in_user(user)
    if session_id:
        return 200, {"user": deliver_user(user, access="private"), "cookies": {"session_id": session_id}}
    return abort(401)
Пример #12
0
def test_user_no_password(db_conn, users_table):
    """
    Ensure an password isn't provided ever.
    """
    user, errors = insert_user(
        {
            'name': 'test',
            'email': '*****@*****.**',
            'password': '******'
        }, db_conn)
    json = deliver_user(user, access='private')
    assert 'password' not in json
Пример #13
0
def _log_in(user):
  """
  Log in a given user, and return an appropriate response.
  Used by sign up, log in, and reset password.
  """

  session_id = log_in_user(user)
  if session_id:
    return 200, {
      'user': deliver_user(user, access='private'),
      'cookies': {
        'session_id': session_id
      },
    }
  return abort(401, '7d26HxmZRCSabhgE4GAxGQ')
Пример #14
0
def update_user_route(request, user_id):
    """
    Update the user. Must be the current user.
    """

    db_conn = request["db_conn"]
    user = get_user({"id": user_id}, db_conn)
    current_user = get_current_user(request)
    if not user:
        return abort(404)
    if not user["id"] == current_user["id"]:
        return abort(401)
    user, errors = update_user(user, request["params"], db_conn)
    if len(errors):
        return 400, {"errors": errors, "ref": "AS7LCAWiOOyeEbNOrbsegVY9"}
    return 200, {"user": deliver_user(user, access="private")}
Пример #15
0
def get_user_route(request, user_id):
  """
  Get the user by their ID.
  """

  db_conn = request['db_conn']
  user = get_user(db_conn, {'id': user_id})
  if not user:
    return abort(404, 'Tp5JnWO1SWms2lTdhw3bJQ')
  current_user = get_current_user(request)
  access = 'private' if (current_user and
                         user['id'] == current_user['id']) else None
  data = {'user': deliver_user(user, access)}
  if 'avatar' in request['params']:
    size = int(request['params']['avatar']) or None
    data['avatar'] = get_avatar(user['email'], size)
  return 200, data
Пример #16
0
def update_user_route(request, user_id):
    """
    Update the user. Must be the current user.
    """

    db_conn = request['db_conn']
    user = get_user({'id': user_id}, db_conn)
    current_user = get_current_user(request)
    if not user:
        return abort(404)
    if not user['id'] == current_user['id']:
        return abort(401)
    user, errors = update_user(user, request['params'], db_conn)
    if len(errors):
        return 400, {
            'errors': errors,
            'ref': 'AS7LCAWiOOyeEbNOrbsegVY9',
        }
    return 200, {'user': deliver_user(user, access='private')}
Пример #17
0
def update_user_route(request, user_id):
  """
  Update the user. Must be the current user.
  """

  db_conn = request['db_conn']
  user = get_user(db_conn, {'id': user_id})
  current_user = get_current_user(request)
  if not user:
    return abort(404, 'Fw7IK0u9TXWxs3Rp15AY1g')
  if not user['id'] == current_user['id']:
    return abort(401, '7QK-6fOcQW-sA99KHtcARA')
  user, errors = update_user(db_conn, user, request['params'])
  if errors:
    return 400, {
      'errors': errors,
      'ref': '61YNw4gWTAKRQxXLYiznBw',
    }
  return 200, {'user': deliver_user(user, access='private')}
Пример #18
0
def get_user_route(request, user_id):
    """
    Get the user by their ID.
    """

    db_conn = request['db_conn']
    user = get_user({'id': user_id}, db_conn)
    current_user = get_current_user(request)
    # Posts if in request params
    # Sets if in request params and allowed
    # Follows if in request params and allowed
    if not user:
        return abort(404)

    data = {}
    data['user'] = deliver_user(user,
                                access='private' if current_user
                                and user['id'] == current_user['id'] else None)

    # TODO-2 SPLITUP create new endpoints for these instead
    if 'posts' in request['params']:
        data['posts'] = [
            post.deliver()
            for post in get_posts_facade(db_conn, user_id=user['id'])
        ]
    if ('sets' in request['params']
            and user['settings']['view_sets'] == 'public'):
        data['sets'] = [
            set_.deliver()
            for set_ in list_user_sets_entity(user['id'], {}, db_conn)
        ]
    if ('follows' in request['params']
            and user['settings']['view_follows'] == 'public'):
        data['follows'] = [
            deliver_follow(follow)
            for follow in list_follows({'user_id': user['id']}, db_conn)
        ]
    if 'avatar' in request['params']:
        size = int(request['params']['avatar'])
        data['avatar'] = get_avatar(user['email'], size if size else None)

    return 200, data
Пример #19
0
def add_post_to_es(db_conn, post):
    """
  Upsert the post data into elasticsearch.
  """

    from database.topic import get_topic, deliver_topic
    from database.user import get_user, deliver_user

    data = json_prep(deliver_post(post))
    topic = get_topic(db_conn, {'id': post['topic_id']})
    if topic:
        data['topic'] = json_prep(deliver_topic(topic))
    user = get_user(db_conn, {'id': post['user_id']})
    if user:
        data['user'] = json_prep(deliver_user(user))

    return es.index(
        index='entity',
        doc_type='post',
        body=data,
        id=convert_uuid_to_slug(post['id']),
    )
Пример #20
0
def list_users_route(request):
  """
  List users by user id. Public facing route.
  """

  db_conn = request['db_conn']
  user_ids = request['params'].get('user_ids')
  if not user_ids:
    return abort(404, 'pNkIvKNRSNiXe4QtQiYdqQ')
  user_ids = user_ids.split(',')
  users = list_users_by_user_ids(db_conn, user_ids)
  if not users:
    return abort(404, 'lYgUJ4jaRv2jpcti0j-5Yw')
  size = int(request['params'].get('avatar') or 0) or None
  avatars = {
    convert_uuid_to_slug(user['id']): get_avatar(user['email'], size)
    for user in users
  }
  return 200, {
    'users': [deliver_user(user, None) for user in users],
    'avatars': avatars,
  }
Пример #21
0
def sitemap_route(request):
    """
    Generate a sitemap so Google can find Sagefy's content.
    Should be linked to from https://sagefy.org/robots.txt
    Sitemap: https://sagefy.org/s/sitemap.txt
    """

    # TODO-1 cache in redis

    db_conn = request['db_conn']
    sitemap = defaults | set()

    # Card, unit, set
    kinds = {'card': Card, 'unit': Unit, 'set': Set}
    for kind, Model in kinds.items():
        query = Model.start_accepted_query()
        entities = [Model(data).deliver() for data in query.run(db_conn)]
        for entity in entities:
            sitemap.add('https://sagefy.org/{kind}s/{id}'.format(
                id=entity['entity_id'],
                kind=kind
            ))
            # TODO-2 ...and versions pages
            # TODO-2 set tree

    # Topic
    for topic in Topic.list(db_conn):
        sitemap.add('https://sagefy.org/topics/{id}'.format(id=topic['id']))

    # User
    users = [deliver_user(user) for user in list_users({}, db_conn)]
    for user in users:
        sitemap.add('https://sagefy.org/users/{id}'.format(id=user['id']))

    sitemap = '\n'.join(sitemap)
    return 200, sitemap