From abe15a5197970c5e13f7a3643bd4a80f1510d4fe Mon Sep 17 00:00:00 2001
From: Syrine Neifar <syrine@greenhost.nl>
Date: Wed, 18 Jan 2023 15:56:20 +0100
Subject: [PATCH] Combine migrations into one

---
 backend/migrations/versions/27761560bbcb_.py  | 46 -----------
 .../3fa0c38ea1ac_add_velero_as_app.py         | 25 ------
 ...462d2d9d25_convert_role_column_to_table.py | 48 ------------
 .../versions/7d27395c892a_new_migration.py    | 69 +++++++++++++++++
 .../versions/b514cca2d47b_add_user_role.py    | 76 -------------------
 backend/migrations/versions/e08df0bef76f_.py  | 33 --------
 .../fc0892d07771_add_oauthclient_app_table.py | 39 ----------
 7 files changed, 69 insertions(+), 267 deletions(-)
 delete mode 100644 backend/migrations/versions/27761560bbcb_.py
 delete mode 100644 backend/migrations/versions/3fa0c38ea1ac_add_velero_as_app.py
 delete mode 100644 backend/migrations/versions/5f462d2d9d25_convert_role_column_to_table.py
 create mode 100644 backend/migrations/versions/7d27395c892a_new_migration.py
 delete mode 100644 backend/migrations/versions/b514cca2d47b_add_user_role.py
 delete mode 100644 backend/migrations/versions/e08df0bef76f_.py
 delete mode 100644 backend/migrations/versions/fc0892d07771_add_oauthclient_app_table.py

