File size: 2,380 Bytes
21bdc64
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
# ๋ถ„์„ ๊ฒฐ๊ณผ๋ฅผ Supabase ํ”Œ๋žซ ํ…Œ์ด๋ธ”(analysis_run/cluster/demographic)์— ์ ์žฌํ•˜๋Š” ๋ชจ๋“ˆ
import os
from datetime import date
from functools import lru_cache

from supabase import create_client, Client


@lru_cache(maxsize=1)
def _client() -> Client:
    return create_client(os.environ["SUPABASE_URL"], os.environ["SUPABASE_SERVICE_KEY"])


def enabled() -> bool:
    # Supabase ์ž๊ฒฉ์ฆ๋ช…์ด ์žˆ์„ ๋•Œ๋งŒ ์ ์žฌ
    return bool(os.environ.get("SUPABASE_URL") and os.environ.get("SUPABASE_SERVICE_KEY"))


def persist(result: dict) -> None:
    # analyze ๊ฒฐ๊ณผ dict๋ฅผ (keyword, run_date) ๊ธฐ์ค€์œผ๋กœ upsert
    sb = _client()
    kw = result["keyword"]
    day = date.today().isoformat()
    ib = result.get("intent_breakdown") or {}

    sb.table("analysis_run").upsert({
        "keyword": kw, "run_date": day,
        "total_search_volume": result.get("total_search_volume"),
        "keyword_count": result.get("keyword_count"),
        "cluster_count": result.get("cluster_count", 0),
        "intent_info": ib.get("info", 0),
        "intent_transactional": ib.get("transactional", 0),
        "intent_navigational": ib.get("navigational", 0),
        "intent_mixed": ib.get("mixed", 0),
        "marketing_suggestion": result.get("marketing_suggestion"),
    }, on_conflict="keyword,run_date").execute()

    # ์žฌ์ ์žฌ ์‹œ ์ค‘๋ณต ๋ฐฉ์ง€: ๊ฐ™์€ ํ‚ค์›Œ๋“œยท๋‚ ์งœ ํ–‰์„ ์ง€์šฐ๊ณ  ๋‹ค์‹œ ๋„ฃ์Œ
    clusters = result.get("clusters") or []
    sb.table("analysis_cluster").delete().eq("keyword", kw).eq("run_date", day).execute()
    if clusters:
        sb.table("analysis_cluster").insert([{
            "keyword": kw, "run_date": day,
            "theme": c.get("theme"), "rep_keyword": c.get("cluster_label"),
            "intent": c.get("intent"), "total_search_volume": c.get("total_search_volume"),
            "keyword_count": c.get("keyword_count"),
            "top_keywords": ", ".join(c.get("top_keywords", [])),
        } for c in clusters]).execute()

    demo = result.get("demographics")
    sb.table("analysis_demographic").delete().eq("keyword", kw).eq("run_date", day).execute()
    if demo and demo.get("cells"):
        sb.table("analysis_demographic").insert([{
            "keyword": kw, "run_date": day,
            "gender": x.get("gender"), "age": x.get("age"), "pct": x.get("pct"),
        } for x in demo["cells"]]).execute()