Metadata-Version: 2.4
Name: project-service-byom
Version: 1.0.1
Summary: Project Service for Distributed Issue Tracker - Project lifecycle and team membership management with templates, archiving, and event-driven integrations
Author-email: om kumar sahu <omkumarsahu747@gmail.com>
Maintainer-email: om kumar sahu <omkumarsahu747@gmail.com>
License-Expression: CC-BY-NC-4.0
Project-URL: Homepage, https://github.com/omkumar01/Distributed-Issue-Tracker-FastAPI-Microservices-
Project-URL: Repository, https://github.com/omkumar01/Distributed-Issue-Tracker-FastAPI-Microservices-
Project-URL: Documentation, https://github.com/omkumar01/Distributed-Issue-Tracker-FastAPI-Microservices-/tree/master/services/project-service
Project-URL: Bug Tracker, https://github.com/omkumar01/Distributed-Issue-Tracker-FastAPI-Microservices-/issues
Keywords: fastapi,project-management,teams,membership,templates,microservices,collaboration
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Topic :: Internet :: WWW/HTTP
Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
Requires-Python: >=3.11
Description-Content-Type: text/markdown
Requires-Dist: fastapi==0.104.1
Requires-Dist: uvicorn[standard]==0.24.0
Requires-Dist: pydantic==2.5.0
Requires-Dist: pydantic-settings==2.1.0
Requires-Dist: pydantic[email]==2.5.0
Requires-Dist: sqlalchemy==2.0.23
Requires-Dist: psycopg2-binary==2.9.11
Requires-Dist: asyncpg==0.29.0
Requires-Dist: redis==5.0.1
Requires-Dist: httpx==0.25.2
Requires-Dist: python-jose[cryptography]==3.3.0
Requires-Dist: passlib[bcrypt]==1.7.4
Requires-Dist: python-multipart==0.0.6
Requires-Dist: celery==5.3.4
Requires-Dist: pika==1.3.2
Requires-Dist: elasticsearch==8.10.0
Requires-Dist: opentelemetry-api==1.21.0
Requires-Dist: opentelemetry-sdk==1.21.0
Requires-Dist: opentelemetry-exporter-jaeger==1.21.0
Requires-Dist: opentelemetry-instrumentation-fastapi==0.42b0
Requires-Dist: opentelemetry-instrumentation-sqlalchemy==0.42b0
Requires-Dist: opentelemetry-instrumentation-redis==0.42b0
Requires-Dist: alembic==1.13.1
Requires-Dist: python-dotenv==1.0.0

# Project Service

Project lifecycle and team membership management service for the issue tracker platform.

## Service Structure

```
src/
├── api/
│   ├── projects.py        # Project endpoints
│   ├── members.py         # Member endpoints
│   ├── permissions.py     # Permission endpoints
│   └── __init__.py        # Package exports
├── db/
│   ├── database.py        # Database connection
│   └── __init__.py        # Package exports
├── domain/
│   ├── project.py         # Project domain model
│   ├── membership.py      # Membership domain model
│   └── __init__.py        # Package exports
├── events/
│   ├── publish.py         # Event publishers
│   └── __init__.py        # Package exports
├── models/
│   ├── ProjectModel       # Project database model
│   ├── MembershipModel    # Membership database model
│   ├── ProjectSettingsModel # Project settings model
│   └── __init__.py        # Package exports
├── repositories/
│   ├── ProjectRepository  # Project CRUD operations
│   ├── MembershipRepository # Membership CRUD
│   ├── SettingsRepository # Settings CRUD
│   └── __init__.py        # Package exports
├── routers/
│   ├── project_router.py  # Project API routes
│   └── __init__.py        # Package exports
├── services/
│   ├── ProjectService     # Project business logic
│   ├── MembershipService  # Membership business logic
│   ├── PermissionService  # Permission business logic
│   └── __init__.py        # Package exports
├── database.py            # Database utilities
├── main.py                # FastAPI application entrypoint
└── __init__.py            # Package exports
```

