1
0
mirror of https://gitlab.com/2-chainz/2chainz.git synced 2025-06-16 01:46:39 +00:00

finish documenting and fixing the site

This commit is contained in:
Anson 2025-05-23 21:31:52 -06:00
parent 8421d7092f
commit 130a9354cb
2 changed files with 117 additions and 106 deletions

View File

@ -8,7 +8,10 @@ from fastapi import FastAPI
from fastapi.middleware.trustedhost import TrustedHostMiddleware from fastapi.middleware.trustedhost import TrustedHostMiddleware
from fastapi.staticfiles import StaticFiles from fastapi.staticfiles import StaticFiles
app = FastAPI() app = FastAPI(
title="2 Chainz REST",
description="A simple API to get 2 Chainz quotes and aliases. See <a href=https://2chainz.ansonbiggs.com>2chainz.ansonbiggs.com</a> for a full explanation.",
)
app.add_middleware( app.add_middleware(
TrustedHostMiddleware, TrustedHostMiddleware,
allowed_hosts=["*"], allowed_hosts=["*"],
@ -29,21 +32,80 @@ def read_data() -> dict[str, str]:
data = read_data() data = read_data()
@app.get("/api/") @app.get(
async def ping(): "/api/",
summary="Health Check",
description="Check API health status and uptime",
response_description="Health status with timestamp and uptime",
tags=["Health"],
responses={
200: {
"description": "Successful health check",
"content": {
"application/json": {
"example": {
"status": "ok",
"timestamp": "2025-05-24T10:30:00",
"uptime_seconds": "3600.5",
}
}
},
}
},
)
async def ping() -> dict[str, str]:
"""
Endpoint to check on the health of the API and to help diagnose issues.
Returns current status, timestamp, and uptime information.
"""
return { return {
"status": "ok", "status": "ok",
"timestamp": datetime.now().isoformat(), "timestamp": datetime.now().isoformat(),
"uptime_seconds": round(time.time() - start_time, 2), "uptime_seconds": str(round(time.time() - start_time, 2)),
} }
@app.get("/api/quote") @app.get(
"/api/quote",
summary="2 Chainz Quote",
description="Get a quote from 2 Chainz",
tags=["Data"],
responses={
200: {
"description": "Successful quote",
"content": {
"application/json": {
"example": {
"quote": "Wood grain chestnut, titty fuck chest nut",
}
}
},
}
},
)
async def quote(): async def quote():
return {"quote": random.choice(data["quotes"])} return {"quote": random.choice(data["quotes"])}
@app.get("/api/alias") @app.get(
"/api/alias",
summary="2 Chainz Alias",
description="Get one of 2 Chainz many aliases",
tags=["Data"],
responses={
200: {
"description": "Successful alias",
"content": {
"application/json": {
"example": {
"alias": "2 Chainz",
}
}
},
}
},
)
async def alias(): async def alias():
return {"alias": random.choice(data["aliases"])} return {"alias": random.choice(data["aliases"])}

View File

@ -40,106 +40,67 @@
:root { :root {
--color: darkviolet; --color: darkviolet;
--color-bg-secondary: black; --color-bg-secondary: black;
} --color-link: darkviolet;
@media screen and (max-width: 400px) {
#scroll-icon {
display: none;
}
} }
</style> </style>
</head> </head>
<body> <body>
<header style="height: 70vh;"> <header style="height: 90vh">
<nav> <nav>
<ul> <a href="https://2chainz.ansonbiggs.com">2chainz.ansonbiggs.com</a>
<li> <p>A REST API for 2 Chainz Quotes</p>
<a href="https://2chainz.ansonbiggs.com">2chainz.ansonbiggs.com</a> - A REST API for 2 <a href="https://gitlab.com/2-chainz/2chainz">Source Code</a>
Chainz Quotes
</li>
</ul>
</nav> </nav>
<section> <section style="height: 50vh">
<blockquote> <blockquote style="margin: auto">
<span id="quote"></span> <span id="quote">TRUUUUUUUU</span>
<footer><i id="alias">- 2 Chainz</i></footer> <footer><i id="alias">- 2 Chainz</i></footer>
</blockquote> </blockquote>
</section> </section>
<p> <section>
<a onclick="getQuote()" href="#" <a onclick="getQuote()" href="#"
><b> ><b style="width: 20vw">
<ion-icon size="large" name="refresh-circle"></ion-icon><br /> <ion-icon size="large" name="refresh-circle"></ion-icon>
New Quote</b <span style="display: grid; place-items: center">New Quote</span>
></a </b>
> </a>
<a id="tweet" href="#" </section>
><b <a href="#scroll" id="scroll-icon" style="padding-top: 10vh"
><ion-icon size="large" name="logo-twitter"></ion-icon> <br />
Tweet Quote
</b></a
>
</p>
<a href="#scroll" id="scroll-icon" style="padding-top: 10vh;"
><ion-icon size="large" name="arrow-down-sharp"></ion-icon ><ion-icon size="large" name="arrow-down-sharp"></ion-icon
></a> ></a>
</header> </header>
<main> <main>
<hr style="padding-top: 0;" /> <hr style="padding-top: 0" />
<header id="scroll"> <header id="scroll">
<h2>Usage</h2> <h2>Usage</h2>
<p>
For exhaustive and up to date documentation see
<a href="/docs">/docs</a>
</p>
</header> </header>
<details open> <details open>
<summary>Quote</summary> <summary>Quote</summary>
<p> <p>
Returns a random 2 Chainz Quote in <code>json</code> format like the Returns a random 2 Chainz Quote in <code>json</code> format like the
following example: following example:
</p> </p>
<p> <p>
send a <code>get</code> request to send a <code>get</code> request to
<code <code
><a href="https://chainz.ansonbiggs.com/api/quote" ><a href="https://2chainz.ansonbiggs.com/api/quote"
>https://chainz.ansonbiggs.com/api/quote</a >https://2chainz.ansonbiggs.com/api/quote</a
></code ></code
> >
</p> </p>
<pre><code>{ <pre><code>{
"quote": "I got a pocket full of money, it got me walking all slew-foot" "quote": "I got a pocket full of money, it got me walking all slew-foot"
}</code></pre> }</code></pre>
<details style="margin-left: 5%;">
<summary>Parameters</summary>
<p>
This endpoint also supports an optional <code>batch</code> parameter
to get more than one quote per request. Maximum quotes that the
endpoint will return is the amount of quotes in
<a
href="https://gitlab.com/2-chainz/2-chainz-rest/-/blob/master/quote/quotes.py"
>quotes.py</a
>
and is subject to change. An example return from
<code>
<a href="https://chainz.ansonbiggs.com/api/quote?batch=2"
>https://chainz.ansonbiggs.com/api/quote?batch=2</a
></code
>
</p>
<pre><code class="json">{
"quotes": [
"I'm in the kitchen. Yams errrrrwhere.",
"Started from the trap, now I rap"
]
}</code></pre>
</details>
</details> </details>
<details <details>
><summary>Alias</summary> <summary>Alias</summary>
<p> <p>
Returns a random 2 Chainz alias in <code>json</code> format. The Returns a random 2 Chainz alias in <code>json</code> format. The
return values are weighted and a full list can be seen in return values are weighted and a full list can be seen in
@ -151,20 +112,21 @@
<p> <p>
send a <code>get</code> request to send a <code>get</code> request to
<code <code
><a href="https://chainz.ansonbiggs.com/api/alias" ><a href="https://2chainz.ansonbiggs.com/api/alias"
>https://chainz.ansonbiggs.com/api/alias</a >https://2chainz.ansonbiggs.com/api/alias</a
></code ></code
> >
</p> </p>
<pre><code>{ <pre><code>{
"alias": "Dos Cadenas" "alias": "Dos Cadenas"
}</code></pre> }</code></pre>
</details> </details>
<hr /> <hr />
<section> <section>
<header> <header>
<h2> <h2>
Projects built using 2chainz.ansonbiggs.com (Your project could be here!) Projects built using 2chainz.ansonbiggs.com (Your project could be
here!)
</h2> </h2>
</header> </header>
<aside> <aside>
@ -214,7 +176,7 @@
</p> </p>
<p> <p>
<small <small
><a href="https://twitter.com/Anson_3D" ><a href="https://ansonbiggs.com/#connect"
>Please let me know if you use it though!</a >Please let me know if you use it though!</a
></small ></small
> >
@ -224,43 +186,31 @@
<h3>Do I need an API key or is this API rate limited?</h3> <h3>Do I need an API key or is this API rate limited?</h3>
<p> <p>
No, the API is totally free and unlimited. However, its being hosted No, the API is totally free and unlimited. However, its being hosted
by a college student so be nice. on a tiny machine that is overburdened by docker containers.
</p> </p>
</aside> </aside>
<aside> <aside>
<h3>Is this project open source? Can I contribute?</h3> <h3>Is this project open source? Can I contribute?</h3>
<p> <p>
Yes and Yes! Check out the Yes and Yes! Check out the
<a href="https://gitlab.com/2-chainz">Project on GitLab.</a> <a href="https://gitlab.com/2-chainz/2chainz">Project on GitLab.</a>
</p> </p>
</aside> </aside>
<aside> <aside>
<h3>Does 2 Chainz know about this?</h3> <h3>Does 2 Chainz know about this?</h3>
<p> <p>Probably not.</p>
Probably not.
</p>
</aside> </aside>
<aside> <aside>
<h3>Why?</h3> <h3>Why?</h3>
<p> <p>Because 2 Chainz has some of the best lines in the rap game.</p>
Because 2 Chainz has some of the best lines in the rap game.
</p>
</aside> </aside>
</section> </section>
</main> </main>
<footer> <footer>
<hr /> <hr />
<p> <p>Made by <a href="https://ansonbiggs.com">Anson</a></p>
Made by <a href="https://gitlab.com/MisterBiggs">Anson Biggs</a>, <p>Inspired By <a href="https://kanye.rest/">kanye.rest</a>.</p>
<a href="https://twitter.com/Anson_3D">@Anson_3D </a> <p><small>Truuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu</small></p>
</p>
<p>
Inspired By <a href="https://kanye.rest/">kanye.rest</a> which was
created by:
<a href="https://ajzbc.com" target="_blank">Andrew Jazbec</a>,
<a href="https://twitter.com/ajzbc" target="_blank">@ajzbc</a>
</p>
<p><small>Truuuuuuuu</small></p>
</footer> </footer>
<script> <script>
getQuote(); getQuote();
@ -270,13 +220,6 @@
.then((resp) => resp.json()) .then((resp) => resp.json())
.then(function (data) { .then(function (data) {
document.getElementById("quote").innerHTML = data.quote; document.getElementById("quote").innerHTML = data.quote;
const tweet = encodeURIComponent(
`"${data.quote}" -@2chainz via https://2chainz.ansonbiggs.com`
);
document.getElementById(
"tweet"
).href = `https://twitter.com/intent/tweet?text=${tweet}`;
}); });
fetch("/api/alias", { method: "GET" }) fetch("/api/alias", { method: "GET" })
@ -286,7 +229,13 @@
}); });
} }
</script> </script>
<script type="module" src="https://unpkg.com/ionicons@7.1.0/dist/ionicons/ionicons.esm.js"></script> <script
<script nomodule src="https://unpkg.com/ionicons@7.1.0/dist/ionicons/ionicons.js"></script> type="module"
src="https://unpkg.com/ionicons@7.1.0/dist/ionicons/ionicons.esm.js"
></script>
<script
nomodule
src="https://unpkg.com/ionicons@7.1.0/dist/ionicons/ionicons.js"
></script>
</body> </body>
</html> </html>