Skip to content

Commit ef46d0f

Browse files
committed
chore: correct merge errors
2 parents be96992 + a8ccc93 commit ef46d0f

File tree

4 files changed

+171
-32
lines changed

4 files changed

+171
-32
lines changed

lib/atomic/generate_avatar.ex

+63
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
defmodule Atomic.GenerateAvatar do
2+
@moduledoc """
3+
A module for generating unique, GitHub-style avatars for organizations.
4+
"""
5+
6+
import Phoenix.HTML
7+
8+
@grid_size 5
9+
@cell_size 50
10+
11+
def generate_avatar(seed, output_type) do
12+
hash = :crypto.hash(:sha256, seed) |> :binary.bin_to_list()
13+
color = Enum.take(hash, 3)
14+
grid = build_grid(hash)
15+
svg = draw(grid, color)
16+
17+
handle_output(svg, output_type)
18+
end
19+
20+
defp handle_output(svg, output) when is_binary(output), do: File.write(output, svg)
21+
22+
defp handle_output(svg, :svg), do: svg
23+
defp handle_output(svg, :blob), do: :erlang.term_to_binary(svg)
24+
defp handle_output(svg, :html), do: raw(svg)
25+
26+
defp handle_output(_svg, invalid) do
27+
raise ArgumentError,
28+
"Invalid output type: #{inspect(invalid)}. Expected one of :svg, :blob, :html, or a file path string."
29+
end
30+
31+
defp build_grid(hash) do
32+
hash
33+
|> Enum.chunk_every(@grid_size, @grid_size, :discard)
34+
|> Enum.map(&mirror/1)
35+
|> List.flatten()
36+
end
37+
38+
defp mirror([a, b, c | _]), do: [a, b, c, b, a]
39+
40+
defp draw(grid, [r, g, b]) do
41+
header = """
42+
<svg width="#{@grid_size * @cell_size}" height="#{@grid_size * @cell_size}" xmlns="http://www.w3.org/2000/svg">
43+
"""
44+
45+
footer = "</svg>"
46+
47+
body =
48+
Enum.map_join(
49+
grid
50+
|> Enum.with_index()
51+
|> Enum.filter(fn {val, _} -> rem(val, 2) == 0 end),
52+
"\n",
53+
fn {_val, index} ->
54+
x = rem(index, @grid_size) * @cell_size
55+
y = div(index, @grid_size) * @cell_size
56+
57+
"<rect x='#{x}' y='#{y}' width='#{@cell_size}' height='#{@cell_size}' fill='rgb(#{r},#{g},#{b})' />"
58+
end
59+
)
60+
61+
header <> body <> footer
62+
end
63+
end

priv/fake/organizations.json

+4-4
Original file line numberDiff line numberDiff line change
@@ -216,8 +216,8 @@
216216
},
217217
{
218218
"name": "Núcleo de Estudante de Contabilidade da Universidade do Minho",
219-
"long_name": "",
220-
"description": ""
219+
"long_name": "Núcleo de Estudante de Contabilidade da Universidade do Minho",
220+
"description": "Núcleo de Estudante de Contabilidade da Universidade do Minho"
221221
},
222222
{
223223
"name": "NUMERUM",
@@ -226,7 +226,7 @@
226226
},
227227
{
228228
"name": "PoliticUM",
229-
"long_name": "",
230-
"description": ""
229+
"long_name": "PoliticUM",
230+
"description": "PoliticUM"
231231
}
232232
]

priv/repo/seeds/feed.exs

+71-22
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,66 @@ defmodule Atomic.Repo.Seeds.Feed do
99
alias Atomic.Repo
1010

1111
@activity_titles [
12-
"Geek Night",
13-
"Hack Night",
14-
"Hackathon",
15-
"Workshop",
16-
"Talk",
17-
"Meetup",
18-
"Conference",
19-
"Seminar",
20-
"Course",
21-
"Bootcamp",
22-
"Study session"
12+
"🌌 Geek Night",
13+
"💻 Hack Night",
14+
"🚀 Hackathon",
15+
"🛠️ Workshop",
16+
"🎤 Palestra",
17+
"🤝 Meetup",
18+
"🌍 Conferência",
19+
"📚 Seminário",
20+
"🎓 Curso",
21+
"🏋️ Bootcamp",
22+
"📖 Sessão de Estudo"
2323
]
2424

