Git Product home page Git Product logo

caronae / caronae-backend Goto Github PK

View Code? Open in Web Editor NEW
38.0 8.0 16.0 24.05 MB

[Projeto descontinuado] Backend do Caronaê, app open-source de caronas usado por mais de 15 mil alunos da UFRJ

Home Page: https://caronae.org

License: GNU General Public License v3.0

PHP 66.63% JavaScript 23.89% HTML 7.87% Shell 0.61% Dockerfile 0.09% Python 0.18% CSS 0.67% Makefile 0.06%
caronae laravel php ridesharing carona

caronae-backend's Introduction

Caronaê - Backend

CircleCI StyleCI

Backend do Caronaê, baseado no Laravel. O backend é composto por uma API REST usada pelos apps e pela área administrativa, usada internamente.

O Caronaê é um sistema de código aberto, seguro e prático de caronas compartilhadas, criado com o objetivo de ser replicado em diferentes instituições e feito exclusivamente para a comunidade acadêmica das instituições integrantes da Rede Caronaê. Para conhecer mais sobre o projeto, visite nosso site.

Instalação

O backend do Caronaê executa em um ambiente com PHP 7, PostgreSQL e Redis.

O jeito mais fácil de executar este projeto localmente é utilizando nossas imagens Docker. Você não precisa ter nada instalado na sua máquina além do Docker e Docker Compose.

No diretório docker há uma configuração do Docker Compose. Para rodar o projeto junto com todas as dependências necessárias, execute:

cd docker
docker-compose up

Você pode criar uma terminal dentro do container do caronae-backend através do comando abaixo:

docker exec -it caronae-backend sh

Populando o banco de dados

Quando você executa o projeto pela primeira vez, o banco de dados está vazio. Porém há um seed que popula um banco de dados com dados aleatórios, perfeito para desenvolvimento local. Para usá-lo, execute o comando abaixo:

Importante: o comando abaixo apaga todos os dados existentes antes de inserir os novos dados.

docker exec -it caronae-backend php artisan migrate:refresh --seed

Pronto! Agora você já pode fazer login na área administrativa utilizando o usuário padrão.

Usando a API através do Postman

Nós recomendamos usar o aplicativo Postman pra testar as chamadas da API.

Como as rotas da API são protegidas apenas para usuários logados, você precisa gerar um token JWT pra se autenticar na API. Você pode gerar um token pela área administrativa clicando em API tokens.

Uma vez gerado o token, você pode configurá-lo na aba Authorization do Postman. No campo Type, selecione 'Bearer Token'. No campo Token, insira o token gerado na área administrativa.

Testes

Este projeto possui alguns testes unitários e de integração, que ficam dentro da pasta tests. Eles verificam o comportamento da aplicação a fim de evitar que mudanças no código quebrem alguma funcionalidade existente. Para ler mais sobre testes no Laravel, consulte a documentação oficial.

Existe um arquivo de configuração do Docker Compose feito só pra poder rodar os testes. Você pode executá-lo da sua máquina usando o comando abaixo de dentro da pasta docker:

docker-compose -f docker-compose.test.yml up --build --exit-code-from caronae-backend-tests

caronae-backend's People

Contributors

damascenorafael avatar daniellima avatar dependabot[bot] avatar evertoncatto avatar igorrocha avatar itepifanio avatar jcavalin avatar kazefiro avatar ldamota avatar leomarques avatar lucashanke avatar macecchi avatar munizeverton avatar rpaggi avatar tonysm avatar tspencer244 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

caronae-backend's Issues

Foto da usuária não aparece na área administrativa

Na visualização da usuária na área administrativa, a imagem do usuário está quebrada, e o Laravel está inserindo um valor 1 ao invés da URL da imagem do usuário.

Exemplo: http://localhost:8000/admin/users/1
screen shot 2018-10-28 at 11 42 37

Essa view é montada aqui - https://github.com/caronae/caronae-backend/blob/master/resources/views/users/user.blade.php#L3 - com uma imagem padrão caso não exista, mas por algum motivo essa lógica não funciona mais.

Um chute é que algum update do Laravel quebrou essa sintaxe (ou ela sempre esteve errada).

Melhorar a pesquisa por nome do usuário na área administrativa

Atualmente a pesquisa por usuários pelo nome na área administrativa - http://localhost:8000/admin/users - funciona fazendo um ILIKE (case-insensitive LIKE) no banco de dados. No entanto, isso não funciona bem quando queremos pesquisar por uma composição do nome da pessoa - por exemplo, pesquisando pelo primeiro e último nome, como Bruno Neto, não encontraria um usuário Bruno Mateus Quintana Neto, pois o último termo não aparece junto com o primeiro.

2018-10-20 21 11 15

