예제 #1
0
    def test_delete_feed_events(self):
        # creating recording recommendation and checking
        event_rec = db_user_timeline_event.create_user_track_recommendation_event(
            user_id=self.user['id'],
            metadata=RecordingRecommendationMetadata(
                track_name="All Caps",
                artist_name="MF DOOM",
                recording_msid=str(uuid.uuid4()),
                artist_msid=str(uuid.uuid4()),
            ))
        self.assertEqual(UserTimelineEventType.RECORDING_RECOMMENDATION,
                         event_rec.event_type)
        self.assertEqual(self.user['id'], event_rec.user_id)

        # creating a new user for notification
        new_user = db_user.get_or_create(2, 'riksucks')
        message = 'You have a <a href="https://listenbrainz.org/non-existent-playlist">playlist</a>'
        event_not = db_user_timeline_event.create_user_notification_event(
            user_id=new_user['id'],
            metadata=NotificationMetadata(
                creator=new_user['musicbrainz_id'],
                message=message,
            ))
        self.assertEqual(new_user['id'], event_not.user_id)
        self.assertEqual(message, event_not.metadata.message)
        self.assertEqual(new_user['musicbrainz_id'],
                         event_not.metadata.creator)
        self.assertEqual(UserTimelineEventType.NOTIFICATION,
                         event_not.event_type)

        # deleting recording recommendation
        db_user_timeline_event.delete_user_timeline_event(
            id=event_rec.id,
            user_id=self.user["id"],
        )
        event_rec = db_user_timeline_event.get_user_notification_events(
            user_id=self.user["id"],
            count=1,
        )
        self.assertEqual(0, len(event_rec))

        # deleting notification
        db_user_timeline_event.delete_user_timeline_event(
            id=event_not.id,
            user_id=new_user["id"],
        )
        event_not = db_user_timeline_event.get_user_notification_events(
            user_id=new_user["id"],
            count=1,
        )
        self.assertEqual(0, len(event_not))
def delete_feed_events(user_name):
    '''
    Delete those events from user's feed that belong to them.
    Supports deletion of recommendation and notification.
    Along with the authorization token, post the event type and event id.
    For example:

    .. code-block:: json

        {
            "event_type": "recording_recommendation",
            "id": "<integer id of the event>"
        }

    .. code-block:: json

        {
            "event_type": "notification",
            "id": "<integer id of the event>"
        }

    :param user_name: The MusicBrainz ID of the user from whose timeline events are being deleted
    :type user_name: ``str``
    :statuscode 200: Successful deletion
    :statuscode 400: Bad request, check ``response['error']`` for more details.
    :statuscode 401: Unauthorized
    :statuscode 404: User not found
    :statuscode 500: API Internal Server Error
    :resheader Content-Type: *application/json*
    '''
    user = validate_auth_header()
    if user_name != user['musicbrainz_id']:
        raise APIUnauthorized(
            "You don't have permissions to delete from this user's timeline.")

    try:
        event = ujson.loads(request.get_data())

        if event["event_type"] in [
                UserTimelineEventType.RECORDING_RECOMMENDATION.value,
                UserTimelineEventType.NOTIFICATION.value
        ]:
            try:
                event_deleted = db_user_timeline_event.delete_user_timeline_event(
                    event["id"], user["id"])
            except Exception as e:
                raise APIInternalServerError(
                    "Something went wrong. Please try again")
            if not event_deleted:
                raise APINotFound(
                    "Cannot find '%s' event with id '%s' for user '%s'" %
                    (event["event_type"], event["id"], user["id"]))
            return jsonify({"status": "ok"})

        raise APIBadRequest(
            "This event type is not supported for deletion via this method")

    except (ValueError, KeyError) as e:
        raise APIBadRequest(f"Invalid JSON: {str(e)}")
예제 #3
0
 def test_delete_feed_events_for_something_goes_wrong(self):
     # creating recording recommendation
     event_rec = db_user_timeline_event.create_user_track_recommendation_event(
         user_id=self.user['id'],
         metadata=RecordingRecommendationMetadata(
             track_name="All Caps",
             artist_name="MF DOOM",
             recording_msid=str(uuid.uuid4()),
         )
     )
     with mock.patch("listenbrainz.db.engine.connect", side_effect=Exception):
         with self.assertRaises(DatabaseException):
             # checking if DatabaseException is raised or not
             db_user_timeline_event.delete_user_timeline_event(
                 id=event_rec.id,
                 user_id=self.user["id"],
             )