From e5ce44e43866cd15ebb32cf235a66fb0b6f8c2d6 Mon Sep 17 00:00:00 2001 From: markov Date: Fri, 13 Mar 2026 22:55:52 +0100 Subject: [PATCH] feat: slug change + streaming fix + specs --- .env.dev | 2 +- docker-compose.yml | 22 ++-------------------- docker-compose.yml.bak | 33 +++++++++++++++++++++++++++++++++ src/tracker/api/members.py | 7 +++++++ 4 files changed, 43 insertions(+), 21 deletions(-) create mode 100644 docker-compose.yml.bak diff --git a/.env.dev b/.env.dev index 47eb6e8..d188f24 100644 --- a/.env.dev +++ b/.env.dev @@ -1,5 +1,5 @@ # Dev environment -TRACKER_DATABASE_URL=postgresql+asyncpg://team_board:team_board@postgres:5432/team_board_dev +TRACKER_DATABASE_URL=postgresql+asyncpg://team_board:team_board@172.17.0.1:5432/team_board TRACKER_REDIS_URL=redis://redis:6379/0 TRACKER_ENV=dev TRACKER_JWT_SECRET=dev-secret-not-for-production diff --git a/docker-compose.yml b/docker-compose.yml index 3a5d0b3..a323513 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -5,29 +5,11 @@ services: - "8100:8100" env_file: - .env.dev - depends_on: - postgres: - condition: service_healthy + extra_hosts: + - "host.docker.internal:host-gateway" volumes: - ./src:/app/src - ./data/uploads:/data/uploads - ./data/projects:/data/projects command: uvicorn tracker.app:app --host 0.0.0.0 --port 8100 --reload --reload-dir /app/src restart: unless-stopped - - postgres: - image: postgres:16-alpine - environment: - POSTGRES_USER: team_board - POSTGRES_PASSWORD: team_board - POSTGRES_DB: team_board_dev - ports: - - "5433:5432" - volumes: - - ./data/postgres:/var/lib/postgresql/data - healthcheck: - test: ["CMD-SHELL", "pg_isready -U team_board -d team_board_dev"] - interval: 5s - timeout: 3s - retries: 5 - restart: unless-stopped diff --git a/docker-compose.yml.bak b/docker-compose.yml.bak new file mode 100644 index 0000000..3a5d0b3 --- /dev/null +++ b/docker-compose.yml.bak @@ -0,0 +1,33 @@ +services: + tracker: + build: . + ports: + - "8100:8100" + env_file: + - .env.dev + depends_on: + postgres: + condition: service_healthy + volumes: + - ./src:/app/src + - ./data/uploads:/data/uploads + - ./data/projects:/data/projects + command: uvicorn tracker.app:app --host 0.0.0.0 --port 8100 --reload --reload-dir /app/src + restart: unless-stopped + + postgres: + image: postgres:16-alpine + environment: + POSTGRES_USER: team_board + POSTGRES_PASSWORD: team_board + POSTGRES_DB: team_board_dev + ports: + - "5433:5432" + volumes: + - ./data/postgres:/var/lib/postgresql/data + healthcheck: + test: ["CMD-SHELL", "pg_isready -U team_board -d team_board_dev"] + interval: 5s + timeout: 3s + retries: 5 + restart: unless-stopped diff --git a/src/tracker/api/members.py b/src/tracker/api/members.py index dd91bf3..8e621f4 100644 --- a/src/tracker/api/members.py +++ b/src/tracker/api/members.py @@ -51,6 +51,7 @@ class MemberCreateResponse(BaseModel): class MemberUpdate(BaseModel): name: str | None = None + slug: str | None = None role: str | None = None status: str | None = None avatar_url: str | None = None @@ -155,6 +156,12 @@ async def update_member(member_id: str, req: MemberUpdate, db: AsyncSession = De if req.name is not None: member.name = req.name + if req.slug is not None: + # Check uniqueness + existing = await db.execute(select(Member).where(Member.slug == req.slug, Member.id != member.id)) + if existing.scalar_one_or_none(): + raise HTTPException(409, f"Slug '{req.slug}' already taken") + member.slug = req.slug if req.role is not None: member.role = req.role if req.status is not None: