-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
34611fc
commit 0a0eda5
Showing
7 changed files
with
314 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
-- migrate:up | ||
CREATE TABLE owners ( | ||
id bigint PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY, | ||
resolver public.repo_resolver NOT NULL, | ||
slug public.citext NOT NULL, | ||
name TEXT, | ||
shards_count INT, | ||
created_at timestamp with time zone DEFAULT now() NOT NULL, | ||
updated_at timestamp with time zone DEFAULT now() NOT NULL | ||
); | ||
|
||
CREATE TRIGGER set_timestamp BEFORE UPDATE ON public.owners FOR EACH ROW EXECUTE PROCEDURE public.trigger_set_timestamp(); | ||
|
||
CREATE UNIQUE INDEX owners_resolver_slug_idx ON public.owners USING btree (resolver, slug); | ||
ALTER TABLE owners | ||
ADD CONSTRAINT owners_resolver_slug_uniq UNIQUE USING INDEX owners_resolver_slug_idx; | ||
|
||
ALTER TABLE repos | ||
ADD COLUMN owner_id bigint REFERENCES owners(id); | ||
|
||
-- migrate:down | ||
ALTER TABLE repos DROP COLUMN owner_id; | ||
|
||
DROP TABLE owners; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
require "spec" | ||
require "../src/repo/owner" | ||
|
||
describe Repo::Owner do | ||
describe ".from_repo_ref" do | ||
it "returns nil for git" do | ||
Repo::Owner.from_repo_ref(Repo::Ref.new("git", "foo/bar")).should be_nil | ||
end | ||
|
||
it "creates owner for github" do | ||
Repo::Owner.from_repo_ref(Repo::Ref.new("github", "foo/bar")).should eq Repo::Owner.new("github", "foo") | ||
end | ||
|
||
it "creates owner for gitlab" do | ||
Repo::Owner.from_repo_ref(Repo::Ref.new("gitlab", "foo/bar")).should eq Repo::Owner.new("gitlab", "foo") | ||
end | ||
|
||
it "creates owner for bitbucket" do | ||
Repo::Owner.from_repo_ref(Repo::Ref.new("bitbucket", "foo/bar")).should eq Repo::Owner.new("bitbucket", "foo") | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,62 @@ | ||
require "spec" | ||
require "../support/db" | ||
require "../../src/service/create_owner" | ||
|
||
describe Service::CreateOwner do | ||
describe "#perform" do | ||
it "creates owner" do | ||
transaction do |db| | ||
repo_ref = Repo::Ref.new("github", "foo/bar") | ||
service = Service::CreateOwner.new(db, repo_ref) | ||
db.get_owner?("github", "foo").should be_nil | ||
db.get_owner?(repo_ref).should be_nil | ||
service.perform | ||
db.get_owner?("github", "foo").should eq Repo::Owner.new("github", "foo", shards_count: 0) | ||
db.get_owner?(repo_ref).should be_nil | ||
end | ||
end | ||
|
||
it "assigns owner to repo" do | ||
transaction do |db| | ||
repo_ref = Repo::Ref.new("github", "foo/bar") | ||
db.create_repo(Repo.new(repo_ref, shard_id: nil)) | ||
db.get_owner?(repo_ref).should be_nil | ||
|
||
Service::CreateOwner.new(db, repo_ref).perform | ||
|
||
db.get_owner?(repo_ref).should eq Repo::Owner.new("github", "foo", shards_count: 1) | ||
end | ||
end | ||
|
||
it "picks up existing owner" do | ||
transaction do |db| | ||
repo_ref = Repo::Ref.new("github", "foo/bar") | ||
db.create_repo(Repo.new(repo_ref, shard_id: nil)) | ||
db.create_owner(Repo::Owner.new("github", "foo")) | ||
db.get_owner?(repo_ref).should be_nil | ||
|
||
Service::CreateOwner.new(db, repo_ref).perform | ||
|
||
db.get_owner?(repo_ref).should eq Repo::Owner.new("github", "foo", shards_count: 1) | ||
end | ||
end | ||
|
||
it "sets shards count" do | ||
transaction do |db| | ||
repo_ref = Repo::Ref.new("github", "foo/bar") | ||
db.create_repo(Repo.new(repo_ref, shard_id: nil)) | ||
Service::CreateOwner.new(db, repo_ref).perform | ||
|
||
db.get_owner?(repo_ref).should eq Repo::Owner.new("github", "foo", shards_count: 1) | ||
|
||
repo_ref_baz = Repo::Ref.new("github", "foo/baz") | ||
db.create_repo(Repo.new(repo_ref_baz, shard_id: nil)) | ||
owner = Service::CreateOwner.new(db, repo_ref_baz).perform | ||
owner = owner.not_nil! | ||
|
||
db.get_owned_repos(owner.id).map(&.ref).should eq [repo_ref, repo_ref_baz] | ||
db.get_owner?(repo_ref).should eq Repo::Owner.new("github", "foo", shards_count: 2) | ||
end | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
class Repo::Owner | ||
property resolver : String | ||
property slug : String | ||
property name : String? | ||
property shards_count : Int32? | ||
property! id : Int64 | ||
|
||
def initialize(@resolver : String, @slug : String, @name : String? = nil, @shards_count : Int32? = nil, *, @id : Int64? = nil) | ||
end | ||
|
||
def self.from_repo_ref(repo_ref : Ref) : Owner? | ||
if owner = repo_ref.owner | ||
new(repo_ref.resolver, owner) | ||
end | ||
end | ||
|
||
def_equals_and_hash @resolver, @slug, @name, @shards_count | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
require "../repo/owner" | ||
|
||
struct Service::CreateOwner | ||
def initialize(@db : ShardsDB, @repo_ref : Repo::Ref) | ||
end | ||
|
||
def perform | ||
owner = Repo::Owner.from_repo_ref(@repo_ref) | ||
|
||
return unless owner | ||
|
||
db_owner = @db.get_owner?(owner.resolver, owner.slug) | ||
|
||
if db_owner | ||
# owner already exists in the database | ||
owner = db_owner | ||
else | ||
# owner does not yet exist, need to insert a new entry | ||
owner.id = @db.create_owner(owner) | ||
end | ||
|
||
assign_owner(owner) | ||
|
||
owner | ||
end | ||
|
||
private def assign_owner(owner) | ||
@db.set_owner(@repo_ref, owner.id) | ||
@db.update_owner_shards_count(owner.id) | ||
end | ||
end |