File size: 2,443 Bytes
214f910
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
from __future__ import annotations

import sqlite3
from pathlib import Path
from typing import Any

from .models import EvaluationResult, ItineraryPlan, UserRequest


BASE_DIR = Path(__file__).parent.parent
DB_PATH = BASE_DIR / "qiddiya.db"


def get_connection() -> sqlite3.Connection:
    conn = sqlite3.connect(DB_PATH)
    conn.row_factory = sqlite3.Row
    return conn


def init_db() -> None:
    conn = get_connection()
    cur = conn.cursor()
    cur.execute(
        """

        CREATE TABLE IF NOT EXISTS plans (

            id INTEGER PRIMARY KEY AUTOINCREMENT,

            created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,

            visit_date TEXT NOT NULL,

            request_json TEXT NOT NULL,

            plan_json TEXT NOT NULL

        );

        """
    )
    cur.execute(
        """

        CREATE TABLE IF NOT EXISTS evaluations (

            id INTEGER PRIMARY KEY AUTOINCREMENT,

            created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,

            visit_date TEXT NOT NULL,

            request_json TEXT NOT NULL,

            plan_json TEXT NOT NULL,

            evaluation_json TEXT NOT NULL

        );

        """
    )
    conn.commit()
    conn.close()


def _to_json(obj: Any) -> str:
    import json

    if hasattr(obj, "model_dump"):
        return json.dumps(obj.model_dump())
    if isinstance(obj, dict):
        return json.dumps(obj)
    raise TypeError("Object is not serializable")


def save_plan_result(request: UserRequest, plan: ItineraryPlan) -> None:
    conn = get_connection()
    cur = conn.cursor()
    cur.execute(
        """

        INSERT INTO plans (visit_date, request_json, plan_json)

        VALUES (?, ?, ?);

        """,
        (
            plan.visit_date,
            _to_json(request),
            _to_json(plan),
        ),
    )
    conn.commit()
    conn.close()


def save_evaluation_result(

    request: UserRequest, plan: ItineraryPlan, evaluation: EvaluationResult

) -> None:
    conn = get_connection()
    cur = conn.cursor()
    cur.execute(
        """

        INSERT INTO evaluations (visit_date, request_json, plan_json, evaluation_json)

        VALUES (?, ?, ?, ?);

        """,
        (
            plan.visit_date,
            _to_json(request),
            _to_json(plan),
            _to_json(evaluation),
        ),
    )
    conn.commit()
    conn.close()