Coder Social home page Coder Social logo

ccsa-ufrn / sigeva Goto Github PK

View Code? Open in Web Editor NEW
5.0 4.0 1.0 7.5 MB

Plataforma que suporta o gerenciamento de eventos acadêmicos do CCSA

Home Page: https://ccsa-ufrn.github.io/sigeva/

License: GNU General Public License v3.0

JavaScript 95.64% CSS 3.91% Dockerfile 0.03% EJS 0.43%
academy management-system nodejs react redux mongodb

sigeva's Introduction

Sigeva

Sistema de Gestão de Eventos Acadêmicos (Sigeva)

GPL CircleCI

Sistema que suporta o evento Seminário de Pesquisa do Centro de Ciências Sociais Aplicadas (CCSA) da UFRN.

Para obter informações sobre instalação, configuração e uso, acesse a wiki do projeto.

Requisitos de sistema

  • Node.js >= v7.0.0
  • NPM >= 3.10.8
  • MongoDB >= 3.2.11

Configurações iniciais 🔧

Antes de instalar dependencias e executar um servidor de Sigeva, é necessário que o arquivo de configuração esteja devidamente preenchido, para isso execute os seguintes passos:

Copie o arquivo config.TEMPLATE.js para um novo arquivo com o nome config.js. Edite as informações desse arquivo de acordo com suas preferências de servidor de banco de dados, chave de segurança, serviço de e-mail etc.

Além disso é necessário a criação de um diretório para armazenamento de arquivos de upload. De preferencia crie um diretório separado do código fonte de Sigeva, e dê permissão de escrita para sigeva no diretório. O arquivo config.js também possui um parâmetro para que seja configurado o endereço absoluto do diretório de arquivos.

Iniciando para produção 🏃

❗ Para executar Sigeva em produção recomendamos utilizar uma instância Docker com/ou um monitorador como o PM2, os comandos abaixo iniciará um servidor Sigeva mas não é a melhor forma de fazer isto, utilize com cuidado.

Para utilizar Sigeva nesse ambiente é necessário instalar as dependencias de produção. Para isso execute, no terminal:

npm install --production

Certifique-se de que seu banco de dados Mongo DB está devidamente funcionando e pronto para receber uma conexão para efetuar os próximos passos. Antes de inicializar o servidor, é necessário rodar o script de inicialização do banco de dados, que faz algums configurações importantes. Para isso execute no terminal:

npm run initdb:prod

É recomendado que somente releases sejam utilizadas em servidores de produção, mas se deseja transpilar o código fonte, ou criar uma release do projeto execute o seguinte comando:

npm run build:server

❗ Para executar o código acima é importante notar que as dependencias de desenvolvimento devem ser instaladas, caso contrário haverá erro de execução.

Caso esteja utilizando uma release, ou se já efetuou a transpilação do código fonte, execute o comando a seguir para inicializar o serviço Sigeva em modo de produção:

npm run start:prod

Iniciando para desenvolvimento 🚶

Este modo é indicado para fazer desenvolvimento de novas features para Sigeva. Caso esteja desenvolvendo algo envie-nos uma PR, e não esqueça de seguir o workflow detalhado na seção "Como contribuir".

Nesse ambiente é necessário instalar todas as dependencias de Sigeva. Para isso execute, no terminal:

npm install

Após configurar o config.js, inclusive definindo um diretório para arquivos de upload, você deve se certificar de que existe uma instancia de MongoDB em execução no servidor e porta definidos no arquivo de configuração. Então, execute o seguinte comando para fazer inicialização de configurações do sistema no banco de dados:

npm run initdb:dev

Por fim, execute o comando para inicialização do serviço. Este comando executa o código fonte com babel-node no modo debug (Utilize a ferramenta Google Chrome Dev Tools) e com o nodemon que reinicia o serviço caso o código seja alterado.

npm run start:dev

Antes de desenvolver, note que Sigeva utiliza EditorConfig e ESLint, certifique-se de encontrar plugins dessas ferramentas para seu editor preferido.

Com as dependencias resolvidas inicie a aplicação com o comando npm start. A aplicação é reiniciada para cada alteração em algum código, graças ao pacote nodemon.

Você pode buildar algo para produção com os comandos npm run build_server e npm run build_react que, respectivamente, transpilam os código do servidor e do front-end em React.js.

