diff --git a/docker-compose.yml b/docker-compose.yml index 3cb6c3469d641152bcc76123e7fa7f11bb473d42..43d0a2b14c4884a5bc5ce99baf9ec2c5429a402f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -16,10 +16,6 @@ services: image: "redis:alpine" ports: - "6379:6379" - redis-client: - build: ./redis - depends_on: - - redis sg-backend: build: ./sg-backend command: sh -c "/wait && uvicorn main:app --reload --host 0.0.0.0" diff --git a/redis/Dockerfile b/redis-test/Dockerfile similarity index 100% rename from redis/Dockerfile rename to redis-test/Dockerfile diff --git a/redis-test/client_example.py b/redis-test/client_example.py new file mode 100644 index 0000000000000000000000000000000000000000..82818051f641fadcacf7a99a03850a034f55cc47 --- /dev/null +++ b/redis-test/client_example.py @@ -0,0 +1,6 @@ +import redis + +r = redis.Redis(host='redis-test', port=6379, db=0) +r.set('foo', 'bar') +result = r.get('foo') +print(result) \ No newline at end of file diff --git a/redis/requirements.txt b/redis-test/requirements.txt similarity index 100% rename from redis/requirements.txt rename to redis-test/requirements.txt diff --git a/redis/client_example.py b/redis/client_example.py deleted file mode 100644 index 092bffdb8001bbc5ec2c6146e7d19b31217fa4e6..0000000000000000000000000000000000000000 --- a/redis/client_example.py +++ /dev/null @@ -1,6 +0,0 @@ -import redis - -r = redis.Redis(host='redis', port=6379, db=0) -r.set('foo', 'bar') -result = r.get('foo') -print(result) diff --git a/sg-backend/cache.py b/sg-backend/cache.py new file mode 100644 index 0000000000000000000000000000000000000000..95a0cf009771b2c0a7dd532dbf422c944e428688 --- /dev/null +++ b/sg-backend/cache.py @@ -0,0 +1,15 @@ +from fastapi_cache import FastAPICache +from fastapi_cache.backends.redis import RedisBackend + +from redis import asyncio as aioredis + + +class RedisCache: + def __init__(self): + redis = aioredis.from_url("redis://redis", encoding="utf8", decode_responses=True) + FastAPICache.init(RedisBackend(redis), prefix="fastapi-cache") + + @staticmethod + async def clear_softwares_cache(): + await FastAPICache.clear(key="software") + await FastAPICache.clear(key="software-graph") \ No newline at end of file diff --git a/sg-backend/main.py b/sg-backend/main.py index 8b40e1920f2e7e92dd4228f55bc2b579c4b8e10d..006d15eb447edc226e057c9f745f9fe42a9b43db 100644 --- a/sg-backend/main.py +++ b/sg-backend/main.py @@ -3,9 +3,11 @@ import os import random from fastapi import FastAPI +from fastapi_cache.decorator import cache from pydantic import BaseModel from starlette.middleware.cors import CORSMiddleware +from cache import RedisCache from db import Neo4j @@ -29,40 +31,29 @@ app = FastAPI() origins = [ os.getenv("FRONTEND_URL"), + "http://localhost", + "http://localhost:4173", + "http://localhost:5173", ] app.add_middleware( CORSMiddleware, - allow_origins=['*'], + allow_origins=origins, allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) -@app.get("/") -async def root(): - return {"message": "Hello World"} - - -@app.get("/hello/{name}") -async def say_hello(name: str): - return {"message": f"Hello {name}"} - - -@app.get("/graph") -async def graph(): - results = driver.get_graph_data() - return json.loads(results[0]['data']) - - @app.get("/software") +@cache(expire=60, key_builder=lambda *args, **kwargs: "software") async def software(): results = driver.get_softwares() return {"softwares": json.loads(json.dumps(results))} @app.get("/software-graph") +@cache(expire=60, key_builder=lambda *args, **kwargs: "software-graph") async def software(): nodes = driver.get_nodes() jnodes = json.loads(json.dumps(nodes)) @@ -106,10 +97,27 @@ async def software_search(search: SoftwareSearch): @app.post("/software-insert") async def software_insert(insert_data: SoftwareInsert): res = driver.insert_software(insert_data) + await RedisCache.clear_softwares_cache() return res @app.post("/relation-insert") async def software_insert(insert_data: RelationInsert): res = driver.relation_insert(insert_data) + await RedisCache.clear_softwares_cache() return res + + +@app.get("/") +async def root(): + return {"message": "Hello World"} + + +@app.on_event("startup") +async def startup(): + RedisCache() + +# @app.get("/graph") +# async def graph(): +# results = driver.get_graph_data() +# return json.loads(results[0]['data']) \ No newline at end of file diff --git a/sg-frontend/src/components/RelationInsert.svelte b/sg-frontend/src/components/RelationInsert.svelte index 78e5e6b927d2e10e1b33e2ece980fd1a09c71694..7d0386f95ac05d78dba22e7da7dd285618c402e2 100644 --- a/sg-frontend/src/components/RelationInsert.svelte +++ b/sg-frontend/src/components/RelationInsert.svelte @@ -11,7 +11,7 @@ onMount(async () => { const relationAddButton = document.getElementById("relationAddButton"); - relationAddButton.addEventListener("click", async () => { + relationAddButton.addEventListener("click", async (e) => { const response = await fetch(BACKEND_URL + "/relation-insert", { method: "POST", headers: { @@ -27,6 +27,7 @@ result = await response.json(); node = result.node; } + e.preventDefault(); }); await fetch(BACKEND_URL + "/software") @@ -113,4 +114,4 @@ label { margin: 0 0 10px; } -</style> +</style> \ No newline at end of file diff --git a/sg-frontend/src/components/SoftwareInsert.svelte b/sg-frontend/src/components/SoftwareInsert.svelte index 429da71f89f20face74a964eb8b4260dc99f3dcc..702fc318d9c8038854a6d5720fca4907f8bc4019 100644 --- a/sg-frontend/src/components/SoftwareInsert.svelte +++ b/sg-frontend/src/components/SoftwareInsert.svelte @@ -13,8 +13,9 @@ const softwareName = document.getElementById("softwareName"); const newNodeButton = document.getElementById("newNodeButton"); - newNodeButton.addEventListener("click", () => { + newNodeButton.addEventListener("click", (e) => { postSoftwareInsert(); + e.preventDefault(); }); async function postSoftwareInsert() { @@ -84,4 +85,4 @@ label { margin: 0 0 10px; } -</style> +</style> \ No newline at end of file diff --git a/sg-frontend/src/routes/AddNode.svelte b/sg-frontend/src/routes/AddNode.svelte index 649088b4007cd82495b384997cee1466ba7f2040..e869809e21f7da454c2e149543b3f294485f6246 100644 --- a/sg-frontend/src/routes/AddNode.svelte +++ b/sg-frontend/src/routes/AddNode.svelte @@ -5,17 +5,13 @@ import RelationInsert from "../components/RelationInsert.svelte"; onMount(() => { - fetch("http://localhost:8000/add-node") - .then(response => response.json()) - .then(data => { - // Retrieve some useful DOM elements: - const link = document.getElementById("sigma") as HTMLElement; - const home = document.getElementById("home") as HTMLElement; - const add = document.getElementById("add") as HTMLElement; - add.classList.add("active"); - home.classList.remove("active"); - link.classList.remove("active"); - }) + const link = document.getElementById("sigma") as HTMLElement; + const home = document.getElementById("home") as HTMLElement; + const add = document.getElementById("add") as HTMLElement; + add.classList.add("active"); + home.classList.remove("active"); + link.classList.remove("active"); + }); </script> <div id="app-base">