Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
63 commits
Select commit Hold shift + click to select a range
fd51c13
add dashboard sections
zcesur Mar 20, 2025
032c5ea
reorganize
zcesur Mar 20, 2025
177424e
reorganize
zcesur Mar 20, 2025
b454cc7
add preview page
zcesur Mar 20, 2025
73b5abc
feat: implement organization preview functionality
zcesur Mar 20, 2025
cbe9552
feat: add contributor management functionality
zcesur Mar 20, 2025
bb36fdc
feat: add complete signup status to dashboard
zcesur Mar 20, 2025
98d6f29
feat: implement contributor listing functionality
zcesur Mar 20, 2025
0742e73
feat: enhance user dashboard with achievement tracking
zcesur Mar 20, 2025
00792b3
feat: implement login code functionality in dashboard
zcesur Mar 20, 2025
0355c9a
refactor: streamline organization onboarding and handle generation
zcesur Mar 20, 2025
5529520
fix: update user handle and email assignment in dashboard
zcesur Mar 20, 2025
850ba43
fix: update GitHub authorization URL in achievement todo component
zcesur Mar 20, 2025
5544f54
refactor: improve GitHub user registration and update logic
zcesur Mar 20, 2025
e4f3d6c
refactor: improve user update logic for GitHub accounts
zcesur Mar 20, 2025
48f297c
refactor: enhance user login handling in dashboard
zcesur Mar 20, 2025
abf9ce6
refactor: enhance user migration logic and installation handling
zcesur Mar 20, 2025
4bc5512
add todo
zcesur Mar 20, 2025
fded97f
refactor: streamline user account creation and update logic
zcesur Mar 21, 2025
888c502
refactor: filter completed achievements in dashboard
zcesur Mar 21, 2025
2e2c89a
refactor: improve dashboard live view for bounties
zcesur Mar 21, 2025
dc28fec
refactor: enhance dashboard live view functionality
zcesur Mar 21, 2025
87e24aa
refactor: adjust UI spacing and layout in live views
zcesur Mar 21, 2025
9e38bfd
refactor: update button variants and enhance dashboard interactions
zcesur Mar 21, 2025
7eb4681
refactor: update dashboard live view for sharing opportunities
zcesur Mar 21, 2025
37e0afb
refactor: update button styles and icons in dashboard live view
zcesur Mar 21, 2025
08a5da2
refactor: enhance share drawer functionality in dashboard live view
zcesur Mar 21, 2025
1c8e978
add url to tip form
zcesur Mar 21, 2025
525a0be
refactor: update dashboard live view layout and functionality
zcesur Mar 21, 2025
7007637
refactor: remove GitHub integration section from dashboard live view
zcesur Mar 21, 2025
e0937a3
add missing tip url
zcesur Mar 21, 2025
3a08988
feat: add repository form to HomeLive for GitHub URL submission
zcesur Mar 21, 2025
07ab2ba
refactor: remove GitHub identity upsert from seeds file
zcesur Mar 21, 2025
e443c4b
refactor: simplify class assignment in CoreComponents
zcesur Mar 21, 2025
1a796d3
fix failing tests
zcesur Mar 21, 2025
8269459
refactor: simplify error handling in repository form
zcesur Mar 21, 2025
b278472
feat: implement GitHub URL parsing and update form validation
zcesur Mar 21, 2025
49daa75
feat: enhance repository creation logic in HomeLive
zcesur Mar 21, 2025
745c5eb
reorganize
zcesur Mar 21, 2025
eb738c0
remove dbg
zcesur Mar 21, 2025
2c56fc1
remove welcome msg
zcesur Mar 21, 2025
84c7d70
feat: add GitHub connection alert in dashboard
zcesur Mar 21, 2025
a0456e0
add view profile button
zcesur Mar 21, 2025
9bbc618
add remove contributor button
zcesur Mar 21, 2025
7502934
refactor: unify form handling in DashboardLive
zcesur Mar 21, 2025
24788cb
refactor: enhance form handling and share drawer logic in DashboardLive
zcesur Mar 21, 2025
6ed15ed
refactor: update developer card rendering and button styles in Dashbo…
zcesur Mar 21, 2025
2c37c2e
refactor: improve contract button rendering logic in DashboardLive
zcesur Mar 21, 2025
857b708
refactor: enhance contract status handling in Contracts module
zcesur Mar 21, 2025
358eebe
refactor: update button styles for improved visual feedback in Dashbo…
zcesur Mar 21, 2025
141501e
feat: enhance bounty management with visibility and shared_with attri…
zcesur Mar 21, 2025
8ae8be7
refactor: improve tech stack query handling in Bounties module
zcesur Mar 21, 2025
fb64261
refactor: simplify padding in inactive account section of DashboardLive
zcesur Mar 21, 2025
57ceb31
refactor: streamline query options handling in DashboardLive
zcesur Mar 21, 2025
5b00fd4
refactor: update criteria handling in Bounties module
zcesur Mar 21, 2025
3571eeb
fix: migrate contracts in Accounts.migrate_user/1
zcesur Mar 21, 2025
5740509
refactor: enhance user update logic in Accounts module
zcesur Mar 21, 2025
e5b84c3
refactor: simplify padding in DashboardLive sections
zcesur Mar 21, 2025
7b1655b
refactor: remove debug logging in Bounties module
zcesur Mar 21, 2025
7a6c1d9
refactor: enhance user update process in Accounts module
zcesur Mar 21, 2025
0887395
fix failing tests
zcesur Mar 21, 2025
6f90949
refactor: adjust layout spacing in DashboardLive
zcesur Mar 21, 2025
d15b1e5
feat: add follower count calculations in InstallationCallbackController
zcesur Mar 21, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
124 changes: 96 additions & 28 deletions lib/algora/accounts/accounts.ex
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,15 @@ defmodule Algora.Accounts do
alias Algora.Accounts.Identity
alias Algora.Accounts.User
alias Algora.Bounties.Bounty
alias Algora.Contracts.Contract
alias Algora.Github
alias Algora.Organizations
alias Algora.Organizations.Member
alias Algora.Payments.Transaction
alias Algora.Repo
alias Algora.Workspace.Contributor
alias Algora.Workspace.Installation
alias Algora.Workspace.Repository

