Skip to main content

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):

# 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

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

pytest tests/
pytest --cov=src tests/

Metadata

Release files for project-service-byom 1.0.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Built distribution (wheel)

Table of built distributions (wheels) for project-service-byom 1.0.1
File Interpreter ABI Platform Actions
project_service_byom-1.0.1-py3-none-any.whl Python 3 none any Details for project_service_byom-1.0.1-py3-none-any.whl

Release files / project_service_byom-1.0.1-py3-none-any.whl

Download URL project_service_byom-1.0.1-py3-none-any.whl
Size 16.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
671ea10cebd2d07c60e06999ce42bda09e7062a54b3a5ea50ce29f2d3a9be88e
BLAKE2b-256 checksum
How to use checksums
7d1875817156cdd6e2d438ec5b4a30b0aa4ed0826ab193bd2c64d0d45ea9edde
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 5, 2026.

Transparency log

Security for project-service-byom 1.0.1

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 1 file in this release has been uploaded with provenance metadata.

Attestation for project_service_byom-1.0.1-py3-none-any.whl

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 5, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

1.0.1 This release

1 release file Full provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page