192 lines
4.6 KiB
Elixir
192 lines
4.6 KiB
Elixir
defmodule EzcontainerRailway.Railway do
|
|
alias EzcontainerRailway.Projects
|
|
alias EzcontainerRailway.GraphqlClient
|
|
def get_projects(token) do
|
|
resp = GraphqlClient.query(
|
|
"""
|
|
query {
|
|
projects {
|
|
edges {
|
|
node {
|
|
id
|
|
name
|
|
}
|
|
}
|
|
}
|
|
}
|
|
""",
|
|
token: token
|
|
) |> format_response
|
|
|
|
case resp do
|
|
{:error, _} -> resp
|
|
{:ok, data} -> {:ok, data["projects"]["edges"]}
|
|
end
|
|
end
|
|
|
|
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
|
|
serviceInstances {
|
|
edges {
|
|
node {
|
|
upstreamUrl
|
|
domains {
|
|
customDomains {
|
|
domain
|
|
}
|
|
serviceDomains {
|
|
domain
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
""",
|
|
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
|
|
GraphqlClient.query(
|
|
"""
|
|
mutation createService($projectId: String!, $image: String!, $name: String!){
|
|
serviceCreate(input: {projectId: $projectId, name: $name source: { image: $image }}) {
|
|
id
|
|
}
|
|
}
|
|
""",
|
|
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
|
|
end
|
|
|
|
def create_project(token) do
|
|
resp = GraphqlClient.query(
|
|
"""
|
|
mutation {
|
|
projectCreate(input: {}) {
|
|
id
|
|
name
|
|
}
|
|
}
|
|
""",
|
|
token: token
|
|
)
|
|
|> format_response
|
|
|
|
case resp do
|
|
{:error, _} -> resp
|
|
{:ok, data} -> {:ok, data["projectCreate"]["id"]}
|
|
end
|
|
end
|
|
|
|
def delete_container(service_id, token) do
|
|
GraphqlClient.query(
|
|
"""
|
|
mutation deleteContainer($id: String!) {
|
|
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
|
|
|
|
{:ok, resp["me"]["id"]}
|
|
end
|
|
|
|
def has_errors?(resp) do
|
|
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"]}
|
|
else
|
|
{:ok, resp.body["data"]}
|
|
end
|
|
end
|
|
|
|
defp has_errors_in_array?([_|_]), do: true
|
|
defp has_errors_in_array?(_), do: false
|
|
end
|