šŸ’» Backend AplicaĆ§Ć£o: Vagas

ExercĆ­cio de criaĆ§Ć£o de Backend e API-REST, desenvolvido em Dart, para servir tanto ao App Mobile - acesso do Cliente, quanto a pĆ”gina Web - acesso do recrutador e administrador.

AbstraĆ§Ć£o Inicial

Alt text

ImplementaĆ§Ć£o

  • CriaĆ§Ć£o do projeto dart

  • InstalaĆ§Ć£o das dependĆŖncias

  • CriaĆ§Ć£o do Servidor

    • DotEnv - 'leitor de arquivos' que contĆ©m informaƧƵes sensĆ­veis.
  • CriaĆ§Ć£o da Api (Controllers)

    • Encapsulamento da seguranƧa e middlewares na interface da API (Controllers)

    • Rotas

      • GET '/vacancy'
      • POST '/vacancy'
      • PUT '/vacancy'
      • DELETE '/vacancy'
  • Model Layer

    • Alt text
  • Service Layer

    • Interface de ServiƧo GenĆ©rica
    • Isolamento da camada Service
  • Middlewares

    • criaĆ§Ć£o de middlewares com shelf createMiddleware()
    • criaĆ§Ć£o de middlewares customizados
  • Mime Type : application/json

    Middleware get middleware => createMiddleware(
            responseHandler: (Response res) => res.change(
              headers: {'content-type': 'application/json'},
            ),
          );
  • verifica a existencia do token JWT

    Middleware get verifyJwt => createMiddleware(
            requestHandler: (Request req) {
              if (req.url.path == 'login') return null;
              if (req.context['jwt'] == null) {
                return Response.forbidden('Not Authorized');
              }
              return null;
            },
          );
  • valida Jwt - PermissĆ£o

    Middleware get authentication {
      return (Handler handler) {
        return (Request req) async {
          String? authorizationHeader = req.headers['Authorization'];
    
          JWT? jwt;
    
          if (authorizationHeader != null) {
            if (authorizationHeader.startsWith('Bearer ')) {
              String token = authorizationHeader.substring(7);
              jwt = await validateJWT(token);
            }
          }
          var request = req.change(context: {'jwt': jwt});
          return handler(request);
        };
      };
    }
  • SeguranƧa

    • Interface de SeguranƧa
      • Encapsulamento da seguranƧa na interface da Api (Controller) atravĆ©s dos middlewares

        abstract class SecurityService<E> {
          Future<String> generateJWT(String userID);
          Future<E?> validateJWT(String token);
        
          Middleware get authentication;
          Middleware get verifyJwt;
        }
  • ImplementaĆ§Ć£o do contrato com JWT

  • Injetor de DependĆŖncia

    • CriaĆ§Ć£o da classe DependencyInjector Container de injeĆ§Ć£o de DependĆŖncia
    • CriaĆ§Ć£o da classe Injects que armazena os registros das instĆ¢ncias

A Desenvolver

  • Banco de Dados MySql
  • Docker
  • Conectar projeto Dart ao banco de dados
    • criaĆ§Ć£o da abstraĆ§Ć£o da conexĆ£o com o banco
    • Mapear modelos da consulta
  • DAO Pattern - Isolamento as consultas
  • CRUD
  • API - ponta a ponta
  • Hash nas senhas
  • IntegraĆ§Ć£o do Login
  • CORS
  • Deploy

Relembrando Conceitos

  • Passagem de Dados com Query e Router Parms

    • Router param
      • obter parĆ¢metro diretamente da url.Exemplo: http://localhost:8080/<variavel>
    • Query parms
      • busca pelo parametro na url atraves da estrutura
        • String? nome = req.url.queryParameters['nome]
        • Passagem por http://localhost:8080/query?nome=Luan
    • body param
      • String body = await req.readAsString()
  • Mime Type - inseridos no headers da Response na chave content-type

    • Exemplos
    • content-type: application/json
    • content-type: text/html
  • Cascade e PipeLine