Vous êtes sur la page 1sur 12

Funcionalidades

Gerais do sistema
Entrar no sistema (request)
In: cookie.facebookId

Ao entrar pela primeira vez no sistema, um User criado, com o facebookId configurado.

Lanar os jobs Sincronizar amigos e Sincronizar dados FB.

Notificao: Seus dados e amigos esto sendo importados do Facebook, isto pode levar alguns
instantes.

Sincronizar amigos (job)
In: userId

A sincronizao de amigos verifica todos os amigos do usurio no FB e cria uma Friendship entre eles
para aquelas que ainda no existem, ou remove aquelas que j no existem mais no Facebook e sim
aqui.

Para cada nova amizade, uma Friendship criada, com o valor de from com o user de menor _id, e em
to o user de maior _id.


Notificao: Seus amigos foram sincronizados com o Facebook.

Calcular amigos em comum (helper)
Calcula os amigos em comum

Sincronizar dados FB (job)
In: userId

Um request ao servidor do FB feito, a partir do ID do facebook do usurio. Os dados importados sero:

Primeiro nome
ltimo nome
Foto pequena
Foto mdia
Foto grande

As fotos sero salvas em um bucket da Amazon.

Esses dados so persistidos imediatamente no usurio.

Notificao: Seus dados foram sincronizados com o Facebook.


Notificao visualizada (request)
Request: PUT /notifications/readAt
In: <id[s]>, session.user
Pr: a Notification deve ser do usurio da sesso

Marca as Notifications como j visualizadas.

Perfil
Lista de amigos (request)
Lista de amigos em comum (request)
Lista de perfis de motorista (request)
Retorna a lista de DriverProfiles do usurio.
Trajetos e clculos
Criar trajeto (helper)
In: origin, destination, waypoints

Os waypoints so limitados em 8 pontos (too_many_waypoints).

Criamos um UserRoute com seu baseRoute dado por Retornar trajeto base.

Retornar trajeto base (helper)
In: origin, destination, waypoints

Retorna o trajeto base, caso exista em BaseRoute, no ndice origin-destination-waypoints.

Caso contrrio, criamos um BaseRoute. Fazemos um Request ao GMaps, com a origem, destino e
waypoints. A distncia deve ser 1km (min_dist) a 50km (max_dist) ou retornamos um erro. Pegamos
o resultado e armazenamos em um novo BaseRoute. Nesse novo BaseRoute, configuramos
status.processing como a datetime atual.

Do resultado do GMaps, extramos e salvamos no BaseRoute:
duration
polyline
polyline decodificada (points)
nmero total de pontos na polyline decodificada (totalPoints)
ponto central do trajeto (centralPoint)
O clculo feito pegando-se obtendo o ponto central dos bounds retornado pelo GMaps


Lanamos ento o job Calcular distncia de trajeto e pontos.


Retornar ponto base (helper)
In: address

Retorna um BasePoint onde on endereo dado est contido em addresses.*, caso encontrado.

Caso contrrio, fazemos um Request ao GMaps, com o endereo dado. Pegamos ento a latitude e
longitude obitdas, e buscamos em BasePoint. Se encontrada um entrada, adicionamos o novo endereo
e retornamos ela.

Se no encontrarmos uma entrada, criamos um BasePoint, com os dados obtidos, e tambm
status.processing com a data atual. Lanamos ento um job para Calcular a distncia de ponto a
trajetos.


Clculos de distncia para busca
Um BasePoint compatvel com um BaseRoute quer dizer que ele est a um limiar de 50km do
centralPoint do BaseRoute. A busca de compatibilidade buscar no banco se a latitude do centralPoint
est a +- 1.2 da latitude do BasePoint, e o mesmo para a longitude. Se a busca for baseada no
BaseRoute, basta buscar pontos em BasePoint com lat/lng a +- 1.2 do centralPoint.
Calcular distncia de trajeto a pontos (job)
In: baseRoute

