{"id":28463268,"url":"https://github.com/ruilopesm/educatium","last_synced_at":"2026-04-26T20:31:20.791Z","repository":{"id":244869737,"uuid":"807061817","full_name":"ruilopesm/educatium","owner":"ruilopesm","description":"Educational Resources Management Platform","archived":false,"fork":false,"pushed_at":"2025-08-08T19:35:14.000Z","size":1784,"stargazers_count":3,"open_issues_count":5,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-08-08T21:27:44.726Z","etag":null,"topics":["ecto","education","elixir","phoenix-framework","phoenix-liveview","postgresql"],"latest_commit_sha":null,"homepage":"","language":"Elixir","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ruilopesm.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2024-05-28T12:12:54.000Z","updated_at":"2025-08-08T19:35:18.000Z","dependencies_parsed_at":"2024-06-24T11:05:35.635Z","dependency_job_id":null,"html_url":"https://github.com/ruilopesm/educatium","commit_stats":null,"previous_names":["ruilopesm/educatium"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/ruilopesm/educatium","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruilopesm%2Feducatium","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruilopesm%2Feducatium/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruilopesm%2Feducatium/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruilopesm%2Feducatium/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ruilopesm","download_url":"https://codeload.github.com/ruilopesm/educatium/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruilopesm%2Feducatium/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32312177,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-26T19:15:34.056Z","status":"ssl_error","status_checked_at":"2026-04-26T19:15:15.467Z","response_time":129,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ecto","education","elixir","phoenix-framework","phoenix-liveview","postgresql"],"created_at":"2025-06-07T04:38:02.765Z","updated_at":"2026-04-26T20:31:20.786Z","avatar_url":"https://github.com/ruilopesm.png","language":"Elixir","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Educatium\n\n\u003e 20/20 :star:\n\n## Instalação\n\nA plataforma depende de vários serviços para funcionar corretamente - uma web app feita em Elixir com Phoenix e uma base de dados em PostgreSQL.\n\nComo tal, o grupo decidiu criar um _setup_ com recurso a Docker e Docker Compose.\n\n\u003e [!NOTE]\n\u003e Caso pretenda utilizar a autenticação via Google, é necessária a criação de uma aplicação no Google Developers.\n\n### Docker\n\n```bash\ncp .env.dev.sample .env.dev # Copiar o ficheiro de configuração (poderá ser necessário alterar localhost para db em DB_HOST)\ndocker-compose -f docker-compose.dev.yml -f {linux,darwin,windows}.yml up\n```\n\nAtenção na escolha do segundo ficheiro, pois o mesmo é dependente do sistema operativo que está a ser utilizado.\n\nÉ, ainda possível, levantar apenas um container com a base de dados, utilizando a web app em modo local.\n\n```bash\ndocker-compose -f docker-compose.dev.yml -f {linux,darwin,windows}.yml up db\n```\n\n### Local\n\n```bash\ncp .env.dev.sample .env.dev # Copiar o ficheiro de configuração\nmix setup # Instalar as dependências\nmix ecto.create # Cria a base de dados\nmix ecto.migrate # Cria as tabelas\nmix ecto.seed # Preenche a base de dados com dados de exemplo\nmix phx.server # Iniciar a web app\n```\n\n## Funcionalidades\n\n### Utilizadores e Níveis de Acesso\n\n- Três níveis de acesso: Administrador, Aluno e Professor\n- Todos podem ser produtores e consumidores de recursos educativos\n- Não é possível utilizadores sem conta acederem à plataforma, desta forma evita-se _griefing_\n- Cada utilizador tem um perfil com informações pessoais e recursos educativos criados e guardados\n- É ainda possível alterar todas as informações pessoais, incluindo o email e a password\n\nEstrutura do modelo de um utilizador:\n\n```\nUser: {\n  email: string\n  hashed_password: string\n  avatar: string\n  handle: string\n  first_name :string\n  last_name: string\n  course: string\n  university: string\n  role: string\n  confirmed_at :datetime\n  active: boolean\n}\n```\n\nDaqui depreende-se que um utilizador tem um email, uma password, um avatar, um _handle_, um primeiro nome, um último nome, um curso, uma universidade, um papel, uma data de confirmação e um estado de ativação.\n\nEsta data de confirmação é utilizada para verificar se o utilizador confirmou o seu email.\n\nO estado de ativação é utilizado para verificar se o utilizador está ativo ou não. Inicialmente, para verificar se o mesmo já terminou o seu registo, preenchendo campos como o primeiro nome, o último nome, o curso e a universidade, etc.\n\n#### Screenshots\n\n| ![Profile page](/docs/report/profile.png) |\n| :---------------------------------------: |\n|     Página de perfil de um utilizador     |\n\n| ![Settings page](/docs/report/settings.png) |\n| :-----------------------------------------: |\n|    Página de definições de um utilizador    |\n\n|     ![Tab Settings Dev](/docs/report/dev.png)      |\n| :------------------------------------------------: |\n| Aba 'Dev' da página de definições de um utilizador |\n\n### Feed\n\n- Feed estilo GitHub com os recursos educativos mais recentes e anúncios criados pelos administradores\n- Possibilidade de filtrar os recursos educativos por tipo e ordenar por data de inserção e popularidade\n- Possibilidade de fazer um _upvote_ ou _downvote_ a um recurso educativo e, ainda, de o comentar\n- Possibilidade de guardar, diretamente a partir do feed, um recurso educativo para ver mais tarde\n- Visualização em tempo real dos _upvotes_ e _downvotes_ de um recurso educativo, tal como da criação de recursos por outros utilizadores\n\n#### Screenshots\n\n| ![Feed](/docs/report/feed.png) |\n| :----------------------------: |\n|  Feed principal da aplicação   |\n\n### Recursos Educativos\n\nEstrutura do modelo de um recurso educativo:\n\n```\nResource: {\n  title: string\n  description: string\n  type: string (book | article | notes | code | worksheet ...)\n  date: date\n  visibility: string (public | private)\n  root_directory_id: uuid\n  ... # outros relacionamentos\n}\n```\n\nDaqui depreende-se que um recurso educativo tem um título, uma descrição, um tipo, uma data, uma visibilidade e uma diretoria raiz. Esta diretoria é _uploaded_ pelo utilizador aquando da criação do recurso educativo. Foi criado, também, um mapeamento na base de dados para diretorias e ficheiros de um recurso, de forma que seja possível fazer uma listagem dos mesmos.\n\nPara além da criação simples, através de um formulário, de um recurso, é também possível a criação de múltiplos recursos através do uso de um ficheiro `.json`.\n\n| ![Um recurso](/docs/report/single_resource.png) |\n| :---------------------------------------------: |\n|           Criação de um único recurso           |\n\n| ![Vários recursos](/docs/report/multiple_resource.png) |\n| :----------------------------------------------------: |\n|             Criação de múltiplos recursos              |\n\n| ![Página de um recurso](/docs/report/resource.png) |\n| :------------------------------------------------: |\n|                Página de um recurso                |\n\n### Anúncios\n\n- Anúncios criados pelos administradores, que dão sempre aso a um post\n\nEstrutura do modelo de um anúncio:\n\n```\nAnnouncement: {\n  title: string\n  body: string\n}\n```\n\n#### Screenshots\n\n| ![Anúncios](/docs/report/announcement.png) |\n| :----------------------------------------: |\n|            Página de um anúncio            |\n\n### Admin dashboard\n\n- Página de administração com CRUD sobre entidades da plataforma\n\n#### Screenshots\n\n| ![Admin dashboard](/docs/report/users.png) |\n| :----------------------------------------: |\n| Página de gestão de utilizadores da plataforma |\n\n| ![Admin dashboard](/docs/report/resources.png) |\n| :-------------------------------------------: |\n| Página de gestão de recursos educativos da plataforma |\n\n| ![Admin dashboard](/docs/report/announcements.png) |\n| :------------------------------------------------: |\n| Página de gestão de anúncios da plataforma |\n\n| ![Admin dashboard](/docs/report/posts.png) |\n| :----------------------------------------: |\n| Página de gestão de posts da plataforma |\n\n| ![Admin dashboard](/docs/report/tags.png) |\n| :---------------------------------------: |\n| Página de gestão de tags da plataforma |\n\n### API REST\n\nO grupo decidiu criar uma API REST para a plataforma, de forma que seja possível a integração com outras aplicações. Esta API é acessível com recurso a uma chave que pode ser gerada na página de definições de um utilizador.\n\n#### Endpoints\n\n_Headers_ necessários:\n```HTTP\nAuthorization: \u003ctoken\u003e\n```\n\nEste token pode ser obtido a partir das definições do utilizador na página de desenvolvimento.\n\n- `GET /api` - Endpoint mostrar estado da API (não é necessário token)\n- `GET /api/test` - Endpoint testar validade token\n- `GET /api/myself` - Endpoint ver utilizador associado ao token\n- `GET /api/users/:id` - Endpoint ver utilizador com `id`\n- `GET /api/resources` - Endpoint listar todos os recursos\n- `GET /api/resources/:id` - Endpoint ver informações recurso\n- `POST /api/resources/` - Endpoint publicar recurso (enviar recurso com multipart)\n- `GET /api/tags` - Endpoint listar todas as tags\n- `GET /api/tags/:id` - Endpoint ver informações de uma tag\n- `GET /api/announcements` - Endpoint listar todos os anúncios\n- `GET /api/announcements/:id` - Endpoint ver informações de um anúncio\n\n##### Endpoints para Administrador\n\nTodos estes endpoints só estão disponíveis caso o utilizador associado ao _token_ seja um administrador.\n\n- `GET /api/users` - Endpoint listar todos os utilizadores\n- `POST /api/tags` - Endpoint criar uma tag\n- `PUT /api/tags/:id` - Endpoint editar uma tag\n- `DELETE /api/tags/:id` - Endpoint apagar uma tag\n- `POST /api/announcements` - Endpoint criar um anúncio\n- `PUT /api/announcements/:id` - Endpoint editar um anúncio\n- `DELETE /api/announcements/:id` - Endpoint apagar um anúncio\n\n### Exportar\n\n- Exportar todos os dados relativos à plataforma para um ficheiro `.json`, acessível apenas por administradores\n\n### Tradução\n\n- Tradução de toda a plataforma para português, onde consoante o idioma do utilizador, a plataforma é traduzida para português ou inglês\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fruilopesm%2Feducatium","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fruilopesm%2Feducatium","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fruilopesm%2Feducatium/lists"}