1
0
mirror of https://gitlab.com/2-chainz/2chainz.git synced 2025-06-15 17:36: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.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(
TrustedHostMiddleware,
allowed_hosts=["*"],
@ -29,21 +32,80 @@ def read_data() -> dict[str, str]:
data = read_data()
@app.get("/api/")
async def ping():
@app.get(
"/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 {
"status": "ok",
"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():
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():
return {"alias": random.choice(data["aliases"])}

View File

@ -40,68 +40,56 @@
:root {
--color: darkviolet;
--color-bg-secondary: black;
}
@media screen and (max-width: 400px) {
#scroll-icon {
display: none;
}
--color-link: darkviolet;
}
</style>
</head>
<body>
<header style="height: 70vh;">
<header style="height: 90vh">
<nav>
<ul>
<li>
<a href="https://2chainz.ansonbiggs.com">2chainz.ansonbiggs.com</a> - A REST API for 2
Chainz Quotes
</li>
</ul>
<a href="https://2chainz.ansonbiggs.com">2chainz.ansonbiggs.com</a>
<p>A REST API for 2 Chainz Quotes</p>
<a href="https://gitlab.com/2-chainz/2chainz">Source Code</a>
</nav>
<section>
<blockquote>
<span id="quote"></span>
<section style="height: 50vh">
<blockquote style="margin: auto">
<span id="quote">TRUUUUUUUU</span>
<footer><i id="alias">- 2 Chainz</i></footer>
</blockquote>
</section>
<p>
<section>
<a onclick="getQuote()" href="#"
><b>
<ion-icon size="large" name="refresh-circle"></ion-icon><br />
New Quote</b
></a
>
<a id="tweet" href="#"
><b
><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;"
><b style="width: 20vw">
<ion-icon size="large" name="refresh-circle"></ion-icon>
<span style="display: grid; place-items: center">New Quote</span>
</b>
</a>
</section>
<a href="#scroll" id="scroll-icon" style="padding-top: 10vh"
><ion-icon size="large" name="arrow-down-sharp"></ion-icon
></a>
</header>
<main>
<hr style="padding-top: 0;" />
<hr style="padding-top: 0" />
<header id="scroll">
<h2>Usage</h2>
<p>
For exhaustive and up to date documentation see
<a href="/docs">/docs</a>
</p>
</header>
<details open>
<summary>Quote</summary>
<p>
Returns a random 2 Chainz Quote in <code>json</code> format like the
following example:
</p>
<p>
send a <code>get</code> request to
<code
><a href="https://chainz.ansonbiggs.com/api/quote"
>https://chainz.ansonbiggs.com/api/quote</a
><a href="https://2chainz.ansonbiggs.com/api/quote"
>https://2chainz.ansonbiggs.com/api/quote</a
></code
>
</p>
@ -109,37 +97,10 @@
<pre><code>{
"quote": "I got a pocket full of money, it got me walking all slew-foot"
}</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
><summary>Alias</summary>
<details>
<summary>Alias</summary>
<p>
Returns a random 2 Chainz alias in <code>json</code> format. The
return values are weighted and a full list can be seen in
@ -151,8 +112,8 @@
<p>
send a <code>get</code> request to
<code
><a href="https://chainz.ansonbiggs.com/api/alias"
>https://chainz.ansonbiggs.com/api/alias</a
><a href="https://2chainz.ansonbiggs.com/api/alias"
>https://2chainz.ansonbiggs.com/api/alias</a
></code
>
</p>
@ -164,7 +125,8 @@
<section>
<header>
<h2>
Projects built using 2chainz.ansonbiggs.com (Your project could be here!)
Projects built using 2chainz.ansonbiggs.com (Your project could be
here!)
</h2>
</header>
<aside>
@ -214,7 +176,7 @@
</p>
<p>
<small
><a href="https://twitter.com/Anson_3D"
><a href="https://ansonbiggs.com/#connect"
>Please let me know if you use it though!</a
></small
>
@ -224,43 +186,31 @@
<h3>Do I need an API key or is this API rate limited?</h3>
<p>
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>
</aside>
<aside>
<h3>Is this project open source? Can I contribute?</h3>
<p>
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>
</aside>
<aside>
<h3>Does 2 Chainz know about this?</h3>
<p>
Probably not.
</p>
<p>Probably not.</p>
</aside>
<aside>
<h3>Why?</h3>
<p>
Because 2 Chainz has some of the best lines in the rap game.
</p>
<p>Because 2 Chainz has some of the best lines in the rap game.</p>
</aside>
</section>
</main>
<footer>
<hr />
<p>
Made by <a href="https://gitlab.com/MisterBiggs">Anson Biggs</a>,
<a href="https://twitter.com/Anson_3D">@Anson_3D </a>
</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>
<p>Made by <a href="https://ansonbiggs.com">Anson</a></p>
<p>Inspired By <a href="https://kanye.rest/">kanye.rest</a>.</p>
<p><small>Truuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu</small></p>
</footer>
<script>
getQuote();
@ -270,13 +220,6 @@
.then((resp) => resp.json())
.then(function (data) {
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" })
@ -286,7 +229,13 @@
});
}
</script>
<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>
<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>
</html>