diff --git a/backend/alembic/versions/0015_platform_id_refactor.py b/backend/alembic/versions/0015_platform_id_refactor.py index da6271372..00a2c1003 100644 --- a/backend/alembic/versions/0015_platform_id_refactor.py +++ b/backend/alembic/versions/0015_platform_id_refactor.py @@ -27,8 +27,6 @@ SIZE_UNIT_TO_BYTES = { def upgrade() -> None: - # ### commands auto generated by Alembic - please adjust! ### - # Drop platform_slug foreign key on all tables with op.batch_alter_table("states", schema=None) as batch_op: batch_op.drop_constraint("states_ibfk_1", type_="foreignkey") @@ -101,14 +99,9 @@ def upgrade() -> None: with op.batch_alter_table("roms", schema=None) as batch_op: batch_op.drop_column("file_size") batch_op.drop_column("file_size_units") - # ### end Alembic commands ### def downgrade() -> None: - # ### commands auto generated by Alembic - please adjust! ### - with op.batch_alter_table("platforms", schema=None) as batch_op: - batch_op.drop_column("id") - with op.batch_alter_table("roms", schema=None) as batch_op: batch_op.add_column( sa.Column("platform_slug", sa.String(length=50), nullable=False) @@ -117,35 +110,71 @@ def downgrade() -> None: batch_op.add_column(sa.Column("p_igdb_id", sa.String(length=10), nullable=True)) batch_op.add_column(sa.Column("p_sgdb_id", sa.String(length=10), nullable=True)) batch_op.drop_constraint("roms_platforms_FK", type_="foreignkey") - batch_op.create_foreign_key(None, "platforms", ["platform_slug"], ["slug"]) - batch_op.drop_column("platform_id") batch_op.drop_column("file_size_bytes") batch_op.add_column( sa.Column("file_size_units", sa.String(length=10), nullable=False) ) batch_op.add_column(sa.Column("file_size", sa.Float(), nullable=False)) + op.execute( + "update roms inner join platforms on roms.platform_id = platforms.id set roms.platform_slug = platforms.slug" + ) + with op.batch_alter_table("saves", schema=None) as batch_op: batch_op.add_column( sa.Column("platform_slug", sa.String(length=50), nullable=False) ) - batch_op.create_foreign_key( - None, "platforms", ["platform_slug"], ["slug"], ondelete="CASCADE" - ) + + op.execute( + "update saves inner join roms on saves.rom_id = roms.id set saves.platform_slug = roms.platform_slug" + ) with op.batch_alter_table("screenshots", schema=None) as batch_op: batch_op.add_column( sa.Column("platform_slug", sa.String(length=50), nullable=True) ) - batch_op.create_foreign_key( - None, "platforms", ["platform_slug"], ["slug"], ondelete="CASCADE" - ) + + op.execute( + "update screenshots inner join roms on screenshots.rom_id = roms.id set screenshots.platform_slug = roms.platform_slug" + ) with op.batch_alter_table("states", schema=None) as batch_op: batch_op.add_column( sa.Column("platform_slug", sa.String(length=50), nullable=False) ) - batch_op.create_foreign_key( - None, "platforms", ["platform_slug"], ["slug"], ondelete="CASCADE" + + op.execute( + "update states inner join roms on states.rom_id = roms.id set states.platform_slug = roms.platform_slug" + ) + + with op.batch_alter_table("platforms", schema=None) as batch_op: + batch_op.drop_column("id") + batch_op.create_primary_key(constraint_name=None, columns=["slug"]) + batch_op.add_column( + sa.Column("n_roms", sa.Integer(), autoincrement=False, nullable=True) ) - # ### end Alembic commands ### + + with op.batch_alter_table("saves", schema=None) as batch_op: + batch_op.create_foreign_key( + "saves_ibfk_1", "platforms", ["platform_slug"], ["slug"], ondelete="CASCADE" + ) + + with op.batch_alter_table("screenshots", schema=None) as batch_op: + batch_op.create_foreign_key( + "screenshots_ibfk_1", + "platforms", + ["platform_slug"], + ["slug"], + ondelete="CASCADE", + ) + + with op.batch_alter_table("states", schema=None) as batch_op: + batch_op.create_foreign_key( + "states_ibfk_1", "platforms", ["platform_slug"], ["slug"], ondelete="CASCADE" + ) + + with op.batch_alter_table("roms", schema=None) as batch_op: + batch_op.create_foreign_key( + "fk_platform_roms", "platforms", ["platform_slug"], ["slug"], ondelete="CASCADE" + ) + batch_op.drop_column("platform_id") diff --git a/backend/config/tests/__init__.py b/backend/config/tests/__init__.py index e69de29bb..10653763c 100644 --- a/backend/config/tests/__init__.py +++ b/backend/config/tests/__init__.py @@ -0,0 +1 @@ +ini diff --git a/backend/handler/db_handler/db_platforms_handler.py b/backend/handler/db_handler/db_platforms_handler.py index 31582d26f..f60d1f117 100644 --- a/backend/handler/db_handler/db_platforms_handler.py +++ b/backend/handler/db_handler/db_platforms_handler.py @@ -1,6 +1,7 @@ from decorators.database import begin_session from handler.db_handler import DBHandler -from models import Platform, Rom +from models.platform import Platform +from models.rom import Rom from sqlalchemy import delete, func, or_, select from sqlalchemy.orm import Session diff --git a/backend/handler/db_handler/db_roms_handler.py b/backend/handler/db_handler/db_roms_handler.py index 84ba028aa..388a2a062 100644 --- a/backend/handler/db_handler/db_roms_handler.py +++ b/backend/handler/db_handler/db_roms_handler.py @@ -1,6 +1,6 @@ from decorators.database import begin_session from handler.db_handler import DBHandler -from models import Rom +from models.rom import Rom from sqlalchemy import and_, delete, func, select, update from sqlalchemy.orm import Session diff --git a/backend/handler/db_handler/db_saves_handler.py b/backend/handler/db_handler/db_saves_handler.py index 49f2082d6..352959f33 100644 --- a/backend/handler/db_handler/db_saves_handler.py +++ b/backend/handler/db_handler/db_saves_handler.py @@ -1,6 +1,6 @@ from decorators.database import begin_session from handler.db_handler import DBHandler -from models import Save +from models.assets import Save from sqlalchemy import and_, delete, select, update from sqlalchemy.orm import Session diff --git a/backend/handler/db_handler/db_screenshots_handler.py b/backend/handler/db_handler/db_screenshots_handler.py index e0d5e110c..52ec2623c 100644 --- a/backend/handler/db_handler/db_screenshots_handler.py +++ b/backend/handler/db_handler/db_screenshots_handler.py @@ -1,6 +1,6 @@ from decorators.database import begin_session from handler.db_handler import DBHandler -from models import Screenshot +from models.assets import Screenshot from sqlalchemy import delete, select, update from sqlalchemy.orm import Session diff --git a/backend/handler/db_handler/db_states_handler.py b/backend/handler/db_handler/db_states_handler.py index 49caf9a21..a662ffafa 100644 --- a/backend/handler/db_handler/db_states_handler.py +++ b/backend/handler/db_handler/db_states_handler.py @@ -1,6 +1,6 @@ from decorators.database import begin_session from handler.db_handler import DBHandler -from models import State +from models.assets import State from sqlalchemy import and_, delete, select, update from sqlalchemy.orm import Session diff --git a/backend/handler/db_handler/db_stats_handler.py b/backend/handler/db_handler/db_stats_handler.py index f6c7d70a2..7e23918fd 100644 --- a/backend/handler/db_handler/db_stats_handler.py +++ b/backend/handler/db_handler/db_stats_handler.py @@ -1,6 +1,8 @@ from decorators.database import begin_session from handler.db_handler import DBHandler -from models import Platform, Rom, Save, Screenshot, State +from models.platform import Platform +from models.rom import Rom +from models.assets import Save, Screenshot, State from sqlalchemy import func, select from sqlalchemy.orm import Session diff --git a/backend/handler/db_handler/db_users_handler.py b/backend/handler/db_handler/db_users_handler.py index 6fccbb827..5950ae533 100644 --- a/backend/handler/db_handler/db_users_handler.py +++ b/backend/handler/db_handler/db_users_handler.py @@ -1,6 +1,6 @@ from decorators.database import begin_session from handler.db_handler import DBHandler -from models import Role, User +from models.user import Role, User from sqlalchemy import delete, select, update from sqlalchemy.orm import Session diff --git a/backend/handler/scan_handler.py b/backend/handler/scan_handler.py index cbab3bc5c..868a03576 100644 --- a/backend/handler/scan_handler.py +++ b/backend/handler/scan_handler.py @@ -1,11 +1,13 @@ import os from typing import Any - import emoji + from config.config_manager import config_manager as cm from handler import fsasseth, igdbh, fsresourceh, fsromh, dbplatformh from logger.logger import log -from models import Platform, Rom, Save, Screenshot, State +from models.platform import Platform +from models.rom import Rom +from models.assets import Save, Screenshot, State SWAPPED_PLATFORM_BINDINGS = dict( (v, k) for k, v in cm.config.PLATFORMS_BINDING.items() diff --git a/backend/handler/tests/conftest.py b/backend/handler/tests/conftest.py index 9ce825c7b..1fec44070 100644 --- a/backend/handler/tests/conftest.py +++ b/backend/handler/tests/conftest.py @@ -4,7 +4,10 @@ from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker from config.config_manager import ConfigManager -from models import Platform, Rom, User, Save, State, Screenshot +from models.platform import Platform +from models.rom import Rom +from models.user import User +from models.assets import Save, State, Screenshot from models.user import Role from handler import dbuserh, dbplatformh, dbromh, dbsaveh, dbstateh, authh, dbscreenshotsh diff --git a/backend/handler/tests/test_db_handler.py b/backend/handler/tests/test_db_handler.py index 1c653f62d..b1c7d8c47 100644 --- a/backend/handler/tests/test_db_handler.py +++ b/backend/handler/tests/test_db_handler.py @@ -1,8 +1,10 @@ from sqlalchemy.exc import IntegrityError # from handler.db_handler import DBHandler -from models import Platform, Rom, User, Save, State, Screenshot -from models.user import Role +from models.platform import Platform +from models.rom import Rom +from models.user import User, Role +from models.assets import Save, State, Screenshot from handler import authh, dbplatformh, dbromh, dbuserh, dbsaveh, dbstateh, dbscreenshotsh diff --git a/backend/models/__init__.py b/backend/models/__init__.py index d0445919a..e69de29bb 100644 --- a/backend/models/__init__.py +++ b/backend/models/__init__.py @@ -1,4 +0,0 @@ -from models.platform import Platform # noqa[401] -from models.rom import Rom # noqa[401] -from models.user import User, Role # noqa[401] -from models.assets import Save, State, Screenshot # noqa[401] diff --git a/backend/models/tests/test_assets.py b/backend/models/tests/test_assets.py index a84d285c4..401d318fb 100644 --- a/backend/models/tests/test_assets.py +++ b/backend/models/tests/test_assets.py @@ -1,4 +1,4 @@ -from models import Save, State, Screenshot +from models.assets import Save, State, Screenshot def test_save(save: Save): assert save.full_path == "test_platform_slug/saves/test_emulator/test_save.sav" diff --git a/backend/utils/tests/test_auth.py b/backend/utils/tests/test_auth.py index 99cb7f8f8..7226b0c2c 100644 --- a/backend/utils/tests/test_auth.py +++ b/backend/utils/tests/test_auth.py @@ -2,7 +2,7 @@ import pytest from base64 import b64encode from fastapi.exceptions import HTTPException -from models import User +from models.user import User from handler import authh, oauthh, dbuserh from handler.auth_handler import WRITE_SCOPES from handler.auth_handler.hybrid_auth import HybridAuthBackend diff --git a/backend/utils/tests/test_fastapi.py b/backend/utils/tests/test_fastapi.py index 57294c19d..80a1831bf 100644 --- a/backend/utils/tests/test_fastapi.py +++ b/backend/utils/tests/test_fastapi.py @@ -2,7 +2,8 @@ import pytest from handler.scan_handler import scan_platform, scan_rom from exceptions.fs_exceptions import RomsNotFoundException -from models import Platform, Rom +from models.platform import Platform +from models.rom import Rom @pytest.mark.vcr() diff --git a/backend/utils/tests/test_fs.py b/backend/utils/tests/test_fs.py index 83b1c9c4b..5eb42260e 100644 --- a/backend/utils/tests/test_fs.py +++ b/backend/utils/tests/test_fs.py @@ -2,7 +2,7 @@ import pytest from unittest.mock import patch from handler import fsresourceh, fsplatformh, fsromh -from models import Platform +from models.platform import Platform from config import DEFAULT_PATH_COVER_L, DEFAULT_PATH_COVER_S