Isso é um problema porque às vezes os usuários mandam mensagens de suporte só usando o primeiro e último nome, e aí essa busca pela equipe acaba sendo manual :(

No controller, essa query é montada aqui - https://github.com/caronae/caronae-backend/blob/master/app/Http/Controllers/Admin/UserController.php#L39-L41. Esse controller usa a biblioteca Laravel Backpack CRUD, mas isso não deve importar muito, porque essa query já está sendo personalizada por nós.

Uma possível solução seria substituir os espaços da pesquisa por um %, mas não testei e não sei se existe uma solução melhor.

Bônus: conseguir pesquisar ignorando acentos - por exemplo, a pesquisa por 'antonio' encontraria um usuário chamado 'Antônio'. Isso atualmente não funciona. Não sei sei o banco de dados (PostgreSQL 9.6) já possui alguma função pra considerar isso na pesquisa.

Configurar auto-merge do master para a branch develop

Atualizações feitas diretamente na branch master deveriam propagar automaticamente para a branch de develop.

Contexto

A branch develop representa o estado do ambiente de desenvolvimento, enquanto a branch master representa o ambiente de produção.

Normalmente os cards são feitos primeiros no develop e depois mergeados para master, mas às vezes são feitos commits diretamente na master (no caso de hotfixes, por exemplo) e o ambiente de desenvolvimento só é atualizado fazendo manualmente um merge do master no develop. Isso poderia ser automatizado no CI.

Exibir caronas da usuária na área administrativa

Na área administrativa existe uma view que mostra o perfil da usuária, como na imagem abaixo. Essa tela é usada pela equipe do Caronaê principalmente quando alguma pessoa tem algum problema e entra em contato com a gente, e precisamos encontrar os dados da pessoa:

screen shot 2018-10-20 at 21 36 12

No entanto, essa view atualmente não traz mais informações além do próprio perfil da usuária.

A ideia é acrescentar informações das caronas da usuária - como as caronas ofertadas e as caronas que ela participou. O próprio model User já retorna as caronas pelo método $user->rides(), que inclui um campo status que indica qual o relacionamento dele com a carona - driver, accepted, pending e refused.

A minha ideia era ter um bloco similar ao de 'Detalhes do usuário', só que de 'Caronas do usuário'. As caronas listadas podem exibir algumas informações, como:

  • título da carona ($ride->title, que retorna algo como Japeri → Praia Vermelha | 21/03)
  • motorista da carona (pq pode ser a própria usuária ou outra motorista)
  • qual o status da usuária na carona (se é motorista, se já foi aceita ou ainda está pendente etc)
  • qual o status da carona ($ride->done, se já foi finalizada ou não)
  • número de caronistas na carona ($ride->riders->count())
  • um link para a página da carona na área administrativa (/admin/rides/12345)
    (se achar relevante, veja a página da carona e quais são as informações disponíveis)

Código do controller: https://github.com/caronae/caronae-backend/blob/master/app/Http/Controllers/Admin/UserController.php (usamos a biblioteca Laravel Backpack CRUD, mas essa view é feita na mão, então não faz tanta diferença).
Código da view: https://github.com/caronae/caronae-backend/blob/master/resources/views/users/show.blade.php

Corrigir seeders para popular banco de dados

O projeto conta com alguns seeders, que geram dados aleatórios no banco de dados, que estão desatualizados e, portanto, não funcionam. 😢

O que são seeders?

Os seeders permitem que qualquer pessoa desenvolvedora possa criar um banco de dados com algumas caronas e usuários de exemplo para poder testar as coisas e observar como funciona o sistema, sem precisar criar dados iniciais ou depender de um dump com dados reais de usuários.

Por exemplo, se acabei de baixar o projeto e criar o banco de dados, posso executar o comando abaixo e em seguida já teria dados de exemplo para visualizar como o sistema funciona:

php artisan db:seed

Detalhes

Os arquivos ficam na pasta https://github.com/caronae/caronae-backend/tree/master/database/seeds.

Os seeds utilizam factories, que são funções que criam caronas, usuários etc usando dados aleatórios. No entanto, devido a refatorações e mudanças nos Models, alguns desses seeders (ex: NeighborhoodSeeder) precisam ser reescritos usando os novos formatos e outros precisam ser criados (ex: InstitutionSeeder).

Campo de 'Usuário desde' não está funcionando na área administrativa

Na visualização da usuária na área administrativa, existe um campo 'Usuário desde' que não está aparecendo o valor.

screen shot 2018-10-28 at 11 35 11

Esse campo deveria mostrar o ano e mês que o usuário foi criado (usando o campo created_at).
Por exemplo: Usuário desde: outubro de 2018

Bônus: mostrar uma data relativa de criação do usuário. Exemplo: agosto de 2017 (há 1 ano e 2 meses) (dica: $date->diffForHumans())

Esta é a view onde isso é montado:
https://github.com/caronae/caronae-backend/blob/master/resources/views/users/user.blade.php

Eu chutaria que falta dizer que created_at é um campo date no model User e que faltou um format do Carbon pra exibir no formato certo.

Notificar usuárias que pediram carona caso ela seja cancelada

Atualmente, enviamos uma notificação para as caronistas avisando caso uma carona que elas foram aceitas é cancelada.

No entanto, caso a usuária ainda esteja aguardando aceitação e a motorista cancela a carona, não enviamos nenhuma notificação, e a carona simplesmente some para a usuária.

A notificação é enviada no RideController, no método leaveRide, que é chamado quando a motorista cancela a carona.

$riders = $ride->riders()->get();
$riders->each->notify($rideCanceledNotification);

O problema é que $ride->riders() só retorna as caronistas que já foram aceitas, com status accepted:

https://github.com/caronae/caronae-backend/blob/master/app/Models/Ride.php

public function riders()
{
    return $this->belongsToMany(User::class)->wherePivot('status', 'accepted');
}

Precisaríamos mandar as notificações também para usuárias com o status pending. Isso poderia ser feito através de outro método ou adicionando uma flag nesse método existente para incluir ou não o status pending.

Outro problema é a mensagem da notificação. Na notificação RideCanceled, a mensagem precisa ser diferente caso a usuária ainda tenha status pending.

Ao invés de dizer Um motorista cancelou uma carona ativa sua, podemos verificar o status do relacionamento e, caso seja pending, dizer Um motorista cancelou uma carona que você havia solicitado.

Listar apenas caronas da instituição do usuário

O usuário do Caronaê deve poder visualizar apenas as caronas oferecidas na sua própria instituição.

Exemplo: se sou aluno da UFRJ, não posso visualizar caronas ofertadas por alunos da UNIRIO.

Para isso, a listagem de caronas que vem da API deve levar em consideração a instituição do usuário que fez a requisição e retornar apenas as caronas da instituição a que pertence.

Detalhes

Cada usuário já é associado a uma instituição e cada carona também. É necessário adaptar a rota de listar/pesquisar caronas (RideController::index) para filtrar apenas as caronas que pertencem a motoristas da mesma instituição do usuário atual.

Extras

A rota de requestJoin (por onde pode solicitar participar numa carona) também deve impedir que um usuário de uma instituição solicite participar de uma carona de outra instituição.

Criar rota única para listar caronas pendentes, ativas e ofertadas

Criar uma rota única na API (ex: /user/{id}/rides) para carregar as caronas do usuário, separando por pendentes, ativas e ofertadas.

Já é possível obter as caronas de cada uma dessas categorias utilizando métodos do próprio User (activeRides, offeredRides, pendingRides), bastando apenas consolidar uma rota que retorna todas elas.

Como as caronas dessa tela serão exibidas em uma única tela "Minhas" no aplicativo, as caronas que pertencem a mais de uma dessas categorias não deve vir mais de uma vez, aparecendo apenas na categoria mais prioritária.

Prioridade das categorias:
Pendente > Ativa > Ofertada

Localisation?

Are there plans to introduce other languages?
many thanks

Separar model factories em arquivos separados

Atualmente temos um único arquivo ModelFactory que possui as factories pra todos os modelos do app:

https://github.com/caronae/caronae-backend/blob/master/database/factories/ModelFactory.php

O padrão do Laravel sugere que deveríamos ter um arquivo pra cada factory, então deveríamos criar novos arquivos como UserFactory, RideFactory etc. ao invés de um só com todos.

https://github.com/laravel/laravel/blob/master/database/factories/UserFactory.php

Atualizar Laravel para a versão 5.8

Atualmente estamos na versão 5.7 do Laravel, mas podemos atualizar pra versão 5.8 seguindo o guia de upgrade.

Dando uma breve olhada, o ponto de maior atenção no upgrade seria o Cache TTL In Seconds nas classes onde usamos cache.

Também seria bom ver os diffs dessa versão no próprio GitHub pra manter arquivos de configuração e outras coisas nos padrões mais recentes.

Impedir que caronas duplicadas sejam criadas

A API deve impedir que o usuário ofereça mais de uma carona na mesma data.

Foi implementada uma rota (em RideController::validateDuplicate) para a verificação prévia se uma carona é duplicada ou muito parecida com outra já criada.

No entanto, a API não está verificando esse estado no momento da criação, o que torna possível para os clientes ainda criarem caronas duplicadas e não seguir a verificação prévia.

A API deveria retornar um estado de erro para o caso em que a nova carona é considerada duplicada (duplicated).

No caso de a carona ser considerada apenas possible_duplicate, o servidor deverá permitir que seja criada mesmo assim.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.