def delete(self, request, organization, repo_id):
        if not request.user.is_authenticated():
            return Response(status=401)

        try:
            repo = Repository.objects.get(
                id=repo_id,
                organization_id=organization.id,
            )
        except Repository.DoesNotExist:
            raise ResourceDoesNotExist

        updated = Repository.objects.filter(
            id=repo.id,
            status__in=[ObjectStatus.VISIBLE, ObjectStatus.DISABLED],
        ).update(status=ObjectStatus.PENDING_DELETION)
        if updated:
            repo.status = ObjectStatus.PENDING_DELETION

            transaction_id = get_transaction_id()
            # if repo doesn't have commits, delete immediately
            has_commits = Commit.objects.filter(
                repository_id=repo.id,
                organization_id=organization.id,
            ).exists()

            countdown = 3600 if has_commits else 0

            repo.rename_on_pending_deletion()

            delete_repository.apply_async(
                kwargs={
                    'object_id': repo.id,
                    'transaction_id': transaction_id,
                    'actor_id': request.user.id,
                },
                countdown=countdown,
            )

            delete_logger.info(
                'object.delete.queued',
                extra={
                    'object_id': repo.id,
                    'transaction_id': transaction_id,
                    'model': Repository.__name__,
                }
            )
        return Response(serialize(repo, request.user), status=202)
    def delete(self, request, organization, repo_id):
        if not request.user.is_authenticated():
            return Response(status=401)

        try:
            repo = Repository.objects.get(
                id=repo_id,
                organization_id=organization.id,
            )
        except Repository.DoesNotExist:
            raise ResourceDoesNotExist

        updated = Repository.objects.filter(
            id=repo.id,
            status__in=[ObjectStatus.VISIBLE, ObjectStatus.DISABLED],
        ).update(status=ObjectStatus.PENDING_DELETION)
        if updated:
            repo.status = ObjectStatus.PENDING_DELETION

            transaction_id = get_transaction_id()
            # if repo doesn't have commits, delete immediately
            has_commits = Commit.objects.filter(
                repository_id=repo.id,
                organization_id=organization.id,
            ).exists()

            countdown = 3600 if has_commits else 0

            repo.rename_on_pending_deletion()

            delete_repository.apply_async(
                kwargs={
                    'object_id': repo.id,
                    'transaction_id': transaction_id,
                    'actor_id': request.user.id,
                },
                countdown=countdown,
            )

            delete_logger.info(
                'object.delete.queued',
                extra={
                    'object_id': repo.id,
                    'transaction_id': transaction_id,
                    'model': Repository.__name__,
                }
            )
        return Response(serialize(repo, request.user), status=202)
    def delete(self, request, organization, repo_id):
        if not request.user.is_authenticated():
            return Response(status=401)

        try:
            repo = Repository.objects.get(
                id=repo_id,
                organization_id=organization.id,
            )
        except Repository.DoesNotExist:
            raise ResourceDoesNotExist

        updated = Repository.objects.filter(
            id=repo.id,
            status=ObjectStatus.VISIBLE,
        ).update(status=ObjectStatus.PENDING_DELETION)
        if updated:
            repo.status = ObjectStatus.PENDING_DELETION

            transaction_id = uuid4().hex
            countdown = 86400

            delete_repository.apply_async(
                kwargs={
                    'object_id': repo.id,
                    'transaction_id': transaction_id,
                    'actor_id': request.user.id,
                },
                countdown=countdown,
            )

            delete_logger.info('object.delete.queued',
                               extra={
                                   'object_id': repo.id,
                                   'transaction_id': transaction_id,
                                   'model': Repository.__name__,
                               })
        return Response(serialize(repo, request.user), status=202)