Documentação (em desenvolvimento) para utilizadores do projeto, contendo instruções para instalação e inicialização de uma instância de Sigeva.

Documentação para desenvolvedores/colaboradores do projeto.

Como contribuir

Leia informações sobre como contribuir em /.github/CONTRIBUTING.md

sigeva's People

Contributors

dependabot[bot] avatar luccasmmg avatar mrmorais avatar thaydds avatar v1d3rm3 avatar wilholt avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

Forkers

neviim

sigeva's Issues

Reiniciar estado do login após sucesso

Terrível bug que permite, após o logout, fazer login sem preencher email e senha. Para resolver o estado do login deve ser reiniciado após sucesso do login.

Menu lateral User Dashboard

O menu lateral do User Dashboard, deverá possuir o título: "Meus eventos" (ou similar) e conterá links para acessar Event Dashboards dos eventos em que o usuário está inscrito.

Pré-requisitos:

  • O modelo de usuário deve possuir o campo ofEvents que possui os eventos com os quais o usuário se relaciona.

Este issue contribui para a finalização do #31

Tornar o componente EventCard sensível ao contexto

O EventCard será sensível ao contexto de usuário e de evento.

  • Evento
    • Se o evento está em período de inscrição deverá aparecer um label "Inscrições abertas"
    • Se estiver passado do período de inscrição deverá aparecer um label "Inscrições encerradas"
  • Usuário
    • Se o usuário estiver logado e já inscrito no evento deverá aparecer o botão "Dashboard" (ou similar)
  • Em todos os casos aparecem o botão "Acessar" que leva para a Página de Evento e as seguintes informações:
    • Período do evento
    • Local
    • Descrição curta (descrição com limite de caracteres)

Um EventCard se assemelha a imagem:

Inicializar banco de dados em modo DEV

Atualmente os testes estão gerenciando os registros no banco de dados. Seria melhor que ao inicializar o servidor no modo "DEV", inicializa o banco de dados caso seja necessário. E os testes vão ser feitos em cima desse banco de dados.

bug no isomorfismo

Quando o usuário está logado e tenta acessar a página inicial ele é redirecionado para o dashboard. Não é possível lançar esta ação em renderização back-side por quê depende do storage do navegador. Assim, na situação em que o usuário abre a tela inicial estando logado, é mostrada a tela inicial por um curto período enquanto o front-end verifica o storage.

Isso indica que a forma com a qual o state da aplicação está sendo manipulada/armazenada não é a ideal para esta aplicação. É necessário rever os ideais de isomorfismo e reformular as interações com o state para que a renderização back-end leve em consideração o state da aplicação já existente.

Carregar evento pelo id

Tipo de issue

  • Implementação
  • Melhoria
  • Bug

Stack relacionada

  • Back-end
  • Front-end
  • Banco de dados

Descrição

Issues relacionadas

Commits relacionados

[ex: cm1h3, ch51gh]

[System] Criar coleção System com campos de cadastro

Modelo System
Deve conter, inicialmente apenas um campo ofRegisterFieldRequirement[] para armazenar as solicitações de campos requeridos (por referência).

Classe System

  • retornar campos requeridos

Rotas System

  • retornar campos requeridos pelo sistema

DAO System

  • Controlar SystemObject

[User] Retornar todos usuários

Desenvolver rotas + funções + DAO para retornar todos os usuários

** Administrador **
O administrador pode solicitar todos os usuários do sistema

** Coordenador de evento **
O coordenador de evento pode solicitar todos os usuários do evento

Dashboard do usuário

Deve-se criar uma nova página que é carregada depois que o usuário loga-se com sucesso no sistema. A partir de então, se o usuário (logado) acessar a página inicial ele será redirecionado para o seu dashboard.

O dashboard do usuário contempla todas as funcionalidades sensíveis ao usuário logado. Deve:

  • Permitir alteração de informações pessoais do usuário
  • Listar eventos que o usuário participa Substituido por #38
  • Listar eventos disponíveis para inscrição #39
  • Acessar área de evento #38

A zona de administração é uma área separada do dashboard. Como o usuário administrador é, também, um usuário comum, sua área de dashboard é também a mesma dos usuários comuns.

[Event] Retornar todos os eventos