require Algora.SQL

Expand Down Expand Up @@ -246,7 +250,7 @@ defmodule Algora.Accounts do
@doc """
Registers a user from their GitHub information.
"""
def register_github_user(primary_email, info, emails, token) do
def register_github_user(current_user, primary_email, info, emails, token) do
query =
from(u in User,
left_join: i in Identity,
Expand All @@ -257,10 +261,16 @@ defmodule Algora.Accounts do
select: {u, i}
)

case Repo.one(query) do
account =
case Repo.all(query) do
[] -> nil
[{user, identity}] -> {user, identity}
records -> Enum.find(records, fn {user, _} -> user.id == current_user.id end)
end

case account do
nil -> create_user(info, primary_email, emails, token)
{user, nil} -> update_user(user, info, primary_email, emails, token)
{user, _identity} -> update_github_token(user, token)
{user, identity} -> update_user(user, identity, info, primary_email, emails, token)
end
end

Expand All @@ -274,15 +284,74 @@ defmodule Algora.Accounts do
|> Repo.insert()
end

def update_user(user, info, primary_email, emails, token) do
with {:ok, _} <-
user
|> Identity.github_registration_changeset(info, primary_email, emails, token)
|> Repo.insert() do
user
|> User.github_registration_changeset(info, primary_email, emails, token)
|> Repo.update()
end
def update_user(user, identity, info, primary_email, emails, token) do
old_user = Repo.get_by(User, provider: "github", provider_id: to_string(info["id"]))

identity_changeset = Identity.github_registration_changeset(user, info, primary_email, emails, token)

user_changeset = User.github_registration_changeset(user, info, primary_email, emails, token)

Repo.transact(fn ->
delete_result =
if identity do
Repo.delete(identity)
else
{:ok, nil}
end

migrate_result =
if old_user && old_user.id != user.id do
{:ok, old_user} =
old_user
|> change(provider: nil, provider_id: nil, provider_login: nil, provider_meta: nil)
|> Repo.update()

# TODO: enqueue job
migrate_user(old_user, user)

{:ok, old_user}
else
{:ok, nil}
end

with {:ok, _} <- delete_result,
{:ok, _} <- migrate_result,
{:ok, _} <- Repo.insert(identity_changeset) do
Repo.update(user_changeset)
end
end)
end

def migrate_user(old_user, new_user) do
Repo.update_all(
from(r in Repository, where: r.user_id == ^old_user.id),
set: [user_id: new_user.id]
)

Repo.update_all(
from(c in Contributor, where: c.user_id == ^old_user.id),
set: [user_id: new_user.id]
)

Repo.update_all(
from(c in Contract, where: c.contractor_id == ^old_user.id),
set: [contractor_id: new_user.id]
)

Repo.update_all(
from(i in Installation, where: i.owner_id == ^old_user.id),
set: [owner_id: new_user.id]
)

Repo.update_all(
from(i in Installation, where: i.provider_user_id == ^old_user.id),
set: [provider_user_id: new_user.id]
)

Repo.update_all(
from(i in Installation, where: i.connected_user_id == ^old_user.id),
set: [connected_user_id: new_user.id]
)
end

# def get_user_by_provider_email(provider, email) when provider in [:github] do
Expand Down Expand Up @@ -352,19 +421,6 @@ defmodule Algora.Accounts do
end
end

