Este repositório contém a API central do programa Practice, que integra todos os serviços digitais criados pelo programa. Esse serviço tem o papel de centralizar funcionalidades para outras aplicações do programa (api gateway), além de disponibilizar serviços próprios.
Documentação completa da API: api-practice.uffs.edu.br/documentation
Para executar o projeto, você precisa ter o seguinte instalado:
IMPORTANTE: se sua distribuição linux não tem PHP 8.x disponível, rode
sudo add-apt-repository ppa:ondrej/php
antes de começar.
Você precisa de várias extensões PHP instaladas também:
sudo apt-get update
sudo apt install php8.0-cli php8.0-mbstring php8.0-zip php8.0-xml php8.0-curl php8.0-sqlite3 php8.0-curl
Feito a instalação das dependências, é necessário obter uma cópia do projeto. A forma recomendada é clonar o repositório para a sua máquina.
Para isso, rode:
git clone --recurse-submodules https://github.com/practice-uffs/api && cd api
Isso criará e trocará para a pasta api
com o código do projeto.
Instale as dependências do PHP usando o comando abaixo:
composer install
O banco de dados mais simples para uso é o SQLite. Para criar uma base usando esse SGBD, rode:
touch database/database.sqlite
Instale também as dependências do NodeJS executando:
npm install
Crie o arquivo .env
a partir do arquivo .env.example
gerado automaticamente pelo Laravel:
cp .env.example .env
Crie as tabelas do banco de dados:
php artisan migrate
Gere os recursos JavaScript e CSS:
npm run dev
DICA: enquanto estiver desenvolvendo, rode
npm run watch
para manter os scripts javascript sendo gerados sob demanda quando alterados.
Se você estiver rodando o projeto localmente para desenvolvimento, você também precisa rodas os seeds:
php artisan db:seed
A documentação da API é gerada automaticamente através do pacote L5-Swagger. Para gerar a documentação, rode:
composer run docs
Isso fará uma alteração no arquivo storage/api-docs/api-docs.json
. Esse arquivo (e qualquer alteração nele) precisa ser commitada para garantir que tenhamos uma documentação atualizada.
Para acessar a documentação da API, basta rodar o projeto normalmente e acessar a url localhost:8000/documentation.
Se você estiver desenvolvendo funcionalidades que utilizem a api de NLP da Aura, o micro-serviço da Aura precisa ser configurado. Essa funcionalidade é disponibilizada pelo projeto externo aura-nlp.
O sistema da aura-nlp
pode ser instalado e configurado em qualquer pasta do seu computador. Instruções de instalação, configuração e execução estão no README do aura-nlp.
Se você seguir todas as instruções, a aura-nlp
estará rodando em uma url como http://localhost:3000/api/
. Feito isso, você precisa informar essa url nos arquivos de configuração da API practice.
Para isso, edite o arquivo .env
e adicione a seguinte linha (edite essa linha se ela já existir):
AURA_NLP_API_URL="http://localhost:3000/api"
Para garantir que o Laravel não tem caches antigas, rode em seguida:
php artisan config:clear
Se você pretende utilizar as funcionalidades de coleta de dados do portal do aluno/professor da UFFS, você precisa do uffs-sga-scraping
funcionando. Para isso, rode:
cd cli/uffs-sga-scraping && npm install
Depois crie um arquivo de config para ele:
cp config.json.example config.json
Depois de seguir todos os passos de instalação, inicie o servidor do Laravel:
php artisan serve
Após isso a aplicação estará rodando na porta 8000 e poderá ser acessada em localhost:8000.
Dica: acesse localhost:8000/documentation para ver a documentação de cada endpoint.
Após isso a aplicação estará rodando na porta 8000 e poderá ser acessada em localhost:8000.
Para que os serviços de websocket funcionem, é necessário preencher os campos PUSHER_APP_ID
, PUSHER_APP_KEY
e PUSHER_APP_SECRET
no .env
. Também, é necessário manter o seguinte comando rodando um terminal:
php artisan websockets:serve
Todos endpoints disponibilizados pela API estarão acessivel em /v0
, /v1
, etc, por exemplo localhost:8000/v0. A maioria dos endpoints exige autenticação, então você precisa obter um token de acesso primeiro através do endpoint /v0/auth
:
curl -H 'Accept: application/json' -d "user=meuiduffsaqui&password=minhasenhaaqui&app_id=1" http://localhost:8000/v0/auth
DICA: o
app_id
é o id da aplicação de onde você está fazendo a requisição. Ela deve estar cadastrada na lista de aplicações de api para funcionar. Por convenção, o id da aplicaçãopratice-api
é 0.
A resposta deve ser algo parecido com o seguinte:
{
"passport": "eyJ0eXAiOiJKV1QiLCJhbGc...9qBQVVw",
"user": {
"name": "Fulano Silva",
"email": "fulano.silva@uffs.edu.br",
"username": "fulano.silva",
"cpf": "99988877666",
"uid": "fulano.silva",
"pessoa_id": "fe82a549-2226-46c1-91b2-a9e9ba4c2d5b"
}
}
O passport
retornado é sua chave de autenticação. Com ele, você pode acessar os endpoints que precisam autenticação (inclusive de outros sistemas do Practice, como o mural). Para isso, utilize o seguinte cabeçalho HTTP nas requisições que precisam de autenticação:
Authorization: Bearer XXX
onde XXX
é o valor do seu passporte/token de acesso. Abaixo está um exemplo de requisição para o endpoint user
utilizando a chave de acesso acima:
curl -H 'Accept: application/json' -H "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGc...9qBQVVw" http://localhost:8000/v0/user
Se você estiver trabalhando com a API de outro serviço Practice, como o mural acessado através da API Practice (api gateway), você precisará de um token/passaporte de acesso.
O practice api, quando roda localmente, tem uma rota /test
para gerar tokens válidos. Para isso, acesse localhost:8000/test. Há instruções na página sobre o token e como gerar outros.
Utilizando a API central do Practice, você pode consumir apis de outros serviços, como o mural, utilizando um passaporte único. As rotas disponíveis estão no arquivo routes/api/v0.php
.
Em linhas gerais, elas são no formato /v0/{app}/{endpoint}
, onde {app}
é o apelido (slug) de um app practice (exemplo: mural
) e {endpoint}
é o endpoint da api naquele serviço. Usando o mural como exemplo, se houver a rota /api/services/audio
no próprio mural, essa rota está disponível na api practice como /v0/mural/services/audio
. Os verbos de acesso (GET
, POST
, etc) são os mesmos, assim como os modelos/parâmetros de entrada.
O passaporte de acesso obtido através do endpoint /v0/auth
da api central funcionará para acesso as outras apis (esse processo é feito internamente, de forma transparente). Você também pode utilizar ele como Authorization: Bearer XXX
nas requisições que precisam de autenticação dos outros serviços (o token da API central funciona no mural, sem passar pela api central, por exemplo).
IMPORTANTE: a api central do practice toma as precauções para que o token de acesso seja válido e que o usuário exista na aplicação destino. Por exemplo, se o usuário nunca logou no mural e houver uma requisição (via api gateway) para o mural (vindo do app móvel do programa, por exemplo), a api criará o usuário equivalente no mural (em linhas gerais, ela fará uma autenticação e criação de conta no mural em nome do usuário dono da requisição original na api central).
Alguns exemplos de requisições para testar se tudo está certo.
Faz uma solicitação de autenticação (obtem passaporte practice) informando que está usando o app-practice (app_id=4
):
curl -H 'Accept: application/json' -d "user=meuiduffsaqui&password=minhasenhaaqui&app_id=1" http://localhost:8000/v0/auth
Obtem informações do usuário no mural:
curl -H 'Accept: application/json' -H "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGc...9qBQVVw" http://localhost:8000/v0/mural/me
Sua ajuda é muito bem-vinda, independente da forma! Confira o arquivo CONTRIBUTING.md para conhecer todas as formas de contribuir com o projeto. Por exemplo, sugerir uma nova funcionalidade, reportar um problema/bug, enviar um pull request, ou simplemente utilizar o projeto e comentar sua experiência.
Veja o arquivo ROADMAP.md para ter uma ideia de como o projeto deve evoluir.
Esse projeto é licenciado nos termos da licença open-source MIT e está disponível de graça.
Veja todas as alterações desse projeto no arquivo CHANGELOG.md.
Abaixo está uma lista de links interessantes e projetos similares: