ezcontainer_example/lib/ezcontainer_railway/railway.ex

193 lines
4.6 KiB
Elixir
Raw Normal View History

2023-10-25 03:58:10 -04:00
defmodule EzcontainerRailway.Railway do
2023-10-25 23:19:22 -04:00
alias EzcontainerRailway.Projects
2023-10-25 03:58:10 -04:00
alias EzcontainerRailway.GraphqlClient
def get_projects(token) do
resp = GraphqlClient.query(
2023-10-25 03:58:10 -04:00
"""
query {
projects {
edges {
node {
id
2023-10-25 04:48:36 -04:00
name
2023-10-25 03:58:10 -04:00
}
}
}
}
""",
token: token
) |> format_response
case resp do
{:error, _} -> resp
{:ok, data} -> {:ok, data["projects"]["edges"]}
end
2023-10-25 03:58:10 -04:00
end
2023-10-25 04:48:36 -04:00
2023-10-25 23:19:22 -04:00
def get_services(token) do
project_id = Projects.get_project_by_token(token).project_id
resp = GraphqlClient.query(
"""
query getServices($projectId: String!) {
project(id: $projectId) {
services {
edges {
node {
id
name
2023-10-26 00:24:51 -04:00
serviceInstances {
edges {
node {
upstreamUrl
domains {
customDomains {
domain
}
serviceDomains {
domain
}
}
}
}
}
2023-10-25 23:19:22 -04:00
}
}
}
}
}
""",
token: token,
variables: %{
projectId: project_id
}
) |> format_response
case resp do
{:error, _} -> resp
{:ok, data} ->
final =
data["project"]["services"]["edges"]
|> Enum.map(&(&1["node"]))
{:ok, final}
end
end
def create_service(source, type, token) do
resp = case type do
"repo" -> create_service_from_repo(source, token)
"image" -> create_service_from_image(source, token)
end
case resp do
{:error, _} -> resp
{:ok, data} -> {:ok, data["serviceCreate"]}
end
end
defp create_service_from_image(source, token) do
project_id = Projects.get_project_by_token(token).project_id
2023-10-25 04:48:36 -04:00
GraphqlClient.query(
"""
2023-10-25 23:19:22 -04:00
mutation createService($projectId: String!, $image: String!, $name: String!){
serviceCreate(input: {projectId: $projectId, name: $name source: { image: $image }}) {
id
}
}
2023-10-25 04:48:36 -04:00
""",
2023-10-25 23:19:22 -04:00
token: token,
variables: %{
projectId: project_id,
image: source,
name: source
}
) |> format_response
end
defp create_service_from_repo(source, token) do
project_id = Projects.get_project_by_token(token).project_id
GraphqlClient.query(
"""
mutation createService($projectId: String!, $repo: String!, $name: String!){
serviceCreate(input: {projectId: $projectId, name: $name source: { repo: $repo }}) {
id
}
}
""",
token: token,
variables: %{
projectId: project_id,
repo: source,
name: source
}
) |> format_response
2023-10-25 04:48:36 -04:00
end
def create_project(token) do
resp = GraphqlClient.query(
2023-10-25 04:48:36 -04:00
"""
mutation {
projectCreate(input: {}) {
2023-10-25 04:48:36 -04:00
id
name
}
}
""",
token: token
2023-10-25 04:48:36 -04:00
)
|> format_response
case resp do
{:error, _} -> resp
{:ok, data} -> {:ok, data["projectCreate"]["id"]}
end
2023-10-25 04:48:36 -04:00
end
2023-10-26 00:24:51 -04:00
def delete_container(service_id, token) do
2023-10-25 23:19:22 -04:00
GraphqlClient.query(
"""
2023-10-26 00:24:51 -04:00
mutation deleteContainer($id: String!) {
2023-10-25 23:19:22 -04:00
serviceDelete(id: $id)
}
""",
token: token,
variables: %{
id: service_id
}
)
|> format_response
end
def get_user_id(token) do
{:ok, resp} = GraphqlClient.query(
"""
query {
me {
id
}
}
""",
token: token
)
|> format_response
2023-10-25 04:48:36 -04:00
{:ok, resp["me"]["id"]}
2023-10-25 04:48:36 -04:00
end
def has_errors?(resp) do
2023-10-25 04:48:36 -04:00
has_errors_in_array?(resp["errors"])
end
defp format_response(resp) when is_map(resp) do
if has_errors?(resp.body) do
{:error, resp.body["errors"]}
2023-10-25 04:48:36 -04:00
else
{:ok, resp.body["data"]}
2023-10-25 04:48:36 -04:00
end
end
defp has_errors_in_array?([_|_]), do: true
defp has_errors_in_array?(_), do: false
2023-10-25 03:58:10 -04:00
end