Add Pitopn digital shop with FastAPI, Postgres 17, and Docker Compose

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
orohi
2026-07-25 05:21:34 +03:00
co-authored by Cursor
parent fb00211c48
commit 08cc4b0f1b
16 changed files with 1126 additions and 0 deletions
+118
View File
@@ -0,0 +1,118 @@
from decimal import Decimal
from sqlalchemy import select
from sqlalchemy.orm import Session
from app.models import Category, Product
CATEGORIES = [
{
"slug": "keys",
"name": "Игровые ключи",
"description": "Steam, Epic, Origin и другие платформы",
"sort_order": 1,
},
{
"slug": "software",
"name": "Софт",
"description": "Лицензии и подписки для работы",
"sort_order": 2,
},
{
"slug": "accounts",
"name": "Аккаунты",
"description": "Готовые профили с контентом",
"sort_order": 3,
},
{
"slug": "giftcards",
"name": "Подарочные карты",
"description": "Цифровые коды пополнения",
"sort_order": 4,
},
]
PRODUCTS = [
{
"slug": "steam-wallet-1000",
"title": "Steam Wallet 1000 ₽",
"short_description": "Код пополнения кошелька Steam на 1000 рублей",
"description": "Цифровой код активируется в клиенте Steam. Доставка сразу после оплаты.",
"price": Decimal("1049.00"),
"category_slug": "giftcards",
"image_gradient": "mint",
"is_featured": True,
"delivery_note": "Код на email за 1–3 минуты",
},
{
"slug": "adobe-cc-1m",
"title": "Adobe Creative Cloud — 1 месяц",
"short_description": "Полный доступ к Photoshop, Premiere, Illustrator",
"description": "Официальная подписка на месяц. Данные для входа приходят автоматически.",
"price": Decimal("1890.00"),
"category_slug": "software",
"image_gradient": "coral",
"is_featured": True,
"delivery_note": "Доступ в личном кабинете",
},
{
"slug": "cyberpunk-steam",
"title": "Cyberpunk 2077 — Steam Key",
"short_description": "Полная версия с обновлениями для Steam",
"description": "Ключ активации для региона RU/CIS. Работает с аккаунтом Steam.",
"price": Decimal("1299.00"),
"category_slug": "keys",
"image_gradient": "ink",
"is_featured": True,
"delivery_note": "Ключ сразу после оплаты",
},
{
"slug": "spotify-premium-3m",
"title": "Spotify Premium — 3 месяца",
"short_description": "Музыка без рекламы и офлайн-режим",
"description": "Подписка активируется на ваш аккаунт или выдаётся новый профиль.",
"price": Decimal("799.00"),
"category_slug": "accounts",
"image_gradient": "sand",
"is_featured": True,
"delivery_note": "Активация до 15 минут",
},
{
"slug": "windows-11-pro",
"title": "Windows 11 Pro Key",
"short_description": "Розничный ключ активации Windows 11 Pro",
"description": "Подходит для чистой установки и апгрейда. Инструкция в письме.",
"price": Decimal("2490.00"),
"category_slug": "software",
"image_gradient": "mint",
"is_featured": False,
"delivery_note": "Ключ на email",
},
{
"slug": "playstation-1500",
"title": "PlayStation Store 1500 ₽",
"short_description": "Карта пополнения аккаунта PSN",
"description": "Цифровой ваучер для российского региона PlayStation Network.",
"price": Decimal("1549.00"),
"category_slug": "giftcards",
"image_gradient": "coral",
"is_featured": False,
"delivery_note": "Код за несколько минут",
},
]
def seed_if_empty(db: Session) -> None:
has_categories = db.scalar(select(Category.id).limit(1)) is not None
if not has_categories:
for item in CATEGORIES:
db.add(Category(**item))
db.commit()
has_products = db.scalar(select(Product.id).limit(1)) is not None
if not has_products:
for item in PRODUCTS:
db.add(Product(**item))
db.commit()