Skip to content

Instantly share code, notes, and snippets.

@filiafobico
Last active August 23, 2021 18:31
Show Gist options
  • Select an option

  • Save filiafobico/0868a44a6fc815ede1b2818f8769f5a3 to your computer and use it in GitHub Desktop.

Select an option

Save filiafobico/0868a44a6fc815ede1b2818f8769f5a3 to your computer and use it in GitHub Desktop.
Anotação para a aula de sistemas distribuidos

SafeHelp: Serviço de compras e entregas para pessoas positivadas pelo vírus COVID-19

1. Análise do sistema

1.1 Funcionamento

  • Serviço de compras e entregas pela Internet
  • Cadastro de prestadores de serviço
  • Cadastro de usuários do serviço
  • Chat entre usuário e o prestador de serviço
  • Cadastro dos serviços
  • Divulgação do serviço pelo usuário
  • Escolha do serviço que será feito pelo prestador
  • Confirmação da entrega do serviço

1.2 Requisitos funcionais e não funcionais

  • Atores:

    • Cliente / Prestador de Serviços
  • Módulo Cliente (Cliente / Prestador de Serviços)

    • Login
    • Cadastro
    • Solicitar Serviços / Listagem de Serviços Solicitados pelos clientes
    • Serviços:
      • Tipo de serviço
      • Descrição
      • Pagamento
      • Local do cliente
      • Local do serviço
      • Data
      • Hora
      • Aceitar serviço (Somente para o Prestador de Serviços)
    • Chat
  • Módulo Servidor:

    • Login
      • CRUD dos usuários
    • Listas Serviços
      • CRUD de Serviços
    • Escolher Serviço (Somente para o Prestador de Serviços)
    • Chat

1.3 Estados do Sistema

  • Indica campo obrigatório

  • Cliente (usuário comum / prestador de serviço)

    • Tela de Login (-> Tela de cadastro ou -> Tela de Serviços)
      • Email*
      • Senha*
    • Tela de cadastro de usuário (-> Tela de Login)
      • Nome*
      • CPF*
      • Email*
      • Senha*
      • Endereço
      • Telefone
    • Tela de Serviços
      • Listagem de Serviço
        • Descrição do serviço
        • Tipo do serviço
        • Valor a ser pago
        • Data
        • Hora
        • Local do serviço (* Forma de escolha do serviço - prestador de serviço) - Muda o Status (para fechado) (* Botão de chat)
      • Cadastro do Serviço
        • Descrição do serviço
        • Tipo do serviço*
        • Valor a ser pago*
        • Local do serviço*
        • Hora*
        • Data*
        • Local do cliente (endereço no cadastro)*
        • Status
    • Tela de Chat

TCP

  • a conexão será feita através do protocolo TCP

Contrato das Ações

  • Uma Mensagem envio é uma solicitação de um cliente para o servidor
  • Uma Mensagem resposta é uma resposta do servidor para o cliente
  • Sempre deve passar o campo data mesmo que não esteja enviando um valor dentro dele

User

Create User

  • Mensagem envio
{
    "id": "user",
    "type": "create",
    "data": {
        "name": "",      // obrigatório
        "cpf": "",       // obrigatório
        "email": "",     // obrigatório
        "password": "",  // obrigatório
        "address": "",   // opcional
        "phone": "",     // opcional
    }
}
  • Mensagem resposta:
    • sucesso:
      {
          "id": "success",
          "data": {
              "id": "", // id do usuário criado
              "desc": "success create user"
          }
      }
    • erro:
      {
          "id": "error",
          "data": {
              "desc": "error create user"
          }
      }

List Users

busca pelos campos passados nos campo "data" sempre vai buscar pelo valor igual ao passado

  • Mensagem envio:
{
    "id": "user",
    "type": "list",
    "data": {
        "id": "",        // opcional
        "name": "",      // opcional
        "cpf": "",       // opcional
        "email": "",     // opcional
        "password": "",  // opcional
        "address": "",   // opcional
        "phone": "",     // opcional
    }
}
  • Mensagem resposta:
    • sucesso:
      {
          "id": "success",
          "data": {
              "users": [{
                  "id": "",
                  "name": "",
                  "cpf": "",
                  "email": "",
                  "password": "",
                  "address": "",
                  "phone": "",
              }]
          }
      }
    • erro:
      {
          "id": "error",
          "data": {
              "desc": "error list users",
              "users": []
          }
      }

Update User

atualiza apenas os campos passados no campo "data"

  • Mensagem envio:
{
    "id": "user",
    "type": "update",
    "data": {
        "id": "",        // obrigatorio (ele será o campo para fazer o filtro e os outros campos passados serão atualizados)
        "name": "",      // opcional
        "cpf": "",       // opcional
        "email": "",     // opcional
        "password": "",  // opcional
        "address": "",   // opcional
        "phone": "",     // opcional
    }
}
  • Mensagem resposta:
    • sucesso:
      {
          "id": "success",
          "data": {
              "desc": "sucess update user"
          }
      }
    • erro:
      {
          "id": "error",
          "data": {
              "desc": "error update user"
          }
      }

Remove User

remove a partir de um id passado

  • Mensagem envio:
{
    "id": "user",
    "type": "remove",
    "data": {
        "id": "",     // obrigatório
    }
}
  • Mensagem resposta:
    • sucesso:
      {
          "id": "success",
          "data": {
              "desc": "user deleted with success"
          }
      }
    • erro:
      {
          "id": "error",
          "data": {
              "desc": "error on delete user"
          }
      }

Login

  • Mensagem envio:
{
    "id": "login",
    "data": {
        "email": "email",   // obrigatório
        "password": "pass"  // obrigatório
    }
}
  • Mensagem resposta:
    • sucesso:
      {
          "id": "success",
          "data": {
              "id": "", // id do usuário logado
              "desc": "success login"
          }
      }
    • error
      {
          "id": "error",
          "data": {
              "desc": "invalid password or user name"
          }
      }

