summaryrefslogtreecommitdiff
path: root/lib/chessh/schema
diff options
context:
space:
mode:
Diffstat (limited to 'lib/chessh/schema')
-rw-r--r--lib/chessh/schema/key.ex3
-rw-r--r--lib/chessh/schema/node.ex24
-rw-r--r--lib/chessh/schema/player_session.ex34
3 files changed, 59 insertions, 2 deletions
diff --git a/lib/chessh/schema/key.ex b/lib/chessh/schema/key.ex
index 765c83b..adf018d 100644
--- a/lib/chessh/schema/key.ex
+++ b/lib/chessh/schema/key.ex
@@ -16,7 +16,7 @@ defmodule Chessh.Key do
|> cast(update_encode_key(attrs, :key), [:key])
|> cast(attrs, [:name])
|> validate_required([:key, :name])
- |> validate_format(:key, ~r/[\-\w\d]+ [^ ]+$/, message: "invalid ssh key")
+ |> validate_format(:key, ~r/[\-\w\d]+ [^ ]+$/, message: "invalid public ssh key")
|> validate_format(:key, ~r/^(?!ssh-dss).+/, message: "DSA keys are not supported")
end
@@ -41,7 +41,6 @@ defmodule Chessh.Key do
end
# Remove comment at end of key
|> String.replace(~r/ [^ ]+\@[^ ]+$/, "")
- # Remove potential spaces / newline
|> String.trim()
end
end
diff --git a/lib/chessh/schema/node.ex b/lib/chessh/schema/node.ex
new file mode 100644
index 0000000..867a6e2
--- /dev/null
+++ b/lib/chessh/schema/node.ex
@@ -0,0 +1,24 @@
+defmodule Chessh.Node do
+ alias Chessh.Repo
+ import Ecto.Changeset
+ use Ecto.Schema
+
+ @primary_key {:id, :string, []}
+ schema "nodes" do
+ field(:last_start, :utc_datetime)
+ end
+
+ def changeset(node, attrs) do
+ node
+ |> cast(attrs, [:last_start])
+ end
+
+ def boot(node_id) do
+ case Repo.get(Chessh.Node, node_id) do
+ nil -> %Chessh.Node{id: node_id}
+ node -> node
+ end
+ |> Chessh.Node.changeset(%{last_start: DateTime.utc_now()})
+ |> Repo.insert_or_update()
+ end
+end
diff --git a/lib/chessh/schema/player_session.ex b/lib/chessh/schema/player_session.ex
new file mode 100644
index 0000000..84f15ee
--- /dev/null
+++ b/lib/chessh/schema/player_session.ex
@@ -0,0 +1,34 @@
+defmodule Chessh.PlayerSession do
+ alias Chessh.Repo
+ use Ecto.Schema
+ import Ecto.{Query, Changeset}
+
+ schema "player_sessions" do
+ field(:login, :utc_datetime)
+
+ belongs_to(:node, Chessh.Node, type: :string)
+ belongs_to(:player, Chessh.Player)
+ end
+
+ def changeset(player_session, attrs) do
+ player_session
+ |> cast(attrs, [:login])
+ end
+
+ def concurrent_sessions(player) do
+ Repo.aggregate(
+ from(p in Chessh.PlayerSession,
+ where: p.player_id == ^player.id
+ ),
+ :count
+ )
+ end
+
+ def delete_all_on_node(node_id) do
+ Repo.delete_all(
+ from(p in Chessh.PlayerSession,
+ where: p.node_id == ^node_id
+ )
+ )
+ end
+end