Skip to content

Commit

Permalink
add redis
Browse files Browse the repository at this point in the history
  • Loading branch information
Ferrariic committed Jan 30, 2023
1 parent c5c479d commit 06ea3e5
Show file tree
Hide file tree
Showing 8 changed files with 84 additions and 8 deletions.
8 changes: 6 additions & 2 deletions .env-example
Original file line number Diff line number Diff line change
@@ -1,2 +1,6 @@
sql_uri =
salt =
sql_uri =
salt =
redis_password =
redis_database=
redis_port=
server_ip=
4 changes: 4 additions & 0 deletions .github/workflows/workflow.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,10 @@ jobs:
run: |
echo "${{ secrets.SQL_URI }}" > .env
echo "${{ secrets.SALT }}" >> .env
echo "${{ secrets.REDIS_PASSWORD }}" >> .env
echo "${{ secrets.REDIS_DATABASE }}" >> .env
echo "${{ secrets.REDIS_PORT }}" >> .env
echo "${{ secrets.SERVER_IP }}" >> .env
deploy:
runs-on: self-hosted
Expand Down
16 changes: 15 additions & 1 deletion api/app.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import api.middleware
from api.config import app
import logging
from api.config import app, redis_client
from api.routers import (
account,
challenge,
Expand All @@ -8,19 +9,32 @@
profile,
trainer,
workout,
images,
)

logger = logging.getLogger(__name__)

app.include_router(account.router)
app.include_router(challenge.router)
app.include_router(profile.router)
app.include_router(trainer.router)
app.include_router(event.router)
app.include_router(dashboard.router)
app.include_router(workout.router)
app.include_router(images.router)


@app.get("/")
async def root():
return {
"message": "Welcome to the Workout with Me API. If you're interested in becoming a developer, please contact [email protected]!"
}


@app.on_event("startup")
async def startup():
# check redis server
if await redis_client.ping():
logger.info("REDIS SERVER CONNECTED!")
else:
logger.fatal("REDIS SERVER IS NOT ACCESSIBLE!")
13 changes: 13 additions & 0 deletions api/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,19 @@

# import logging_loki
from dotenv import find_dotenv, load_dotenv
import aioredis
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware

# load environment variables
load_dotenv(find_dotenv(), verbose=True)
sql_uri = os.environ.get("sql_uri")
salt = os.environ.get("salt")
redis_password = os.environ.get("redis_password")
redis_database = os.environ.get("redis_database")
redis_port = os.environ.get("redis_port")
server_ip = os.environ.get("server_ip")


# create application
app = FastAPI()
Expand All @@ -25,6 +31,13 @@
allow_headers=["*"],
)

redis_client = aioredis.from_url(
url=server_ip,
port=redis_port,
db=redis_database,
password=redis_password,
)

file_handler = logging.FileHandler(filename="logs/error.log", mode="a")
stream_handler = logging.StreamHandler(sys.stdout)

Expand Down
11 changes: 9 additions & 2 deletions api/database/functions.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
from PIL import Image
import PIL
import os
import ast
import glob

from sqlalchemy import Text, text
Expand All @@ -28,11 +29,17 @@ async def hashbrown(password: str):
return hashlib.sha256(string.encode()).hexdigest()


async def generate_token():
token = secrets.token_urlsafe(32)
async def generate_token(n=32):
token = secrets.token_urlsafe(n)
return token


def redis_decode(bytes_encoded) -> list:
if type(bytes_encoded) == list:
return [ast.literal_eval(element.decode("utf-8")) for element in bytes_encoded]
return [ast.literal_eval(bytes_encoded.decode("utf-8"))]


async def parse_sql(
sql, param: dict, has_return: bool, row_count: int, page: int
) -> tuple[Text, bool]:
Expand Down
26 changes: 26 additions & 0 deletions api/routers/images.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import json

from fastapi import APIRouter, HTTPException, status
from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.sql.expression import select, insert, delete
from api.config import redis_client
import api.routers.functions.account as account_functions
import api.routers.models.account as account_models
from api.database.database import USERDATA_ENGINE
from api.database.functions import hashbrown, sqlalchemy_result
from api.database.models import Registration, Tokens, Blocks
from api.routers.functions.general import get_token_user_id
from fastapi.responses import FileResponse
import os
from api.database.functions import redis_decode

router = APIRouter()


@router.get("/v1/image/{image_id}", tags=["images"])
async def get_image(image_id: str) -> json:
"""get image copy"""
image_route = await redis_client.get(image_id)
image_route = redis_decode(bytes_encoded=image_route)
return FileResponse("C:/Users/thear/Documents/GitHub/API/images/8/profile.jpeg")
12 changes: 9 additions & 3 deletions api/routers/profile.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.sql import or_
from sqlalchemy.sql.expression import select
from api.config import redis_client
from api.database.functions import generate_token
from api.routers.functions.general import get_token_user_id, check_user_block

from api.database.database import USERDATA_ENGINE
Expand All @@ -31,15 +33,19 @@
@router.get("/v1/profile/avatar/{user_id}", tags=["profile"])
async def get_profile_picture(user_id: str) -> json:
"Get the profile picture of a user by their ID."
print("test")

print(f"{os.getcwd()}/images/{user_id}/profile.jpeg")
if not os.path.exists(f"{os.getcwd()}/images/{user_id}/profile.jpeg"):
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="This user does not have a profile picture.",
)

return FileResponse(f"{os.getcwd()}/images/{user_id}/profile.jpeg")
print("test")
image_route = f"{os.getcwd()}\images\{user_id}\profile.jpeg"
image_token = await generate_token(16)
print("test")
await redis_client.set(name=image_token, value=image_route, ex=3600)
return HTTPException(status_code=status.HTTP_200_OK, detail=image_token)


@router.post("/v1/profile/avatar/{token}", tags=["profile"])
Expand Down
2 changes: 2 additions & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
aiofiles==0.8.0
aioredis==2.0.1
anyio==3.5.0
APScheduler==3.8.1
asgiref==3.5.0
async-timeout==4.0.2
asyncmy==0.2.3
atomicwrites==1.4.0
attrs==21.4.0
Expand Down

0 comments on commit 06ea3e5

Please sign in to comment.