Skip to content

Commit 1ef7468

Browse files
seed: add seed examples to database
1 parent e4d048e commit 1ef7468

4 files changed

Lines changed: 757 additions & 3 deletions

File tree

app/domains/live_chat/routers/chat_router.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ async def connect_to_conversation(
4646
)
4747
return
4848

49-
await ws.accept()
49+
await ws.accept(subprotocol="access_token")
5050
conn = ChatConnection(ws, response, user)
5151
joined = False
5252

app/seed/run_seed.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,37 @@
44

55
sys.path.insert(0, str(Path(__file__).resolve().parents[2]))
66

7+
from app.db.mongo.db import mongo_db
78
from app.db.postgres.engine import async_session
89
from app.seed import seed
10+
from app.seed.seed_examples import (
11+
seed_example_attendances,
12+
seed_example_conversations,
13+
seed_example_tickets,
14+
seed_example_user_roles,
15+
seed_example_users,
16+
)
917

1018

1119
async def run() -> None:
20+
# --- Postgres ---
1221
async with async_session() as db, db.begin():
1322
await seed.seed_roles(db)
1423
await seed.seed_permissions(db)
1524
await seed.seed_role_permissions(db)
25+
await seed.seed_users(db)
26+
await seed_example_users(db)
27+
await seed_example_user_roles(db)
28+
29+
# --- MongoDB ---
30+
await mongo_db.connect()
31+
try:
32+
mongo = mongo_db.get_db()
33+
await seed_example_attendances(mongo)
34+
await seed_example_tickets(mongo)
35+
await seed_example_conversations(mongo)
36+
finally:
37+
await mongo_db.disconnect()
1638

1739

1840
if __name__ == "__main__":

app/seed/seed.py

Lines changed: 62 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
1+
import secrets
2+
import string
3+
from typing import Any
4+
15
from sqlalchemy import insert, select
26
from sqlalchemy.dialects.postgresql import insert as pg_insert
37
from sqlalchemy.ext.asyncio import AsyncSession
48

5-
from app.domains.auth.models import Permission, Role, role_permissions
9+
from app.core.security import PasswordSecurity
10+
from app.domains.auth.models import Permission, Role, User, role_permissions, user_roles
611

712

813
async def seed_roles(session: AsyncSession) -> None:
@@ -62,7 +67,8 @@ async def seed_permissions(session: AsyncSession) -> None:
6267
{"name": "ticket:update_status", "description": "Update ticket status"},
6368
]
6469

65-
await session.execute(insert(Permission).values(permissions))
70+
insert_stmt = pg_insert(Permission).values(permissions).on_conflict_do_nothing()
71+
await session.execute(insert_stmt)
6672

6773

6874
async def seed_role_permissions(session: AsyncSession) -> None:
@@ -90,3 +96,57 @@ async def seed_role_permissions(session: AsyncSession) -> None:
9096
values = [{"role_id": role_id, "permission_id": perm_id} for perm_id in permission_ids]
9197
insert_stmt = pg_insert(role_permissions).values(values).on_conflict_do_nothing()
9298
await session.execute(insert_stmt)
99+
100+
101+
def generate_random_password(length: int = 16) -> str:
102+
alphabet = string.ascii_letters + string.digits + string.punctuation
103+
104+
while True:
105+
password = "".join(secrets.choice(alphabet) for _ in range(length))
106+
107+
if (
108+
any(c.islower() for c in password)
109+
and any(c.isupper() for c in password)
110+
and any(c.isdigit() for c in password)
111+
and any(c in string.punctuation for c in password)
112+
):
113+
return password
114+
115+
116+
async def seed_users(session: AsyncSession) -> None:
117+
password_security = PasswordSecurity()
118+
119+
admin_names: list[str] = ["angelina", "eduardo", "julia", "mafe", "pedro", "wesley"]
120+
default_password = "Admin@123!"
121+
users_payload: list[dict[str, Any]] = []
122+
123+
for name in admin_names:
124+
users_payload.append(
125+
{
126+
"email": f"{name}@syncdesk.pro",
127+
"password_hash": password_security.generate_password_hash(default_password),
128+
"username": name,
129+
"name": name,
130+
"must_change_password": False,
131+
"must_accept_terms": False
132+
}
133+
)
134+
135+
insert_stmt = pg_insert(User).values(users_payload).on_conflict_do_nothing()
136+
await session.execute(insert_stmt)
137+
138+
role_result = await session.execute(select(Role.id).where(Role.name == "admin"))
139+
admin_role_id = role_result.scalar_one_or_none()
140+
if admin_role_id is None:
141+
return
142+
143+
users_result = await session.execute(
144+
select(User.id).where(User.email.in_([user["email"] for user in users_payload]))
145+
)
146+
user_ids = users_result.scalars().all()
147+
if not user_ids:
148+
return
149+
150+
user_role_values = [{"user_id": user_id, "role_id": admin_role_id} for user_id in user_ids]
151+
role_insert_stmt = pg_insert(user_roles).values(user_role_values).on_conflict_do_nothing()
152+
await session.execute(role_insert_stmt)

0 commit comments

Comments
 (0)