|
@@ -1,16 +1,19 @@
|
|
import json
|
|
import json
|
|
import os
|
|
import os
|
|
from typing import TypeVar, Generic
|
|
from typing import TypeVar, Generic
|
|
-from urllib.parse import urljoin
|
|
|
|
|
|
+from urllib.parse import urljoin, parse_qs
|
|
|
|
|
|
import requests
|
|
import requests
|
|
from fastapi import APIRouter, Response
|
|
from fastapi import APIRouter, Response
|
|
from pydantic import BaseModel
|
|
from pydantic import BaseModel
|
|
|
|
|
|
|
|
+from mwmbl.tinysearchengine.indexer import TinyIndex, Document
|
|
from mwmbl.tokenizer import tokenize
|
|
from mwmbl.tokenizer import tokenize
|
|
|
|
|
|
|
|
+
|
|
LEMMY_URL = os.environ["LEMMY_URL"]
|
|
LEMMY_URL = os.environ["LEMMY_URL"]
|
|
RESULT_URL = "https://mwmbl.org/?q="
|
|
RESULT_URL = "https://mwmbl.org/?q="
|
|
|
|
+MAX_CURATED_SCORE = 1_111_111.0
|
|
|
|
|
|
|
|
|
|
class Register(BaseModel):
|
|
class Register(BaseModel):
|
|
@@ -62,10 +65,12 @@ T = TypeVar('T', CurateAdd, CurateDelete, CurateMove, CurateValidate)
|
|
class Curation(BaseModel, Generic[T]):
|
|
class Curation(BaseModel, Generic[T]):
|
|
auth: str
|
|
auth: str
|
|
curation_id: int
|
|
curation_id: int
|
|
|
|
+ url: str
|
|
|
|
+ results: list[Result]
|
|
curation: T
|
|
curation: T
|
|
|
|
|
|
|
|
|
|
-def create_router() -> APIRouter:
|
|
|
|
|
|
+def create_router(index_path: str) -> APIRouter:
|
|
router = APIRouter(prefix="/user", tags=["user"])
|
|
router = APIRouter(prefix="/user", tags=["user"])
|
|
|
|
|
|
community_id = get_community_id()
|
|
community_id = get_community_id()
|
|
@@ -114,22 +119,25 @@ def create_router() -> APIRouter:
|
|
|
|
|
|
@router.post("/curation/move")
|
|
@router.post("/curation/move")
|
|
def user_move_result(curate_move: Curation[CurateMove]):
|
|
def user_move_result(curate_move: Curation[CurateMove]):
|
|
- return _create_comment("curate_move", curate_move)
|
|
|
|
|
|
+ return _curate("curate_move", curate_move)
|
|
|
|
|
|
@router.post("/curation/delete")
|
|
@router.post("/curation/delete")
|
|
def user_delete_result(curate_delete: Curation[CurateDelete]):
|
|
def user_delete_result(curate_delete: Curation[CurateDelete]):
|
|
- return _create_comment("curate_delete", curate_delete)
|
|
|
|
|
|
+ return _curate("curate_delete", curate_delete)
|
|
|
|
|
|
@router.post("/curation/add")
|
|
@router.post("/curation/add")
|
|
def user_add_result(curate_add: Curation[CurateAdd]):
|
|
def user_add_result(curate_add: Curation[CurateAdd]):
|
|
- return _create_comment("curate_add", curate_add)
|
|
|
|
|
|
+ return _curate("curate_add", curate_add)
|
|
|
|
|
|
@router.post("/curation/validate")
|
|
@router.post("/curation/validate")
|
|
def user_add_result(curate_validate: Curation[CurateValidate]):
|
|
def user_add_result(curate_validate: Curation[CurateValidate]):
|
|
- return _create_comment("curate_validate", curate_validate)
|
|
|
|
|
|
+ return _curate("curate_validate", curate_validate)
|
|
|
|
|
|
- def _create_comment(curation_type: str, curation: Curation):
|
|
|
|
- content = json.dumps({curation_type: curation.curation.dict()}, indent=2)
|
|
|
|
|
|
+ def _curate(curation_type: str, curation: Curation):
|
|
|
|
+ content = json.dumps({
|
|
|
|
+ "curation_type": curation_type,
|
|
|
|
+ "curation": curation.curation.dict(),
|
|
|
|
+ }, indent=2)
|
|
create_comment = {
|
|
create_comment = {
|
|
"auth": curation.auth,
|
|
"auth": curation.auth,
|
|
"content": json.dumps(content, indent=2),
|
|
"content": json.dumps(content, indent=2),
|
|
@@ -139,6 +147,32 @@ def create_router() -> APIRouter:
|
|
"post_id": curation.curation_id,
|
|
"post_id": curation.curation_id,
|
|
}
|
|
}
|
|
request = requests.post(urljoin(LEMMY_URL, "api/v3/comment"), json=create_comment)
|
|
request = requests.post(urljoin(LEMMY_URL, "api/v3/comment"), json=create_comment)
|
|
|
|
+
|
|
|
|
+ with TinyIndex(Document, index_path, 'w') as indexer:
|
|
|
|
+ documents = [
|
|
|
|
+ Document(result.title, result.url, result.extract, MAX_CURATED_SCORE - i)
|
|
|
|
+ for i, result in enumerate(curation.results)
|
|
|
|
+ ]
|
|
|
|
+
|
|
|
|
+ query_string = parse_qs(curation.url)
|
|
|
|
+ if len(query_string) > 1:
|
|
|
|
+ raise ValueError(f"Should be one query string in the URL: {curation.url}")
|
|
|
|
+
|
|
|
|
+ queries = next(iter(query_string.values()))
|
|
|
|
+ if len(queries) > 1:
|
|
|
|
+ raise ValueError(f"Should be one query value in the URL: {curation.url}")
|
|
|
|
+
|
|
|
|
+ query = queries[0]
|
|
|
|
+ print("Query", query)
|
|
|
|
+ tokens = tokenize(query)
|
|
|
|
+ print("Tokens", tokens)
|
|
|
|
+ key = " ".join(tokens)
|
|
|
|
+ print("Key", key)
|
|
|
|
+ page_index = indexer.get_key_page_index(key)
|
|
|
|
+ print("Page index", page_index)
|
|
|
|
+ print("Storing documents", documents)
|
|
|
|
+ indexer.store_in_page(page_index, documents)
|
|
|
|
+
|
|
return Response(content=request.content, status_code=request.status_code, media_type="text/json")
|
|
return Response(content=request.content, status_code=request.status_code, media_type="text/json")
|
|
|
|
|
|
return router
|
|
return router
|