File size: 2,621 Bytes
b2be963
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from fastapi import APIRouter, Depends, HTTPException, status, UploadFile, File
from datetime import datetime
import os
from app.core.config import settings as app_settings
from sqlalchemy.orm import Session
from typing import Any

from app.db.base import get_db
from app.models.settings import StoreSettings
from app.schemas.settings import StoreSettingsResponse, StoreSettingsUpdate
from app.api.auth import get_current_admin_user
from app.schemas.api_response import APIResponse

router = APIRouter(prefix="/settings", tags=["Settings"])

@router.get("/", response_model=APIResponse)
def get_settings(db: Session = Depends(get_db)) -> Any:
    settings = db.query(StoreSettings).first()
    if not settings:
        settings = StoreSettings() # create default
        db.add(settings)
        db.commit()
        db.refresh(settings)
    return APIResponse(
        isSuccess=True,
        value=StoreSettingsResponse.model_validate(settings).model_dump(),
        statusCode=200
    )

@router.put("/", response_model=APIResponse)
def update_settings(

    settings_in: StoreSettingsUpdate,

    db: Session = Depends(get_db),

    current_admin=Depends(get_current_admin_user)

) -> Any:
    settings = db.query(StoreSettings).first()
    if not settings:
        settings = StoreSettings(**settings_in.model_dump(exclude_unset=True))
        db.add(settings)
    else:
        update_data = settings_in.model_dump(exclude_unset=True)
        for field, value in update_data.items():
            setattr(settings, field, value)
            
    db.commit()
    db.refresh(settings)
    return APIResponse(
        isSuccess=True,
        value=StoreSettingsResponse.model_validate(settings).model_dump(),
        statusCode=200
    )

@router.post("/upload-image", response_model=APIResponse)
def upload_settings_image(

    file: UploadFile = File(...),

    db: Session = Depends(get_db),

    current_admin=Depends(get_current_admin_user)

) -> Any:
    # Convert file to base64 string
    file_bytes = file.file.read()
    
    import base64
    ext = os.path.splitext(file.filename)[1].lower()
    mime_type = "image/jpeg"
    if ext in [".png"]:
        mime_type = "image/png"
    elif ext in [".gif"]:
        mime_type = "image/gif"
    elif ext in [".webp"]:
        mime_type = "image/webp"
        
    b64_encoded = base64.b64encode(file_bytes).decode('utf-8')
    data_uri = f"data:{mime_type};base64,{b64_encoded}"
    
    return APIResponse(
        isSuccess=True,
        value={"url": data_uri},
        statusCode=200
    )