Buscar todos os pontos em BasePoint compatveis com a baseRoute e realizar Calcular distncia entre
trajeto e ponto com todos eles.

Uma vez finalizado, o basePoint deve ter seu status de status.processing removido, e a informao de
syncedAt deve ser atualizada com o tempo atual.

Calcular distncia de ponto a trajetos (job)
In: basePoint

Identificar todos os trajeto compatveis com o ponto e ento realizar Calcular distncia entre trajeto e
ponto com todos os trajetos e este ponto.

Uma vez finalizado, o basePoint deve ter seu status de status.processing removido, e a informao de
syncedAt deve ser atualizada com o tempo atual.
Calcular distncia entre trajeto e ponto (helper)
In: baseRoute, basePoint

Se o baseRoute e o basePoint j possuirem um RoutePointDistance, retornar.

Criar um RoutePointDistance com o baseRoute e basePoint.

Calcular a distncia de baseRoute a basePoint:

1. Os pontos da polyline decodificada do BaseRoute so iterados;
2. As distncias dos consecutivos segmentos de reta so comparadas com o basePoint;
3. A menor distncia do basePoint a um segmento de reta guardada, junta ao ponto de menor
distncia no trajeto, em routePoint. A distncia guardada em metros, em distance;

Devemos guardar o tempo de processamento levado em processingTime.

Controle de horrio
Criar horrio (request)
Request: POST /schedules/
In: origin, destination, (arriveTime e/ou leaveTime), date, [originTag, destinationTag, weekly]

Se nenhum dos dois, arriveTime ou leaveTime, estiver sido definido, retornar o erro genrico
schedule_time_expected.
Criao da tag
Buscar uma entrada em UserPlace a partir da originTag e do usurio. Se no existir Criar Local e
associa-la ao horrio.
O mesmo repete-se para o destination.

Se weekly for dado, o horrio ser periodic, com index no dia da semana calculado para date (de 0 a 6),
e com frequency fixa em 7 (que indica semanal).

Calcular distncia de ponto a trajetos nos pontos origin e destination. Associar os pontos de BasePoint
ao horrio.

Retornar o horrio criado.

Editar horrio (request)
Request: PUT /schedules/<id>
Pr: horrio no possui nenhum grupo associado a ele

O procedimento e entrada so as mesmas do Criar horrio.

Deletar horrio (request)
Request: DELETE /schedules/<id>

Todos os grupos daquele horrio so tambm deletados, e o horrio inclusive.

Lista de horrios para dias especficos (request)
Retorna uma lista com todos os horrios disponveis para dias da semana selecionados.

Os horrios devem veicular algo indicando se h uma carona confirmada.

Controle de grupo
O usurio no poder mexer apenas na prxima Ride.
Controle de grupo (motorista)
Consideraes gerais
Se o usurio no for o driver do Group, retornar not_group_driver.

Criar grupo para um horrio (request)
Se j houver um Group do motorista para o Schedule, o erro group_already_exists retornado.

Ao criar o grupo, o motorista escolhe qual ser o trajeto, e quais sero as peculiaridades do grupo.

criado um Group associado ao Schedule dado, adicionado ao set groups do Schedule.

Fechar grupo (request)
O Group deletado e todos os membros recebem uma notificao <Nome do motorista> fechou o
grupo.
Todos os Schedules tm o Group removido de sua lista.

Remover membro (request)
Se o usurio no fizer parte do grupo, invalid_group_member retornado.

Todos os Schedules daquele membro tm o Group removido.
O usurio sai do set members do Group, e recebe uma Notification: <Nome do motorista> removeu voc
do grupo.

Quando um usurio removido de um grupo, sua entrada em GroupMessagesStatus deve ser removida.

Editar perfil de motorista (request)
Retornar prxima carona

Editar trajeto (request)
O motorista poder editar o trajeto da prxima carona apenas, ou do grupo, para sempre.
Para modificar o trajeto para sempre, o Group modificado.

Se a inteno modificar apenas para a prxima carona, apenas o Ride modificado.
Retornar prxima carona