Logout

  • Mensagem envio:
{
    "id": "logout"
}
  • Mensagem resposta:
    • sucesso:
      {
          "id": "success",
          "data": {
              "desc": "success logout"
          }
      }
    • error
      {
          "id": "error",
          "data": {
              "desc": "error on logout"
          }
      }

Service

Create Service

  • Mensagem envio:
{
    "id": "service",
    "type": "create",
    "data": {
        "type": "",              // obrigatorio
        "description": "",       // opcional
        "value": "",             // obrigatorio
        "id_user_provider": "",  // opcional (enviar na hora de escolher o serviço) - id do usuário que vai executar o serviço
        "id_user_client": "",    // obrigatorio - id do usuário que pediu o serviço
        "user_client_place": "", // obrigatorio - lugar onde o usuario pediu o serviço
        "service_place": "",     // obrigatorio - lugar onde o cliente quer executar o serviço
        "date": "",              // obrigatorio (YYYY-MM-DD)
        "hour": "",              // opcional (HH:mm:ss)
        "status": ""             // obrigatorio - ("aberto" na hora da criação)(status possiveis: aberto, andamento, fechado)
    }
}
  • Mensagem resposta:
    • sucesso:
      {
          "id": "success",
          "data": {
              "id": "", // id do servico criado
              "desc": "success create service"
          }
      }
    • erro:
      {
          "id": "error",
          "data": {
              "desc": "error create service"
          }
      }

List servicos

busca pelos campos passados nos campo "data" sempre vai buscar pelo valor igual ao passado

  • Mensagem envio:
{
    "id": "service",
    "type": "list",
    "data": {
        "id": "",           // opcional
        "type": "",         // opcional
        "description": "",  // opcional
        "id_user_provider": "", // opcional
        "id_user_client": "",   // opcional
        "status": ""            // opcional (aberto, andamento, fechado)
    }
}
  • Mensagem resposta:
    • sucesso:
      {
          "id": "success",
          "data": {
              "services": [{
                  "id": "",
                  "type": "",
                  "description": "",
                  "value": "",
                  "id_user_provider": "",
                  "id_user_client": "",
                  "user_client_place": "",
                  "service_place": "",
                  "date": "",
                  "hour": "",
                  "status": ""
              }]
          }
      }
    • erro:
      {
          "id": "error",
          "data": {
              "desc": "error list service",
              "services": []
          }
      }

Update Servico

atualiza apenas os campos passados no campo "data"

  • Mensagem envio:
{
    "id": "service",
    "type": "update",
    "data": {
        "id": "",           // obrigatorio (ele será o campo para fazer o filtro e os outros campos passados serão atualizados)
        "type": "",         // opcional
        "description": "",  // opcional
        "value": "",        // opcional
        "id_user_provider": "", // opcional
        "id_user_client": "",   // opcional
        "user_client_place": "", // opcional
        "service_place": "",    // opcional
        "date": "",             // opcional (YYYY-MM-DD)
        "hour": "",             // opcional (HH:mm:ss)
        "status": ""            // opcional
    }
}
  • Mensagem resposta:
    • sucesso:
      {
          "id": "success",
          "data": {
              "desc": "sucess update service"
          }
      }
    • erro:
      {
          "id": "error",
          "data": {
              "desc": "error update service"
          }
      }

Remover Servico

remove a partir de um id passado

  • Mensagem envio:
{
    "id": "service",
    "type": "remove",
    "data": {
        "id": "",     // obrigatório
    }
}
  • Mensagem resposta:
    • sucesso:
      {
          "id": "success",
          "data": {
              "desc": "service deleted with success"
          }
      }
    • erro:
      {
          "id": "error",
          "data": {
              "desc": "error on delete service"
          }
      }

Error when the message sent is broken

quando o cliente enviar um JSON inválido; ou quando o cliente enviar um JSON com campo "id" inválido; ou quando o cliente não enviar o campo data; ou quando o cliente não eviar o contrato correto para a ação que ele pediu;

{
    "id": "error",
    "data": {
        "desc": "unprocessable message"
    }
}

CHAT

Aqui foi usado JSON-SCHEMA para tentar mitigar os problemas que tivemos com entendimento do contrato. É possivel validar seu JSON usando o seguinte link: JSON-SCHEMA-VALIDATOR

  • SCHEMA da "Mensagem de envio"
{
    "$schema": "http://json-schema.org/schema",
    "title": "send-message",
    "description": "Payload para enviar mensagens ao servidor",
    "type": "object",
    "properties": {
        "id": {
            "type": "string",
            "const": "chat"
        },
        "data": {
            "type": "object",
            "properties": {
                "message": {
                    "type": "string",
                    "description": "Conteúdo da mensagem"
                }
            },
            "required": [
                "message"
            ]
        }
    },
    "required": [
        "id",
        "data"
    ]
}
  • SCHEMA da "Mensagem resposta":
{
    "$schema": "http://json-schema.org/schema",
    "title": "broadcast-message",
    "description": "Payload que o servidor envia a todos os clientes (Chat) - até mesmo para quem enviou a mensagem",
    "type": "object",
    "properties": {
        "id": {
            "type": "string",
            "const": "chat"
        },
        "data": {
            "type": "object",
            "properties": {
                "ip": {
                    "type": "string",
                    "description": "IP do usuário que enviou a mensagem"
                },
                "message": {
                    "type": "string",
                    "description": "Conteúdo da mensagem"
                }
            },
            "required": [
                "ip",
                "message"
            ]
        }
    },
    "required": [
        "id",
        "data"
    ]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment