diff --git a/backend/__pycache__/main.cpython-313.pyc b/backend/__pycache__/main.cpython-313.pyc index 8048de5..1504b45 100644 Binary files a/backend/__pycache__/main.cpython-313.pyc and b/backend/__pycache__/main.cpython-313.pyc differ diff --git a/backend/__pycache__/schemas.cpython-313.pyc b/backend/__pycache__/schemas.cpython-313.pyc index b605276..55a90f2 100644 Binary files a/backend/__pycache__/schemas.cpython-313.pyc and b/backend/__pycache__/schemas.cpython-313.pyc differ diff --git a/backend/alembic/versions/__pycache__/eb35214a1411_update_items_table.cpython-313.pyc b/backend/alembic/versions/__pycache__/eb35214a1411_update_items_table.cpython-313.pyc new file mode 100644 index 0000000..ab06778 Binary files /dev/null and b/backend/alembic/versions/__pycache__/eb35214a1411_update_items_table.cpython-313.pyc differ diff --git a/backend/alembic/versions/__pycache__/f71dc2bbdfc6_update_items_table.cpython-313.pyc b/backend/alembic/versions/__pycache__/f71dc2bbdfc6_update_items_table.cpython-313.pyc new file mode 100644 index 0000000..2593d94 Binary files /dev/null and b/backend/alembic/versions/__pycache__/f71dc2bbdfc6_update_items_table.cpython-313.pyc differ diff --git a/backend/alembic/versions/eb35214a1411_update_items_table.py b/backend/alembic/versions/eb35214a1411_update_items_table.py new file mode 100644 index 0000000..29c1da5 --- /dev/null +++ b/backend/alembic/versions/eb35214a1411_update_items_table.py @@ -0,0 +1,28 @@ +"""update items table + +Revision ID: eb35214a1411 +Revises: f71dc2bbdfc6 +Create Date: 2026-06-03 02:15:20.584639 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision: str = 'eb35214a1411' +down_revision: Union[str, Sequence[str], None] = 'f71dc2bbdfc6' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + """Upgrade schema.""" + pass + + +def downgrade() -> None: + """Downgrade schema.""" + pass diff --git a/backend/alembic/versions/f71dc2bbdfc6_update_items_table.py b/backend/alembic/versions/f71dc2bbdfc6_update_items_table.py new file mode 100644 index 0000000..490762c --- /dev/null +++ b/backend/alembic/versions/f71dc2bbdfc6_update_items_table.py @@ -0,0 +1,28 @@ +"""update items table + +Revision ID: f71dc2bbdfc6 +Revises: b55808a86947 +Create Date: 2026-06-03 02:12:35.370477 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision: str = 'f71dc2bbdfc6' +down_revision: Union[str, Sequence[str], None] = 'b55808a86947' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + """Upgrade schema.""" + pass + + +def downgrade() -> None: + """Downgrade schema.""" + pass diff --git a/backend/api/__pycache__/admin.cpython-313.pyc b/backend/api/__pycache__/admin.cpython-313.pyc index d8926f4..04fb49d 100644 Binary files a/backend/api/__pycache__/admin.cpython-313.pyc and b/backend/api/__pycache__/admin.cpython-313.pyc differ diff --git a/backend/api/__pycache__/user.cpython-313.pyc b/backend/api/__pycache__/user.cpython-313.pyc index 51e0d47..3747bc8 100644 Binary files a/backend/api/__pycache__/user.cpython-313.pyc and b/backend/api/__pycache__/user.cpython-313.pyc differ diff --git a/backend/api/admin.py b/backend/api/admin.py index 2d76f01..06c23cf 100644 --- a/backend/api/admin.py +++ b/backend/api/admin.py @@ -1,9 +1,5 @@ -from fastapi import APIRouter -from fastapi import Depends -from fastapi import HTTPException - +from fastapi import APIRouter, Depends, HTTPException from sqlalchemy.orm import Session - import schemas from schemas import ItemResponse from services import crud @@ -13,7 +9,6 @@ from core.logger import get_logger router = APIRouter() logger = get_logger('admin') - def get_db(): db = SessionLocal() try: @@ -21,7 +16,6 @@ def get_db(): finally: db.close() - # GET ALL ITEMS @router.get("/items", response_model=list[ItemResponse]) def get_items(db: Session = Depends(get_db)): @@ -33,28 +27,51 @@ def get_items(db: Session = Depends(get_db)): logger.critical(f"Unexpected error fetching items: {e}") raise - # CREATE ITEM @router.post("/items", response_model=ItemResponse) -def create_item( - item: schemas.ItemCreate, - db: Session = Depends(get_db) -): +def create_item(item: schemas.ItemCreate, db: Session = Depends(get_db)): try: - result = crud.create_item(db, item.title, item.value) # ✅ value اضافه شد + result = crud.create_item( + db, + item.title, + item.prize, + item.description, + item.prize_type, + item.probability + ) logger.info(f"Item created: {item.title}") return result except Exception as e: logger.critical(f"Unexpected error creating item: {e}") raise +# UPDATE ITEM +@router.put("/items/{item_id}", response_model=ItemResponse) +def update_item(item_id: int, item: schemas.ItemUpdate, db: Session = Depends(get_db)): + try: + updated = crud.update_item( + db, + item_id, + item.title, + item.prize, + item.description, + item.prize_type, + item.probability + ) + if not updated: + logger.warning(f"Item not found: {item_id}") + raise HTTPException(status_code=404, detail="Item not found") + logger.info(f"Item updated: {item_id}") + return updated + except HTTPException: + raise + except Exception as e: + logger.critical(f"Unexpected error updating item: {e}") + raise # DELETE ITEM @router.delete("/items/{item_id}") -def delete_item( - item_id: int, - db: Session = Depends(get_db) -): +def delete_item(item_id: int, db: Session = Depends(get_db)): try: item = crud.delete_item(db, item_id) if not item: @@ -66,28 +83,4 @@ def delete_item( raise except Exception as e: logger.critical(f"Unexpected error deleting item: {e}") - raise - -@router.put("/items/{item_id}", response_model=ItemResponse) -def update_item( - item_id: int, - item: schemas.ItemCreate, - db: Session = Depends(get_db) -): - try: - updated = crud.update_item(db, item_id, item.title, item.value) - - if not updated: - logger.warning(f"Item not found: {item_id}") - raise HTTPException(status_code=404, detail="Item not found") - - logger.info(f"Item updated: {item_id}") - return updated - - except HTTPException: - raise - except Exception as e: - logger.critical(f"Unexpected error updating item: {e}") - raise - - \ No newline at end of file + raise \ No newline at end of file diff --git a/backend/api/user.py b/backend/api/user.py index e8e0fb9..d8b3a45 100644 --- a/backend/api/user.py +++ b/backend/api/user.py @@ -51,7 +51,10 @@ def spin(db: Session = Depends(get_db)): return { "winner": { "id": winner.id, - "title": winner.title + "title": winner.title, + "prize": winner.prize, + "prize_type": winner.prize_type, + "description": winner.description or "" } } diff --git a/backend/app/db/__pycache__/models.cpython-313.pyc b/backend/app/db/__pycache__/models.cpython-313.pyc index 36d6023..2b26073 100644 Binary files a/backend/app/db/__pycache__/models.cpython-313.pyc and b/backend/app/db/__pycache__/models.cpython-313.pyc differ diff --git a/backend/app/db/models.py b/backend/app/db/models.py index 48d048c..b9c0c4d 100644 --- a/backend/app/db/models.py +++ b/backend/app/db/models.py @@ -1,26 +1,12 @@ -from sqlalchemy import Column -from sqlalchemy import Integer -from sqlalchemy import String - +from sqlalchemy import Column, Integer, String, Float from app.db.session import Base - class Item(Base): - __tablename__ = "items" - id = Column( - Integer, - primary_key=True, - index=True - ) - - title = Column( - String, - nullable=False - ) - - value = Column( - Integer, - nullable=False - ) \ No newline at end of file + id = Column(Integer, primary_key=True, index=True) + title = Column(String, nullable=False) + prize = Column(String, nullable=False) + description = Column(String, nullable=True, default="") + prize_type = Column(String, nullable=False, default="پوچ") + probability = Column(Float, nullable=False, default=1.0) \ No newline at end of file diff --git a/backend/logs/app.log b/backend/logs/app.log index c3509ca..c77bd98 100644 --- a/backend/logs/app.log +++ b/backend/logs/app.log @@ -287,3 +287,137 @@ FROM items] 2026-05-30 12:50:43 | INFO | admin | Items fetched: 8 items 2026-05-30 12:51:00 | INFO | user | User fetched items: 8 items 2026-05-30 12:53:57 | INFO | user | Spin result: پوچ +2026-05-30 14:30:41 | INFO | admin | Items fetched: 8 items +2026-05-30 14:31:19 | INFO | user | User fetched items: 8 items +2026-05-30 14:31:21 | INFO | user | Spin result: تخفيف يک ماهه +2026-05-30 14:32:54 | INFO | user | Spin result: پوچ +2026-05-30 14:33:18 | INFO | admin | Item updated: 1 +2026-05-30 14:33:18 | INFO | admin | Items fetched: 8 items +2026-05-30 14:33:38 | INFO | user | Spin result: تخفيف سه ماهه +2026-06-03 02:01:07 | CRITICAL | user | Unexpected error fetching items: (sqlite3.OperationalError) no such column: items.type +[SQL: SELECT items.id AS items_id, items.title AS items_title, items.type AS items_type, items.description AS items_description, items.probability AS items_probability, items.value AS items_value +FROM items] +(Background on this error at: https://sqlalche.me/e/20/e3q8) +2026-06-03 02:01:11 | CRITICAL | user | Unexpected error fetching items: (sqlite3.OperationalError) no such column: items.type +[SQL: SELECT items.id AS items_id, items.title AS items_title, items.type AS items_type, items.description AS items_description, items.probability AS items_probability, items.value AS items_value +FROM items] +(Background on this error at: https://sqlalche.me/e/20/e3q8) +2026-06-03 02:08:13 | CRITICAL | user | Unexpected error fetching items: (sqlite3.OperationalError) no such column: items.type +[SQL: SELECT items.id AS items_id, items.title AS items_title, items.type AS items_type, items.description AS items_description, items.probability AS items_probability, items.value AS items_value +FROM items] +(Background on this error at: https://sqlalche.me/e/20/e3q8) +2026-06-03 02:30:22 | CRITICAL | admin | Unexpected error fetching items: (sqlite3.OperationalError) no such column: items.prize +[SQL: SELECT items.id AS items_id, items.title AS items_title, items.prize AS items_prize, items.description AS items_description, items.prize_type AS items_prize_type, items.probability AS items_probability +FROM items] +(Background on this error at: https://sqlalche.me/e/20/e3q8) +2026-06-07 00:22:06 | CRITICAL | user | Unexpected error fetching items: (sqlite3.OperationalError) no such column: items.prize +[SQL: SELECT items.id AS items_id, items.title AS items_title, items.prize AS items_prize, items.description AS items_description, items.prize_type AS items_prize_type, items.probability AS items_probability +FROM items] +(Background on this error at: https://sqlalche.me/e/20/e3q8) +2026-06-07 00:22:08 | CRITICAL | user | Unexpected error fetching items: (sqlite3.OperationalError) no such column: items.prize +[SQL: SELECT items.id AS items_id, items.title AS items_title, items.prize AS items_prize, items.description AS items_description, items.prize_type AS items_prize_type, items.probability AS items_probability +FROM items] +(Background on this error at: https://sqlalche.me/e/20/e3q8) +2026-06-07 00:23:31 | CRITICAL | user | Unexpected error fetching items: (sqlite3.OperationalError) no such column: items.prize +[SQL: SELECT items.id AS items_id, items.title AS items_title, items.prize AS items_prize, items.description AS items_description, items.prize_type AS items_prize_type, items.probability AS items_probability +FROM items] +(Background on this error at: https://sqlalche.me/e/20/e3q8) +2026-06-07 00:24:02 | CRITICAL | user | Unexpected error fetching items: (sqlite3.OperationalError) no such column: items.prize +[SQL: SELECT items.id AS items_id, items.title AS items_title, items.prize AS items_prize, items.description AS items_description, items.prize_type AS items_prize_type, items.probability AS items_probability +FROM items] +(Background on this error at: https://sqlalche.me/e/20/e3q8) +2026-06-07 00:26:33 | INFO | user | User fetched items: 0 items +2026-06-07 00:32:56 | INFO | user | User fetched items: 0 items +2026-06-07 00:36:17 | INFO | user | User fetched items: 0 items +2026-06-07 00:36:21 | INFO | user | User fetched items: 0 items +2026-06-07 00:39:11 | INFO | user | User fetched items: 0 items +2026-06-07 00:39:15 | INFO | admin | Items fetched: 0 items +2026-06-07 00:39:33 | INFO | admin | Items fetched: 0 items +2026-06-07 00:49:16 | INFO | admin | Items fetched: 0 items +2026-06-07 00:49:39 | INFO | admin | Item created: jotdt 20 +2026-06-07 00:49:39 | INFO | admin | Items fetched: 1 items +2026-06-07 00:49:44 | INFO | user | User fetched items: 1 items +2026-06-07 00:49:47 | INFO | user | Spin result: jotdt 20 +2026-06-07 00:50:31 | INFO | admin | Item created: پوچ +2026-06-07 00:50:31 | INFO | admin | Items fetched: 2 items +2026-06-07 00:50:38 | INFO | user | User fetched items: 2 items +2026-06-07 00:50:40 | INFO | user | Spin result: پوچ +2026-06-07 00:51:12 | INFO | admin | Item created: تخفيف 20 +2026-06-07 00:51:12 | INFO | admin | Items fetched: 3 items +2026-06-07 00:51:16 | INFO | user | User fetched items: 3 items +2026-06-07 00:52:18 | INFO | user | Spin result: پوچ +2026-06-07 00:53:54 | INFO | admin | Item updated: 1 +2026-06-07 00:53:54 | INFO | admin | Items fetched: 3 items +2026-06-07 00:54:22 | INFO | admin | Item created: تخفيف 30 +2026-06-07 00:54:22 | INFO | admin | Items fetched: 4 items +2026-06-07 00:54:35 | INFO | user | User fetched items: 4 items +2026-06-07 00:54:38 | INFO | user | Spin result: پوچ +2026-06-07 00:55:39 | INFO | user | Spin result: تخفيف 30 +2026-06-07 00:56:16 | INFO | admin | Item created: تخفيف 30 +2026-06-07 00:56:16 | INFO | admin | Items fetched: 5 items +2026-06-07 00:56:51 | INFO | admin | Item created: پوچ +2026-06-07 00:56:51 | INFO | admin | Items fetched: 6 items +2026-06-07 00:56:58 | INFO | user | User fetched items: 6 items +2026-06-07 00:57:01 | INFO | user | Spin result: پوچ +2026-06-07 00:57:13 | INFO | user | Spin result: پوچ +2026-06-07 01:03:09 | INFO | user | User fetched items: 6 items +2026-06-07 01:03:12 | INFO | user | Spin result: پوچ +2026-06-07 01:07:35 | INFO | admin | Items fetched: 6 items +2026-06-07 01:07:37 | INFO | user | User fetched items: 6 items +2026-06-07 01:07:39 | INFO | user | Spin result: تخفيف 20 +2026-06-07 02:15:44 | INFO | user | User fetched items: 6 items +2026-06-07 02:15:45 | INFO | user | Spin result: پوچ +2026-06-07 02:19:11 | INFO | user | Spin result: پوچ +2026-06-07 02:19:40 | INFO | user | Spin result: پوچ +2026-06-07 13:34:50 | INFO | user | User fetched items: 6 items +2026-06-07 13:34:52 | INFO | user | Spin result: پوچ +2026-06-07 13:35:15 | INFO | admin | Items fetched: 6 items +2026-06-07 13:35:36 | INFO | user | Spin result: پوچ +2026-06-10 11:55:45 | INFO | user | User fetched items: 6 items +2026-06-10 11:56:01 | INFO | admin | Items fetched: 6 items +2026-06-10 11:57:45 | INFO | user | Spin result: پوچ +2026-06-10 11:59:13 | INFO | user | Spin result: پوچ +2026-06-10 11:59:33 | INFO | admin | Item updated: 3 +2026-06-10 11:59:33 | INFO | admin | Items fetched: 6 items +2026-06-10 11:59:36 | INFO | user | Spin result: پوچ +2026-06-10 11:59:45 | INFO | user | Spin result: تخفيف 20 +2026-06-10 12:01:01 | INFO | user | Spin result: پوچ +2026-06-10 12:02:20 | INFO | user | Spin result: پوچ +2026-06-10 12:07:31 | INFO | user | User fetched items: 6 items +2026-06-10 12:07:31 | INFO | user | User fetched items: 6 items +2026-06-10 12:07:31 | INFO | user | Spin result: تخفيف 20 +2026-06-10 12:07:31 | INFO | user | User fetched items: 6 items +2026-06-10 12:07:31 | INFO | user | User fetched items: 6 items +2026-06-10 12:07:31 | INFO | user | User fetched items: 6 items +2026-06-10 12:08:44 | INFO | user | User fetched items: 6 items +2026-06-10 12:08:47 | INFO | user | Spin result: تخفيف 20 +2026-06-10 12:17:29 | INFO | user | User fetched items: 6 items +2026-06-10 12:17:32 | INFO | user | Spin result: پوچ +2026-06-10 12:18:03 | INFO | user | Spin result: پوچ +2026-06-10 12:18:44 | INFO | user | Spin result: تخفيف 20 +2026-06-10 12:19:16 | INFO | user | User fetched items: 6 items +2026-06-10 12:19:20 | INFO | user | Spin result: تخفيف 20 +2026-06-10 12:20:37 | INFO | user | Spin result: پوچ +2026-06-10 12:20:41 | INFO | user | User fetched items: 6 items +2026-06-10 12:20:49 | INFO | admin | Items fetched: 6 items +2026-06-10 12:22:37 | INFO | user | User fetched items: 6 items +2026-06-10 12:22:39 | INFO | user | Spin result: تخفيف 20 +2026-06-10 12:22:49 | INFO | user | Spin result: تخفيف 20 +2026-06-10 12:23:08 | INFO | user | User fetched items: 6 items +2026-06-10 12:23:09 | INFO | user | Spin result: پوچ +2026-06-10 12:25:32 | INFO | user | User fetched items: 6 items +2026-06-10 12:25:34 | INFO | user | Spin result: تخفيف 20 +2026-06-10 12:30:55 | INFO | user | User fetched items: 6 items +2026-06-10 12:30:56 | INFO | user | Spin result: پوچ +2026-06-10 12:36:33 | INFO | user | User fetched items: 6 items +2026-06-10 12:36:35 | INFO | user | Spin result: تخفيف 20 +2026-06-10 12:37:57 | INFO | user | User fetched items: 6 items +2026-06-10 12:48:20 | INFO | user | User fetched items: 6 items +2026-06-10 12:51:46 | INFO | user | User fetched items: 6 items +2026-06-10 12:58:36 | INFO | user | User fetched items: 6 items +2026-06-10 12:58:41 | INFO | user | Spin result: تخفيف 30 +2026-06-10 12:59:01 | INFO | admin | Items fetched: 6 items +2026-06-10 12:59:04 | INFO | admin | Items fetched: 6 items +2026-06-10 13:00:57 | INFO | user | User fetched items: 6 items +2026-06-10 13:01:44 | INFO | user | User fetched items: 6 items +2026-06-10 13:01:46 | INFO | user | User fetched items: 6 items diff --git a/backend/logs/error.log b/backend/logs/error.log index 9d08148..895e7b1 100644 --- a/backend/logs/error.log +++ b/backend/logs/error.log @@ -38,3 +38,35 @@ FROM items] [SQL: INSERT INTO items (title) VALUES (?)] [parameters: ('جایزه 1',)] (Background on this error at: https://sqlalche.me/e/20/e3q8) +2026-06-03 02:01:07 | CRITICAL | user | Unexpected error fetching items: (sqlite3.OperationalError) no such column: items.type +[SQL: SELECT items.id AS items_id, items.title AS items_title, items.type AS items_type, items.description AS items_description, items.probability AS items_probability, items.value AS items_value +FROM items] +(Background on this error at: https://sqlalche.me/e/20/e3q8) +2026-06-03 02:01:11 | CRITICAL | user | Unexpected error fetching items: (sqlite3.OperationalError) no such column: items.type +[SQL: SELECT items.id AS items_id, items.title AS items_title, items.type AS items_type, items.description AS items_description, items.probability AS items_probability, items.value AS items_value +FROM items] +(Background on this error at: https://sqlalche.me/e/20/e3q8) +2026-06-03 02:08:13 | CRITICAL | user | Unexpected error fetching items: (sqlite3.OperationalError) no such column: items.type +[SQL: SELECT items.id AS items_id, items.title AS items_title, items.type AS items_type, items.description AS items_description, items.probability AS items_probability, items.value AS items_value +FROM items] +(Background on this error at: https://sqlalche.me/e/20/e3q8) +2026-06-03 02:30:22 | CRITICAL | admin | Unexpected error fetching items: (sqlite3.OperationalError) no such column: items.prize +[SQL: SELECT items.id AS items_id, items.title AS items_title, items.prize AS items_prize, items.description AS items_description, items.prize_type AS items_prize_type, items.probability AS items_probability +FROM items] +(Background on this error at: https://sqlalche.me/e/20/e3q8) +2026-06-07 00:22:06 | CRITICAL | user | Unexpected error fetching items: (sqlite3.OperationalError) no such column: items.prize +[SQL: SELECT items.id AS items_id, items.title AS items_title, items.prize AS items_prize, items.description AS items_description, items.prize_type AS items_prize_type, items.probability AS items_probability +FROM items] +(Background on this error at: https://sqlalche.me/e/20/e3q8) +2026-06-07 00:22:08 | CRITICAL | user | Unexpected error fetching items: (sqlite3.OperationalError) no such column: items.prize +[SQL: SELECT items.id AS items_id, items.title AS items_title, items.prize AS items_prize, items.description AS items_description, items.prize_type AS items_prize_type, items.probability AS items_probability +FROM items] +(Background on this error at: https://sqlalche.me/e/20/e3q8) +2026-06-07 00:23:31 | CRITICAL | user | Unexpected error fetching items: (sqlite3.OperationalError) no such column: items.prize +[SQL: SELECT items.id AS items_id, items.title AS items_title, items.prize AS items_prize, items.description AS items_description, items.prize_type AS items_prize_type, items.probability AS items_probability +FROM items] +(Background on this error at: https://sqlalche.me/e/20/e3q8) +2026-06-07 00:24:02 | CRITICAL | user | Unexpected error fetching items: (sqlite3.OperationalError) no such column: items.prize +[SQL: SELECT items.id AS items_id, items.title AS items_title, items.prize AS items_prize, items.description AS items_description, items.prize_type AS items_prize_type, items.probability AS items_probability +FROM items] +(Background on this error at: https://sqlalche.me/e/20/e3q8) diff --git a/backend/main.py b/backend/main.py index fa62976..113a07c 100644 --- a/backend/main.py +++ b/backend/main.py @@ -1,19 +1,14 @@ from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware -from app.db.session import engine -from app.db.session import Base - +from app.db.session import engine, Base from app.db.models import Item -app = FastAPI() - from api.admin import router as admin_router from api.user import router as user_router -app.include_router(user_router, prefix="/user") +app = FastAPI() -Base.metadata.create_all(bind=engine) app.add_middleware( CORSMiddleware, @@ -26,4 +21,8 @@ app.add_middleware( allow_headers=["*"], ) -app.include_router(admin_router, prefix="/admin") \ No newline at end of file +# ✅ بعد router ها +app.include_router(user_router, prefix="/user") +app.include_router(admin_router, prefix="/admin") + +Base.metadata.create_all(bind=engine) \ No newline at end of file diff --git a/backend/schemas.py b/backend/schemas.py index 45c04a2..ef9e1f3 100644 --- a/backend/schemas.py +++ b/backend/schemas.py @@ -1,20 +1,27 @@ from pydantic import BaseModel - +from typing import Optional class ItemCreate(BaseModel): title: str - value: int - + prize: str + description: Optional[str] = "" + prize_type: str = "پوچ" + probability: float = 1.0 class ItemUpdate(BaseModel): title: str - value: int - + prize: str + description: Optional[str] = "" + prize_type: str = "پوچ" + probability: float = 1.0 class ItemResponse(BaseModel): id: int title: str - value: int + prize: str + description: Optional[str] = "" + prize_type: str + probability: float class Config: from_attributes = True \ No newline at end of file diff --git a/backend/services/__pycache__/crud.cpython-313.pyc b/backend/services/__pycache__/crud.cpython-313.pyc index 3c9f161..fa52f42 100644 Binary files a/backend/services/__pycache__/crud.cpython-313.pyc and b/backend/services/__pycache__/crud.cpython-313.pyc differ diff --git a/backend/services/crud.py b/backend/services/crud.py index c17828a..c83354a 100644 --- a/backend/services/crud.py +++ b/backend/services/crud.py @@ -5,18 +5,27 @@ from app.db.models import Item def get_items(db: Session): return db.query(Item).all() -def create_item(db: Session, title: str, value: int): # ✅ prize → value - item = Item(title=title, value=value) # ✅ prize → value +def create_item(db: Session, title: str, prize: str, description: str = "", prize_type: str = "پوچ", probability: float = 1.0): + item = Item( + title=title, + prize=prize, + description=description, + prize_type=prize_type, + probability=probability + ) db.add(item) db.commit() db.refresh(item) return item -def update_item(db: Session, item_id: int, title: str, value: int): # ✅ prize → value +def update_item(db: Session, item_id: int, title: str, prize: str, description: str = "", prize_type: str = "پوچ", probability: float = 1.0): item = db.query(Item).filter(Item.id == item_id).first() if item: item.title = title - item.value = value # ✅ prize → value + item.prize = prize + item.description = description + item.prize_type = prize_type + item.probability = probability db.commit() db.refresh(item) return item @@ -32,4 +41,5 @@ def spin_wheel(db: Session): items = db.query(Item).all() if not items: return None - return random.choice(items) \ No newline at end of file + weights = [item.probability for item in items] + return random.choices(items, weights=weights, k=1)[0] \ No newline at end of file diff --git a/backend/spinwheel.db b/backend/spinwheel.db index f2d2d47..492947f 100644 Binary files a/backend/spinwheel.db and b/backend/spinwheel.db differ diff --git a/frontend/admin.html b/frontend/admin.html index 462e254..598d619 100644 --- a/frontend/admin.html +++ b/frontend/admin.html @@ -1,92 +1,161 @@ -
- -مدیریت آیتمها و جوایز گردونه
| # | -عنوان جایزه | -مقدار | -عملیات | -
|---|
| # | +نوع جایزه | +عنوان | +مقدار | +احتمال | +توضیحات | +عملیات | +
|---|