Editar horrio da carona (request)
Retornar prxima carona

Controle de grupo (membro)
Consideraes gerais
Se o usurio no fizer parte do grupo, retornar not_group_member. Isto deve ser verificado buscando o
user em group.members ou driver.

Confirmar presena (request)
Retornar prxima carona

Se o usurio j estiver confirmado para a carona, already_confirmed deve ser retornado. Se o usurio j
estiver confirmado em outra carona, ele ser desconfirmado (Desconfirmar presena) da outra carona, e
confirmado nessa.

Se o tamanho de confirmedUsers for igual ou maior que o settings.maxPassengers, retornar ride_is_full.

Se algum Schedule do usurio j possuir algum Group confirmado, retornar other_group_is_confirmed.


Todos os Schedules do usurio que possuem o Group devem ter seu campo confirmedFor configurado
para esta Ride.
No Ride, o usurio inserido no set confirmedUsers.

O motorista recebe uma Notification: <Nome do usurio> confirmou a presena.

Desconfirmar presena (request)
Retornar prxima carona

Se o usurio no estiver confirmado para a carona, not_confirmed deve ser retornado.

O usurio sai do set confirmedUsers.
O motorista recebe uma Notification: <Nome do usurio> desconfirmou a presena.

Eu Iria (request)
O motorista no pode exercer esta ao, retornando you_are_the_driver.

Se o usurio j estiver confirmado para a carona, already_confirmed deve ser retornado. Se o usurio j
estiver confirmado em outro Group que compartilha um horrio deste Group, already_confirmed_other
deve ser retornado.

Esta ao pode ser efetivada apenas em Rides nas quais o motorista ainda no confirmou que ir. Se o
motorista j confirmou, o erro driver_already_confirmed retornado.

No Ride, o usurio inserido no set standbyUsers.

Retornar prxima carona

Sair do grupo (request)
O Group removido do Schedule.
O usurio nunca deixa de ser membro do Group, a menos que o motorista remova-o.

Enviar mensagem ao grupo (request)
criada uma GroupMessage ligada ao Group, com a hora em que a mensagem foi enviada.

Todos os usurio devem ver que h novas mensagens no grupo.
O contador de mensagens no lidas em GroupMessagesStatus deve ser incrementado para todos os
usurio. O atributo readAt deve ser nulificado, pois o usurio no leu todas as mesagens ainda.

Mensagens lidas (request)
Aqui indicamos que o usurio leu a ltima mensagem do grupo, e quando o fez, atravs de
GroupMessagesStatus, em readAt.

Em seguida, zeramos o contador de mensagens no lidas dele em GroupMessagesStatus.

Lista de mensagens (request)
In: group


Caso contrrio, retornar as mensagens.

Negociar ponto de encontro (request)
O usurio pode negociar o ponto de encontro para sempre ou apenas para a prxima carona.
Retornar prxima carona

Controle de grupo (usurio qualquer)
Consideraes gerais
Se o usurio no for amigo ou amigo de amigo do motorista, retornar driver_not_friend.

Lista de usurios no grupo (request)
Aqui so retornados os members do Group.

Apenas amigos ou amigos de amigos do motorista podem ver os membros de um grupo. Se o usurio
no for amigo, retornar driver_is_not_friend.

Histrico de caronas no grupo (request)
So retornados os Rides passados.

Retornar prxima carona (helper)
In: system.date, group

Busca para horrios datados
Retornamos a Ride com o date igual ao do Schedule.
Busca para horrios peridicos
Para buscar a prxima Ride peridica, usamos o filtro date > system.date e date < system.date +
frequency. Dessa forma, garantimos que a prxima carona, que ainda no passou e que no uma
muito adiantada. Se encontramos uma, retornamos ela.
Nova Ride
Se nenhuma foi encontrada, criamos uma Ride para o Group.

O date da nova Ride deve ser a data do prximo episdio de carona. Isso deve ser computado atravs
do date do Schedule e de sua periodicidade (date + frequency).