## Features

### Project Management
- **Project CRUD**: Create, read, update, delete projects
- **Project Settings**: Customizable project configurations
- **Project Archiving**: Archive/restore projects
- **Project Templates**: Create projects from templates

### Team Membership
- **Member Management**: Add/remove team members
- **Role Assignment**: Assign roles within projects
- **Permission Matrix**: Fine-grained permissions per role
- **Invitation System**: Invite users to projects

### Event Integration
- **Project Events**: Publishes project.created, project.updated, project.deleted, project.archived
- **Membership Events**: Publishes member.added, member.removed, member.role_changed
- **Consumes Events**: Listens for user and auth events

## API Endpoints

### Projects

#### Create Project
```
POST /api/v1/projects
Content-Type: application/json

{
  "name": "Website Redesign",
  "description": "Redesign company website",
  "key": "WEB",
  "owner_id": "uuid",
  "settings": {
    "issue_types": ["bug", "feature", "task"],
    "workflow": "default"
  }
}
```

#### Get Project
```
GET /api/v1/projects/{project_id}

Response:
{
  "id": "uuid",
  "name": "Website Redesign",
  "description": "Redesign company website",
  "key": "WEB",
  "owner_id": "uuid",
  "is_archived": false,
  "settings": {...},
  "created_at": "2024-01-15T10:30:00Z",
  "updated_at": "2024-01-15T10:30:00Z"
}
```

#### Update Project
```
PATCH /api/v1/projects/{project_id}
Content-Type: application/json

{
  "name": "Website Redesign v2",
  "description": "Updated description"
}
```

#### Archive Project
```
POST /api/v1/projects/{project_id}/archive
```

#### Restore Project
```
POST /api/v1/projects/{project_id}/restore
```

#### Delete Project
```
DELETE /api/v1/projects/{project_id}
```

#### List Projects
```
GET /api/v1/projects?skip=0&limit=20&archived=false

Query Parameters:
- skip: int (default: 0)
- limit: int (default: 20, max: 100)
- archived: bool (default: false)
- owner_id: uuid (optional)
```

### Members

#### Add Member
```
POST /api/v1/projects/{project_id}/members
Content-Type: application/json

{
  "user_id": "uuid",
  "role": "developer"
}
```

#### Update Member Role
```
PATCH /api/v1/projects/{project_id}/members/{user_id}
Content-Type: application/json

{
  "role": "admin"
}
```

#### Remove Member
```
DELETE /api/v1/projects/{project_id}/members/{user_id}
```

#### List Members
```
GET /api/v1/projects/{project_id}/members
```

### Permissions

#### Get Project Permissions
```
GET /api/v1/projects/{project_id}/permissions
```

#### Check User Permission
```
GET /api/v1/projects/{project_id}/permissions/check?user_id={user_id}&permission=issues.write
```

## Configuration

Environment variables (in `.env`):
```env
# Service
SERVICE_NAME=project-service
SERVICE_VERSION=1.0.0
ENVIRONMENT=development

# Database
DATABASE_URL=postgresql+asyncpg://postgres:postgres_password@postgres:5432/issue_tracker

# Redis
REDIS_URL=redis://redis:6379/0

# RabbitMQ
RABBITMQ_URL=amqp://guest:guest@rabbitmq:5672/

# Observability
JAEGER_ENABLED=false
JAEGER_HOST=jaeger
JAEGER_PORT=6831
```

## Health Check
```
GET /health

Response:
{
  "status": "healthy",
  "service": "project-service",
  "version": "1.0.0"
}
```

## Development

### Running the Service
```bash
pip install -r requirements.txt
uvicorn src.main:app --reload --host 0.0.0.0 --port 8000

# Or using Docker
docker build -f Dockerfile -t project-service .
docker run -p 8003:8000 --env-file .env project-service
```

### Testing
```bash
pytest tests/
pytest --cov=src tests/
```
