Skip to content

Commit

Permalink
Migrated to Robyn
Browse files Browse the repository at this point in the history
  • Loading branch information
AmaseCocoa committed Aug 23, 2024
1 parent bdafb4b commit 20bf76a
Show file tree
Hide file tree
Showing 25 changed files with 498 additions and 552 deletions.
6 changes: 5 additions & 1 deletion .config/config_example.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,8 @@ job:
debug:
enable: true
profiling: false
nossl: false
nossl: false

extends:
workers: 4
process: 4
File renamed without changes.
18 changes: 9 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
# HoloBE
Holo (Hol0) backend server.
# Holo
Holo backend server.

Powered by [FastAPI](https://fastapi.tiangolo.com) with [Prisma](https://prisma.io) ([prisma-client-py](https://github.com/RobertCraigie/prisma-client-py))
Powered by [Robyn](https://fastapi.tiangolo.com) with [Prisma](https://prisma.io) ([prisma-client-py](https://github.com/RobertCraigie/prisma-client-py))

## Getting Started
> [!WARNING]
> HoloBE is under development. Therefore, its use in a production environment is deprecated.
> Holo is under development. Therefore, its use in a production environment is deprecated.
By following this guide, you can build an instance of Hol0.

```shell
Expand All @@ -26,7 +26,7 @@ Hol0 is inspired by the following software:
- [ ] ActivityPub (1/8 done)
- [x] webfinger
- [ ] Person
- [ ] Instance Actor
<!-- - [ ] Instance Actor-->
- [ ] Inbox
- [ ] Outbox
- [ ] Post Activity To Remote
Expand All @@ -45,11 +45,11 @@ Hol0 is inspired by the following software:
- [ ] Misskey's summaly proxy support
- [ ] Allow registration to be approved/or invite code-based (from Misskey (and Sharkey))
- [ ] Frontend
- [x] login
- [x] signup
- [x] CloudFlare Turnstile
- [ ] login
- [ ] signup
- [ ] CloudFlare Turnstile
- [ ] password reset
- [x] CloudFlare Turnstile
- [ ] CloudFlare Turnstile
- [ ] Profile
- [ ] Note
- [ ] Render MFM
Expand Down
18 changes: 0 additions & 18 deletions app/utils/response.py

This file was deleted.

698 changes: 287 additions & 411 deletions pdm.lock

Large diffs are not rendered by default.

12 changes: 3 additions & 9 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -6,40 +6,34 @@ authors = [
{name = "AmaseCocoa", email = "[email protected]"},
]
dependencies = [
"fastapi>=0.111.0",
"aiohttp[speedups]>=3.9.5",
"aiofiles>=23.2.1",
"orjson>=3.10.3",
"pycryptodome>=3.20.0",
# "granian>=1.4.1",
"boringavatars>=1.0.3",
"bcrypt>=4.2.0",
"joserfc>=1.0.0",
"uvicorn[standard]>=0.30.0",
"pyfiglet>=1.0.2",
"redis[hiredis]>=5.0.4",
"passlib[bcrypt]>=1.7.4",
"prisma>=0.13.1",
"activitypub-utils>=0.3.1.post1",
"python-aid>=0.2.1",
"omegaconf>=2.3.0",
"scalar-fastapi>=1.0.2",
"colorlog>=6.8.2",
"robyn>=0.58.2",
]
requires-python = ">=3.11"
readme = "README.md"
license = {text = "AGPL-3.0-or-later"}
license = {text = "AGPL-3.0-only"}


[tool.pdm]
distribution = false

[tool.pdm.scripts]
serve = "uvicorn main:app"
serve = "python src/process.py --workers=5 --process=5"
test = "pytest --cov=./ --cov-report=xml"
migrate = "python app/utils/migrate.py"
# "granian:serve" = "granian --interface asgi main:app"
# grapctl

[tool.pdm.dev-dependencies]
pytest = [
Expand Down
File renamed without changes.
4 changes: 2 additions & 2 deletions app/routes/__init__.py → src/app/routes/__init__.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from fastapi import APIRouter
from robyn import SubRouter

from . import activitypub, avatar

router = APIRouter()
router = SubRouter("Holo")
router.include_router(activitypub.router)
router.include_router(avatar.router)
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
from fastapi import APIRouter
from robyn import SubRouter

from . import well_known, nodeinfo, box, actors

router = APIRouter()
router = SubRouter("Holo")
router.include_router(well_known.router)
router.include_router(nodeinfo.router)
router.include_router(box.router)
Expand Down
File renamed without changes.
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
import logging

from prisma.models import User
from fastapi import APIRouter
from fastapi.requests import Request
from fastapi.responses import ORJSONResponse, Response
from robyn import SubRouter, Response, jsonify, Request

from prisma.models import BEConfig

router = APIRouter(include_in_schema=False)
router = SubRouter("Holo")
logger: logging.Logger = None


Expand Down Expand Up @@ -83,7 +82,7 @@ async def users(request: Request, userid: str):
"sensitive": False,
"name": None,
}
return ORJSONResponse(actor, media_type="application/activity+json")
return Response(jsonify(actor), headers={"Content-Type": "application/activity+json"})


"""
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,15 @@

import aiohttp
import aputils
from fastapi import APIRouter, HTTPException, Request
from fastapi.responses import ORJSONResponse, Response
from robyn import SubRouter, Request

from prisma.models import User
from Crypto.PublicKey import RSA

from ...utils import log
from ... import __version__

router = APIRouter(
include_in_schema=False
)
router = SubRouter("Holo")
logger, formatter = log.getLogger(__name__)
handler = logging.FileHandler('./.logs/{:%Y-%m-%d}.log'.format(log.logConfig.time))
handler.setFormatter(formatter)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
import logging

from fastapi import APIRouter, Request
from fastapi.responses import ORJSONResponse, Response
from robyn import SubRouter, Request, jsonify

from prisma.models import BEConfig, User, Note

from ... import __version__

router = APIRouter(prefix="/nodeinfo", include_in_schema=False)
router = SubRouter("Holo", prefix="/nodeinfo")

logger: logging.Logger = None

Expand Down Expand Up @@ -71,7 +70,7 @@ async def v2_1(request: Request):
ni["maintainer"] = {
"name": instance.maintainerName
}
return ORJSONResponse(ni)
return ni


@router.get("/2.0")
Expand Down Expand Up @@ -128,4 +127,4 @@ async def v2(request: Request):
ni["maintainer"] = {
"name": instance.maintainerName
}
return ORJSONResponse(ni)
return ni
Empty file.
Original file line number Diff line number Diff line change
@@ -1,36 +1,33 @@
import logging

from fastapi import APIRouter, Request
from fastapi.responses import ORJSONResponse, Response
from robyn import SubRouter, Response, jsonify


from prisma.models import BEConfig, User
from ...utils.response import XMLResponse
from ...utils.responses import XMLResponse

router = SubRouter("Holo", prefix="/.well-known")

router = APIRouter(
prefix="/.well-known",
include_in_schema=False
)
logger: logging.Logger = None

logger : logging.Logger = None

@router.get("/nodeinfo")
async def nodeinfo(request: Request):

instance = await BEConfig.prisma().find_first(where={"id": "hol0"})
return ORJSONResponse(
{
"links": [
{
"rel": "http://nodeinfo.diaspora.software/ns/schema/2.1",
"href": f"https://{instance.host}/nodeinfo/2.1"
},
{
"rel": "http://nodeinfo.diaspora.software/ns/schema/2.0",
"href": f"https://{instance.host}/nodeinfo/2.0"
}
]
}
)
return {
"links": [
{
"rel": "http://nodeinfo.diaspora.software/ns/schema/2.1",
"href": f"https://{instance.host}/nodeinfo/2.1",
},
{
"rel": "http://nodeinfo.diaspora.software/ns/schema/2.0",
"href": f"https://{instance.host}/nodeinfo/2.0",
},
]
}


@router.get("/webfinger")
async def webfinger(resource: str):
Expand All @@ -45,50 +42,48 @@ async def webfinger(resource: str):
else:
return Response(status_code=400)
user = await User.prisma().find_first(
where={
"normalizedUserName": acct[0].lower(),
"host": None
}
where={"normalizedUserName": acct[0].lower(), "host": None}
)
if user is None:
return Response(status_code=404)
return ORJSONResponse(
{
return {
"subject": f"acct:{acct[0]}@{acct[1]}",
"links": [
{
"links": [
{
"rel": "http://webfinger.net/rel/profile-page",
"type": "text/html",
"href": f"https://{instance.host}/@{user.username}"
},
{
"rel": "self",
"type": "application/activity+json",
"href": f"https://{instance.host}/users/{user.id}"
}
]
}
)
"href": f"https://{instance.host}/@{user.username}",
},
{
"rel": "self",
"type": "application/activity+json",
"href": f"https://{instance.host}/users/{user.id}",
},
],
}


@router.get("/host-meta")
@router.get("/host-meta.json")
async def host_meta(request: Request):
instance = await BEConfig.prisma().find_first(where={"id": "hol0"})
if request.url.path == "/.well-known/host-meta":
hm = f"""<?xml version="1.0"?>
hm = (
f"""<?xml version="1.0"?>
<XRD xmlns="http://docs.oasis-open.org/ns/xri/xrd-1.0">
<Link rel="lrdd" type="application/xrd+xml" template="https://{instance.host}/.well-known/webfinger""" + """?resource={uri}" />
<Link rel="lrdd" type="application/xrd+xml" template="https://{instance.host}/.well-known/webfinger"""
+ """?resource={uri}" />
</XRD>"""
return XMLResponse(content=hm)
)
return XMLResponse(xml_body=hm)
elif request.url.path == "/.well-known/host-meta.json":
return ORJSONResponse(
{
"links": [
{
"rel": "lrdd",
"type": "application/jrd+json",
"template": f"https://{instance.host}/.well-known/webfinger?resource=" + "{uri}"
}
]
}
)
return {
"links": [
{
"rel": "lrdd",
"type": "application/jrd+json",
"template": f"https://{instance.host}/.well-known/webfinger?resource="
+ "{uri}",
}
]
}
10 changes: 6 additions & 4 deletions app/routes/avatar.py → src/app/routes/avatar.py
Original file line number Diff line number Diff line change
@@ -1,17 +1,19 @@
from boringavatars import avatar
from fastapi import APIRouter, Response
from fastapi.responses import RedirectResponse
from robyn import SubRouter, Response
from prisma.models import User

router = APIRouter()
from ..utils.responses import Redirect

router = SubRouter("Holo")


@router.get("/{username}.png")
async def get_avatar(username: str):
user = await User.prisma().find_first(where={"username": username.lower()})
if user is None:
return Response(status_code=404)
else:
return RedirectResponse(user.avatarUrl)
return Redirect(user.avatarUrl)

@router.get("/identicon/{text}/")
async def identicon(text: str):
Expand Down
Loading

0 comments on commit 20bf76a

Please sign in to comment.