this repo has no description

fix up titles and get users supporting bookmarks

Changed files
+95 -56
lib
bookmarker
accounts
bookmarks
bookmarker_web
live
bookmark_live
tag_live
priv
+2 -11
lib/bluesky_hose.ex
··· 132 132 133 133 # Get a demo user for posting bookmarks 134 134 defp get_or_create_demo_user do 135 - case Accounts.get_user_by_username("bluesky_bot") do 136 - nil -> 137 - {:ok, user} = Accounts.create_user(%{ 138 - username: "bluesky_bot", 139 - email: "bluesky_bot@example.com", 140 - display_name: "Bluesky Bot" 141 - }) 142 - user 143 - user -> 144 - user 145 - end 135 + alias Bookmarker.Accounts.DemoUsers 136 + DemoUsers.get_random_demo_user() 146 137 end 147 138 148 139 def handle_disconnect(%{reason: {:local, reason}}, state) do
+75
lib/bookmarker/accounts/demo_users.ex
··· 1 + defmodule Bookmarker.Accounts.DemoUsers do 2 + @moduledoc """ 3 + Module for handling demo user creation and selection. 4 + """ 5 + 6 + alias Bookmarker.Accounts 7 + alias Bookmarker.Accounts.User 8 + alias Bookmarker.Repo 9 + import Ecto.Query 10 + 11 + @demo_user_count 100 12 + @demo_user_prefix "demo_user_" 13 + 14 + @doc """ 15 + Returns a random demo user from the pool of demo users. 16 + If demo users don't exist yet, creates them first. 17 + """ 18 + def get_random_demo_user do 19 + ensure_demo_users_exist() 20 + 21 + User 22 + |> where([u], like(u.username, ^"#{@demo_user_prefix}%")) 23 + |> Repo.all() 24 + |> Enum.random() 25 + end 26 + 27 + @doc """ 28 + Creates all demo users if they don't exist already. 29 + """ 30 + def ensure_demo_users_exist do 31 + # Check if we already have demo users 32 + demo_user_count = 33 + User 34 + |> where([u], like(u.username, ^"#{@demo_user_prefix}%")) 35 + |> Repo.aggregate(:count, :id) 36 + 37 + if demo_user_count < @demo_user_count do 38 + # Create the remaining demo users 39 + Enum.each(demo_user_count..(@demo_user_count - 1), fn index -> 40 + username = "#{@demo_user_prefix}#{index + 1}" 41 + 42 + case Accounts.get_user_by_username(username) do 43 + nil -> 44 + {:ok, _user} = Accounts.create_user(%{ 45 + username: username, 46 + email: "#{username}@example.com", 47 + display_name: generate_display_name(index) 48 + }) 49 + _user -> 50 + :ok 51 + end 52 + end) 53 + end 54 + end 55 + 56 + # Generate a realistic display name 57 + defp generate_display_name(index) do 58 + first_names = [ 59 + "Alex", "Jamie", "Jordan", "Taylor", "Casey", "Riley", "Avery", "Quinn", 60 + "Morgan", "Reese", "Charlie", "Blake", "Parker", "Dakota", "Peyton", "Elliot", 61 + "Rowan", "Cameron", "Sam", "Ashley", "Robin", "Skyler", "Sage", "Jesse" 62 + ] 63 + 64 + last_names = [ 65 + "Smith", "Jones", "Brown", "Johnson", "Williams", "Davis", "Miller", "Wilson", 66 + "Taylor", "Moore", "Anderson", "Thomas", "Jackson", "White", "Harris", "Martin", 67 + "Thompson", "Garcia", "Martinez", "Robinson", "Clark", "Rodriguez", "Lewis", "Lee" 68 + ] 69 + 70 + first_name = Enum.at(first_names, rem(index, length(first_names))) 71 + last_name = Enum.at(last_names, rem(div(index, length(first_names)), length(last_names))) 72 + 73 + "#{first_name} #{last_name}" 74 + end 75 + end
+1 -1
lib/bookmarker/bookmarks/bookmark.ex
··· 21 21 bookmark 22 22 |> cast(attrs, [:url, :title, :description, :user_id]) 23 23 |> validate_required([:url, :title, :user_id]) 24 - |> validate_length(:title, min: 1, max: 255) 24 + |> validate_length(:title, min: 1) 25 25 |> validate_length(:url, min: 5, max: 2048) 26 26 |> foreign_key_constraint(:user_id) 27 27 |> put_assoc(:tags, tags)
+2 -11
lib/bookmarker_web/live/bookmark_live/new.ex
··· 56 56 end 57 57 58 58 defp get_or_create_demo_user do 59 - case Accounts.get_user_by_username("demo_user") do 60 - nil -> 61 - {:ok, user} = Accounts.create_user(%{ 62 - username: "demo_user", 63 - email: "demo@example.com", 64 - display_name: "Demo User" 65 - }) 66 - user 67 - user -> 68 - user 69 - end 59 + alias Bookmarker.Accounts.DemoUsers 60 + DemoUsers.get_random_demo_user() 70 61 end 71 62 end
+2 -11
lib/bookmarker_web/live/bookmark_live/show.ex
··· 66 66 end 67 67 68 68 defp get_or_create_demo_user do 69 - case Accounts.get_user_by_username("demo_user") do 70 - nil -> 71 - {:ok, user} = Accounts.create_user(%{ 72 - username: "demo_user", 73 - email: "demo@example.com", 74 - display_name: "Demo User" 75 - }) 76 - user 77 - user -> 78 - user 79 - end 69 + alias Bookmarker.Accounts.DemoUsers 70 + DemoUsers.get_random_demo_user() 80 71 end 81 72 end
+2 -11
lib/bookmarker_web/live/home_live.ex
··· 151 151 end 152 152 153 153 defp get_or_create_demo_user do 154 - case Accounts.get_user_by_username("demo_user") do 155 - nil -> 156 - {:ok, user} = Accounts.create_user(%{ 157 - username: "demo_user", 158 - email: "demo@example.com", 159 - display_name: "Demo User" 160 - }) 161 - user 162 - user -> 163 - user 164 - end 154 + alias Bookmarker.Accounts.DemoUsers 155 + DemoUsers.get_random_demo_user() 165 156 end 166 157 end
+2 -11
lib/bookmarker_web/live/tag_live/show.ex
··· 74 74 end 75 75 76 76 defp get_or_create_demo_user do 77 - case Accounts.get_user_by_username("demo_user") do 78 - nil -> 79 - {:ok, user} = Accounts.create_user(%{ 80 - username: "demo_user", 81 - email: "demo@example.com", 82 - display_name: "Demo User" 83 - }) 84 - user 85 - user -> 86 - user 87 - end 77 + alias Bookmarker.Accounts.DemoUsers 78 + DemoUsers.get_random_demo_user() 88 79 end 89 80 end
+9
priv/repo/migrations/20250321001052_alter_bookmark_title_to_text.exs
··· 1 + defmodule Bookmarker.Repo.Migrations.AlterBookmarkTitleToText do 2 + use Ecto.Migration 3 + 4 + def change do 5 + alter table(:bookmarks) do 6 + modify :title, :text, null: false 7 + end 8 + end 9 + end