diff --git a/backend/migrations/versions/27761560bbcb_.py b/backend/migrations/versions/27761560bbcb_.py
deleted file mode 100644
index baa80e49..00000000
--- a/backend/migrations/versions/27761560bbcb_.py
+++ /dev/null
@@ -1,46 +0,0 @@
-"""empty message
-
-Revision ID: 27761560bbcb
-Revises: 
-Create Date: 2021-12-21 06:07:14.857940
-
-"""
-import sqlalchemy as sa
-from alembic import op
-
-# revision identifiers, used by Alembic.
-revision = "27761560bbcb"
-down_revision = None
-branch_labels = None
-depends_on = None
-
-
-def upgrade():
-    # ### commands auto generated by Alembic - please adjust! ###
-    op.create_table(
-        "app",
-        sa.Column("id", sa.Integer(), nullable=False),
-        sa.Column("name", sa.String(length=64), nullable=True),
-        sa.Column("slug", sa.String(length=64), nullable=True),
-        sa.PrimaryKeyConstraint("id"),
-        sa.UniqueConstraint("slug"),
-    )
-    op.create_table(
-        "app_role",
-        sa.Column("user_id", sa.String(length=64), nullable=False),
-        sa.Column("app_id", sa.Integer(), nullable=False),
-        sa.Column("role", sa.String(length=64), nullable=True),
-        sa.ForeignKeyConstraint(
-            ["app_id"],
-            ["app.id"],
-        ),
-        sa.PrimaryKeyConstraint("user_id", "app_id"),
-    )
-    # ### end Alembic commands ###
-
-
-def downgrade():
-    # ### commands auto generated by Alembic - please adjust! ###
-    op.drop_table("app_role")
-    op.drop_table("app")
-    # ### end Alembic commands ###
diff --git a/backend/migrations/versions/3fa0c38ea1ac_add_velero_as_app.py b/backend/migrations/versions/3fa0c38ea1ac_add_velero_as_app.py
deleted file mode 100644
index 5caae97d..00000000
--- a/backend/migrations/versions/3fa0c38ea1ac_add_velero_as_app.py
+++ /dev/null
@@ -1,25 +0,0 @@
-"""add-velero-as-app
-
-Revision ID: 3fa0c38ea1ac
-Revises: e08df0bef76f
-Create Date: 2022-10-13 09:40:44.290319
-
-"""
-from alembic import op
-import sqlalchemy as sa
-
-
-# revision identifiers, used by Alembic.
-revision = '3fa0c38ea1ac'
-down_revision = 'e08df0bef76f'
-branch_labels = None
-depends_on = None
-
-
-def upgrade():
-    # Add monitoring app
-    op.execute(f'INSERT IGNORE INTO app (`name`, `slug`) VALUES ("Velero","velero")')
-
-
-def downgrade():
-    pass
diff --git a/backend/migrations/versions/5f462d2d9d25_convert_role_column_to_table.py b/backend/migrations/versions/5f462d2d9d25_convert_role_column_to_table.py
deleted file mode 100644
index 53a8a1d5..00000000
--- a/backend/migrations/versions/5f462d2d9d25_convert_role_column_to_table.py
+++ /dev/null
@@ -1,48 +0,0 @@
-"""convert role column to table
-
-Revision ID: 5f462d2d9d25
-Revises: 27761560bbcb
-Create Date: 2022-04-13 15:00:27.182898
-
-"""
-from alembic import op
-import sqlalchemy as sa
-from sqlalchemy.dialects import mysql
-
-# revision identifiers, used by Alembic.
-revision = "5f462d2d9d25"
-down_revision = "27761560bbcb"
-branch_labels = None
-depends_on = None
-
-
-def upgrade():
-    # ### commands auto generated by Alembic - please adjust! ###
-    role_table = op.create_table(
-        "role",
-        sa.Column("id", sa.Integer(), nullable=False),
-        sa.Column("name", sa.String(length=64), nullable=True),
-        sa.PrimaryKeyConstraint("id"),
-    )
-    op.add_column("app_role", sa.Column("role_id", sa.Integer(), nullable=True))
-    op.create_foreign_key(None, "app_role", "role", ["role_id"], ["id"])
-    # ### end Alembic commands ###
-
-    # Insert default role "admin" as ID 1
-    op.execute(sa.insert(role_table).values(id=1,name="admin"))
-    # Set role_id 1 to all current "admin" users
-    op.execute("UPDATE app_role SET role_id = 1 WHERE role = 'admin'")
-
-    # Drop old column
-    op.drop_column("app_role", "role")
-
-
-def downgrade():
-    # ### commands auto generated by Alembic - please adjust! ###
-    op.add_column(
-        "app_role", sa.Column("role", mysql.VARCHAR(length=64), nullable=True)
-    )
-    op.drop_constraint(None, "app_role", type_="foreignkey")
-    op.drop_column("app_role", "role_id")
-    op.drop_table("role")
-    # ### end Alembic commands ###
diff --git a/backend/migrations/versions/7d27395c892a_new_migration.py b/backend/migrations/versions/7d27395c892a_new_migration.py
new file mode 100644
index 00000000..35590b09
--- /dev/null
+++ b/backend/migrations/versions/7d27395c892a_new_migration.py
@@ -0,0 +1,69 @@
+"""empty message
+
+Revision ID: 7d27395c892a
+Revises:
+Create Date: 2023-01-18 14:48:23.996261
+
+"""
+from alembic import op
+import sqlalchemy as sa
+from sqlalchemy.dialects import mysql
+
+# revision identifiers, used by Alembic.
+revision = '7d27395c892a'
+down_revision = None
+branch_labels = None
+depends_on = None
+
+def upgrade():
+
+    op.create_table(
+        "app",
+        sa.Column("id", sa.Integer(), nullable=False),
+        sa.Column("name", sa.String(length=64), nullable=True),
+        sa.Column("slug", sa.String(length=64), nullable=True),
+        sa.Column('external', sa.Boolean(), server_default='0', nullable=False),
+        sa.Column('url', sa.String(length=128), nullable=True),
+        sa.PrimaryKeyConstraint("id"),
+        sa.UniqueConstraint("slug"),
+    )
+
+    op.create_table(
+        "app_role",
+        sa.Column("user_id", sa.String(length=64), nullable=False),
+        sa.Column("app_id", sa.Integer(), nullable=False),
+        sa.Column("role_id", sa.Integer(), nullable=True),
+        sa.ForeignKeyConstraint(
+            ["app_id"],
+            ["app.id"],
+        ),
+        sa.PrimaryKeyConstraint("user_id", "app_id"),
+    )
+
+    role_table = op.create_table(
+        "role",
+        sa.Column("id", sa.Integer(), nullable=False),
+        sa.Column("name", sa.String(length=64), nullable=True),
+        sa.PrimaryKeyConstraint("id"),
+    )
+
+    op.create_foreign_key(None, "app_role", "role", ["role_id"], ["id"])
+
+    op.execute("INSERT INTO `role` (id, `name`) VALUES (1, 'admin')")
+    op.execute("INSERT INTO `role` (id, `name`) VALUES (2, 'user')")
+    op.execute("INSERT INTO `role` (id, `name`) VALUES (3, 'no access')")
+
+    oauthclient_app_table = op.create_table('oauthclient_app',
+        sa.Column('oauthclient_id', mysql.VARCHAR(length=64), nullable=False),
+        sa.Column('app_id', mysql.INTEGER(display_width=11), autoincrement=False, nullable=False),
+        sa.ForeignKeyConstraint(['app_id'], ['app.id'], name='oauthclient_app_fk_app_id'),
+        sa.PrimaryKeyConstraint('oauthclient_id'),
+        mysql_default_charset='utf8mb3',
+        mysql_engine='InnoDB'
+    )
+
+def downgrade():
+    op.drop_table("role")
+    op.drop_table("app_role")
+    op.drop_table("app")
+    op.drop_table('oauthclient_app')
diff --git a/backend/migrations/versions/b514cca2d47b_add_user_role.py b/backend/migrations/versions/b514cca2d47b_add_user_role.py
deleted file mode 100644
index 05869420..00000000
--- a/backend/migrations/versions/b514cca2d47b_add_user_role.py
+++ /dev/null
@@ -1,76 +0,0 @@
-"""update apps and add 'user' and 'no access' role
-
-Revision ID: b514cca2d47b
-Revises: 5f462d2d9d25
-Create Date: 2022-06-08 17:24:51.305129
-
-"""
-from alembic import op
-import sqlalchemy as sa
-
-# revision identifiers, used by Alembic.
-revision = 'b514cca2d47b'
-down_revision = '5f462d2d9d25'
-branch_labels = None
-depends_on = None
-
-
-def upgrade():
-    # ### end Alembic commands ###
-
-    # Check and update app table in DB
-    apps = {
-        "dashboard": "Dashboard",
-        "wekan": "Wekan",
-        "wordpress": "WordPress",
-        "nextcloud": "Nextcloud",
-        "zulip": "Zulip"
-    }
-    # app table
-    app_table = sa.table('app', sa.column('id', sa.Integer), sa.column(
-        'name', sa.String), sa.column('slug', sa.String))
-
-    existing_apps = op.get_bind().execute(app_table.select()).fetchall()
-    existing_app_slugs = [app['slug'] for app in existing_apps]
-    for app_slug in apps.keys():
-        if app_slug in existing_app_slugs:
-            op.execute(f'UPDATE app SET `name` = "{apps.get(app_slug)}" WHERE slug = "{app_slug}"')
-        else:
-            op.execute(f'INSERT INTO app (`name`, slug) VALUES ("{apps.get(app_slug)}","{app_slug}")')
-
-    # Fetch all apps including newly created
-    existing_apps = op.get_bind().execute(app_table.select()).fetchall()
-    # Insert role "user" as ID 2
-    op.execute("INSERT INTO `role` (id, `name`) VALUES (2, 'user')")
-    # Insert role "no access" as ID 3
-    op.execute("INSERT INTO `role` (id, `name`) VALUES (3, 'no access')")
-    # Set role_id 2 to all current "user" users which by have NULL role ID
-    op.execute("UPDATE app_role SET role_id = 2 WHERE role_id IS NULL")
-
-    # Add 'no access' role for all users that don't have any roles for specific apps
-    app_roles_table = sa.table('app_role', sa.column('user_id', sa.String), sa.column(
-        'app_id', sa.Integer), sa.column('role_id', sa.Integer))
-    
-    app_ids = [app['id'] for app in existing_apps]
-    app_roles = op.get_bind().execute(app_roles_table.select()).fetchall()
-    user_ids = set([app_role['user_id'] for app_role in app_roles])
-
-    for user_id in user_ids:
-        existing_user_app_ids = [x['app_id'] for x in list(filter(lambda role: role['user_id'] == user_id, app_roles))]
-        missing_user_app_ids = [x for x in app_ids if x not in existing_user_app_ids]
-
-        if len(missing_user_app_ids) > 0:
-            values = [{'user_id': user_id, 'app_id': app_id, 'role_id': 3} for app_id in missing_user_app_ids]
-            op.bulk_insert(app_roles_table, values)
-
-
-def downgrade():
-    # Revert all users role_id to NULL where role is 'user'
-    op.execute("UPDATE app_role SET role_id = NULL WHERE role_id = 2")
-    # Delete role 'user' from roles
-    op.execute("DELETE FROM `role` WHERE id = 2")
-
-    # Delete all user app roles where role is 'no access' with role_id 3
-    op.execute("DELETE FROM app_role WHERE role_id = 3")
-    # Delete role 'no access' from roles
-    op.execute("DELETE FROM `role` WHERE id = 3")
diff --git a/backend/migrations/versions/e08df0bef76f_.py b/backend/migrations/versions/e08df0bef76f_.py
deleted file mode 100644
index 005833fb..00000000
--- a/backend/migrations/versions/e08df0bef76f_.py
+++ /dev/null
@@ -1,33 +0,0 @@
-"""Add fields for external apps
-
-Revision ID: e08df0bef76f
-Revises: b514cca2d47b
-Create Date: 2022-09-23 16:38:06.557307
-
-"""
-from alembic import op
-import sqlalchemy as sa
-
-
-# revision identifiers, used by Alembic.
-revision = 'e08df0bef76f'
-down_revision = 'b514cca2d47b'
-branch_labels = None
-depends_on = None
-
-
-def upgrade():
-    # ### commands auto generated by Alembic - please adjust! ###
-    op.add_column('app', sa.Column('external', sa.Boolean(), server_default='0', nullable=False))
-    op.add_column('app', sa.Column('url', sa.String(length=128), nullable=True))
-    # ### end Alembic commands ###
-
-    # Add monitoring app
-    op.execute(f'INSERT IGNORE INTO app (`name`, `slug`) VALUES ("Monitoring","monitoring")')
-
-
-def downgrade():
-    # ### commands auto generated by Alembic - please adjust! ###
-    op.drop_column('app', 'url')
-    op.drop_column('app', 'external')
-    # ### end Alembic commands ###
diff --git a/backend/migrations/versions/fc0892d07771_add_oauthclient_app_table.py b/backend/migrations/versions/fc0892d07771_add_oauthclient_app_table.py
deleted file mode 100644
index be0ddf02..00000000
--- a/backend/migrations/versions/fc0892d07771_add_oauthclient_app_table.py
+++ /dev/null
@@ -1,39 +0,0 @@
-"""Add oauthclient_app table
-
-Revision ID: fc0892d07771
-Revises: 3fa0c38ea1ac
-Create Date: 2022-11-02 09:52:09.510764
-
-"""
-from alembic import op
-import sqlalchemy as sa
-from sqlalchemy.dialects import mysql
-
-# revision identifiers, used by Alembic.
-revision = 'fc0892d07771'
-down_revision = '3fa0c38ea1ac'
-branch_labels = None
-depends_on = None
-
-
-def upgrade():
-    oauthclient_app_table = op.create_table('oauthclient_app',
-        sa.Column('oauthclient_id', mysql.VARCHAR(length=64), nullable=False),
-        sa.Column('app_id', mysql.INTEGER(display_width=11), autoincrement=False, nullable=False),
-        sa.ForeignKeyConstraint(['app_id'], ['app.id'], name='oauthclient_app_fk_app_id'),
-        sa.PrimaryKeyConstraint('oauthclient_id'),
-        mysql_default_charset='utf8mb3',
-        mysql_engine='InnoDB'
-    )
-    values = [
-        {"oauthclient_id": "dashboard"            , "app_id": 1},
-        {"oauthclient_id": "wekan"                , "app_id": 2},
-        {"oauthclient_id": "wordpress"            , "app_id": 3},
-        {"oauthclient_id": "nextcloud"            , "app_id": 4},
-        {"oauthclient_id": "zulip"                , "app_id": 5},
-        {"oauthclient_id": "kube-prometheus-stack", "app_id": 6},
-    ]
-    op.bulk_insert(oauthclient_app_table, values)
-
-def downgrade():
-    op.drop_table('oauthclient_app')
-- 
GitLab