"""
refactor: create 'group_resources' table.
"""
import uuid
import random
import string
import sqlite3
from yoyo import step
__depends__ = {'20230907_03_BwAmf-refactor-drop-group-id-from-resources-table'}
def randstr(length: int = 5):
"""Generate random string."""
return "".join(random.choices(
string.ascii_letters + string.digits, k=length))
def create_and_link_resources_for_existing_groups(conn):
conn.row_factory = sqlite3.Row
cursor = conn.cursor()
cursor.execute("SELECT group_id, group_name FROM groups")
resources = tuple({
"group_id": row["group_id"],
"resource_id": str(uuid.uuid4()),
"resource_name": f"{randstr(10)}: {row['group_name']}",
"resource_category_id": "1e0f70ee-add5-4358-8c6c-43de77fa4cce"
} for row in cursor.fetchall())
cursor.executemany(
"INSERT INTO "
"resources(resource_id, resource_name, resource_category_id) "
"VALUES (:resource_id, :resource_name, :resource_category_id)",
resources)
cursor.executemany(
"INSERT INTO group_resources(resource_id, group_id) "
"VALUES (:resource_id, :group_id)",
resources)
steps = [
step(
"""
CREATE TABLE IF NOT EXISTS group_resources(
-- Links groups to the resources of type 'group' that control access to
-- each group
resource_id TEXT NOT NULL,
group_id TEXT NOT NULL,
PRIMARY KEY(resource_id, group_id),
FOREIGN KEY (resource_id)
REFERENCES resources(resource_id)
ON UPDATE CASCADE ON DELETE RESTRICT,
FOREIGN KEY (group_id)
REFERENCES groups(group_id)
ON UPDATE CASCADE ON DELETE RESTRICT
) WITHOUT ROWID
""",
"DROP TABLE IF EXISTS group_resources"),
step(create_and_link_resources_for_existing_groups)
]