25+
@announcement_titles [
26+
"📢 Atualização importante da comunidade estudantil!",
27+
"🚀 Novidades emocionantes para todos os estudantes!",
28+
"🔔 Um anúncio que não vais querer perder!",
29+
"💡 Mantém-te informado: aqui está o que está a acontecer!",
30+
"📅 Grandes mudanças a caminho!",
31+
"🎉 Uma mensagem especial para os nossos membros!",
32+
"🚨 Vamos falar: aviso importante para ti!",
33+
"📣 Grandes oportunidades esperam por ti – lê mais aqui!",
34+
"🌟 Aqui está o que precisas de saber!",
35+
"🏆 Atenção, estudantes: temos algo para partilhar!"
36+
]
37+
38+
def activity_description(organization, activity_title) do
39+
activity_paragraphs = [
40+
"O #{organization.name} preparou mais uma edição de #{activity_title}! Esta é uma excelente oportunidade para te juntares a uma comunidade dinâmica, explorando novas ideias e desenvolvendo as tuas habilidades num ambiente envolvente e colaborativo.",
41+
"Junta-te ao #{organization.name} na próxima #{activity_title}! Um evento pensado para todos os que querem aprender, partilhar conhecimento e conectar-se com outros entusiastas da área.",
42+
"O #{organization.name} convida-te para a #{activity_title}! Prepara-te para um momento repleto de aprendizagem, desafios estimulantes e oportunidades de networking num ambiente descontraído.",
43+
"A #{activity_title} organizada pelo #{organization.name} está quase a chegar! Uma experiência única onde podes desenvolver novas competências e conhecer pessoas com interesses semelhantes.",
44+
"Não percas a #{activity_title} promovida pelo #{organization.name}! Um evento pensado para criar um espaço de partilha, crescimento e inovação. Fica atento para mais detalhes e garante já a tua presença! 🚀",
45+
"O #{organization.name} traz-te a #{activity_title}, um evento onde a aprendizagem e a diversão andam de mãos dadas. Vem descobrir novas oportunidades e expandir os teus horizontes!",
46+
"Vem participar na #{activity_title} organizada pelo #{organization.name}! Um momento perfeito para trocares experiências, aprenderes algo novo e te conectares com a comunidade.",
47+
"A #{activity_title} do #{organization.name} é uma oportunidade imperdível para todos os interessados em explorar novas áreas e desafios. Não fiques de fora!",
48+
"O #{organization.name} preparou a #{activity_title} a pensar em ti! Participa neste evento e aproveita para desenvolver as tuas competências num ambiente dinâmico e inspirador.",
49+
"Se procuras uma experiência enriquecedora, a #{activity_title} promovida pelo #{organization.name} é o evento certo para ti. Marca já na tua agenda e junta-te a nós!"
50+
]
51+
52+
paragraph = Enum.random(activity_paragraphs)
53+
end
54+
55+
def announcement_description(organization) do
56+
announcement_paragraphs = [
57+
"📢 O #{organization.name} tem novidades para ti! Fica atento, porque algo incrível está a caminho. Em breve revelamos mais detalhes!",
58+
"🚀 Atenção, comunidade! O #{organization.name} está a preparar algo especial. Não vais querer perder esta novidade!",
59+
"🔔 Tens acompanhado as novidades do #{organization.name}? Um anúncio importante será feito em breve. Fica ligado!",
60+
"💡 Algo empolgante está a acontecer no #{organization.name}! Mal podemos esperar para partilhar contigo. Fica atento às nossas redes!",
61+
"📅 O #{organization.name} tem um grande anúncio para fazer. Prepara-te para descobrir algo que vai fazer a diferença!",
62+
"🎉 Boas notícias a caminho! O #{organization.name} está prestes a lançar uma nova iniciativa. Descobre tudo em breve!",
63+
"🚨 O #{organization.name} tem uma surpresa reservada para ti! Mantém-te ligado para não perderes esta grande oportunidade.",
64+
"📣 Está quase! Em breve o #{organization.name} vai anunciar algo que não vais querer perder. Fica atento!",
65+
"🌟 A equipa do #{organization.name} tem trabalhado em algo muito especial para ti. O anúncio oficial está a chegar!",
66+
"🏆 Uma grande novidade do #{organization.name} está prestes a ser revelada. Garante que não perdes esta oportunidade única!"
67+
]
68+
69+
paragraph = Enum.random(announcement_paragraphs)
70+
end
71+
2572
def run do
2673
seed_posts()
2774
end
@@ -35,8 +82,8 @@ defmodule Atomic.Repo.Seeds.Feed do
3582
type = Enum.random([:activity, :announcement])
3683

