From 0551c8052720b378a9800f8c9db6ba642cfc9498 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Lobo?= Date: Fri, 24 Nov 2023 18:37:29 +0000 Subject: [PATCH 01/10] feat: add course to attendee --- lib/mix/tasks/gen.attendees_with_password.ex | 9 ++- lib/safira/accounts/attendee.ex | 7 ++- lib/safira_web/views/attendee_view.ex | 4 ++ priv/fake/courses.txt | 59 +++++++++++++++++++ .../20180704191725_create_attendees.exs | 1 + .../controllers/attendee_controller_test.exs | 3 + .../controllers/company_controller_test.exs | 4 ++ 7 files changed, 83 insertions(+), 4 deletions(-) create mode 100644 priv/fake/courses.txt diff --git a/lib/mix/tasks/gen.attendees_with_password.ex b/lib/mix/tasks/gen.attendees_with_password.ex index 18d8cb35..219d1f22 100644 --- a/lib/mix/tasks/gen.attendees_with_password.ex +++ b/lib/mix/tasks/gen.attendees_with_password.ex @@ -7,6 +7,7 @@ defmodule Mix.Tasks.Gen.AttendeesWithPassword do alias Safira.Accounts @domain "seium.org" + @courses File.read!("priv/fake/courses.txt") |> String.split("\n") def run(args) do cond do @@ -28,6 +29,7 @@ defmodule Mix.Tasks.Gen.AttendeesWithPassword do nickname = "attendee#{n}" email = Enum.join([nickname, @domain], "@") password = random_string(8) + course = Enum.random(@courses) user = %{ "email" => email, @@ -36,7 +38,12 @@ defmodule Mix.Tasks.Gen.AttendeesWithPassword do } account = - Accounts.create_attendee(%{"name" => nickname, "nickname" => nickname, "user" => user}) + Accounts.create_attendee(%{ + "name" => nickname, + "nickname" => nickname, + "course" => course, + "user" => user + }) |> elem(1) IO.puts("#{email}:#{password}") diff --git a/lib/safira/accounts/attendee.ex b/lib/safira/accounts/attendee.ex index a894bb49..91c5f95d 100644 --- a/lib/safira/accounts/attendee.ex +++ b/lib/safira/accounts/attendee.ex @@ -29,6 +29,7 @@ defmodule Safira.Accounts.Attendee do field :nickname, :string field :avatar, Safira.Avatar.Type field :name, :string + field :course, :string field :token_balance, :integer, default: 0 field :entries, :integer, default: 0 field :discord_association_code, Ecto.UUID, autogenerate: true @@ -49,7 +50,7 @@ defmodule Safira.Accounts.Attendee do def changeset(attendee, attrs) do attendee - |> cast(attrs, [:name, :nickname, :user_id]) + |> cast(attrs, [:name, :nickname, :user_id, :course]) |> cast_attachments(attrs, [:avatar, :cv]) |> cast_assoc(:user) |> validate_required([:name, :nickname]) @@ -59,7 +60,7 @@ defmodule Safira.Accounts.Attendee do def update_changeset_sign_up(attendee, attrs) do attendee - |> cast(attrs, [:name, :nickname, :user_id]) + |> cast(attrs, [:name, :nickname, :user_id, :course]) |> cast_attachments(attrs, [:avatar, :cv]) |> cast_assoc(:user) |> validate_required([:name, :nickname]) @@ -69,7 +70,7 @@ defmodule Safira.Accounts.Attendee do def update_changeset(attendee, attrs) do attendee - |> cast(attrs, [:nickname]) + |> cast(attrs, [:nickname, :course]) |> cast_attachments(attrs, [:avatar, :cv]) |> validate_required([:nickname]) |> validate_format(:nickname, @nickname_regex) diff --git a/lib/safira_web/views/attendee_view.ex b/lib/safira_web/views/attendee_view.ex index 973ee342..869f1de5 100644 --- a/lib/safira_web/views/attendee_view.ex +++ b/lib/safira_web/views/attendee_view.ex @@ -26,6 +26,7 @@ defmodule SafiraWeb.AttendeeView do id: attendee.id, nickname: attendee.nickname, name: attendee.name, + course: attendee.course, avatar: Avatar.url({attendee.avatar, attendee}, :original), cv: CV.url({attendee.cv, attendee}, :original), badges: render_many(attendee.badges, SafiraWeb.BadgeView, "badge.json"), @@ -43,6 +44,7 @@ defmodule SafiraWeb.AttendeeView do id: attendee.id, nickname: attendee.nickname, name: attendee.name, + course: attendee.course, avatar: Avatar.url({attendee.avatar, attendee}, :original), cv: CV.url({attendee.cv, attendee}, :original), badges: render_many(attendee.badges, SafiraWeb.BadgeView, "badge.json"), @@ -72,6 +74,7 @@ defmodule SafiraWeb.AttendeeView do id: attendee.id, nickname: attendee.nickname, name: attendee.name, + course: attendee.course, avatar: Avatar.url({attendee.avatar, attendee}, :original), cv: CV.url({attendee.cv, attendee}, :original), token_balance: attendee.token_balance, @@ -84,6 +87,7 @@ defmodule SafiraWeb.AttendeeView do id: attendee.id, nickname: attendee.nickname, name: attendee.name, + course: attendee.course, avatar: Avatar.url({attendee.avatar, attendee}, :original), cv: nil, token_balance: attendee.token_balance, diff --git a/priv/fake/courses.txt b/priv/fake/courses.txt new file mode 100644 index 00000000..e6671516 --- /dev/null +++ b/priv/fake/courses.txt @@ -0,0 +1,59 @@ +Administração Pública +Arqueologia +Artes Visuais +Biologia Aplicada +Biologia e Geologia +Bioquímica +Ciência de Dados +Ciências da Educação +Ciência Política +Ciências da Computação +Ciências da Comunicação +Ciências do Ambiente +Contabilidade +Criminologia e Justiça Criminal +Design de Produto +Design e Marketing de Moda +Direito +Economia +Educação +Educação Básica +Enfermagem +Engenharia Aeroespacial +Engenharia Biomédica +Engenharia Civil +Engenharia de Materiais +Engenharia de Polímeros +Engenharia de Telecomunicações e Informática +Engenharia e Gestão de Sistemas de Informação +Engenharia e Gestão Industrial +Engenharia Eletrónica Industrial e Computadores +Engenharia Física +Engenharia Informática +Engenharia Mecânica +Engenharia Química e Biológica +Engenharia Têxtil +Estatística Aplicada +Estudos Culturais +Estudos Orientais: Estudos Chineses e Japoneses +Estudos Portugueses +Filosofia +Física +Geografia e Planeamento +Geologia +Gestão +História +Línguas Aplicadas +Línguas e Literaturas Europeias +Medicina +Marketing +Matemática +Música +Negócios Internacionais +Optometria e Ciências da Visão +Proteção Civil e Gestão do Território +Psicologia +Química +Relações Internacionais +Sociologia +Teatro \ No newline at end of file diff --git a/priv/repo/migrations/20180704191725_create_attendees.exs b/priv/repo/migrations/20180704191725_create_attendees.exs index d8ebbd3b..cbe4a393 100644 --- a/priv/repo/migrations/20180704191725_create_attendees.exs +++ b/priv/repo/migrations/20180704191725_create_attendees.exs @@ -6,6 +6,7 @@ defmodule Safira.Repo.Migrations.CreateAttendees do add :uuid, :string add :nickname, :string add :user_id, references(:users, on_delete: :delete_all) + add :course, :string timestamps() end diff --git a/test/safira_web/controllers/attendee_controller_test.exs b/test/safira_web/controllers/attendee_controller_test.exs index bf682055..19a8ac16 100644 --- a/test/safira_web/controllers/attendee_controller_test.exs +++ b/test/safira_web/controllers/attendee_controller_test.exs @@ -95,6 +95,7 @@ defmodule SafiraWeb.AttendeeControllerTest do "id" => attendee.id, "name" => attendee.name, "nickname" => attendee.nickname, + "course" => attendee.course, "token_balance" => 0, "badges" => [], "badge_count" => 0 @@ -137,6 +138,7 @@ defmodule SafiraWeb.AttendeeControllerTest do "id" => attendee.id, "name" => attendee.name, "nickname" => attendee.nickname, + "course" => attendee.course, "token_balance" => 0, "badges" => [], "badge_count" => 0, @@ -180,6 +182,7 @@ defmodule SafiraWeb.AttendeeControllerTest do "id" => attendee.id, "name" => attendee.name, "nickname" => "john_doe123", + "course" => attendee.course, "token_balance" => 0 } diff --git a/test/safira_web/controllers/company_controller_test.exs b/test/safira_web/controllers/company_controller_test.exs index eb180c61..37bab1d6 100644 --- a/test/safira_web/controllers/company_controller_test.exs +++ b/test/safira_web/controllers/company_controller_test.exs @@ -113,6 +113,7 @@ defmodule SafiraWeb.CompanyControllerTest do "id" => attendee.id, "nickname" => attendee.nickname, "name" => attendee.name, + "course" => attendee.course, "avatar" => nil, "cv" => nil, "token_balance" => attendee.token_balance, @@ -143,6 +144,7 @@ defmodule SafiraWeb.CompanyControllerTest do "id" => attendee1.id, "nickname" => attendee1.nickname, "name" => attendee1.name, + "course" => attendee1.course, "avatar" => nil, "cv" => nil, "token_balance" => attendee1.token_balance, @@ -152,6 +154,7 @@ defmodule SafiraWeb.CompanyControllerTest do "id" => attendee2.id, "nickname" => attendee2.nickname, "name" => attendee2.name, + "course" => attendee2.course, "avatar" => nil, "cv" => nil, "token_balance" => attendee2.token_balance, @@ -192,6 +195,7 @@ defmodule SafiraWeb.CompanyControllerTest do "id" => attendee1.id, "nickname" => attendee1.nickname, "name" => attendee1.name, + "course" => attendee1.course, "avatar" => nil, "cv" => nil, "token_balance" => attendee1.token_balance, From faa3fb9fffef1593cfd1a646510c35e75d13c29c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Lobo?= Date: Fri, 24 Nov 2023 22:30:56 +0000 Subject: [PATCH 02/10] chore: add degree levels --- priv/fake/courses.txt | 197 +++++++++++++++++++++++++++++------------- 1 file changed, 138 insertions(+), 59 deletions(-) diff --git a/priv/fake/courses.txt b/priv/fake/courses.txt index e6671516..f1fe6147 100644 --- a/priv/fake/courses.txt +++ b/priv/fake/courses.txt @@ -1,59 +1,138 @@ -Administração Pública -Arqueologia -Artes Visuais -Biologia Aplicada -Biologia e Geologia -Bioquímica -Ciência de Dados -Ciências da Educação -Ciência Política -Ciências da Computação -Ciências da Comunicação -Ciências do Ambiente -Contabilidade -Criminologia e Justiça Criminal -Design de Produto -Design e Marketing de Moda -Direito -Economia -Educação -Educação Básica -Enfermagem -Engenharia Aeroespacial -Engenharia Biomédica -Engenharia Civil -Engenharia de Materiais -Engenharia de Polímeros -Engenharia de Telecomunicações e Informática -Engenharia e Gestão de Sistemas de Informação -Engenharia e Gestão Industrial -Engenharia Eletrónica Industrial e Computadores -Engenharia Física -Engenharia Informática -Engenharia Mecânica -Engenharia Química e Biológica -Engenharia Têxtil -Estatística Aplicada -Estudos Culturais -Estudos Orientais: Estudos Chineses e Japoneses -Estudos Portugueses -Filosofia -Física -Geografia e Planeamento -Geologia -Gestão -História -Línguas Aplicadas -Línguas e Literaturas Europeias -Medicina -Marketing -Matemática -Música -Negócios Internacionais -Optometria e Ciências da Visão -Proteção Civil e Gestão do Território -Psicologia -Química -Relações Internacionais -Sociologia -Teatro \ No newline at end of file +Licenciatura em Administração Pública +Licenciatura em Arqueologia +Licenciatura em Artes Visuais +Licenciatura em Biologia Aplicada +Licenciatura em Biologia e Geologia +Licenciatura em Bioquímica +Licenciatura em Ciência de Dados +Licenciatura em Ciência Política +Licenciatura em Ciências da Computação +Licenciatura em Ciências da Comunicação +Licenciatura em Ciências do Ambiente +Licenciatura em Contabilidade +Licenciatura em Criminologia e Justiça Criminal +Licenciatura em Design de Produto +Licenciatura em Design e Marketing de Moda +Licenciatura em Direito +Licenciatura em Economia +Licenciatura em Educação +Licenciatura em Educação Básica +Licenciatura em Enfermagem +Licenciatura em Engenharia Aeroespacial +Licenciatura em Engenharia Biomédica +Licenciatura em Engenharia Civil +Licenciatura em Engenharia de Materiais +Licenciatura em Engenharia de Polímeros +Licenciatura em Engenharia de Telecomunicações e Informática +Licenciatura em Engenharia e Gestão de Sistemas de Informação +Licenciatura em Engenharia e Gestão Industrial +Licenciatura em Engenharia Eletrónica Industrial e Computadores +Licenciatura em Engenharia Física +Licenciatura em Engenharia Informática +Licenciatura em Engenharia Mecânica +Licenciatura em Engenharia Química e Biológica +Licenciatura em Engenharia Têxtil +Licenciatura em Estatística Aplicada +Licenciatura em Estudos Culturais +Licenciatura em Estudos Orientais: Estudos Chineses e Japoneses +Licenciatura em Estudos Portugueses +Licenciatura em Filosofia +Licenciatura em Física +Licenciatura em Geografia e Planeamento +Licenciatura em Geologia +Licenciatura em Gestão +Licenciatura em História +Licenciatura em Línguas Aplicadas +Licenciatura em Línguas e Literaturas Europeias +Licenciatura em Marketing +Licenciatura em Matemática +Licenciatura em Música +Licenciatura em Negócios Internacionais +Licenciatura em Optometria e Ciências da Visão +Licenciatura em Proteção Civil e Gestão do Território +Licenciatura em Psicologia +Licenciatura em Química +Licenciatura em Relações Internacionais +Licenciatura em Sociologia +Licenciatura em Teatro +Mestrado Integrado em Arquitetura +Mestrado em Administração Pública +Mestrado em Análise Estrutural Avançada e Projeto com Materiais Compósitos +Mestrado em Análise Estrutural de Monumentos e Construções Históricas +Mestrado em Arqueologia +Mestrado em Avaliação Aplicada à Formação nas Profissões da Saúde +Mestrado em Biodiversidade, Ecologia e Alterações Globais +Mestrado em Biofísica e Bionanossistemas +Mestrado em Bioinformática +Mestrado em Biologia Molecular, Biotecnologia e Bioempreendedorismo em Plantas +Mestrado em Bioquímica Aplicada +Mestrado em Biotecnologia +Mestrado em Ciência Política +Mestrado em Ciências Criminais +Mestrado em Ciências da Comunicação +Mestrado em Ciências da Educação +Mestrado em Ciências da Saúde +Mestrado em Ciências e Tecnologias do Ambiente +Mestrado em Cognição Humana +Mestrado em Comunicação de Ciência +Mestrado em Comunicação, Arte e Cultura +Mestrado em Construção e Reabilitação Sustentáveis +Mestrado em Contabilidade +Mestrado em Crime, Diferença e Desigualdade +Mestrado em Desafios das Cidades +Mestrado em Design de Produto e Serviços +Mestrado em Design e Inovação de Produtos Têxteis e Acessórios +Mestrado em Design para a Comunicação de Moda +Mestrado em Direito Administrativo +Mestrado em Direito da União Europeia +Mestrado em Direito das Crianças, Família e Sucessões +Mestrado em Direito dos Contratos e da Empresa +Mestrado em Direito dos Negócios, Europeu e Transnacional +Mestrado em Direito e Informática +Mestrado em Direito Judiciário +Mestrado em Direito Transnacional da Empresa e das Tecnologias Digitais +Mestrado em Direito Tributário +Mestrado em Direitos Humanos +Mestrado em Economia +Mestrado em Economia Industrial e da Empresa +Mestrado em Economia Monetária, Bancária e Financeira +Mestrado em Economia Social +Mestrado em Educação +Mestrado em Educação Pré-Escolar +Mestrado em Educação Pré-Escolar e Ensino do 1º Ciclo do Ensino Básico +Mestrado em Engenharia Aeroespacial +Mestrado em Engenharia Biomédica +Mestrado em Engenharia Civil +Mestrado em Engenharia de Estruturas +Mestrado em Engenharia de Materiais +Mestrado em Engenharia de Polímeros +Mestrado em Engenharia de Sistemas +Mestrado em Engenharia de Telecomunicações e Informática +Mestrado em Engenharia do Produto +Mestrado em Engenharia e Gestão da Qualidade +Mestrado em Engenharia e Gestão de Operações +Mestrado em Engenharia e Gestão de Sistemas de Informação +Mestrado em Engenharia e Gestão Industrial +Mestrado em Engenharia Eletrónica Industrial e Computadores +Mestrado em Engenharia Física +Mestrado em Engenharia Humana +Doutoramento em Biologia +Doutoramento em Ciência e Engenharia de Polímeros e Compósitos +Doutoramento em Ciências da Cultura +Doutoramento em Ciências da Linguagem +Doutoramento em Ciências da Literatura +Doutoramento em Engenharia Biomédica +Doutoramento em Engenharia Civil +Doutoramento em Engenharia de Materiais +Doutoramento em Engenharia de Tecidos, Medicina Regenerativa e Células Estaminais +Doutoramento em Engenharia Eletrónica e de Computadores +Doutoramento em Engenharia Mecânica +Doutoramento em Engenharia Química e Biológica +Doutoramento em Engenharia Têxtil +Doutoramento em Filosofia +Doutoramento em Geologia - Geoconservação, Geologia Ambiental e Recursos Geológicos +Doutoramento em Gestão e Tratamento de Resíduos +Doutoramento em Informática +Doutoramento em Matemática +Doutoramento em Química Aplicada +Doutoramento em Sustentabilidade do Ambiente Construído \ No newline at end of file From 2aeaa761cd312f4a66dd8eb91dc1ae423793a60a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Lobo?= Date: Sat, 25 Nov 2023 01:38:13 +0000 Subject: [PATCH 03/10] feat: enforce valid course values --- {priv/fake => data}/courses.txt | 3 ++- lib/mix/tasks/gen.attendees_with_password.ex | 2 +- lib/safira/accounts/attendee.ex | 5 +++++ 3 files changed, 8 insertions(+), 2 deletions(-) rename {priv/fake => data}/courses.txt (98%) diff --git a/priv/fake/courses.txt b/data/courses.txt similarity index 98% rename from priv/fake/courses.txt rename to data/courses.txt index f1fe6147..e38e406b 100644 --- a/priv/fake/courses.txt +++ b/data/courses.txt @@ -135,4 +135,5 @@ Doutoramento em Gestão e Tratamento de Resíduos Doutoramento em Informática Doutoramento em Matemática Doutoramento em Química Aplicada -Doutoramento em Sustentabilidade do Ambiente Construído \ No newline at end of file +Doutoramento em Sustentabilidade do Ambiente Construído +None \ No newline at end of file diff --git a/lib/mix/tasks/gen.attendees_with_password.ex b/lib/mix/tasks/gen.attendees_with_password.ex index 219d1f22..df308937 100644 --- a/lib/mix/tasks/gen.attendees_with_password.ex +++ b/lib/mix/tasks/gen.attendees_with_password.ex @@ -7,7 +7,7 @@ defmodule Mix.Tasks.Gen.AttendeesWithPassword do alias Safira.Accounts @domain "seium.org" - @courses File.read!("priv/fake/courses.txt") |> String.split("\n") + @courses File.read!("data/courses.txt") |> String.split("\n") def run(args) do cond do diff --git a/lib/safira/accounts/attendee.ex b/lib/safira/accounts/attendee.ex index 91c5f95d..6b0def4d 100644 --- a/lib/safira/accounts/attendee.ex +++ b/lib/safira/accounts/attendee.ex @@ -24,6 +24,8 @@ defmodule Safira.Accounts.Attendee do # Any sequence of 3-15 characters that are either letters, numbers, - or _ @nickname_regex ~r/^[\w\d-_]{3,15}$/ + @courses File.read!("data/courses.txt") |> String.split("\n") + @derive {Phoenix.Param, key: :id} schema "attendees" do field :nickname, :string @@ -53,6 +55,7 @@ defmodule Safira.Accounts.Attendee do |> cast(attrs, [:name, :nickname, :user_id, :course]) |> cast_attachments(attrs, [:avatar, :cv]) |> cast_assoc(:user) + |> validate_inclusion(:course, @courses) |> validate_required([:name, :nickname]) |> validate_format(:nickname, @nickname_regex) |> unique_constraint(:nickname) @@ -63,6 +66,7 @@ defmodule Safira.Accounts.Attendee do |> cast(attrs, [:name, :nickname, :user_id, :course]) |> cast_attachments(attrs, [:avatar, :cv]) |> cast_assoc(:user) + |> validate_inclusion(:course, @courses) |> validate_required([:name, :nickname]) |> validate_format(:nickname, @nickname_regex) |> unique_constraint(:nickname) @@ -72,6 +76,7 @@ defmodule Safira.Accounts.Attendee do attendee |> cast(attrs, [:nickname, :course]) |> cast_attachments(attrs, [:avatar, :cv]) + |> validate_inclusion(:course, @courses) |> validate_required([:nickname]) |> validate_format(:nickname, @nickname_regex) |> unique_constraint(:nickname) From 547861df1c75eed73d97cc682ecbc30d1277aa6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Lobo?= Date: Tue, 28 Nov 2023 00:57:45 +0000 Subject: [PATCH 04/10] refactor: courses --- data/courses.txt | 3 +- lib/mix/tasks/gen.attendees_with_password.ex | 8 ++-- lib/mix/tasks/gen.courses.ex | 38 +++++++++++++++++++ lib/safira/accounts/accounts.ex | 35 +++++++++++++++++ lib/safira/accounts/attendee.ex | 14 +++---- lib/safira/accounts/course.ex | 24 ++++++++++++ .../controllers/course_controller.ex | 12 ++++++ lib/safira_web/router.ex | 2 + lib/safira_web/views/attendee_view.ex | 8 ++-- lib/safira_web/views/course_view.ex | 16 ++++++++ .../20180704191725_create_attendees.exs | 1 - .../20231127120646_create_courses.exs | 15 ++++++++ priv/repo/seeds/accounts.exs | 7 +++- 13 files changed, 163 insertions(+), 20 deletions(-) create mode 100644 lib/mix/tasks/gen.courses.ex create mode 100644 lib/safira/accounts/course.ex create mode 100644 lib/safira_web/controllers/course_controller.ex create mode 100644 lib/safira_web/views/course_view.ex create mode 100644 priv/repo/migrations/20231127120646_create_courses.exs diff --git a/data/courses.txt b/data/courses.txt index e38e406b..f1fe6147 100644 --- a/data/courses.txt +++ b/data/courses.txt @@ -135,5 +135,4 @@ Doutoramento em Gestão e Tratamento de Resíduos Doutoramento em Informática Doutoramento em Matemática Doutoramento em Química Aplicada -Doutoramento em Sustentabilidade do Ambiente Construído -None \ No newline at end of file +Doutoramento em Sustentabilidade do Ambiente Construído \ No newline at end of file diff --git a/lib/mix/tasks/gen.attendees_with_password.ex b/lib/mix/tasks/gen.attendees_with_password.ex index df308937..136f34f4 100644 --- a/lib/mix/tasks/gen.attendees_with_password.ex +++ b/lib/mix/tasks/gen.attendees_with_password.ex @@ -7,7 +7,6 @@ defmodule Mix.Tasks.Gen.AttendeesWithPassword do alias Safira.Accounts @domain "seium.org" - @courses File.read!("data/courses.txt") |> String.split("\n") def run(args) do cond do @@ -25,11 +24,12 @@ defmodule Mix.Tasks.Gen.AttendeesWithPassword do defp create(number) do Mix.Task.run("app.start") + courses = Accounts.list_courses() + Enum.each(1..number, fn n -> nickname = "attendee#{n}" email = Enum.join([nickname, @domain], "@") password = random_string(8) - course = Enum.random(@courses) user = %{ "email" => email, @@ -37,11 +37,13 @@ defmodule Mix.Tasks.Gen.AttendeesWithPassword do "password_confirmation" => password } + course = Enum.random(courses) + account = Accounts.create_attendee(%{ "name" => nickname, "nickname" => nickname, - "course" => course, + "course_id" => course.id, "user" => user }) |> elem(1) diff --git a/lib/mix/tasks/gen.courses.ex b/lib/mix/tasks/gen.courses.ex new file mode 100644 index 00000000..9f48621e --- /dev/null +++ b/lib/mix/tasks/gen.courses.ex @@ -0,0 +1,38 @@ +defmodule Mix.Tasks.Gen.Courses do + @moduledoc """ + Task to generate university courses + """ + use Mix.Task + + alias Safira.Accounts + + def run(args) do + if Enum.empty?(args) do + Mix.shell().info("Needs to receive atleast one file path.") + else + args |> create + end + end + + defp create(path) do + Mix.Task.run("app.start") + + path + |> parse_txt() + |> insert_courses() + end + + defp parse_txt(path) do + path + |> File.read!() + |> String.split("\n") + end + + defp insert_courses(courses) do + Enum.each(courses, fn course -> + Accounts.create_course(%{ + "name" => course + }) + end) + end +end diff --git a/lib/safira/accounts/accounts.ex b/lib/safira/accounts/accounts.ex index 71af43d4..d538c57a 100644 --- a/lib/safira/accounts/accounts.ex +++ b/lib/safira/accounts/accounts.ex @@ -9,6 +9,7 @@ defmodule Safira.Accounts do alias Safira.Accounts.Company alias Safira.Accounts.Staff alias Safira.Accounts.User + alias Safira.Accounts.Course alias Safira.Repo @@ -106,6 +107,7 @@ defmodule Safira.Accounts do |> Repo.preload(:badges) |> Repo.preload(:user) |> Repo.preload(:prizes) + |> Repo.preload(:course) end def get_attendee_by_discord_association_code(discord_association_code) do @@ -264,4 +266,37 @@ defmodule Safira.Accounts do |> get_user_preload!() end end + + @doc """ + Creates a course. + + ## Examples + + iex> create_course(%{field: value}) + {:ok, %Course{}} + + iex> create_course(%{field: bad_value}) + {:error, %Ecto.Changeset{}} + + """ + def create_course(attrs) do + %Course{} + |> Course.changeset(attrs) + |> Repo.insert() + end + + @doc """ + Returns the list of courses. + + ## Examples + + iex> list_courses() + [%Course{}, ...] + + """ + def list_courses do + Course + |> order_by(:id) + |> Repo.all() + end end diff --git a/lib/safira/accounts/attendee.ex b/lib/safira/accounts/attendee.ex index 6b0def4d..bf4a830b 100644 --- a/lib/safira/accounts/attendee.ex +++ b/lib/safira/accounts/attendee.ex @@ -7,6 +7,7 @@ defmodule Safira.Accounts.Attendee do import Ecto.Changeset alias Safira.Accounts.User + alias Safira.Accounts.Course alias Safira.Contest.Badge alias Safira.Contest.DailyToken @@ -24,14 +25,11 @@ defmodule Safira.Accounts.Attendee do # Any sequence of 3-15 characters that are either letters, numbers, - or _ @nickname_regex ~r/^[\w\d-_]{3,15}$/ - @courses File.read!("data/courses.txt") |> String.split("\n") - @derive {Phoenix.Param, key: :id} schema "attendees" do field :nickname, :string field :avatar, Safira.Avatar.Type field :name, :string - field :course, :string field :token_balance, :integer, default: 0 field :entries, :integer, default: 0 field :discord_association_code, Ecto.UUID, autogenerate: true @@ -39,6 +37,7 @@ defmodule Safira.Accounts.Attendee do field :cv, Safira.CV.Type belongs_to :user, User + belongs_to :course, Course many_to_many :badges, Badge, join_through: Redeem has_many :referrals, Referral has_many :daily_tokens, DailyToken @@ -52,10 +51,9 @@ defmodule Safira.Accounts.Attendee do def changeset(attendee, attrs) do attendee - |> cast(attrs, [:name, :nickname, :user_id, :course]) + |> cast(attrs, [:name, :nickname, :user_id, :course_id]) |> cast_attachments(attrs, [:avatar, :cv]) |> cast_assoc(:user) - |> validate_inclusion(:course, @courses) |> validate_required([:name, :nickname]) |> validate_format(:nickname, @nickname_regex) |> unique_constraint(:nickname) @@ -63,10 +61,9 @@ defmodule Safira.Accounts.Attendee do def update_changeset_sign_up(attendee, attrs) do attendee - |> cast(attrs, [:name, :nickname, :user_id, :course]) + |> cast(attrs, [:name, :nickname, :user_id, :course_id]) |> cast_attachments(attrs, [:avatar, :cv]) |> cast_assoc(:user) - |> validate_inclusion(:course, @courses) |> validate_required([:name, :nickname]) |> validate_format(:nickname, @nickname_regex) |> unique_constraint(:nickname) @@ -74,9 +71,8 @@ defmodule Safira.Accounts.Attendee do def update_changeset(attendee, attrs) do attendee - |> cast(attrs, [:nickname, :course]) + |> cast(attrs, [:nickname, :course_id]) |> cast_attachments(attrs, [:avatar, :cv]) - |> validate_inclusion(:course, @courses) |> validate_required([:nickname]) |> validate_format(:nickname, @nickname_regex) |> unique_constraint(:nickname) diff --git a/lib/safira/accounts/course.ex b/lib/safira/accounts/course.ex new file mode 100644 index 00000000..8d4ebfa1 --- /dev/null +++ b/lib/safira/accounts/course.ex @@ -0,0 +1,24 @@ +defmodule Safira.Accounts.Course do + @moduledoc """ + A course the user is enrolled in + """ + use Ecto.Schema + import Ecto.Changeset + + alias Safira.Accounts.Attendee + + @required_fields ~w(name)a + + schema "courses" do + field :name, :string + has_many :attendees, Attendee + + timestamps() + end + + def changeset(course, attrs) do + course + |> cast(attrs, @required_fields) + |> validate_required(@required_fields) + end +end diff --git a/lib/safira_web/controllers/course_controller.ex b/lib/safira_web/controllers/course_controller.ex new file mode 100644 index 00000000..bf5d14e1 --- /dev/null +++ b/lib/safira_web/controllers/course_controller.ex @@ -0,0 +1,12 @@ +defmodule SafiraWeb.CourseController do + use SafiraWeb, controller: "1.6" + + alias Safira.Accounts + + action_fallback SafiraWeb.FallbackController + + def index(conn, _params) do + courses = Accounts.list_courses() + render(conn, "index.json", courses: courses) + end +end diff --git a/lib/safira_web/router.ex b/lib/safira_web/router.ex index 35e01c6e..a32ef6f1 100644 --- a/lib/safira_web/router.ex +++ b/lib/safira_web/router.ex @@ -43,6 +43,8 @@ defmodule SafiraWeb.Router do resources "/passwords", PasswordController, only: [:create, :update] end + get "/attendee/courses", CourseController, :index + get "/is_registered/:id", AuthController, :is_registered pipe_through :jwt_authenticated diff --git a/lib/safira_web/views/attendee_view.ex b/lib/safira_web/views/attendee_view.ex index 869f1de5..3cb05573 100644 --- a/lib/safira_web/views/attendee_view.ex +++ b/lib/safira_web/views/attendee_view.ex @@ -26,7 +26,7 @@ defmodule SafiraWeb.AttendeeView do id: attendee.id, nickname: attendee.nickname, name: attendee.name, - course: attendee.course, + course: attendee.course_id, avatar: Avatar.url({attendee.avatar, attendee}, :original), cv: CV.url({attendee.cv, attendee}, :original), badges: render_many(attendee.badges, SafiraWeb.BadgeView, "badge.json"), @@ -44,7 +44,7 @@ defmodule SafiraWeb.AttendeeView do id: attendee.id, nickname: attendee.nickname, name: attendee.name, - course: attendee.course, + course: attendee.course_id, avatar: Avatar.url({attendee.avatar, attendee}, :original), cv: CV.url({attendee.cv, attendee}, :original), badges: render_many(attendee.badges, SafiraWeb.BadgeView, "badge.json"), @@ -74,7 +74,7 @@ defmodule SafiraWeb.AttendeeView do id: attendee.id, nickname: attendee.nickname, name: attendee.name, - course: attendee.course, + course: attendee.course_id, avatar: Avatar.url({attendee.avatar, attendee}, :original), cv: CV.url({attendee.cv, attendee}, :original), token_balance: attendee.token_balance, @@ -87,7 +87,7 @@ defmodule SafiraWeb.AttendeeView do id: attendee.id, nickname: attendee.nickname, name: attendee.name, - course: attendee.course, + course: attendee.course_id, avatar: Avatar.url({attendee.avatar, attendee}, :original), cv: nil, token_balance: attendee.token_balance, diff --git a/lib/safira_web/views/course_view.ex b/lib/safira_web/views/course_view.ex new file mode 100644 index 00000000..f5594b5f --- /dev/null +++ b/lib/safira_web/views/course_view.ex @@ -0,0 +1,16 @@ +defmodule SafiraWeb.CourseView do + use SafiraWeb, :view + + alias SafiraWeb.CourseView + + def render("index.json", %{courses: courses}) do + %{data: render_many(courses, CourseView, "course.json")} + end + + def render("course.json", %{course: course}) do + %{ + id: course.id, + name: course.name + } + end +end diff --git a/priv/repo/migrations/20180704191725_create_attendees.exs b/priv/repo/migrations/20180704191725_create_attendees.exs index cbe4a393..d8ebbd3b 100644 --- a/priv/repo/migrations/20180704191725_create_attendees.exs +++ b/priv/repo/migrations/20180704191725_create_attendees.exs @@ -6,7 +6,6 @@ defmodule Safira.Repo.Migrations.CreateAttendees do add :uuid, :string add :nickname, :string add :user_id, references(:users, on_delete: :delete_all) - add :course, :string timestamps() end diff --git a/priv/repo/migrations/20231127120646_create_courses.exs b/priv/repo/migrations/20231127120646_create_courses.exs new file mode 100644 index 00000000..24c16f4a --- /dev/null +++ b/priv/repo/migrations/20231127120646_create_courses.exs @@ -0,0 +1,15 @@ +defmodule Safira.Repo.Migrations.CreateCourses do + use Ecto.Migration + + def change do + create table(:courses) do + add :name, :string, null: false + + timestamps() + end + + alter table(:attendees) do + add :course_id, references(:courses, on_delete: :nothing) + end + end +end diff --git a/priv/repo/seeds/accounts.exs b/priv/repo/seeds/accounts.exs index 76fe752f..a36adf33 100644 --- a/priv/repo/seeds/accounts.exs +++ b/priv/repo/seeds/accounts.exs @@ -1,18 +1,23 @@ defmodule Safira.Repo.Seeds.Accounts do @moduledoc false - alias Mix.Tasks.Gen.{AttendeesWithPassword, Companies, Staffs} + alias Mix.Tasks.Gen.{AttendeesWithPassword, Companies, Staffs, Courses} alias Safira.Accounts alias Safira.Accounts.User alias Safira.Repo def run do + seed_courses() seed_staffs() seed_companies() seed_attendees() reset_passwords() end + defp seed_courses do + Courses.run(["data/courses.txt"]) + end + defp seed_companies do Companies.run(["data/sponsors.csv"]) end From 23f1551e442cdd26f1d0ffc358bc65d289226832 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Lobo?= Date: Tue, 28 Nov 2023 01:06:04 +0000 Subject: [PATCH 05/10] chore: tests --- test/safira_web/controllers/attendee_controller_test.exs | 6 +++--- test/safira_web/controllers/company_controller_test.exs | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/test/safira_web/controllers/attendee_controller_test.exs b/test/safira_web/controllers/attendee_controller_test.exs index 19a8ac16..ef204af7 100644 --- a/test/safira_web/controllers/attendee_controller_test.exs +++ b/test/safira_web/controllers/attendee_controller_test.exs @@ -95,7 +95,7 @@ defmodule SafiraWeb.AttendeeControllerTest do "id" => attendee.id, "name" => attendee.name, "nickname" => attendee.nickname, - "course" => attendee.course, + "course" => attendee.course_id, "token_balance" => 0, "badges" => [], "badge_count" => 0 @@ -134,11 +134,11 @@ defmodule SafiraWeb.AttendeeControllerTest do expected_attendee = %{ "avatar" => nil, "cv" => nil, + "course" => nil, "entries" => 0, "id" => attendee.id, "name" => attendee.name, "nickname" => attendee.nickname, - "course" => attendee.course, "token_balance" => 0, "badges" => [], "badge_count" => 0, @@ -178,11 +178,11 @@ defmodule SafiraWeb.AttendeeControllerTest do expected_attendee = %{ "avatar" => nil, "cv" => nil, + "course" => nil, "entries" => 0, "id" => attendee.id, "name" => attendee.name, "nickname" => "john_doe123", - "course" => attendee.course, "token_balance" => 0 } diff --git a/test/safira_web/controllers/company_controller_test.exs b/test/safira_web/controllers/company_controller_test.exs index 37bab1d6..25739eb9 100644 --- a/test/safira_web/controllers/company_controller_test.exs +++ b/test/safira_web/controllers/company_controller_test.exs @@ -113,9 +113,9 @@ defmodule SafiraWeb.CompanyControllerTest do "id" => attendee.id, "nickname" => attendee.nickname, "name" => attendee.name, - "course" => attendee.course, "avatar" => nil, "cv" => nil, + "course" => nil, "token_balance" => attendee.token_balance, "entries" => attendee.entries } @@ -144,7 +144,7 @@ defmodule SafiraWeb.CompanyControllerTest do "id" => attendee1.id, "nickname" => attendee1.nickname, "name" => attendee1.name, - "course" => attendee1.course, + "course" => nil, "avatar" => nil, "cv" => nil, "token_balance" => attendee1.token_balance, @@ -154,7 +154,7 @@ defmodule SafiraWeb.CompanyControllerTest do "id" => attendee2.id, "nickname" => attendee2.nickname, "name" => attendee2.name, - "course" => attendee2.course, + "course" => nil, "avatar" => nil, "cv" => nil, "token_balance" => attendee2.token_balance, @@ -195,7 +195,7 @@ defmodule SafiraWeb.CompanyControllerTest do "id" => attendee1.id, "nickname" => attendee1.nickname, "name" => attendee1.name, - "course" => attendee1.course, + "course" => nil, "avatar" => nil, "cv" => nil, "token_balance" => attendee1.token_balance, From 4ac9b14b9df36f0bc45177c268b77a072cff643c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Lobo?= Date: Tue, 28 Nov 2023 01:09:24 +0000 Subject: [PATCH 06/10] chore: fix ci --- lib/safira/accounts/accounts.ex | 2 +- lib/safira/accounts/attendee.ex | 2 +- priv/repo/seeds/accounts.exs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/safira/accounts/accounts.ex b/lib/safira/accounts/accounts.ex index d538c57a..bc5099a1 100644 --- a/lib/safira/accounts/accounts.ex +++ b/lib/safira/accounts/accounts.ex @@ -8,8 +8,8 @@ defmodule Safira.Accounts do alias Safira.Accounts.Attendee alias Safira.Accounts.Company alias Safira.Accounts.Staff - alias Safira.Accounts.User alias Safira.Accounts.Course + alias Safira.Accounts.User alias Safira.Repo diff --git a/lib/safira/accounts/attendee.ex b/lib/safira/accounts/attendee.ex index bf4a830b..99e337e1 100644 --- a/lib/safira/accounts/attendee.ex +++ b/lib/safira/accounts/attendee.ex @@ -6,8 +6,8 @@ defmodule Safira.Accounts.Attendee do use Arc.Ecto.Schema import Ecto.Changeset - alias Safira.Accounts.User alias Safira.Accounts.Course + alias Safira.Accounts.User alias Safira.Contest.Badge alias Safira.Contest.DailyToken diff --git a/priv/repo/seeds/accounts.exs b/priv/repo/seeds/accounts.exs index a36adf33..28c49ff0 100644 --- a/priv/repo/seeds/accounts.exs +++ b/priv/repo/seeds/accounts.exs @@ -1,7 +1,7 @@ defmodule Safira.Repo.Seeds.Accounts do @moduledoc false - alias Mix.Tasks.Gen.{AttendeesWithPassword, Companies, Staffs, Courses} + alias Mix.Tasks.Gen.{AttendeesWithPassword, Companies, Courses, Staffs} alias Safira.Accounts alias Safira.Accounts.User alias Safira.Repo From 093feacc8e4721e2e2e84a0f1a51b56b8061209e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Lobo?= Date: Tue, 28 Nov 2023 05:19:54 +0000 Subject: [PATCH 07/10] chore: very important and mandatory alphabetical order of imports --- lib/safira/accounts/accounts.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/safira/accounts/accounts.ex b/lib/safira/accounts/accounts.ex index bc5099a1..1604e3ae 100644 --- a/lib/safira/accounts/accounts.ex +++ b/lib/safira/accounts/accounts.ex @@ -7,8 +7,8 @@ defmodule Safira.Accounts do alias Safira.Accounts.Attendee alias Safira.Accounts.Company - alias Safira.Accounts.Staff alias Safira.Accounts.Course + alias Safira.Accounts.Staff alias Safira.Accounts.User alias Safira.Repo From ceb09b3f5d4d63090f11b9495f41c05a945f6fa3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Lobo?= Date: Tue, 28 Nov 2023 09:00:00 +0000 Subject: [PATCH 08/10] chore: add all courses and sort them properly --- data/courses.txt | 133 ++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 126 insertions(+), 7 deletions(-) diff --git a/data/courses.txt b/data/courses.txt index f1fe6147..3c865310 100644 --- a/data/courses.txt +++ b/data/courses.txt @@ -1,3 +1,6 @@ +Licenciatura em Engenharia Informática +Mestrado em Engenharia Informática +Doutoramento em Informática Licenciatura em Administração Pública Licenciatura em Arqueologia Licenciatura em Artes Visuais @@ -14,8 +17,10 @@ Licenciatura em Criminologia e Justiça Criminal Licenciatura em Design de Produto Licenciatura em Design e Marketing de Moda Licenciatura em Direito +Licenciatura em Direito (Pós-Laboral) Licenciatura em Economia Licenciatura em Educação +Licenciatura em Educação (Pós-Laboral) Licenciatura em Educação Básica Licenciatura em Enfermagem Licenciatura em Engenharia Aeroespacial @@ -28,7 +33,6 @@ Licenciatura em Engenharia e Gestão de Sistemas de Informação Licenciatura em Engenharia e Gestão Industrial Licenciatura em Engenharia Eletrónica Industrial e Computadores Licenciatura em Engenharia Física -Licenciatura em Engenharia Informática Licenciatura em Engenharia Mecânica Licenciatura em Engenharia Química e Biológica Licenciatura em Engenharia Têxtil @@ -56,11 +60,27 @@ Licenciatura em Relações Internacionais Licenciatura em Sociologia Licenciatura em Teatro Mestrado Integrado em Arquitetura +Mestrado Integrado em Engenharia Biológica +Mestrado Integrado em Engenharia Biomédica +Mestrado Integrado em Engenharia Civil +Mestrado Integrado em Engenharia de Materiais +Mestrado Integrado em Engenharia de Polímeros +Mestrado Integrado em Engenharia de Telecomunicações e Informática +Mestrado Integrado em Engenharia e Gestão de Sistemas de Informação +Mestrado Integrado em Engenharia e Gestão de Sistemas de Informação (Pós-Laboral) +Mestrado Integrado em Engenharia e Gestão Industrial +Mestrado Integrado em Engenharia Eletrónica Industrial e Computadores +Mestrado Integrado em Engenharia Física +Mestrado Integrado em Engenharia Informática +Mestrado Integrado em Engenharia Mecânica +Mestrado Integrado em Engenharia Têxtil +Mestrado Integrado em Medicina +Mestrado Integrado em Psicologia Mestrado em Administração Pública -Mestrado em Análise Estrutural Avançada e Projeto com Materiais Compósitos -Mestrado em Análise Estrutural de Monumentos e Construções Históricas +Mestrado em Análise Estrutural Avançada e Projeto com Materiais Compósitos - FRP++ +Mestrado em Análise Estrutural de Monumentos e Construções Históricas (Mestrado Europeu) Mestrado em Arqueologia -Mestrado em Avaliação Aplicada à Formação nas Profissões da Saúde +Mestrado em Avaliação Aplicada à Formação nas Profissões da Saúde - [O 1º ano do Curso não Funciona em 2023/2024] Mestrado em Biodiversidade, Ecologia e Alterações Globais Mestrado em Biofísica e Bionanossistemas Mestrado em Bioinformática @@ -89,7 +109,7 @@ Mestrado em Direito das Crianças, Família e Sucessões Mestrado em Direito dos Contratos e da Empresa Mestrado em Direito dos Negócios, Europeu e Transnacional Mestrado em Direito e Informática -Mestrado em Direito Judiciário +Mestrado em Direito Judiciário (Direitos Processuais e Organização Judiciária) Mestrado em Direito Transnacional da Empresa e das Tecnologias Digitais Mestrado em Direito Tributário Mestrado em Direitos Humanos @@ -116,6 +136,67 @@ Mestrado em Engenharia e Gestão Industrial Mestrado em Engenharia Eletrónica Industrial e Computadores Mestrado em Engenharia Física Mestrado em Engenharia Humana +Mestrado em Engenharia Mecânica +Mestrado em Engenharia Mecatrónica +Mestrado em Engenharia Química e Biológica +Mestrado em Engenharia Têxtil +Mestrado em Engenharia Urbana +Mestrado em Ensino de Biologia e Geologia no 3º Ciclo no Ensino Básico e no Ensino Secundário +Mestrado em Ensino de Física e de Química no 3º Ciclo do Ensino Básico e no Ensino Secundário +Mestrado em Ensino de História no 3º Ciclo do Ensino Básico e no Ensino Secundário +Mestrado em Ensino de Informática +Mestrado em Ensino de Inglês no 1º Ciclo do Ensino Básico +Mestrado em Ensino de Matemática no 3º Ciclo do Ensino Básico e no Secundário +Mestrado em Ensino de Música +Mestrado em Ensino de Português no 3º Ciclo do Ensino Básico e no Ensino Secundário +Mestrado em Ensino do 1º Ciclo do Ensino Básico e de Matemática e Ciências Naturais no 2º Ciclo do Ensino Básico +Mestrado em Ensino do 1º Ciclo do Ensino Básico e de Português e História e Geografia de Portugal no 2º Ciclo do Ensino Básico +Mestrado em Espanhol Língua Segunda e Língua Estrangeira +Mestrado em Estatística para Ciência de Dados +Mestrado em Estudos da Criança +Mestrado em Estudos Interculturais Português/Chinês +Mestrado em Estudos Luso-Alemães +Mestrado em Filosofia Política +Mestrado em Finanças +Mestrado em Física +Mestrado em Genética Molecular +Mestrado em Geociências +Mestrado em Geografia +Mestrado em Gestão +Mestrado em Gestão de Projetos de Engenharia +Mestrado em Gestão de Recursos Humanos +Mestrado em Gestão de Unidades de Saúde +Mestrado em Gestão e Negócios +Mestrado em História +Mestrado em Humanidades Digitais +Mestrado em Lexicografia (Mestrado Europeu) +Mestrado em Língua, Literatura e Cultura Inglesas +Mestrado em Literaturas de Língua Portuguesa +Mestrado em Marketing e Estratégia +Mestrado em Matemática e Computação +Mestrado em Media Arts +Mestrado em Micro e Nano Tecnologias +Mestrado em Modelação de Informação na Construção de Edifícios +Mestrado em Negócios Internacionais +Mestrado em Optometria Avançada +Mestrado em Património Cultural +Mestrado em Português Língua Não Materna +Mestrado em Psicologia Clínica e Psicoterapia de Adultos +Mestrado em Psicologia Clínica na Infância e Adolescência +Mestrado em Psicologia da Educação +Mestrado em Psicologia da Justiça +Mestrado em Psicologia do Trabalho e das Organizações +Mestrado em Química Medicinal +Mestrado em Relações Internacionais +Mestrado em Sistemas de Informação +Mestrado em Sociologia +Mestrado em Sociologia do Género e da Sexualidade +Mestrado em Sustentabilidade do Ambiente Construído +Mestrado em Técnicas de Caracterização e Análise Química +Mestrado em Tecnologia e Ciência Alimentar +Mestrado em Tecnologias Interativas +Mestrado em Temas de Psicologia da Educação +Mestrado em Tradução e Comunicação Multilingue Doutoramento em Biologia Doutoramento em Ciência e Engenharia de Polímeros e Compósitos Doutoramento em Ciências da Cultura @@ -132,7 +213,45 @@ Doutoramento em Engenharia Têxtil Doutoramento em Filosofia Doutoramento em Geologia - Geoconservação, Geologia Ambiental e Recursos Geológicos Doutoramento em Gestão e Tratamento de Resíduos -Doutoramento em Informática Doutoramento em Matemática Doutoramento em Química Aplicada -Doutoramento em Sustentabilidade do Ambiente Construído \ No newline at end of file +Doutoramento em Sustentabilidade do Ambiente Construído +Programa Doutoral em Arqueologia +Programa Doutoral em Arquitetura +Programa Doutoral em Bioengenharia +Programa Doutoral em Biologia Molecular e Ambiental +Programa Doutoral em Biotecnologia Marinha e Aquacultura +Programa Doutoral em Cadeias de Produção Agrícola - da mesa ao campo +Programa Doutoral em Ciência e Tecnologia Alimentar e Nutrição +Programa Doutoral em Ciência Política e Relações Internacionais +Programa Doutoral em Ciência, Tecnologia e Gestão do Mar +Programa Doutoral em Ciências da Administração +Programa Doutoral em Ciências da Comunicação +Programa Doutoral em Ciências da Educação +Programa Doutoral em Ciências da Saúde +Programa Doutoral em Ciências Jurídicas +Programa Doutoral em Design de Moda +Programa Doutoral em Economia +Programa Doutoral em Educação a Distância e e-Learning +Programa Doutoral em Engenharia Industrial e de Sistemas +Programa Doutoral em Estudos Culturais +Programa Doutoral em Estudos da Criança +Programa Doutoral em Fabrico Digital Direto para as Indústrias dos Polímeros e Moldes +Programa Doutoral em Física +Programa Doutoral em Geografia +Programa Doutoral em Gestão +Programa Doutoral em História +Programa Doutoral em Informática +Programa Doutoral em Marketing e Estratégia +Programa Doutoral em Matemática Aplicada +Programa Doutoral em Matemática e Aplicações +Programa Doutoral em Materiais e Processamento Avançados +Programa Doutoral em Medicina +Programa Doutoral em Modernidades Comparadas: Literaturas, Artes e Culturas +Programa Doutoral em Optometria e Ciências da Visão +Programa Doutoral em Psicologia +Programa Doutoral em Química +Programa Doutoral em Sistemas Avançados de Engenharia para a Indústria +Programa Doutoral em Sociologia +Programa Doutoral em Tecnologia e Sistemas de Informação +Programa Doutoral em Telecomunicações \ No newline at end of file From 74424dcea87615ecdbd84238b0c6fcef47ff4892 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Lobo?= Date: Wed, 29 Nov 2023 23:05:03 +0000 Subject: [PATCH 09/10] feat: implement suggestions --- data/courses.txt | 11 ++++------- lib/mix/tasks/gen.companies.ex | 2 +- lib/mix/tasks/gen.courses.ex | 2 +- .../{ => course}/course_controller.ex | 4 ++-- lib/safira_web/controllers/course/course_json.ex | 12 ++++++++++++ lib/safira_web/views/course_view.ex | 16 ---------------- 6 files changed, 20 insertions(+), 27 deletions(-) rename lib/safira_web/controllers/{ => course}/course_controller.ex (69%) create mode 100644 lib/safira_web/controllers/course/course_json.ex delete mode 100644 lib/safira_web/views/course_view.ex diff --git a/data/courses.txt b/data/courses.txt index 3c865310..dcadebc1 100644 --- a/data/courses.txt +++ b/data/courses.txt @@ -17,10 +17,8 @@ Licenciatura em Criminologia e Justiça Criminal Licenciatura em Design de Produto Licenciatura em Design e Marketing de Moda Licenciatura em Direito -Licenciatura em Direito (Pós-Laboral) Licenciatura em Economia Licenciatura em Educação -Licenciatura em Educação (Pós-Laboral) Licenciatura em Educação Básica Licenciatura em Enfermagem Licenciatura em Engenharia Aeroespacial @@ -67,7 +65,6 @@ Mestrado Integrado em Engenharia de Materiais Mestrado Integrado em Engenharia de Polímeros Mestrado Integrado em Engenharia de Telecomunicações e Informática Mestrado Integrado em Engenharia e Gestão de Sistemas de Informação -Mestrado Integrado em Engenharia e Gestão de Sistemas de Informação (Pós-Laboral) Mestrado Integrado em Engenharia e Gestão Industrial Mestrado Integrado em Engenharia Eletrónica Industrial e Computadores Mestrado Integrado em Engenharia Física @@ -77,10 +74,10 @@ Mestrado Integrado em Engenharia Têxtil Mestrado Integrado em Medicina Mestrado Integrado em Psicologia Mestrado em Administração Pública -Mestrado em Análise Estrutural Avançada e Projeto com Materiais Compósitos - FRP++ -Mestrado em Análise Estrutural de Monumentos e Construções Históricas (Mestrado Europeu) +Mestrado em Análise Estrutural Avançada e Projeto com Materiais Compósitos +Mestrado em Análise Estrutural de Monumentos e Construções Históricas Mestrado em Arqueologia -Mestrado em Avaliação Aplicada à Formação nas Profissões da Saúde - [O 1º ano do Curso não Funciona em 2023/2024] +Mestrado em Avaliação Aplicada à Formação nas Profissões da Saúde Mestrado em Biodiversidade, Ecologia e Alterações Globais Mestrado em Biofísica e Bionanossistemas Mestrado em Bioinformática @@ -169,7 +166,7 @@ Mestrado em Gestão de Unidades de Saúde Mestrado em Gestão e Negócios Mestrado em História Mestrado em Humanidades Digitais -Mestrado em Lexicografia (Mestrado Europeu) +Mestrado em Lexicografia Mestrado em Língua, Literatura e Cultura Inglesas Mestrado em Literaturas de Língua Portuguesa Mestrado em Marketing e Estratégia diff --git a/lib/mix/tasks/gen.companies.ex b/lib/mix/tasks/gen.companies.ex index bdec7e1e..fa28f06f 100644 --- a/lib/mix/tasks/gen.companies.ex +++ b/lib/mix/tasks/gen.companies.ex @@ -16,7 +16,7 @@ defmodule Mix.Tasks.Gen.Companies do def run(args) do if Enum.empty?(args) do - Mix.shell().info("Needs to receive atleast one file path.") + Mix.shell().info("Needs to receive at least one file path.") else args |> create end diff --git a/lib/mix/tasks/gen.courses.ex b/lib/mix/tasks/gen.courses.ex index 9f48621e..3e45e6aa 100644 --- a/lib/mix/tasks/gen.courses.ex +++ b/lib/mix/tasks/gen.courses.ex @@ -8,7 +8,7 @@ defmodule Mix.Tasks.Gen.Courses do def run(args) do if Enum.empty?(args) do - Mix.shell().info("Needs to receive atleast one file path.") + Mix.shell().info("Needs to receive at least one file path.") else args |> create end diff --git a/lib/safira_web/controllers/course_controller.ex b/lib/safira_web/controllers/course/course_controller.ex similarity index 69% rename from lib/safira_web/controllers/course_controller.ex rename to lib/safira_web/controllers/course/course_controller.ex index bf5d14e1..cf77e0d5 100644 --- a/lib/safira_web/controllers/course_controller.ex +++ b/lib/safira_web/controllers/course/course_controller.ex @@ -1,5 +1,5 @@ defmodule SafiraWeb.CourseController do - use SafiraWeb, controller: "1.6" + use SafiraWeb, :controller alias Safira.Accounts @@ -7,6 +7,6 @@ defmodule SafiraWeb.CourseController do def index(conn, _params) do courses = Accounts.list_courses() - render(conn, "index.json", courses: courses) + render(conn, :index, courses: courses) end end diff --git a/lib/safira_web/controllers/course/course_json.ex b/lib/safira_web/controllers/course/course_json.ex new file mode 100644 index 00000000..f23cf21b --- /dev/null +++ b/lib/safira_web/controllers/course/course_json.ex @@ -0,0 +1,12 @@ +defmodule SafiraWeb.CourseJSON do + def index(%{courses: courses}) do + %{data: for(course <- courses, do: data(course))} + end + + def data(course) do + %{ + id: course.id, + name: course.name + } + end +end diff --git a/lib/safira_web/views/course_view.ex b/lib/safira_web/views/course_view.ex deleted file mode 100644 index f5594b5f..00000000 --- a/lib/safira_web/views/course_view.ex +++ /dev/null @@ -1,16 +0,0 @@ -defmodule SafiraWeb.CourseView do - use SafiraWeb, :view - - alias SafiraWeb.CourseView - - def render("index.json", %{courses: courses}) do - %{data: render_many(courses, CourseView, "course.json")} - end - - def render("course.json", %{course: course}) do - %{ - id: course.id, - name: course.name - } - end -end From 9cf7a9200af71c7d863eef91822f8fb8abf74d9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Lobo?= Date: Wed, 29 Nov 2023 23:12:07 +0000 Subject: [PATCH 10/10] fix: please --- lib/safira_web/controllers/course/course_json.ex | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/safira_web/controllers/course/course_json.ex b/lib/safira_web/controllers/course/course_json.ex index f23cf21b..d6960d73 100644 --- a/lib/safira_web/controllers/course/course_json.ex +++ b/lib/safira_web/controllers/course/course_json.ex @@ -1,4 +1,6 @@ defmodule SafiraWeb.CourseJSON do + @moduledoc false + def index(%{courses: courses}) do %{data: for(course <- courses, do: data(course))} end