diff --git a/.gitea/workflows/docker.yml b/.gitea/workflows/docker.yml index 08d7a9c..901b533 100644 --- a/.gitea/workflows/docker.yml +++ b/.gitea/workflows/docker.yml @@ -5,21 +5,33 @@ on: [push] jobs: build_and_publish: runs-on: [ubuntu-latest] - permissions: - contents: read - packages: write steps: - name: Check out repository code uses: actions/checkout@v4 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Docker meta + id: meta + uses: docker/metadata-action@v5 + with: + images: git.i-am.nexus/nex/link-elongater + - name: Log into forgejo CR + if: ${{ github.event_name != 'pull_request' }} uses: docker/login-action@v3 with: registry: git.i-am.nexus username: nex - password: ${{ secrets.CR_TOKEN }} - - name: Build Docker image - run: | - docker build -t git.i-am.nexus/nex/link-elongater:latest . - - name: Push to forgejo CR - run: | - docker push -a git.i-am.nexus/nex/link-elongater + password: ${{ secrets.CR_PASSWORD }} + + - name: Build and push + uses: docker/build-push-action@v5 + with: + context: . + push: ${{ github.event_name != 'pull_request' }} + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + cache-from: type=registry,ref=git.i-am.nexus/nex/link-elongater:master + cache-to: type=inline \ No newline at end of file diff --git a/src/db.py b/src/db.py index 32cd11e..faaa64c 100644 --- a/src/db.py +++ b/src/db.py @@ -7,7 +7,9 @@ from tortoise.contrib.pydantic import pydantic_model_creator class Redirect(Model): uuid = fields.UUIDField(primary_key=True, default=uuid.uuid4) - slug = fields.CharField(max_length=32779, index=False, default=lambda: secrets.token_urlsafe(1024)) + slug = fields.CharField( + max_length=32779, index=False, default=lambda: secrets.token_urlsafe(1024) + ) destination = fields.CharField(max_length=8192) created_at = fields.DatetimeField(auto_now_add=True) expires = fields.DatetimeField(null=True) diff --git a/src/main.py b/src/main.py index 42f74b1..4960941 100644 --- a/src/main.py +++ b/src/main.py @@ -8,7 +8,7 @@ import db import requests from fastapi import FastAPI, Request, HTTPException, status, Form from fastapi.staticfiles import StaticFiles -from fastapi.responses import RedirectResponse +from fastapi.responses import RedirectResponse, JSONResponse from fastapi.templating import Jinja2Templates from contextlib import asynccontextmanager from tortoise.contrib.fastapi import RegisterTortoise @@ -94,11 +94,12 @@ async def list_redirects(): @app.post("/api/create", response_model=db.RedirectPydantic) async def create_redirect( - destination: str = Form(...), - expires: typing.Optional[datetime.datetime] = Form(None), - max_visits: typing.Optional[int] = Form(None), - slug_length: int = Form(2048, gt=0, lte=16389), - slug_type: str = Form("urlsafe", regex="^(urlsafe|hex|words|uuid)$"), + response: JSONResponse, + destination: str = Form(...), + expires: typing.Optional[datetime.datetime] = Form(None), + max_visits: typing.Optional[int] = Form(None), + slug_length: int = Form(2048, gt=0, lte=16389), + slug_type: str = Form("urlsafe", regex="^(urlsafe|hex|words|uuid)$"), ): parsed = urlparse(destination) if not parsed.scheme or not parsed.netloc: @@ -106,6 +107,11 @@ async def create_redirect( elif parsed.scheme not in ["http", "https"]: raise HTTPException(status_code=400, detail="Invalid URL - must be HTTP/HTTPS") + existing = await db.Redirect.get_or_none(destination=destination) + if existing is not None: + response.status_code = 200 + return await db.RedirectPydantic.from_tortoise_orm(existing) + match slug_type: case "urlsafe": slug = secrets.token_urlsafe(slug_length // 2) @@ -130,7 +136,10 @@ async def create_redirect( while await db.Redirect.get_or_none(slug=slug) is not None: slug = secrets.token_urlsafe(slug_length // 2) - redirect = await db.Redirect.create(destination=destination, expires=expires, max_visits=max_visits, slug=slug) + redirect = await db.Redirect.create( + destination=destination, expires=expires, max_visits=max_visits, slug=slug + ) + response.status_code = 201 return await db.RedirectPydantic.from_tortoise_orm(redirect) diff --git a/src/static/index.html b/src/static/index.html index 870ac3f..3818c78 100644 --- a/src/static/index.html +++ b/src/static/index.html @@ -5,6 +5,12 @@ Link Elongater - Create Redirect +

Create redirect

@@ -60,10 +88,11 @@

- +
-
+ +

URL length will total to a lot of characters.