A nova Ride recebe os settings, driver e route de seu Group.

Finalmente, retornamos a Ride.

Busca de grupos
Buscar grupos para um horrio (request)
In: schedule

Aqui buscaremos todos os Groups que se encaixam nos filtros providos, em comparao ao Schedule
dado. No devem aparecer horrios nos quais eu dirijo.

Filtros:
Tolerncia de tempo: 15 30 45 60 min
Tolerncia de distncia at o trajeto: 500m 1km 1.5km 2km
Amigos ou amigos de amigos (conhecidos)
Semanal ou no

So ento retornados todos os Groups encontrados. Junto aos grupos encontrados, so retornados
tambm os GroupRequests entre aquele usurio e os grupos, indicando que h pendncias.

Enviar pedido para entrar em grupo (request)
In: group, schedule, message, pickPos, pickAt, dropPos

No posso enviar pedidos para entrar no meu prprio grupo (you_are_the_driver), ou em um grupo no
qual j sou membro (already_group_member).

Se j houver um GroupRequest para aquele schedule, group e user, retornar o erro
request_arleady_exists.
Ambos o pickPos e dropPos devem cair em um lugar prximo da polyline, caso contrrio, o erro de
parmetro invalid_polyline_position deve ser retornado.
O pickAt deve cair em um horrio entre os horrios limites do grupo.

O usurio envia um pedido para entrar no grupo, criando um GroupRequest.

Notificao: <Nome> enviou um pedido para entrar no seu grupo.

Recusar pedido (request)
Apenas o dono do grupo pode responder o pedido.

O GroupRequest removido.

O motorista pode indicar se deseja ou no enviar uma notificao. Caso envie, o usurio pedinte recebe
uma notificao: <Nome do motorista> recusou seu pedido de incluso no grupo.

Aceitar pedido (request)
O GroupRequest removido e o usurio recebe uma notificao <Nome do motorista> aceitou seu
pedido e voc entrou no grupo.

Adicionar usurio ao grupo
Cancelar pedido (request)
Apenas o dono do pedido pode recusar o pedido.
O GroupRequest removido e nada mais.

Negociar pedido (request)
O motorista do grupo modifica alguma coisa dos locais da carona e/ou da hora de encontro, e envia a
negociao ao usurio. O usurio recebe uma notificao <Nome do motorista> est negociando o
ponto de embarque e desembarque de seu pedido.

Buscar passageiro para um grupo (request)

Enviar convite para usurio (request)
O usurio entra no grupo e a

Recusar convite (request)
Aceitar convite (request)
Adicionar usurio ao grupo
Negociar convite (request)


Mecanismos gerais

Adicionar usurio ao grupo (helper)
O usurio entra como member do Group e o group adicionado ao Schedule do usurio.

Quando um usurio adicionado a um grupo, uma entrada nica em GroupMessagesStatus deve ser
criada relacionando ele e o grupo.


Negociar ponto de encontro
Criar local (helper)
In: tag, address, session.user

Se o tag j existir, o erro duplicate_tag retornado.

Se o tag no existir, criar uma nova entrada em UserPlace e associ-la a todos os horrios do usurio
que usam o endereo address.

Request ao GMaps (helper)
In: link

Todos os requests feitos ao GMaps devem ser logados com uma entrada em GMapsRequestLog, junto
com seu tempo de durao, seu link e o resultado.

Jobs de consistncia
Estes so alguns jobs necessrios para garantir a consistncia de dados.

GroupMessagesStatus
Todos os Groups so verificados. Entradas em GroupMessagesStatus que no tm mais o usurio no
Group so removidas. Entradas que esto faltando so adicionadas.

Duplicaes de dados
Schedule e Group, periodic.*

Server-side
MongoDB
NodeJS
Heroku
Client-side
Backbone
jQuery
GoogleMaps
Real-time
Os usurio sero alertados de novidades atravs de um canal de comunicao utilizando Socket.io.

Vous aimerez peut-être aussi