3784
case type do
38-
:activity -> seed_activity(Enum.random(organizations).id, i)
39-
:announcement -> seed_announcement(Enum.random(organizations).id)
85+
:activity -> seed_activity(Enum.random(organizations), i)
86+
:announcement -> seed_announcement(Enum.random(organizations))
4087
end
4188
end
4289

@@ -45,21 +92,23 @@ defmodule Atomic.Repo.Seeds.Feed do
4592
end
4693
end
4794

48-
def seed_activity(organization_id, i) do
95+
def seed_activity(organization, i) do
4996
location = %{
5097
name: Faker.Address.city(),
5198
url: Faker.Internet.url()
5299
}
53100

101+
title = Enum.random(@activity_titles)
102+
54103
%{
55-
title: Enum.random(@activity_titles),
56-
description: Faker.Lorem.paragraph(),
104+
title: title,
105+
description: activity_description(organization, title),
57106
start: build_start_date(i),
58107
finish: build_finish_date(i),
59108
location: %{name: Faker.Company.name(), address: Faker.Address.street_address()},
60109
maximum_entries: Enum.random(11..20),
61-
organization_id: organization_id,
62-
enrolled: 0
110+
organization_id: organization.id,
111+
enrolled: Enum.random(0..10)
63112
}
64113
|> Activities.create_activity_with_post()
65114
|> case do
@@ -68,11 +117,11 @@ defmodule Atomic.Repo.Seeds.Feed do
68117
end
69118
end
70119

71-
def seed_announcement(organization_id) do
120+
def seed_announcement(organization) do
72121
%{
73-
title: Faker.Lorem.sentence(),
74-
description: Faker.Lorem.paragraph(),
75-
organization_id: organization_id
122+
title: Enum.random(@announcement_titles),
123+
description: announcement_description(organization),
124+
organization_id: organization.id
76125
}
77126
|> Organizations.create_announcement_with_post()
78127
|> case do

priv/repo/seeds/organizations.exs

+33-6
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ defmodule Atomic.Repo.Seeds.Organizations do
22
@moduledoc """
33
Seeds the database with organizations.
44
"""
5+
alias Atomic.GenerateAvatar
56
alias Atomic.Organizations
67
alias Atomic.Organizations.Organization
78
alias Atomic.Repo
@@ -45,12 +46,38 @@ defmodule Atomic.Repo.Seeds.Organizations do
4546
# Seed other organizations
4647
@organizations
4748
|> Enum.each(fn organization ->
48-
%{
49-
name: organization["name"],
50-
long_name: organization["long_name"],
51-
description: organization["description"]
52-
}
53-
|> Organizations.create_organization()
49+
case Repo.get_by(Organization, name: organization["name"]) do
50+
nil ->
51+
{:ok, new_org} =
52+
%{
53+
name: organization["name"],
54+
long_name: organization["long_name"],
55+
description: organization["description"]
56+
}
57+
|> Organizations.create_organization()
58+
59+
logo_path = "priv/static/images/#{organization["name"]}.svg"
60+
61+
Atomic.GenerateAvatar.generate_avatar(
62+
organization["name"],
63+
logo_path
64+
)
65+
66+
new_org
67+
|> Organization.logo_changeset(%{
68+
logo: %Plug.Upload{
69+
path: logo_path,
70+
content_type: "image/svg",
71+
filename: "#{organization["name"]}.svg"
72+
}
73+
})
74+
|> Repo.update!()
75+
76+
File.rm(logo_path)
77+
78+
_existing_org ->
79+
IO.puts("Organization '#{organization["name"]}' already exists. Skipping...")
80+
end
5481
end)
5582
end
5683
end

0 commit comments

Comments
 (0)