🐛 Improved MeiliSearch startup
This commit is contained in:
@@ -8,6 +8,7 @@ from classquiz.config import settings, meilisearch
|
||||
from classquiz.db import database
|
||||
from classquiz.routers import users, quiz, utils, stats, storage, search, testing_routes
|
||||
from classquiz.socket_server import sio
|
||||
from classquiz.helpers import meilisearch_init
|
||||
|
||||
settings = settings()
|
||||
if settings.sentry_dsn:
|
||||
@@ -33,7 +34,7 @@ async def startup() -> None:
|
||||
database_ = app.state.database
|
||||
if not database_.is_connected:
|
||||
await database_.connect()
|
||||
meilisearch.index(settings.meilisearch_index).update_settings({"sortableAttributes": ["created_at"]})
|
||||
await meilisearch_init()
|
||||
|
||||
|
||||
@app.on_event("shutdown")
|
||||
|
||||
@@ -1,8 +1,13 @@
|
||||
import asyncio
|
||||
|
||||
from classquiz.db.models import Quiz, User
|
||||
import xlsxwriter
|
||||
from aiohttp import ClientSession
|
||||
from io import BytesIO
|
||||
from PIL import Image
|
||||
from classquiz.config import meilisearch, settings
|
||||
|
||||
settings = settings()
|
||||
|
||||
|
||||
async def get_meili_data(quiz: Quiz) -> dict:
|
||||
@@ -69,3 +74,31 @@ async def generate_spreadsheet(quiz_results: dict, quiz: Quiz) -> BytesIO:
|
||||
workbook.close()
|
||||
storage.seek(0)
|
||||
return storage
|
||||
|
||||
|
||||
async def meilisearch_init():
|
||||
indexes = meilisearch.get_indexes()
|
||||
classquiz_index_found = False
|
||||
# +++ Check if the index does not exist and creates it
|
||||
for index in indexes:
|
||||
if index.uid == settings.meilisearch_index:
|
||||
classquiz_index_found = True
|
||||
if not classquiz_index_found:
|
||||
print("Creating MeiliSearch Index")
|
||||
meilisearch.create_index(settings.meilisearch_index)
|
||||
await asyncio.sleep(1)
|
||||
# --- END
|
||||
# +++ Check if count of docs in meilisearch is equal the count in the database +++
|
||||
quiz_count = await Quiz.objects.filter(public=True).count()
|
||||
if meilisearch.index(settings.meilisearch_index).get_stats()["numberOfDocuments"] != quiz_count:
|
||||
print("MeiliSearch and Database got out of sync, syncthing them")
|
||||
meilisearch.delete_index(settings.meilisearch_index)
|
||||
meilisearch.create_index(settings.meilisearch_index)
|
||||
quizzes = await Quiz.objects.filter(public=True).all()
|
||||
meili_data = []
|
||||
for quiz in quizzes:
|
||||
meili_data.append(await get_meili_data(quiz))
|
||||
meilisearch.index(settings.meilisearch_index).add_documents(meili_data)
|
||||
# --- END ---
|
||||
meilisearch.index(settings.meilisearch_index).update_settings({"sortableAttributes": ["created_at"]})
|
||||
print("Finished MeiliSearch synchronisation")
|
||||
|
||||
Reference in New Issue
Block a user