Lucas Simon

Web Developer. lucassrod@gmail.com

Série API em Flask - Parte 11 - Deletando um usuário

Chegando ao fim de nosso CRUD vamos implementar a deleção de usuaŕios. Aqui eu escolhi fazer um soft delete ou seja re-utilizei o campo active setando-o como False para indicar que meu usuário foi deletado. A outra maneira seria de fato deletar o usuário da nossa base utilizando o método User.objects.get(id=user_id).delete(), porém não quero perder dados. E claro para recuperar esse usuário basta ativá-lo novamente.

Para entendimento, segue os capítulos que serão abordados.

O repositório com todo o código fonte esta aqui. Os capítulos estão em branches.

Criar uma nova mensagem

Como de praxe, precisamos padronizar as mensagens da aplicação. Para este caso vamos criar uma mensagem referenciando à um recurso atualizado. Em nosso messages.py adicione:

MSG_RESOURCE_DELETED = '{} deletado(a).'

O método DELETE

Esse é um dos recursos mais simples de nosso CRUD.

# -*- coding: utf-8 -*-

# Flask
from flask import request

# Third
from flask_restful import Resource
from mongoengine.errors import FieldDoesNotExist
from mongoengine.errors import NotUniqueError, ValidationError

# Apps
from apps.responses import resp_ok, resp_exception, resp_data_invalid, resp_already_exists

from apps.messages import MSG_RESOURCE_FETCHED_PAGINATED, MSG_RESOURCE_FETCHED
from apps.messages import MSG_NO_DATA, MSG_RESOURCE_UPDATED, MSG_INVALID_DATA
from apps.messages import MSG_ALREADY_EXISTS, MSG_RESOURCE_DELETED

# Local
from .models import User
from .schemas import UserSchema, UserUpdateSchema
from .utils import get_user_by_id, exists_email_in_users


class AdminUserPageList(Resource):
    # ...

class AdminUserResource(Resource):

    def get(self, user_id):
        # ...

    def put(self, user_id):
        # ...

    def delete(self, user_id):
        # Busco o usuário na coleção users pelo seu id
        user = get_user_by_id(user_id)

        # se não for uma instancia do modelo User retorno uma resposta
        # da requisição http do flask
        if not isinstance(user, User):
            return user

        try:
            user.active = False
            user.save()

        except NotUniqueError:
            return resp_already_exists('Users', 'usuário')

        except ValidationError as e:
            return resp_exception('Users', msg=MSG_INVALID_DATA, description=e.__str__())

        except Exception as e:
            return resp_exception('Users', description=e.__str__())

        return resp_ok('Users', MSG_RESOURCE_DELETED.format('Usuário'))

Testando

$ http -v DELETE 0.0.0.0:5000/admin/users/5bbeaf52fb5d1b0a32466c93
DELETE /admin/users/5bbeaf52fb5d1b0a32466c93 HTTP/1.1
Accept: */*
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Length: 0
Host: 0.0.0.0:5000
User-Agent: HTTPie/0.9.8



HTTP/1.0 200 OK
Content-Length: 87
Content-Type: application/json
Date: Wed, 17 Oct 2018 18:56:50 GMT
Server: Werkzeug/0.14.1 Python/3.6.5

{
    "message": "Usuário deletado(a).",
    "resource": "Users",
    "status": 200
}

Graças a refatoração de código podemos economizar algumas linhas de código. Com isso finalizamos a atualização de dados do usuário e estamos quase terminando o nosso CRUD.

Próximo artigo: Autênticação por JWT