v0.2 - 19 features: comparator, allergies, gamification, shopping list, achievements, stats, profile, share, bottom nav

This commit is contained in:
2026-02-10 18:52:42 -03:00
parent e8f4788a33
commit ecdd7546d3
33 changed files with 2105 additions and 309 deletions

View File

@@ -1,5 +1,5 @@
from app.models.user import User
from app.models.product import Product
from app.models.scan import Scan
__all__ = ["User", "Product", "Scan"]
from app.models.achievement import Achievement, UserAchievement
from app.models.shopping_list import ShoppingItem

View File

@@ -0,0 +1,19 @@
from sqlalchemy import Column, Integer, String, DateTime, ForeignKey, Boolean
from datetime import datetime, timezone
from app.database import Base
class Achievement(Base):
__tablename__ = "achievements"
id = Column(Integer, primary_key=True, index=True)
code = Column(String, unique=True, nullable=False)
name = Column(String, nullable=False)
description = Column(String, nullable=False)
emoji = Column(String, default="🏆")
target = Column(Integer, default=1) # number needed to unlock
class UserAchievement(Base):
__tablename__ = "user_achievements"
id = Column(Integer, primary_key=True, index=True)
user_id = Column(Integer, ForeignKey("users.id"), nullable=False)
achievement_id = Column(Integer, ForeignKey("achievements.id"), nullable=False)
unlocked_at = Column(DateTime(timezone=True), default=lambda: datetime.now(timezone.utc))

View File

@@ -0,0 +1,12 @@
from sqlalchemy import Column, Integer, String, DateTime, ForeignKey, Boolean
from datetime import datetime, timezone
from app.database import Base
class ShoppingItem(Base):
__tablename__ = "shopping_list"
id = Column(Integer, primary_key=True, index=True)
user_id = Column(Integer, ForeignKey("users.id"), nullable=False)
product_name = Column(String, nullable=False)
barcode = Column(String, nullable=True)
checked = Column(Boolean, default=False)
added_at = Column(DateTime(timezone=True), default=lambda: datetime.now(timezone.utc))

View File

@@ -1,4 +1,4 @@
from sqlalchemy import Column, Integer, String, Boolean, DateTime
from sqlalchemy import Column, Integer, String, Boolean, DateTime, Text
from datetime import datetime, timezone
from app.database import Base
@@ -9,4 +9,6 @@ class User(Base):
name = Column(String, nullable=False)
password_hash = Column(String, nullable=False)
is_premium = Column(Boolean, default=False)
allergies = Column(Text, default="[]") # JSON array of allergies
health_profile = Column(String, default="normal") # normal, crianca, gestante, diabetico, hipertenso
created_at = Column(DateTime(timezone=True), default=lambda: datetime.now(timezone.utc))