mirror of
https://github.com/philomena-dev/philomena.git
synced 2024-11-27 21:47:59 +01:00
268 lines
6.5 KiB
Elixir
268 lines
6.5 KiB
Elixir
# Script for populating the database. You can run it as:
|
|
#
|
|
# mix run priv/repo/seeds.exs
|
|
#
|
|
# Inside the script, you can read and write to any of your
|
|
# repositories directly:
|
|
#
|
|
# Philomena.Repo.insert!(%Philomena.SomeSchema{})
|
|
#
|
|
# We recommend using the bang functions (`insert!`, `update!`
|
|
# and so on) as they will fail if something goes wrong.
|
|
|
|
defmodule Philomena.DevSeeds do
|
|
alias Philomena.{Repo, Forums.Forum, Users, Users.User}
|
|
alias Philomena.Comments
|
|
alias Philomena.Images
|
|
alias Philomena.Images.Image
|
|
alias Philomena.Topics
|
|
alias Philomena.Posts
|
|
alias Philomena.Tags
|
|
import Ecto.Query
|
|
|
|
def seed() do
|
|
{:ok, _} = Application.ensure_all_started(:plug)
|
|
|
|
# resources =
|
|
# "priv/repo/seeds/seeds_development.json"
|
|
# |> File.read!()
|
|
# |> Jason.decode!()
|
|
|
|
communications =
|
|
"priv/repo/seeds/dev/communications.json"
|
|
|> File.read!()
|
|
|> Jason.decode!()
|
|
|
|
images =
|
|
"priv/repo/seeds/dev/images.json"
|
|
|> File.read!()
|
|
|> Jason.decode!()
|
|
|
|
# pages =
|
|
# "priv/repo/seeds/dev/pages.json"
|
|
# |> File.read!()
|
|
# |> Jason.decode!()
|
|
|
|
users =
|
|
"priv/repo/seeds/dev/users.json"
|
|
|> File.read!()
|
|
|> Jason.decode!()
|
|
|
|
Logger.configure(level: :warning)
|
|
|
|
IO.puts "---- Generating users"
|
|
for user_def <- users do
|
|
{:ok, user} = Users.register_user(user_def)
|
|
|
|
user
|
|
|> Repo.preload([:roles])
|
|
|> User.confirm_changeset()
|
|
|> User.update_changeset(%{role: user_def["role"]}, [])
|
|
|> Repo.update!()
|
|
end
|
|
|
|
users = Repo.all(User)
|
|
pleb = Repo.get_by!(User, name: "Pleb")
|
|
pleb_attrs = request_attrs(pleb)
|
|
|
|
IO.puts "---- Generating images"
|
|
for image_def <- images do
|
|
file = Briefly.create!()
|
|
now = DateTime.utc_now() |> DateTime.to_unix(:microsecond)
|
|
|
|
IO.puts "Fetching #{image_def["url"]} ..."
|
|
{:ok, %{body: body}} = PhilomenaProxy.Http.get(image_def["url"])
|
|
|
|
File.write!(file, body)
|
|
|
|
upload = %Plug.Upload{
|
|
path: file,
|
|
content_type: "application/octet-stream",
|
|
filename: "fixtures-#{now}"
|
|
}
|
|
|
|
IO.puts "Inserting ..."
|
|
|
|
Images.create_image(
|
|
pleb_attrs,
|
|
Map.merge(image_def, %{"image" => upload})
|
|
)
|
|
|> case do
|
|
{:ok, %{image: image}} ->
|
|
Images.approve_image(image)
|
|
Images.reindex_image(image)
|
|
Tags.reindex_tags(image.added_tags)
|
|
|
|
IO.puts "Created image ##{image.id}"
|
|
|
|
{:error, :image, changeset, _so_far} ->
|
|
IO.inspect changeset.errors
|
|
end
|
|
end
|
|
|
|
IO.puts "---- Generating comments for image #1"
|
|
for comment_body <- communications["demos"] do
|
|
image = Images.get_image!(1)
|
|
|
|
Comments.create_comment(
|
|
image,
|
|
pleb_attrs,
|
|
%{"body" => comment_body}
|
|
)
|
|
|> case do
|
|
{:ok, %{comment: comment}} ->
|
|
Comments.approve_comment(comment, pleb)
|
|
Comments.reindex_comment(comment)
|
|
Images.reindex_image(image)
|
|
|
|
{:error, :comment, changeset, _so_far} ->
|
|
IO.inspect changeset.errors
|
|
end
|
|
end
|
|
|
|
all_imgs = Image |> where([i], i.id > 1) |> Repo.all()
|
|
|
|
IO.puts "---- Generating random comments for images other than 1"
|
|
for _ <- 1..1000 do
|
|
image = Enum.random(all_imgs)
|
|
user = random_user(users)
|
|
|
|
Comments.create_comment(
|
|
image,
|
|
request_attrs(user),
|
|
%{"body" => random_body(communications)}
|
|
)
|
|
|> case do
|
|
{:ok, %{comment: comment}} ->
|
|
Comments.approve_comment(comment, user)
|
|
Comments.reindex_comment(comment)
|
|
Images.reindex_image(image)
|
|
|
|
{:error, :comment, changeset, _so_far} ->
|
|
IO.inspect changeset.errors
|
|
end
|
|
end
|
|
|
|
IO.puts "---- Generating forum posts"
|
|
for _ <- 1..500 do
|
|
random_topic_no_replies(communications, users)
|
|
end
|
|
|
|
for _ <- 1..20 do
|
|
random_topic(communications, users)
|
|
end
|
|
|
|
IO.puts "---- Done."
|
|
|
|
Logger.configure(level: :debug)
|
|
end
|
|
|
|
defp default_ip() do
|
|
{:ok, ip} = EctoNetwork.INET.cast({203, 0, 113, 0})
|
|
ip
|
|
end
|
|
|
|
defp available_forums(), do: ["dis", "art", "rp", "meta", "shows"]
|
|
|
|
defp random_forum(), do: Enum.random(available_forums())
|
|
|
|
defp random_user(users), do: Enum.random(users)
|
|
|
|
defp request_attrs(%{id: id} = user) do
|
|
[
|
|
fingerprint: "d015c342859dde3",
|
|
ip: default_ip(),
|
|
user_agent: "Hopefully not IE",
|
|
referrer: "localhost",
|
|
user_id: id,
|
|
user: user
|
|
]
|
|
end
|
|
|
|
defp random_body(%{"random" => random}) do
|
|
count = :rand.uniform(3)
|
|
|
|
(0..count)
|
|
|> Enum.map(fn _ -> Enum.random(random) end)
|
|
|> Enum.join("\n\n")
|
|
end
|
|
|
|
defp random_title(%{"titles" => titles}) do
|
|
Enum.random(titles["first"]) <> " "
|
|
<> Enum.random(titles["second"]) <> " "
|
|
<> Enum.random(titles["third"])
|
|
end
|
|
|
|
defp random_topic(comm, users) do
|
|
forum = Repo.get_by!(Forum, short_name: random_forum())
|
|
op = random_user(users)
|
|
|
|
Topics.create_topic(
|
|
forum,
|
|
request_attrs(op),
|
|
%{
|
|
"title" => random_title(comm),
|
|
"posts" => %{
|
|
"0" => %{
|
|
"body" => random_body(comm),
|
|
}
|
|
}
|
|
}
|
|
)
|
|
|> case do
|
|
{:ok, %{topic: topic}} ->
|
|
IO.puts(" -> created topic ##{topic.id}")
|
|
count = :rand.uniform(250) + 5
|
|
|
|
for _ <- 1..count do
|
|
user = random_user(users)
|
|
|
|
Posts.create_post(
|
|
topic,
|
|
request_attrs(user),
|
|
%{"body" => random_body(comm)}
|
|
)
|
|
|> case do
|
|
{:ok, %{post: post}} ->
|
|
Posts.approve_post(post, op)
|
|
Posts.reindex_post(post)
|
|
|
|
{:error, :post, changeset, _so_far} ->
|
|
IO.inspect changeset.errors
|
|
end
|
|
end
|
|
|
|
IO.puts(" -> created #{count} replies for topic ##{topic.id}")
|
|
|
|
{:error, :topic, changeset, _so_far} ->
|
|
IO.inspect changeset.errors
|
|
end
|
|
end
|
|
|
|
defp random_topic_no_replies(comm, users) do
|
|
forum = Repo.get_by!(Forum, short_name: random_forum())
|
|
op = random_user(users)
|
|
|
|
Topics.create_topic(
|
|
forum,
|
|
request_attrs(op),
|
|
%{
|
|
"title" => random_title(comm),
|
|
"posts" => %{
|
|
"0" => %{
|
|
"body" => random_body(comm),
|
|
}
|
|
}
|
|
}
|
|
)
|
|
|> case do
|
|
{:ok, %{topic: topic}} ->
|
|
IO.puts(" -> created topic ##{topic.id}")
|
|
|
|
{:error, :topic, changeset, _so_far} ->
|
|
IO.inspect changeset.errors
|
|
end
|
|
end
|
|
end
|
|
|
|
Philomena.DevSeeds.seed()
|