Skip to content

Commit 5601aad

Browse files
committed
structure refactoring
1 parent 1fa322f commit 5601aad

File tree

8 files changed

+479
-207
lines changed

8 files changed

+479
-207
lines changed

base_logger.py

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import logging
2+
import os
3+
4+
5+
logger = logging
6+
if os.getenv("DEBUG") == "1":
7+
logging.basicConfig(
8+
level=logging.DEBUG,
9+
format='%(levelname)s %(asctime)s -> %(message)s',
10+
11+
datefmt='%Y-%m-%dT%H:%M:%S')
12+
else:
13+
logging.basicConfig(
14+
level=logging.INFO,
15+
format='%(levelname)s %(asctime)s -> %(message)s',
16+
datefmt='%Y-%m-%dT%H:%M:%S')

db/__init__.py

Whitespace-only changes.

db/crud.py

+84
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
import json
2+
import logging
3+
from sqlalchemy.orm import Session
4+
from sqlalchemy import exc
5+
6+
from db.models import I18nDict, GenericDict
7+
from typing import Dict, List, Optional
8+
from api_config import game_name_id_map, ACCEPTED_LANGUAGES, LANGUAGE_PAIRS
9+
10+
11+
def get_game_id_by_name(this_game_name: str) -> Optional[int]:
12+
return game_name_id_map.get(this_game_name)
13+
14+
15+
def get_lang_column(lang: str):
16+
"""
17+
Map from short-code to I18nDict property.
18+
"""
19+
mapper = {
20+
"chs": I18nDict.chs_text,
21+
"cht": I18nDict.cht_text,
22+
"de": I18nDict.de_text,
23+
"en": I18nDict.en_text,
24+
"es": I18nDict.es_text,
25+
"fr": I18nDict.fr_text,
26+
"id": I18nDict.id_text,
27+
"jp": I18nDict.jp_text,
28+
"kr": I18nDict.kr_text,
29+
"pt": I18nDict.pt_text,
30+
"ru": I18nDict.ru_text,
31+
"th": I18nDict.th_text,
32+
"vi": I18nDict.vi_text,
33+
}
34+
return mapper.get(lang)
35+
36+
37+
def clear_game_data(db: Session, game_id: int):
38+
""" Delete old data from i18n_dict & generic_dict for a given game_id. """
39+
db.query(I18nDict).filter(I18nDict.game_id == game_id).delete()
40+
db.query(GenericDict).filter(GenericDict.game_id == game_id).delete()
41+
db.commit()
42+
43+
44+
def insert_localization_data(
45+
db: Session,
46+
game_id: int,
47+
localization_dict: Dict[str, Dict[str, str]]
48+
):
49+
"""
50+
Insert data into i18n_dict & generic_dict.
51+
localization_dict = { item_id: { 'en': 'some text', 'chs': '中文', ...}, ... }
52+
"""
53+
for item_id, translation in localization_dict.items():
54+
i18n_entry = I18nDict(
55+
game_id=game_id,
56+
item_id=item_id,
57+
chs_text=translation.get("chs", ""),
58+
cht_text=translation.get("cht", ""),
59+
de_text=translation.get("de", ""),
60+
en_text=translation.get("en", ""),
61+
es_text=translation.get("es", ""),
62+
fr_text=translation.get("fr", ""),
63+
id_text=translation.get("id", ""),
64+
jp_text=translation.get("jp", ""),
65+
kr_text=translation.get("kr", ""),
66+
pt_text=translation.get("pt", ""),
67+
ru_text=translation.get("ru", ""),
68+
th_text=translation.get("th", ""),
69+
vi_text=translation.get("vi", "")
70+
)
71+
db.add(i18n_entry)
72+
73+
# Insert into GenericDict
74+
for lang_code, text_value in translation.items():
75+
if text_value:
76+
gdict = GenericDict(
77+
game_id=game_id,
78+
item_id=item_id,
79+
text=text_value, # Properly set "text"
80+
lang=lang_code # And "lang"
81+
)
82+
db.add(gdict)
83+
84+
db.commit()

