From 296964ab996f460b8d35aaaf0197b2b895ede5f4 Mon Sep 17 00:00:00 2001 From: Mawoka Date: Sun, 12 Jun 2022 12:44:21 +0200 Subject: [PATCH] :bug: Improved MeiliSearch startup --- classquiz/__init__.py | 3 ++- classquiz/helpers.py | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/classquiz/__init__.py b/classquiz/__init__.py index 87d04d7..93bb1db 100644 --- a/classquiz/__init__.py +++ b/classquiz/__init__.py @@ -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") diff --git a/classquiz/helpers.py b/classquiz/helpers.py index b740c18..8283dff 100644 --- a/classquiz/helpers.py +++ b/classquiz/helpers.py @@ -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")