Added graphql playground
This commit is contained in:
parent
80475c547e
commit
f2c1b863e5
|
@ -3,6 +3,7 @@ POSTGRES_PASSWORD=
|
|||
|
||||
URL=
|
||||
|
||||
BACKEND_GRAPHQL_PLAYGROUND=0
|
||||
BACKEND_JWT_SECRET=
|
||||
BACKEND_SMTP_HELO=
|
||||
BACKEND_SMTP_ADDRESS=
|
||||
|
|
|
@ -59,6 +59,7 @@ services:
|
|||
- redis
|
||||
environment:
|
||||
URL: ${URL}
|
||||
BACKEND_GRAPHQL_PLAYGROUND: ${BACKEND_GRAPHQL_PLAYGROUND}
|
||||
BACKEND_DATABASE_URL: postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_USER}
|
||||
BACKEND_JWT_SECRET: ${BACKEND_JWT_SECRET}
|
||||
BACKEND_WORKER_REDIS_URL: redis://redis:6379
|
||||
|
|
|
@ -24,6 +24,10 @@ shards:
|
|||
git: https://github.com/crystal-lang/crystal-db.git
|
||||
version: 0.10.1
|
||||
|
||||
duktape:
|
||||
git: https://github.com/jessedoyle/duktape.cr.git
|
||||
version: 1.0.0
|
||||
|
||||
email:
|
||||
git: https://github.com/arcage/crystal-email.git
|
||||
version: 0.6.3
|
||||
|
@ -48,6 +52,10 @@ shards:
|
|||
git: https://github.com/luckyframework/habitat.git
|
||||
version: 0.4.7
|
||||
|
||||
html-minifier:
|
||||
git: https://github.com/sam0x17/html-minifier.git
|
||||
version: 0.1.0+git.commit.3913bbf8845ddb2030cbd799f7aa8a40a014c7d2
|
||||
|
||||
jwt:
|
||||
git: https://github.com/crystal-community/jwt.git
|
||||
version: 1.6.0
|
||||
|
|
|
@ -51,3 +51,5 @@ dependencies:
|
|||
github: arcage/crystal-email
|
||||
router:
|
||||
github: tbrand/router.cr
|
||||
html-minifier:
|
||||
github: sam0x17/html-minifier
|
||||
|
|
3
docker/backend/src/backend/api/macros/minify_html.cr
Normal file
3
docker/backend/src/backend/api/macros/minify_html.cr
Normal file
|
@ -0,0 +1,3 @@
|
|||
require "html-minifier"
|
||||
|
||||
puts HtmlMinifier.minify!(ARGV[0])
|
697
docker/backend/src/backend/api/playground.html
Normal file
697
docker/backend/src/backend/api/playground.html
Normal file
|
@ -0,0 +1,697 @@
|
|||
<!-- https://github.com/graphql/graphql-playground/blob/main/packages/graphql-playground-html/withAnimation.html -->
|
||||
|
||||
<!DOCTYPE html>
|
||||
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta
|
||||
name="viewport"
|
||||
content="user-scalable=no, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, minimal-ui"
|
||||
/>
|
||||
<title>GraphQL Playground</title>
|
||||
<link
|
||||
rel="stylesheet"
|
||||
href="//cdn.jsdelivr.net/npm/graphql-playground-react/build/static/css/index.css"
|
||||
/>
|
||||
<link
|
||||
rel="shortcut icon"
|
||||
href="//cdn.jsdelivr.net/npm/graphql-playground-react/build/favicon.png"
|
||||
/>
|
||||
<script src="//cdn.jsdelivr.net/npm/graphql-playground-react/build/static/js/middleware.js"></script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<style type="text/css">
|
||||
html {
|
||||
font-family: "Open Sans", sans-serif;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
body {
|
||||
margin: 0;
|
||||
background: #172a3a;
|
||||
}
|
||||
|
||||
.playgroundIn {
|
||||
-webkit-animation: playgroundIn 0.5s ease-out forwards;
|
||||
animation: playgroundIn 0.5s ease-out forwards;
|
||||
}
|
||||
|
||||
@-webkit-keyframes playgroundIn {
|
||||
from {
|
||||
opacity: 0;
|
||||
-webkit-transform: translateY(10px);
|
||||
-ms-transform: translateY(10px);
|
||||
transform: translateY(10px);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
-webkit-transform: translateY(0);
|
||||
-ms-transform: translateY(0);
|
||||
transform: translateY(0);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes playgroundIn {
|
||||
from {
|
||||
opacity: 0;
|
||||
-webkit-transform: translateY(10px);
|
||||
-ms-transform: translateY(10px);
|
||||
transform: translateY(10px);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
-webkit-transform: translateY(0);
|
||||
-ms-transform: translateY(0);
|
||||
transform: translateY(0);
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
<style type="text/css">
|
||||
.fadeOut {
|
||||
-webkit-animation: fadeOut 0.5s ease-out forwards;
|
||||
animation: fadeOut 0.5s ease-out forwards;
|
||||
}
|
||||
|
||||
@-webkit-keyframes fadeIn {
|
||||
from {
|
||||
opacity: 0;
|
||||
-webkit-transform: translateY(-10px);
|
||||
-ms-transform: translateY(-10px);
|
||||
transform: translateY(-10px);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
-webkit-transform: translateY(0);
|
||||
-ms-transform: translateY(0);
|
||||
transform: translateY(0);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes fadeIn {
|
||||
from {
|
||||
opacity: 0;
|
||||
-webkit-transform: translateY(-10px);
|
||||
-ms-transform: translateY(-10px);
|
||||
transform: translateY(-10px);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
-webkit-transform: translateY(0);
|
||||
-ms-transform: translateY(0);
|
||||
transform: translateY(0);
|
||||
}
|
||||
}
|
||||
|
||||
@-webkit-keyframes fadeOut {
|
||||
from {
|
||||
opacity: 1;
|
||||
-webkit-transform: translateY(0);
|
||||
-ms-transform: translateY(0);
|
||||
transform: translateY(0);
|
||||
}
|
||||
to {
|
||||
opacity: 0;
|
||||
-webkit-transform: translateY(-10px);
|
||||
-ms-transform: translateY(-10px);
|
||||
transform: translateY(-10px);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes fadeOut {
|
||||
from {
|
||||
opacity: 1;
|
||||
-webkit-transform: translateY(0);
|
||||
-ms-transform: translateY(0);
|
||||
transform: translateY(0);
|
||||
}
|
||||
to {
|
||||
opacity: 0;
|
||||
-webkit-transform: translateY(-10px);
|
||||
-ms-transform: translateY(-10px);
|
||||
transform: translateY(-10px);
|
||||
}
|
||||
}
|
||||
|
||||
@-webkit-keyframes appearIn {
|
||||
from {
|
||||
opacity: 0;
|
||||
-webkit-transform: translateY(0px);
|
||||
-ms-transform: translateY(0px);
|
||||
transform: translateY(0px);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
-webkit-transform: translateY(0);
|
||||
-ms-transform: translateY(0);
|
||||
transform: translateY(0);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes appearIn {
|
||||
from {
|
||||
opacity: 0;
|
||||
-webkit-transform: translateY(0px);
|
||||
-ms-transform: translateY(0px);
|
||||
transform: translateY(0px);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
-webkit-transform: translateY(0);
|
||||
-ms-transform: translateY(0);
|
||||
transform: translateY(0);
|
||||
}
|
||||
}
|
||||
|
||||
@-webkit-keyframes scaleIn {
|
||||
from {
|
||||
-webkit-transform: scale(0);
|
||||
-ms-transform: scale(0);
|
||||
transform: scale(0);
|
||||
}
|
||||
to {
|
||||
-webkit-transform: scale(1);
|
||||
-ms-transform: scale(1);
|
||||
transform: scale(1);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes scaleIn {
|
||||
from {
|
||||
-webkit-transform: scale(0);
|
||||
-ms-transform: scale(0);
|
||||
transform: scale(0);
|
||||
}
|
||||
to {
|
||||
-webkit-transform: scale(1);
|
||||
-ms-transform: scale(1);
|
||||
transform: scale(1);
|
||||
}
|
||||
}
|
||||
|
||||
@-webkit-keyframes innerDrawIn {
|
||||
0% {
|
||||
stroke-dashoffset: 70;
|
||||
}
|
||||
50% {
|
||||
stroke-dashoffset: 140;
|
||||
}
|
||||
100% {
|
||||
stroke-dashoffset: 210;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes innerDrawIn {
|
||||
0% {
|
||||
stroke-dashoffset: 70;
|
||||
}
|
||||
50% {
|
||||
stroke-dashoffset: 140;
|
||||
}
|
||||
100% {
|
||||
stroke-dashoffset: 210;
|
||||
}
|
||||
}
|
||||
|
||||
@-webkit-keyframes outerDrawIn {
|
||||
0% {
|
||||
stroke-dashoffset: 76;
|
||||
}
|
||||
100% {
|
||||
stroke-dashoffset: 152;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes outerDrawIn {
|
||||
0% {
|
||||
stroke-dashoffset: 76;
|
||||
}
|
||||
100% {
|
||||
stroke-dashoffset: 152;
|
||||
}
|
||||
}
|
||||
|
||||
.hHWjkv {
|
||||
-webkit-transform-origin: 0px 0px;
|
||||
-ms-transform-origin: 0px 0px;
|
||||
transform-origin: 0px 0px;
|
||||
-webkit-transform: scale(0);
|
||||
-ms-transform: scale(0);
|
||||
transform: scale(0);
|
||||
-webkit-animation: scaleIn 0.25s linear forwards 0.2222222222222222s;
|
||||
animation: scaleIn 0.25s linear forwards 0.2222222222222222s;
|
||||
}
|
||||
|
||||
.gCDOzd {
|
||||
-webkit-transform-origin: 0px 0px;
|
||||
-ms-transform-origin: 0px 0px;
|
||||
transform-origin: 0px 0px;
|
||||
-webkit-transform: scale(0);
|
||||
-ms-transform: scale(0);
|
||||
transform: scale(0);
|
||||
-webkit-animation: scaleIn 0.25s linear forwards 0.4222222222222222s;
|
||||
animation: scaleIn 0.25s linear forwards 0.4222222222222222s;
|
||||
}
|
||||
|
||||
.hmCcxi {
|
||||
-webkit-transform-origin: 0px 0px;
|
||||
-ms-transform-origin: 0px 0px;
|
||||
transform-origin: 0px 0px;
|
||||
-webkit-transform: scale(0);
|
||||
-ms-transform: scale(0);
|
||||
transform: scale(0);
|
||||
-webkit-animation: scaleIn 0.25s linear forwards 0.6222222222222222s;
|
||||
animation: scaleIn 0.25s linear forwards 0.6222222222222222s;
|
||||
}
|
||||
|
||||
.eHamQi {
|
||||
-webkit-transform-origin: 0px 0px;
|
||||
-ms-transform-origin: 0px 0px;
|
||||
transform-origin: 0px 0px;
|
||||
-webkit-transform: scale(0);
|
||||
-ms-transform: scale(0);
|
||||
transform: scale(0);
|
||||
-webkit-animation: scaleIn 0.25s linear forwards 0.8222222222222223s;
|
||||
animation: scaleIn 0.25s linear forwards 0.8222222222222223s;
|
||||
}
|
||||
|
||||
.byhgGu {
|
||||
-webkit-transform-origin: 0px 0px;
|
||||
-ms-transform-origin: 0px 0px;
|
||||
transform-origin: 0px 0px;
|
||||
-webkit-transform: scale(0);
|
||||
-ms-transform: scale(0);
|
||||
transform: scale(0);
|
||||
-webkit-animation: scaleIn 0.25s linear forwards 1.0222222222222221s;
|
||||
animation: scaleIn 0.25s linear forwards 1.0222222222222221s;
|
||||
}
|
||||
|
||||
.llAKP {
|
||||
-webkit-transform-origin: 0px 0px;
|
||||
-ms-transform-origin: 0px 0px;
|
||||
transform-origin: 0px 0px;
|
||||
-webkit-transform: scale(0);
|
||||
-ms-transform: scale(0);
|
||||
transform: scale(0);
|
||||
-webkit-animation: scaleIn 0.25s linear forwards 1.2222222222222223s;
|
||||
animation: scaleIn 0.25s linear forwards 1.2222222222222223s;
|
||||
}
|
||||
|
||||
.bglIGM {
|
||||
-webkit-transform-origin: 64px 28px;
|
||||
-ms-transform-origin: 64px 28px;
|
||||
transform-origin: 64px 28px;
|
||||
-webkit-transform: scale(0);
|
||||
-ms-transform: scale(0);
|
||||
transform: scale(0);
|
||||
-webkit-animation: scaleIn 0.25s linear forwards 0.2222222222222222s;
|
||||
animation: scaleIn 0.25s linear forwards 0.2222222222222222s;
|
||||
}
|
||||
|
||||
.ksxRII {
|
||||
-webkit-transform-origin: 95.98500061035156px 46.510000228881836px;
|
||||
-ms-transform-origin: 95.98500061035156px 46.510000228881836px;
|
||||
transform-origin: 95.98500061035156px 46.510000228881836px;
|
||||
-webkit-transform: scale(0);
|
||||
-ms-transform: scale(0);
|
||||
transform: scale(0);
|
||||
-webkit-animation: scaleIn 0.25s linear forwards 0.4222222222222222s;
|
||||
animation: scaleIn 0.25s linear forwards 0.4222222222222222s;
|
||||
}
|
||||
|
||||
.cWrBmb {
|
||||
-webkit-transform-origin: 95.97162628173828px 83.4900016784668px;
|
||||
-ms-transform-origin: 95.97162628173828px 83.4900016784668px;
|
||||
transform-origin: 95.97162628173828px 83.4900016784668px;
|
||||
-webkit-transform: scale(0);
|
||||
-ms-transform: scale(0);
|
||||
transform: scale(0);
|
||||
-webkit-animation: scaleIn 0.25s linear forwards 0.6222222222222222s;
|
||||
animation: scaleIn 0.25s linear forwards 0.6222222222222222s;
|
||||
}
|
||||
|
||||
.Wnusb {
|
||||
-webkit-transform-origin: 64px 101.97999572753906px;
|
||||
-ms-transform-origin: 64px 101.97999572753906px;
|
||||
transform-origin: 64px 101.97999572753906px;
|
||||
-webkit-transform: scale(0);
|
||||
-ms-transform: scale(0);
|
||||
transform: scale(0);
|
||||
-webkit-animation: scaleIn 0.25s linear forwards 0.8222222222222223s;
|
||||
animation: scaleIn 0.25s linear forwards 0.8222222222222223s;
|
||||
}
|
||||
|
||||
.bfPqf {
|
||||
-webkit-transform-origin: 32.03982162475586px 83.4900016784668px;
|
||||
-ms-transform-origin: 32.03982162475586px 83.4900016784668px;
|
||||
transform-origin: 32.03982162475586px 83.4900016784668px;
|
||||
-webkit-transform: scale(0);
|
||||
-ms-transform: scale(0);
|
||||
transform: scale(0);
|
||||
-webkit-animation: scaleIn 0.25s linear forwards 1.0222222222222221s;
|
||||
animation: scaleIn 0.25s linear forwards 1.0222222222222221s;
|
||||
}
|
||||
|
||||
.edRCTN {
|
||||
-webkit-transform-origin: 32.033552169799805px 46.510000228881836px;
|
||||
-ms-transform-origin: 32.033552169799805px 46.510000228881836px;
|
||||
transform-origin: 32.033552169799805px 46.510000228881836px;
|
||||
-webkit-transform: scale(0);
|
||||
-ms-transform: scale(0);
|
||||
transform: scale(0);
|
||||
-webkit-animation: scaleIn 0.25s linear forwards 1.2222222222222223s;
|
||||
animation: scaleIn 0.25s linear forwards 1.2222222222222223s;
|
||||
}
|
||||
|
||||
.iEGVWn {
|
||||
opacity: 0;
|
||||
stroke-dasharray: 76;
|
||||
-webkit-animation: outerDrawIn 0.5s ease-out forwards
|
||||
0.3333333333333333s,
|
||||
appearIn 0.1s ease-out forwards 0.3333333333333333s;
|
||||
animation: outerDrawIn 0.5s ease-out forwards 0.3333333333333333s,
|
||||
appearIn 0.1s ease-out forwards 0.3333333333333333s;
|
||||
-webkit-animation-iteration-count: 1, 1;
|
||||
animation-iteration-count: 1, 1;
|
||||
}
|
||||
|
||||
.bsocdx {
|
||||
opacity: 0;
|
||||
stroke-dasharray: 76;
|
||||
-webkit-animation: outerDrawIn 0.5s ease-out forwards
|
||||
0.5333333333333333s,
|
||||
appearIn 0.1s ease-out forwards 0.5333333333333333s;
|
||||
animation: outerDrawIn 0.5s ease-out forwards 0.5333333333333333s,
|
||||
appearIn 0.1s ease-out forwards 0.5333333333333333s;
|
||||
-webkit-animation-iteration-count: 1, 1;
|
||||
animation-iteration-count: 1, 1;
|
||||
}
|
||||
|
||||
.jAZXmP {
|
||||
opacity: 0;
|
||||
stroke-dasharray: 76;
|
||||
-webkit-animation: outerDrawIn 0.5s ease-out forwards
|
||||
0.7333333333333334s,
|
||||
appearIn 0.1s ease-out forwards 0.7333333333333334s;
|
||||
animation: outerDrawIn 0.5s ease-out forwards 0.7333333333333334s,
|
||||
appearIn 0.1s ease-out forwards 0.7333333333333334s;
|
||||
-webkit-animation-iteration-count: 1, 1;
|
||||
animation-iteration-count: 1, 1;
|
||||
}
|
||||
|
||||
.hSeArx {
|
||||
opacity: 0;
|
||||
stroke-dasharray: 76;
|
||||
-webkit-animation: outerDrawIn 0.5s ease-out forwards
|
||||
0.9333333333333333s,
|
||||
appearIn 0.1s ease-out forwards 0.9333333333333333s;
|
||||
animation: outerDrawIn 0.5s ease-out forwards 0.9333333333333333s,
|
||||
appearIn 0.1s ease-out forwards 0.9333333333333333s;
|
||||
-webkit-animation-iteration-count: 1, 1;
|
||||
animation-iteration-count: 1, 1;
|
||||
}
|
||||
|
||||
.bVgqGk {
|
||||
opacity: 0;
|
||||
stroke-dasharray: 76;
|
||||
-webkit-animation: outerDrawIn 0.5s ease-out forwards
|
||||
1.1333333333333333s,
|
||||
appearIn 0.1s ease-out forwards 1.1333333333333333s;
|
||||
animation: outerDrawIn 0.5s ease-out forwards 1.1333333333333333s,
|
||||
appearIn 0.1s ease-out forwards 1.1333333333333333s;
|
||||
-webkit-animation-iteration-count: 1, 1;
|
||||
animation-iteration-count: 1, 1;
|
||||
}
|
||||
|
||||
.hEFqBt {
|
||||
opacity: 0;
|
||||
stroke-dasharray: 76;
|
||||
-webkit-animation: outerDrawIn 0.5s ease-out forwards
|
||||
1.3333333333333333s,
|
||||
appearIn 0.1s ease-out forwards 1.3333333333333333s;
|
||||
animation: outerDrawIn 0.5s ease-out forwards 1.3333333333333333s,
|
||||
appearIn 0.1s ease-out forwards 1.3333333333333333s;
|
||||
-webkit-animation-iteration-count: 1, 1;
|
||||
animation-iteration-count: 1, 1;
|
||||
}
|
||||
|
||||
.dzEKCM {
|
||||
opacity: 0;
|
||||
stroke-dasharray: 70;
|
||||
-webkit-animation: innerDrawIn 1s ease-in-out forwards
|
||||
1.3666666666666667s,
|
||||
appearIn 0.1s linear forwards 1.3666666666666667s;
|
||||
animation: innerDrawIn 1s ease-in-out forwards 1.3666666666666667s,
|
||||
appearIn 0.1s linear forwards 1.3666666666666667s;
|
||||
-webkit-animation-iteration-count: infinite, 1;
|
||||
animation-iteration-count: infinite, 1;
|
||||
}
|
||||
|
||||
.DYnPx {
|
||||
opacity: 0;
|
||||
stroke-dasharray: 70;
|
||||
-webkit-animation: innerDrawIn 1s ease-in-out forwards
|
||||
1.5333333333333332s,
|
||||
appearIn 0.1s linear forwards 1.5333333333333332s;
|
||||
animation: innerDrawIn 1s ease-in-out forwards 1.5333333333333332s,
|
||||
appearIn 0.1s linear forwards 1.5333333333333332s;
|
||||
-webkit-animation-iteration-count: infinite, 1;
|
||||
animation-iteration-count: infinite, 1;
|
||||
}
|
||||
|
||||
.hjPEAQ {
|
||||
opacity: 0;
|
||||
stroke-dasharray: 70;
|
||||
-webkit-animation: innerDrawIn 1s ease-in-out forwards
|
||||
1.7000000000000002s,
|
||||
appearIn 0.1s linear forwards 1.7000000000000002s;
|
||||
animation: innerDrawIn 1s ease-in-out forwards 1.7000000000000002s,
|
||||
appearIn 0.1s linear forwards 1.7000000000000002s;
|
||||
-webkit-animation-iteration-count: infinite, 1;
|
||||
animation-iteration-count: infinite, 1;
|
||||
}
|
||||
|
||||
#loading-wrapper {
|
||||
position: absolute;
|
||||
width: 100vw;
|
||||
height: 100vh;
|
||||
display: -webkit-box;
|
||||
display: -webkit-flex;
|
||||
display: -ms-flexbox;
|
||||
display: flex;
|
||||
-webkit-align-items: center;
|
||||
-webkit-box-align: center;
|
||||
-ms-flex-align: center;
|
||||
align-items: center;
|
||||
-webkit-box-pack: center;
|
||||
-webkit-justify-content: center;
|
||||
-ms-flex-pack: center;
|
||||
justify-content: center;
|
||||
-webkit-flex-direction: column;
|
||||
-ms-flex-direction: column;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.logo {
|
||||
width: 75px;
|
||||
height: 75px;
|
||||
margin-bottom: 20px;
|
||||
opacity: 0;
|
||||
-webkit-animation: fadeIn 0.5s ease-out forwards;
|
||||
animation: fadeIn 0.5s ease-out forwards;
|
||||
}
|
||||
|
||||
.text {
|
||||
font-size: 32px;
|
||||
font-weight: 200;
|
||||
text-align: center;
|
||||
color: rgba(255, 255, 255, 0.6);
|
||||
opacity: 0;
|
||||
-webkit-animation: fadeIn 0.5s ease-out forwards;
|
||||
animation: fadeIn 0.5s ease-out forwards;
|
||||
}
|
||||
|
||||
.dGfHfc {
|
||||
font-weight: 400;
|
||||
}
|
||||
</style>
|
||||
<div id="loading-wrapper">
|
||||
<svg
|
||||
class="logo"
|
||||
viewBox="0 0 128 128"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
>
|
||||
<title>GraphQL Playground Logo</title>
|
||||
<defs>
|
||||
<linearGradient
|
||||
id="linearGradient-1"
|
||||
x1="4.86%"
|
||||
x2="96.21%"
|
||||
y1="0%"
|
||||
y2="99.66%"
|
||||
>
|
||||
<stop stop-color="#E00082" stop-opacity=".8" offset="0%"></stop>
|
||||
<stop stop-color="#E00082" offset="100%"></stop>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<g>
|
||||
<rect
|
||||
id="Gradient"
|
||||
width="127.96"
|
||||
height="127.96"
|
||||
y="1"
|
||||
fill="url(#linearGradient-1)"
|
||||
rx="4"
|
||||
></rect>
|
||||
<path
|
||||
id="Border"
|
||||
fill="#E00082"
|
||||
fill-rule="nonzero"
|
||||
d="M4.7 2.84c-1.58 0-2.86 1.28-2.86 2.85v116.57c0 1.57 1.28 2.84 2.85 2.84h116.57c1.57 0 2.84-1.26 2.84-2.83V5.67c0-1.55-1.26-2.83-2.83-2.83H4.67zM4.7 0h116.58c3.14 0 5.68 2.55 5.68 5.7v116.58c0 3.14-2.54 5.68-5.68 5.68H4.68c-3.13 0-5.68-2.54-5.68-5.68V5.68C-1 2.56 1.55 0 4.7 0z"
|
||||
></path>
|
||||
<path
|
||||
class="bglIGM"
|
||||
x="64"
|
||||
y="28"
|
||||
fill="#fff"
|
||||
d="M64 36c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8"
|
||||
style="transform: translate(100px, 100px)"
|
||||
></path>
|
||||
<path
|
||||
class="ksxRII"
|
||||
x="95.98500061035156"
|
||||
y="46.510000228881836"
|
||||
fill="#fff"
|
||||
d="M89.04 50.52c-2.2-3.84-.9-8.73 2.94-10.96 3.83-2.2 8.72-.9 10.95 2.94 2.2 3.84.9 8.73-2.94 10.96-3.85 2.2-8.76.9-10.97-2.94"
|
||||
style="transform: translate(100px, 100px)"
|
||||
></path>
|
||||
<path
|
||||
class="cWrBmb"
|
||||
x="95.97162628173828"
|
||||
y="83.4900016784668"
|
||||
fill="#fff"
|
||||
d="M102.9 87.5c-2.2 3.84-7.1 5.15-10.94 2.94-3.84-2.2-5.14-7.12-2.94-10.96 2.2-3.84 7.12-5.15 10.95-2.94 3.86 2.23 5.16 7.12 2.94 10.96"
|
||||
style="transform: translate(100px, 100px)"
|
||||
></path>
|
||||
<path
|
||||
class="Wnusb"
|
||||
x="64"
|
||||
y="101.97999572753906"
|
||||
fill="#fff"
|
||||
d="M64 110c-4.43 0-8-3.6-8-8.02 0-4.44 3.57-8.02 8-8.02s8 3.58 8 8.02c0 4.4-3.57 8.02-8 8.02"
|
||||
style="transform: translate(100px, 100px)"
|
||||
></path>
|
||||
<path
|
||||
class="bfPqf"
|
||||
x="32.03982162475586"
|
||||
y="83.4900016784668"
|
||||
fill="#fff"
|
||||
d="M25.1 87.5c-2.2-3.84-.9-8.73 2.93-10.96 3.83-2.2 8.72-.9 10.95 2.94 2.2 3.84.9 8.73-2.94 10.96-3.85 2.2-8.74.9-10.95-2.94"
|
||||
style="transform: translate(100px, 100px)"
|
||||
></path>
|
||||
<path
|
||||
class="edRCTN"
|
||||
x="32.033552169799805"
|
||||
y="46.510000228881836"
|
||||
fill="#fff"
|
||||
d="M38.96 50.52c-2.2 3.84-7.12 5.15-10.95 2.94-3.82-2.2-5.12-7.12-2.92-10.96 2.2-3.84 7.12-5.15 10.95-2.94 3.83 2.23 5.14 7.12 2.94 10.96"
|
||||
style="transform: translate(100px, 100px)"
|
||||
></path>
|
||||
<path
|
||||
class="iEGVWn"
|
||||
stroke="#fff"
|
||||
stroke-width="4"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
d="M63.55 27.5l32.9 19-32.9-19z"
|
||||
></path>
|
||||
<path
|
||||
class="bsocdx"
|
||||
stroke="#fff"
|
||||
stroke-width="4"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
d="M96 46v38-38z"
|
||||
></path>
|
||||
<path
|
||||
class="jAZXmP"
|
||||
stroke="#fff"
|
||||
stroke-width="4"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
d="M96.45 84.5l-32.9 19 32.9-19z"
|
||||
></path>
|
||||
<path
|
||||
class="hSeArx"
|
||||
stroke="#fff"
|
||||
stroke-width="4"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
d="M64.45 103.5l-32.9-19 32.9 19z"
|
||||
></path>
|
||||
<path
|
||||
class="bVgqGk"
|
||||
stroke="#fff"
|
||||
stroke-width="4"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
d="M32 84V46v38z"
|
||||
></path>
|
||||
<path
|
||||
class="hEFqBt"
|
||||
stroke="#fff"
|
||||
stroke-width="4"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
d="M31.55 46.5l32.9-19-32.9 19z"
|
||||
></path>
|
||||
<path
|
||||
class="dzEKCM"
|
||||
id="Triangle-Bottom"
|
||||
stroke="#fff"
|
||||
stroke-width="4"
|
||||
d="M30 84h70"
|
||||
stroke-linecap="round"
|
||||
></path>
|
||||
<path
|
||||
class="DYnPx"
|
||||
id="Triangle-Left"
|
||||
stroke="#fff"
|
||||
stroke-width="4"
|
||||
d="M65 26L30 87"
|
||||
stroke-linecap="round"
|
||||
></path>
|
||||
<path
|
||||
class="hjPEAQ"
|
||||
id="Triangle-Right"
|
||||
stroke="#fff"
|
||||
stroke-width="4"
|
||||
d="M98 87L63 26"
|
||||
stroke-linecap="round"
|
||||
></path>
|
||||
</g>
|
||||
</svg>
|
||||
<div class="text">
|
||||
Loading
|
||||
<span class="dGfHfc">GraphQL Playground</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="root" />
|
||||
<script type="text/javascript">
|
||||
window.addEventListener("load", function (event) {
|
||||
const loadingWrapper = document.getElementById("loading-wrapper");
|
||||
loadingWrapper.classList.add("fadeOut");
|
||||
|
||||
const root = document.getElementById("root");
|
||||
root.classList.add("playgroundIn");
|
||||
|
||||
GraphQLPlayground.init(root, {
|
||||
// you can add more options here
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
|
@ -7,12 +7,27 @@ module Backend
|
|||
class WebServer
|
||||
include Router
|
||||
|
||||
GRAPHQL_PLAYGROUND = {{ run("./macros/minify_html.cr", read_file("#{__DIR__}/playground.html")).stringify }}
|
||||
GRAPHQL_PLAYGROUND_ENABLE = SAFE_ENV["BACKEND_GRAPHQL_PLAYGROUND"].to_i == 1 || {{ flag?(:development) }}
|
||||
|
||||
def draw_routes : Nil
|
||||
# enable graphql playground when in development mode or explicitly enabled
|
||||
if GRAPHQL_PLAYGROUND_ENABLE
|
||||
Log.info { "GraphQL playground enabled" }
|
||||
|
||||
get "/" do |context|
|
||||
context.response.content_type = "text/html"
|
||||
context.response.print(GRAPHQL_PLAYGROUND)
|
||||
|
||||
context
|
||||
end
|
||||
end
|
||||
|
||||
post "/" do |context|
|
||||
context.response.content_type = "application/json"
|
||||
|
||||
data = GraphQLQueryData.from_json(context.request.body.not_nil!.gets.not_nil!)
|
||||
context.response.puts(
|
||||
context.response.print(
|
||||
Schema::SCHEMA.execute(
|
||||
data.query,
|
||||
data.variables,
|
||||
|
|
|
@ -3,6 +3,7 @@ require "senf"
|
|||
module Backend
|
||||
SAFE_ENV = Senf::SafeEnv.new(%w(
|
||||
URL
|
||||
BACKEND_GRAPHQL_PLAYGROUND
|
||||
BACKEND_DATABASE_URL
|
||||
BACKEND_ADMIN_EMAIL
|
||||
BACKEND_ADMIN_PASSWORD
|
||||
|
|
Loading…
Reference in a new issue