db/models.py

+48
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
from .mysql_db import Base
2+
from sqlalchemy import Column, Integer, String, Date
3+
4+
# ------------------------------------------------------------------------
5+
# MODEL DECLARATIONS
6+
# ------------------------------------------------------------------------
7+
8+
9+
class I18nDict(Base):
10+
"""
11+
Reflects the i18n_dict table with the following columns:
12+
game_id, item_id, chs_text, cht_text, de_text, en_text, es_text,
13+
fr_text, id_text, jp_text, kr_text, pt_text, ru_text, th_text, vi_text
14+
"""
15+
__tablename__ = "i18n_dict"
16+
17+
# auto increment primary key if you want
18+
id = Column(Integer, primary_key=True, index=True)
19+
game_id = Column(Integer, index=True, nullable=False)
20+
item_id = Column(String(255), index=True, nullable=False)
21+
22+
chs_text = Column(String(255), default="")
23+
cht_text = Column(String(255), default="")
24+
de_text = Column(String(255), default="")
25+
en_text = Column(String(255), default="")
26+
es_text = Column(String(255), default="")
27+
fr_text = Column(String(255), default="")
28+
id_text = Column(String(255), default="")
29+
jp_text = Column(String(255), default="")
30+
kr_text = Column(String(255), default="")
31+
pt_text = Column(String(255), default="")
32+
ru_text = Column(String(255), default="")
33+
th_text = Column(String(255), default="")
34+
vi_text = Column(String(255), default="")
35+
36+
37+
class GenericDict(Base):
38+
"""
39+
Reflects the generic_dict table with columns:
40+
game_id, item_id, text, lang
41+
"""
42+
__tablename__ = "generic_dict"
43+
44+
id = Column(Integer, primary_key=True, index=True)
45+
game_id = Column(Integer, index=True, nullable=False)
46+
item_id = Column(String(255), index=True, nullable=False)
47+
text = Column(String(255), nullable=False)
48+
lang = Column(String(16), nullable=False)

db/mysql_db.py

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import os
2+
from sqlalchemy import create_engine
3+
from sqlalchemy.ext.declarative import declarative_base
4+
from sqlalchemy.orm import sessionmaker
5+
from base_logger import logging
6+
import socket
7+
8+
if os.getenv("host.docker.internal", None):
9+
MYSQL_HOST = os.getenv("host.docker.internal")
10+
else:
11+
MYSQL_HOST = socket.gethostbyname('host.docker.internal')
12+
MYSQL_PORT = int(os.getenv("MYSQL_PORT", "3306"))
13+
MYSQL_USER = os.getenv("MYSQL_USER")
14+
MYSQL_PASSWORD = os.getenv("MYSQL_PASSWORD")
15+
MYSQL_DATABASE = os.getenv("MYSQL_DATABASE")
16+
17+
SQLALCHEMY_DATABASE_URL = f"mysql+pymysql://{MYSQL_USER}:{MYSQL_PASSWORD}@{MYSQL_HOST}:{MYSQL_PORT}/{MYSQL_DATABASE}?charset=utf8mb4"
18+
19+
engine = create_engine(SQLALCHEMY_DATABASE_URL, pool_pre_ping=True)
20+
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
21+
Base = declarative_base()
22+
logging.info(f"MySQL connection established to {MYSQL_HOST}/{MYSQL_DATABASE}")

db/schemas.py

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
from pydantic import BaseModel
2+
from typing import Optional, Any
3+
4+
5+
# ------------------------------------------------------------------------
6+
# Pydantic Schemas for Requests/Responses
7+
# ------------------------------------------------------------------------
8+
class TranslateRequest(BaseModel):
9+
type: str
10+
lang: str
11+
game: str
12+
item_name: Optional[str] = None
13+
item_id: Optional[str] = None
14+
15+
16+
class TranslateResponse(BaseModel):
17+
item_id: Optional[Any] = None
18+
item_name: Optional[Any] = None

0 commit comments

Comments
 (0)