- Inclusion
- Tabela de Conteúdos
- Acerca do projeto
- Equipa
- Requisitos
- Base de Dados
- Diagrama de arquitetura de alto nível de componentes
- Contexto
- Documentação de Épicos e User Stories
- Como executar o projeto
- Conclusão
- Inclusion trata-se de uma aplicação cross-platform que mistura algumas funcionalidades do X, Threads e Instagram.
- Esta iniciativa surgiu da vontade de procurar criar uma aplicação na qual os utilizadores possam usufruir dos seus direitos base de liberdade de expressão, irradicar o conteúdo produzido em massa por bots ou inteligência artificial e combater o ódio e a discriminação.
- Deste modo pretende-se alterar o paradigma das redes sociais, garantindo a inclusão de todos os utilizadores da nossa aplicação através da solidariedade.
- O principal objetivo do nosso projeto é facilitar a comunicação e disseminação de informação pelo mundo.
- Se pretender obter uma lista mais aprofundada das dependências utilizadas no nosso projeto pode consultar aqui
- A aplicação foi desenvolvida por quatro elementos, que se dividiram em duas equipas: uma equipa de frontend e outra de backend.
- edagener0: Martim Neves
- Monstercreft: Gabriel Vaz
- jethroTLOU: Vadym Lemnaru
- GuilhermeCarmo6: Guilherme Carmo
- RF1 – O utilizador pode registar-se na plataforma.
- RF2 – O utilizador pode autenticar-se na plataforma.
- RF3 – O utilizador pode criar um post.
- RF4 – O utilizador pode eliminar um post.
- RF5 – O utilizador pode dar like num post.
- RF6 – O utilizador pode dar remover o like de um post.
- RF7 – O utilizador pode criar um inc
- RF8 – O utilizador pode eliminar um inc
- RF9 – O utilizador pode dar like num inc
- RF10 – O utilizador pode remover o like de um inc.
- RF11 - O utilizador pode postar histórias em formato de vídeo ou imagem.
- RF12 – O utilizador pode eliminar histórias.
- RF13 – As histórias têm uma duração de 24h, após a qual são apagadas.
- RF14 – O utilizador pode dar like nas histórias.
- RF15 – O utilizador pode remover o like das histórias.
- RF16 – O utilizador pode postar notas.
- RF17 – O utilizador pode editar notas.
- RF18 – O utilizador pode eliminar notas.
- RF19 – O utilizador pode dar like em notas.
- RF20 – O utilizador pode remover o like das notas.
- RF21 – As notas têm uma duração de 24h, após a qual são apagadas.
- RF22 – Os utilizadores podem comentar nos posts.
- RF23 – Os utilizadores podem comentar nos incs.
- RF24 – Os utilizadores podem apagar os seus comentários.
- RF25 – Os utilizadores podem dar like em comentários.
- RF26 – Os utilizadores podem remover o like em comentários.
- RF27 – Os criadores de um post ou inc podem remover qualquer comentário.
- RF28 – Um utilizador pode tornar o seu perfil público.
- RF29 – Um utilizador pode tornar o seu perfil privado.
- RF30 – Por definição, o perfil de utilizador começa publico.
- RF31 – O utilizador pode enviar um pedido de amizade a outro utilizador.
- RF32 – O utilizador pode aceitar um pedido de amizade.
- RF33 – O utilizador pode recusar um pedido de amizade.
- RF34 – O utilizador pode remover um amigo.
- RF35 – Os amigos podem ver os conteúdos de contas privadas.
- RF36 – O utilizador pode enviar mensagem a outro utilizador.
- RF37 – O utilizador pode editar as suas próprias mensagens.
- RF38 – O utilizador pode eliminar as suas próprias mensagens.
- RF-39 – O utilizador pode procurar por outros utilizadores
- RF-40 – O utilizador pode ver o perfil de outros utilizador.
- RF-41 - O utilizar pode comunicar com um chatbot através de uma prompt.
- RF-42 - O utilizador pode jogar um jogo do wordle.
- RQ1 – O frontend tem de ser dinâmico e adaptado a todas as plataformas.
- RQ2 – Garantir a segurança dos dados do utilizador.
- RQ3 – O frontend tem de ser intuitivo.
- RQ4 – Garatir uma boa experiência de utilizador.
- RC1 – O backend tem de ser desenvolvido em Python3 com Django Rest Framework
- RC2 – A autenticação tem de ser feita com cookies baseada em JSON Web Token (JWT)
- RC3 – O frontend tem de ser desenvolvido em Typescript com React.
- De modo a conceber uma base de dados bem estruturada desenhou-se um modelo entidade relação, a partir do qual se fez o modelo relacional.
-
User(id, username, first_name, last_name, password, biography, picture, is_private, created_at)
- UK(username)
- NN(username)
- NN(first_name)
- NN(last_name)
- NN(password)
- NN(picture)
- NN(is_private)
- NN(created_at)
-
FriendRequest(from_user_id, to_user_id, status)
-
FK(from_user_id) → User
-
FK(to_user_id) → User
-
NN(status)
-
RI: status só pode ser Accepted, Rejected ou Pending
-
-
Friends(user_1, user_2)
- FK(user_1) → User
- FK(user_2) → User
- RI: user_1.id < user_2.id
- RI: user_1.id != user_2.idg
-
DirectMessage(id, sender, receiver)
- FK(sender) → User
- FK(receiver) -> User
- NN(receiver)
- NN(sender)
-
Content(id, created_at)
-
ShortFormContent(id)
- FK(id) → Content
-
LongFormContent(id)
- FK(id) → Content
-
Comments(id, content, long_form_content_id)
- FK(long_form_content_id) → LongFormContent
- NN(content)
- NN(long_form_content)
-
Stories(id, file)
- FK(id) → ShortFormContent
- NN(file)
-
Notes(id, content)
- NN(content)
- FK(id) → ShortFormContent
-
Incs(id, content)
- FK(id) → LongFormContent
- NN(content)
-
Posts(id, file, description)
-
FK(id) → LongFormContent
-
NN(file)
-
NN(description)
-
RI: O file só pode ser um vídeo ou imagem.
-
-
WordleResult(user_id, wordle_id, guesses, status)
- NN(guesses)
- NN(status)
- FK(user_id) → User
- FK(wordle_id) → Wordle
- RI: guesses >= 0
- RI: Status só pode ser success ou failure.
-
Wordle(id, date, word)
- NN(date)
- NN(word)
- FK(word) → Word
-
Word(id, text, length, difficulty)
-
NN(text)
-
NN(length)
-
NN(difficulty)
-
RI: Difficulty só pode ser easy, medium ou hard
-
-
Dominio: Utilizador, histórias, notas, incs, posts, comentários.
-
Uso: Formulários para criar histórias, notas, posts, incs e comentários.
-
Tecnologia: Hardware: Servidor com 1TB de armanezamento e UPS. Software: sistema operativo baseado em Linux, gestor de base de dados PostgreSQL, Python3 com Django Rest Framework para o backend, Typescript com React para o Frontend
-
Desenvolvimento: Metodologia SCRUM, equipa de desenvolvimento de 4 pessoas e orçamento de 0€.
Como utilizador, quero criar conta utilizando um username, primeiro nome, sobrenome e password.
Critérios de aceitação: * Dado que todos os dados fornecidos são válidos o utilizador fica registado com sucesso na plataforma.
Como utilizador, quero poder autenticar-me na plataforma, efetuando login com o username e password.
Critérios de aceitação:
- Dado que o utilizador existe e todos os dados fornecidos são válidos o utilizador fica autenticado com sucesso.
Como utilizador, quero obter uma listagem de outros utilizadores paginada com um limite de 10 utilizadores por página, podendo filtrar por username, primeiro nome e sobrenome, na qual obtemos o username, primeiro nome, sobrenome e avatar para cada utilizador da lista.
Critérios de aceitação:
- Os filtros funcionam de acordo com o expectável.
- A paginação funciona de acordo com o expectável.
Como utilizador, quero obter os detalhes acerca de um utilizador em específico. Os detalhes incluem o username, primeiro nome, sobrenome, biografia e avatar.
Critérios de aceitação:
- O utilizador existe e obtemos os seus detalhes.
Como utilizador, quero criar un post com uma imagem ou vídeo e uma descrição.
Critérios de aceitação:
- Se os dados submetidos forem válidos o post é criado com sucesso.
Como utilizador, dono de post, quero poder eliminar o respetivo post.
Critérios de aceitação:
- Se for o dono do post o post é eliminado com sucesso.
Como utilizador, quero poder dar like em um post.
Critérios de aceitação:
- Se ainda não foi dado um like nesse post pelo respetivo utilizador, então o like é atribuido ao post.
Como utilizador, quero poder remover o like de um post.
Critérios de aceitação:
- Se o utilizador deu like no post então consegue remover o like com sucesso.
Como utilizador, quero poder comentar num post.
Critérios de aceitação:
- Se a length do comentário for apropriada o comentário é criado com sucesso.
Enquanto utilizador criador de um post, posso remover qualquer comentário.
Critérios de aceitação:
- Se for o dono de um post posso remover qualquer comentário.
Como utilizador, quero conseguir criar um inc a partir de um conteúdo (long text).
Critérios de aceitação:
- Se o conteúdo não exceder o limite de caracteres estabelecido para um inc então o inc é criado com sucesso.
Como utilizador, quero conseguir eliminar um inc, se for o seu dono.
Critérios de aceitação:
- Se for o dono do inc consigo eliminá-lo com sucesso.
Como utilizador, quero conseguir dar like num inc.
Critérios de aceitação:
- Se o utilizador ainda não deu like no respetivo inc então pode dar like no inc.
Como utilizador, quero conseguir remover o like de um inc.
Critérios de aceitação:
- Se o utilizador deu like no inc então devo conseguir remover o like.
Como utilizador, quero poder comentar num inc.
Critérios de aceitação:
- Se a length do comentário for apropriada o comentário é criado com sucesso.
Enquanto utilizador criador de um inc, posso remover qualquer comentário.
Critérios de aceitação:
- Se for o dono de um inc posso remover qualquer comentário.
Como utilizador, quero conseguir criar uma história a partir de um ficheiro de vídeo ou imagem.
Critérios de aceitação:
- Se a extensão do ficheiro for válida a história é criada.
Como utilizador, dono de uma história, quero poder eliminar essa história voluntariamente.
Critérios de aceitação:
- Se for o dono da história, a história é eliminada.
O sistema elimina a história automaticamente, 24h após a sua publicação.
Critérios de aceitação:
- Verifica-se que 24h após a sua criação a história é eliminada.
Como utilizador, quero poder dar like numa história caso ainda não tenha dado like.
Critérios de aceitação:
- Se o utilizador ainda não deu like na história, o like é associado à história.
Como utilizador, quero poder remover o like da história caso tenha dado like previamente.
Critérios de aceitação:
- Se o utilizador deu like na história, então pode remover o like da história.
Como utilizador, quero conseguir criar uma nota a partir de um conteúdo (short text).
Critérios de aceitação:
- Se a length do conteúdo for apropriada a nota é criada.
Como utilizador, dono de uma nota, quero poder eliminar essa nota voluntariamente.
Critérios de aceitação:
- Se for o dono da nota, a nota é eliminada.
O sistema elimina a nota automaticamente, 24h após a sua publicação.
Critérios de aceitação:
- Verifica-se que 24h após a sua criação a nota é eliminada.
Como utilizador, quero poder dar like numa nota caso ainda não tenha dado like.
Critérios de aceitação:
- Se o utilizador ainda não deu like na nota, o like é associado à história.
Como utilizador, quero poder remover o like da nota caso tenha dado like previamente.
Critérios de aceitação:
- Se o utilizador deu like na nota, então pode remover o like da história.
Um utilizador pode enviar um pedido de amizade a outro utilizador.
Critérios de aceitação:
- Se o utilizador ainda não enviou o pedido de amizade então é enviado um pedido de amizade.
Um utilizador que recebeu um pedido de amizade pode aceitar.
Critérios de aceitação:
- O utilizador pode aceitar um pedido de amizade com status pending que tenha recebido, passando o estado do pedido a accepted.
Um utilizador que recebeu um pedido de amizade pode recusar.
Critérios de aceitação:
- O utilizador pode rejeitar um pedido de amizade com status pending que tenha recebido, passando o estado do pedido a rejected.
Um utilizador pode remover outro utilizador da sua lista de amigos.
Critérios de aceitação:
- O utilizador só pode remover um amigo se este pertencer à sua lista de amigos.
Um utilizador pode obter uma listagem dos amigos de outro utilizador.
Critérios de aceitação:
- O utilizador consegue ver a lista de amigos do outro utilizador.
Como utilizador, quero poder enviar mensagem a outro utilizador.
Critérios de aceitação:
- A mensagem do utilizador é enviada se a sua length for apropriada.
Como utilizador, quero poder enviar as mensagens que enviei a outro utilizador.
Critérios de aceitação:
- O utilizador apenas pode editar as ḿensagens que enviou.
Como utilizador, quero poder eliminar as mensagens que enviei a outro utilizador.
Critérios de aceitação:
- O utilizador apenas pode eliminar as mensagens que enviou para outro utilizador.
Como utilizador, quero poder visualizar os posts dos meus amigos.
Critérios de aceitação:
- Os posts demonstrados no feed são apenas dos amigos do utilizador.
Como utilizador, quero poder visualizar os incs dos meus amigos.
Critérios de aceitação:
- Os incs demonstrados no feed são apenas dos amigos do utilizador.
Enquanto utilizador, quero poder dar update ao meu perfil, nomeadamente alterar a privacidade da conta, biografia, primeiro nome e último nome.
Critérios de aceitação:
- O utilizador apenas pode dar update ao seu perfil.
- Os dados introduzidos têm de ser válidos para o update ocorrer.
Enquanto utilizador, se a minha conta for privada apenas os meus amigos podem visualizar o meu conteúdo.
Critérios de aceitação:
- Garantir que quando a conta é privada apenas os amigos do utilizador conseguem visualizar o conteúdo da conta, apesar de todos conseguirem ver o seu perfil.
Enquanto utilizador, se a minha conta for pública todos podem visualizar os meus conteúdos.
Critérios de aceitação:
- Garantir que quando a conta é publica todos podem visualizar o conteúdo associado à conta.
Enquanto utilizador, quero poder encontrar outros utilizadores, procurando simultâneamente pelo username, first name, last name e full name.
Critérios de aceitação:
- Garantir que a procura de utilizadores devolve os utilizadores apropriados para um determinado input.
Enquanto utilizador, quero poder ver os detalhes de outro utilizador no seu perfil.
Critérios de aceitação:
- Garantir que é possível ver os detalhes do utilizador no seu perfil em qualquer tipo de conta, seja privada ou pública.
Enquanto utilizador, quero poder adivinhar uma palavra.
Critérios de aceitação:
- Garantir que o utilizador consegue adivinhar uma palavra com sucesso.
O sistema cria um wordle novo diariamente.
Critérios de aceitação:
- Um novo wordle tem de ser criado todos os dias à meia noite.
Enquanto utilizador, quero poder enviar prompts a um chatbot de Inteligência Artificial.
Critérios de aceitação:
- Obtém-se uma resposta válida da inteligência artificial, de acordo com aquilo que foi pedido.
Enquanto utilizador, quero poder receber respostas da inteligência artifical.
Critérios de aceitação:
- A inteligência artificial consegue responder com sucesso às prompts do utilizador.
Enquanto utilizador, quero poder visualizar todas as minhas outras mensagens com a inteligência artificial.
Critérios de aceitação:
- Obtém-se um histórico de todos as mensagens trocadas com a inteligência artificial.
git clone https://github.com/edagener0/Inclusion.git
cd ./Inclusion
mv ./backend/.env.example ./backend/.env
nano ./backend/.env # Preencher as variáveis ambientais adequadamente
mv ./frontend/.env.example ./frontend/.env.production
nano ./frontend/.env.production # Preencher as variáveis ambientais adequadamente
docker compose up --detach- site: http://localhost
- docs: http://localhost:8000
Ao longo do desenvolvimento do projeto desenvolvemos competências transversais à Engenharia de Software, em concreto, no desenvolvimento de REST APIs e base de dados escaláveis, bem como um frontend responsivo que integra os endpoints da REST API.
Desenvolveu-se também competências de DevOps, ao criar Dockerfiles para o backend e frontend e por fim um docker compose que permite iniciar todos os serviços e aplicação.