A rota GE /api/event/all deve retornar todos os eventos considerando filtros, ordenação e paginação da API.
Exemplos de requisições:

  • Pegar título e subtitulo de todos os eventos com até 10 por página
    • Requisição: https://sigeva.ccsa.ufrn.br/api/event/all/?f=title,subtitle&size=10
    • Retorno:
    "data": {
      "pagination": {
        "total_pages": 13,
        "links": {
          "self": "https://sigeva.ccsa.ufrn.br/api/event/all/?f=title,subtitle&size=10&page=1",
          "first": "https://sigeva.ccsa.ufrn.br/api/event/all/?f=title,subtitle&size=10&page=1",
          "prev": null,
          "next": "https://sigeva.ccsa.ufrn.br/api/event/all/?f=title,subtitle&size=10&page=2",
          "last": "https://sigeva.ccsa.ufrn.br/api/event/all/?f=title,subtitle&size=10&page=13"
        }
      },
      "events": [ ]
    }

Criar máscara para CPF e Telefone

Os tipos CPF e telefone, no formulário de cadastro, deve ter os campos CPF e Telefone (caso existam nos register fields) com uma máscara para facilitar a inserção pelo o usuário

Bug no redirecionamento entre /dashboard e /

Quando o usuário está logado o sistema se comporta como antes da resolução do bug #32, mas desta vez não é um problema do isomorfismo, mas sim dos redirecionamentos.

Percebe-se que o estado não chega ao Dashboard a tempo de verificar se o usuário está logado, assim ele repassa para o "/" que percebe o login e passa para o Dashboard novamente. ❓

Event board deve aparecer no UserDashboard

O mesmo componente da página inicial que mostra os eventos disponíveis na página inicial deve ser utilizado no UserDashboard. Vale notar que o EventBoard deve ser sensível a contexto do usuário.

Correlatos: #42 #43
Este issue contribui para a finalização do #31

Criar componente de inscrição no evento

Esse componente é sensível ao contexto de usuário.

  • Se o usuário está logado deverá aparecer um componente que permite a inscrição no evento, a partir da escolha do Papel público
  • Se o usuário não está logado deverá aparecer o componente de login (o mesmo da página inicial)
  • Se o usuário já está inscrito no evento o componente deverá ser um link para o Dashboard do Evento

Os dois primeiros componentes são similares a estes:

[Event] Rota para retornar paéis do evento

Tipo de issue

  • Implementação
  • Melhoria
  • Bug

Stack relacionada

  • Back-end
  • Front-end
  • Banco de dados

Descrição

[descrição aqui]

Issues relacionadas

[ex: #1, #2 ]

Commits relacionados

[ex: cm1h3, ch51gh]

bug na validação password e repeat_password

No RegisterForm, caso o usuário preencha somente o password e deixe o repeat_password vazio, não vai dar erro pelo fato dos campos não combinarem. O esperado é que um erro seja lançado.

explorar bug de TypeError

Ao efetuar um registro é lançado um TypeError por promise

Unhandled promise rejection (rejection id: 2): TypeError: this.DAO.createObject is not a function

Carregar eventos no EventBoard

O componente EventBoard deverá receber do back-end os eventos considerados ativos. Esses eventos serão impressos em um componente EventCard, que é sensível ao contexto do evento e usuário.

Será similar a imagem:

Criar componente com carregamento de informações de evento

O componente deverá imprimir todas as informações fundamentais do evento.

  • Local do evento
  • Período de atividade do evento
  • Período de inscrições
  • Label "Inscrições abertas" caso o período de inscrições esteja em curso
  • Detalhes do evento.
  • Imagem do evento

O componente se localizará na esquerda da Página de Evento, como na imagem:

fixar ação do pós registro

Após o registro com sucesso, deve renderizar mensagem de sucesso ou redirecionamento adequado. O RegisterForm possui o state register_success inicial em false, e é resolvido para true após a recepção dos dados de registro (POST no /api/user).

Problemas identificados:

  • O buffer JSON da requisição não está se comportando como esperado (linha ~187)
  • o else do json.error nunca é atingido (linha ~190)

Criar endpoint para execução de ações em Módulo

Tipo de issue: Implementação

Stacks: Back-end

Entidades: PaymentModule

Descrição

Os módulos devem conter a função act() que recebe uma ação e um conjunto de informações através de uma requisição POST e deve verificar se o usuário logado possui permissão adequada para realizar tal ação e por fim, realizar a ação.

Atributos: user (objeto do usuário logado), roles (papéis que o usuário possui no evento), body (corpo POST da requisição), entitySlug (slug da entidade), subaction (subação a ser executada).

Fluxo:

  • Busca a entidade pelo slug
  • Pega as permissões da entidade pelo ID da entidade retornada
  • Pega a subaction (dentro de um switch, por exemplo), assim sabe-se qual a ação da permissão é necessária. Faz o filtro das permissões retornadas pela permissão desejada.
  • Chama uma função auxiliar que verifica se a permissão daquela subaction é possuida por pelo menos um dos roles passados (ex: matchPermission(roles, permission):boolean )
  • se o matchPermission retorna true, o usuário possui a permissão para executar a ação
  • executa a ação
  • retorna uma promisse com o resultado do tipo Response

Realizar autorização de usuário

Criar middleware de autorização de usuário a partir do token.
O token é passado pelo campo Authorization do header da requisição

[User] verificar se já existe email cadastrado

Pendencia de criação de usuário #3

Na classe User foi criado a função que retorna um Promise e que realiza a busca de um usuário por email, retornando o userObject caso encontrado, e retornando false caso contrário.

❗ Problema: Como chamar esta função asyncrona na função setData ?

[User] Retornar usuário logado na rota POST /user/me

Deve-se criar uma nova rota na API '/user/me' que retorna os dados formatados do usuário atualmente logado. Esta rota exige a passagem do Token e autorização.

Deve-se passar o token pela header: Authorization

[User] Desativar usuário

Desenvolver rotas + funções + DAO para desativar um usuário

Somente Administrador e o próprio usuário podem desativar uma conta

Sprint Note 6

Front-End

  • User Dashboard (M)
    • Menu do User Dashboard (M)
      • Adicionar links de acesso para os dashboards dos Eventos.
    • Eventos diponíveis (M)
      • Utiliza o mesmo componente da tela inicial (EventBoard) ✅
  • Layout do Dashboard (M) ✅
    • Menu superior com dropdown para Conta/Dashboard/Sair (M) ✅ 487d50b
  • Página do Evento
    • Informações do evento (T)
    • Inscrição (M)
  • EventBoard (T)
    • Se estiver no período de inscrição aparecerá uma label "Inscrições Abertas" (T)
    • Se o usuário logado estiver inscrito aparecerá o link para "Dashboard do Evento" (T)

Back-end

  • Criar rota para inscrição em evento: POST "/event/:id/enroll" body: {roleId} Autorização simples (só necessário estar logado) (M) ✅
  • Modificações nos modelos (M)
    • Criar o modelo "Relationship" (M) ✅ 7d0fbee
    • Criar o modelo "Role" (M) ✅ c55c5f8
    • Alterar "Event" para receber "ofRelationships" e "ofRoles" (M) ✅ 7d0fbee
    • Na criação do evento são gerados não editáveis: "Coordenador do evento" Privado. (M) ✅
    • Alterar "User" para receber "ofEvents" (M)

Menu superior no Header para usuário logado

Quando o usuário estiver logado, a barra de menus superior será sensível ao usuário. Permitindo que acesse configurações da conta, volte ao Dashboard ou fazer logout do Sigeva. Parecido com a imagem a seguir:

Rota de inscrição em evento

Rota para inscrição de um usuário em um evento. A inscrição obriga a passagem de um papel do tipo público que existe dentro do evento. A inscrição pode ser feita mediante autorização do tipo Simples (necessita apenas estar logado)

Rota:

POST /api/event/:id/enroll
body: { roleId }

A inscrição no evento, a nível de banco de dados, faz:

  • Criar uma instancia de Relationship ( #45 ) na lista ofRelationships de Evento
  • Criar uma referência para evento na lista ofEvents de Usuário

Esta rota é utilizada pelo container do componente desenvolvido em #40

Criar modelo Role

O modelo "Role" representa papeis (públicos ou privados) que um usuário pode ter em relação a um evento, firmado pela ação de inscrição no evento.

A documentação Papel requer melhorias.

Sprint Note 7

Front-end

  • Event Board (T) #42
    • Event Card deve ser sensível ao contexto (T) #43
  • Página de evento
    • Carregar o estado com informações pelo ID #48 (M) ✅
    • Detalhes do evento (T) #41

Back-end

  • Finalizar rota de inscrição em evento (M) #44
  • Rota que retorna os papéis do evento (M) #49
  • Resolver pendências da inscrição no evento (M) #44

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.