Skip to content

Commit b61b973

Browse files
committed
feat: update RepoController to check and cache invalid repositories during repository retrieval
1 parent c4ea2df commit b61b973

File tree

3 files changed

+58
-0
lines changed

3 files changed

+58
-0
lines changed
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
defmodule Algora.Workspace.InvalidRepoCache do
2+
@moduledoc false
3+
use Algora.Schema
4+
5+
import Ecto.Changeset
6+
import Ecto.Query
7+
8+
alias Algora.Repo
9+
10+
typed_schema "invalid_repos" do
11+
field :owner, :string
12+
field :name, :string
13+
14+
timestamps()
15+
end
16+
17+
def changeset(invalid_repo, attrs) do
18+
invalid_repo
19+
|> cast(attrs, [:owner, :name])
20+
|> validate_required([:owner, :name])
21+
|> unique_constraint([:owner, :name])
22+
end
23+
24+
def cache_invalid_repo(owner, name) do
25+
%__MODULE__{}
26+
|> changeset(%{owner: owner, name: name})
27+
|> generate_id()
28+
|> Repo.insert()
29+
end
30+
31+
def invalid_repo?(owner, name) do
32+
query =
33+
from r in __MODULE__,
34+
where: r.owner == ^owner and r.name == ^name
35+
36+
Repo.exists?(query)
37+
end
38+
end

lib/algora_web/controllers/repo_controller.ex

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,24 @@ defmodule AlgoraWeb.RepoController do
44
alias Algora.Accounts.User
55
alias Algora.Repo
66
alias Algora.Workspace
7+
alias Algora.Workspace.InvalidRepoCache
78

89
def index(conn, %{"repo_owner" => repo_owner, "repo_name" => repo_name}) do
910
case Repo.get_by(User, provider: "github", provider_login: repo_owner) do
1011
%{handle: handle} when is_binary(handle) ->
1112
redirect(conn, to: ~p"/#{handle}")
1213

1314
_ ->
15+
if InvalidRepoCache.invalid_repo?(repo_owner, repo_name) do
16+
raise AlgoraWeb.NotFoundError
17+
end
18+
1419
case Workspace.ensure_repository(Algora.Admin.token(), repo_owner, repo_name) do
1520
{:ok, _repo} ->
1621
redirect(conn, to: ~p"/go/#{repo_owner}/#{repo_name}")
1722

1823
{:error, _reason} ->
24+
InvalidRepoCache.cache_invalid_repo(repo_owner, repo_name)
1925
raise AlgoraWeb.NotFoundError
2026
end
2127
end
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
defmodule Algora.Repo.Migrations.CreateInvalidRepos do
2+
use Ecto.Migration
3+
4+
def change do
5+
create table(:invalid_repos) do
6+
add :owner, :string, null: false
7+
add :name, :string, null: false
8+
9+
timestamps()
10+
end
11+
12+
create unique_index(:invalid_repos, [:owner, :name])
13+
end
14+
end

0 commit comments

Comments
 (0)