defp update_github_token(%User{} = user, new_token) do
identity =
Repo.one!(from(i in Identity, where: i.user_id == ^user.id and i.provider == "github"))

{:ok, _} =
identity
|> change()
|> put_change(:provider_token, new_token)
|> Repo.update()

{:ok, Repo.preload(user, :identities, force: true)}
end

def last_context(nil), do: "nil"

def last_context(%User{last_context: nil} = user) do
Expand Down Expand Up @@ -413,8 +469,20 @@ defmodule Algora.Accounts do

def get_last_context_user(%User{} = user) do
case last_context(user) do
"personal" -> user
last_context -> get_user_by_handle(last_context)
"personal" ->
user

"preview/" <> ctx ->
case String.split(ctx, "/") do
[id, _repo_owner, _repo_name] -> get_user(id)
_ -> nil
end

"repo/" <> _repo_full_name ->
user

last_context ->
get_user_by_handle(last_context)
end
end

Expand Down
50 changes: 33 additions & 17 deletions lib/algora/accounts/schemas/user.ex
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@ defmodule Algora.Accounts.User do
params = %{
"handle" => info["login"],
"email" => primary_email,
"display_name" => get_change(identity_changeset, :provider_name),
"display_name" => info["name"],
"bio" => info["bio"],
"location" => info["location"],
"avatar_url" => info["avatar_url"],
Expand Down Expand Up @@ -176,21 +176,33 @@ defmodule Algora.Accounts.User do
Identity.github_registration_changeset(user, info, primary_email, emails, token)

if identity_changeset.valid? do
params = %{
"display_name" => user.display_name || get_change(identity_changeset, :provider_name),
"bio" => user.bio || info["bio"],
"location" => user.location || info["location"],
"avatar_url" => user.avatar_url || info["avatar_url"],
"website_url" => user.website_url || info["blog"],
"github_url" => user.github_url || info["html_url"],
"provider" => "github",
"provider_id" => to_string(info["id"]),
"provider_login" => info["login"],
"provider_meta" => info
}
params =
%{
"handle" => user.handle || Algora.Organizations.ensure_unique_handle(info["login"]),
"email" => user.email || primary_email,
"display_name" => user.display_name || info["name"],
"bio" => user.bio || info["bio"],
"location" => user.location || info["location"],
"avatar_url" => user.avatar_url || info["avatar_url"],
"website_url" => user.website_url || info["blog"],
"github_url" => user.github_url || info["html_url"],
"provider" => "github",
"provider_id" => to_string(info["id"]),
"provider_login" => info["login"],
"provider_meta" => info
}

params =
if is_nil(user.provider_id) do
Map.put(params, "display_name", info["name"])
else
params
end

user
|> cast(params, [
:handle,
:email,
:display_name,
:bio,
:location,
Expand All @@ -203,8 +215,11 @@ defmodule Algora.Accounts.User do
:provider_meta
])
|> generate_id()
|> validate_required([:display_name])
|> validate_required([:email, :display_name, :handle])
|> validate_handle()
|> validate_email()
|> unique_constraint(:email)
|> unique_constraint(:handle)
else
user
|> change()
Expand Down Expand Up @@ -270,7 +285,7 @@ defmodule Algora.Accounts.User do

def validate_handle(changeset) do
reserved_words =
~w(personal org admin support help security team staff official auth tip home dashboard bounties community user payment claims orgs projects jobs leaderboard onboarding pricing developers companies contracts community blog docs open hiring sdk api)
~w(personal org admin support help security team staff official auth tip home dashboard bounties community user payment claims orgs projects jobs leaderboard onboarding pricing developers companies contracts community blog docs open hiring sdk api repo go preview)

changeset
|> validate_format(:handle, ~r/^[a-zA-Z0-9_-]{2,32}$/)
Expand Down Expand Up @@ -320,8 +335,9 @@ defmodule Algora.Accounts.User do
validate_inclusion(changeset, :timezone, Tzdata.zone_list())
end

defp type_from_provider(:github, "Organization"), do: :organization
defp type_from_provider(:github, _), do: :individual
def type_from_provider(:github, "Bot"), do: :bot
def type_from_provider(:github, "Organization"), do: :organization
def type_from_provider(:github, _), do: :individual

def handle(%{handle: handle}) when is_binary(handle), do: handle
def handle(%{provider_login: handle}), do: handle
Expand Down
11 changes: 11 additions & 0 deletions lib/algora/admin/admin.ex
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,17 @@ defmodule Algora.Admin do

require Logger

def alert(message) do
%{
title: "Alert: #{message}",
body: message,
name: "Algora Alert",
email: "info@algora.io"
}
|> Algora.Activities.SendEmail.changeset()
|> Repo.insert()
end

def token!, do: System.fetch_env!("ADMIN_GITHUB_TOKEN")

def run(worker) do
Expand Down
Loading