{"id":27154800,"url":"https://github.com/josuejuca/api-pbx","last_synced_at":"2026-01-29T21:04:08.183Z","repository":{"id":264950655,"uuid":"865043656","full_name":"josuejuca/api-pbx","owner":"josuejuca","description":"API to manage FusionPBX with FastAPI (Python)","archived":false,"fork":false,"pushed_at":"2024-10-19T18:48:46.000Z","size":6,"stargazers_count":1,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-10-20T06:58:46.780Z","etag":null,"topics":["api-pbx","fusionpbx","fusionpbx-api"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/josuejuca.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-09-29T20:44:08.000Z","updated_at":"2024-10-19T18:48:50.000Z","dependencies_parsed_at":"2024-11-27T00:15:47.035Z","dependency_job_id":null,"html_url":"https://github.com/josuejuca/api-pbx","commit_stats":null,"previous_names":["josuejuca/api-pbx"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/josuejuca/api-pbx","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/josuejuca%2Fapi-pbx","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/josuejuca%2Fapi-pbx/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/josuejuca%2Fapi-pbx/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/josuejuca%2Fapi-pbx/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/josuejuca","download_url":"https://codeload.github.com/josuejuca/api-pbx/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/josuejuca%2Fapi-pbx/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28884752,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-29T19:55:09.949Z","status":"ssl_error","status_checked_at":"2026-01-29T19:55:08.490Z","response_time":59,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["api-pbx","fusionpbx","fusionpbx-api"],"created_at":"2025-04-08T18:43:41.504Z","updated_at":"2026-01-29T21:04:08.166Z","avatar_url":"https://github.com/josuejuca.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"### Estrutura do Projeto\n\n1. **Criação da Estrutura de Diretórios**\n   ```\n   fastapi-fusionpbx/\n   ├── main.py  # Arquivo principal da FastAPI\n   ├── models.py  # Modelos de dados (Pydantic e SQLAlchemy)\n   ├── database.py  # Configuração da conexão com o banco de dados\n   ├── crud.py  # Funções de CRUD (Create, Read, Update, Delete)\n   ├── schemas.py  # Schemas Pydantic para validação de dados\n   └── requirements.txt  # Dependências do projeto\n   ```\n\n2. **Instalar as Dependências**\n   Vamos usar `FastAPI`, `SQLAlchemy` e `psycopg2`. Crie um ambiente virtual e instale as dependências:\n\n   ```bash\n   mkdir fastapi-fusionpbx\n   cd fastapi-fusionpbx\n   python -m venv venv\n   source venv/bin/activate  # No Windows: venv\\Scripts\\activate\n   pip install fastapi uvicorn sqlalchemy psycopg2 pydantic\n   ```\n\n   Crie um arquivo `requirements.txt` com o seguinte conteúdo:\n\n   ```\n   fastapi\n   uvicorn\n   sqlalchemy\n   psycopg2\n   pydantic\n   ```\n\n3. **Configuração do Banco de Dados (`database.py`)**\n   Este arquivo irá configurar a conexão com o banco de dados PostgreSQL.\n\n   ```python\n   # database.py\n   from sqlalchemy import create_engine\n   from sqlalchemy.ext.declarative import declarative_base\n   from sqlalchemy.orm import sessionmaker\n\n   DATABASE_URL = \"postgresql://api:Josue191203#@localhost:5432/fusionpbx\"\n\n   engine = create_engine(DATABASE_URL)\n   SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)\n   Base = declarative_base()\n\n   # Dependência para obter a sessão do banco de dados\n   def get_db():\n       db = SessionLocal()\n       try:\n           yield db\n       finally:\n           db.close()\n   ```\n\n4. **Modelos e Schemas (`models.py` e `schemas.py`)**\n   Vamos definir os modelos de dados para representar a tabela `v_extensions`.\n\n   - `models.py`:\n   ```python\n   # models.py\n   from sqlalchemy import Column, String, Integer, Boolean, Text\n   from sqlalchemy.dialects.postgresql import UUID\n   from database import Base\n\n   class Extension(Base):\n       __tablename__ = \"v_extensions\"\n       \n       extension_uuid = Column(UUID(as_uuid=True), primary_key=True, index=True)\n       domain_uuid = Column(UUID(as_uuid=True), index=True)\n       extension = Column(String, index=True)\n       number_alias = Column(String, nullable=True)\n       password = Column(String, nullable=True)\n       accountcode = Column(String, nullable=True)\n       effective_caller_id_name = Column(String, nullable=True)\n       effective_caller_id_number = Column(String, nullable=True)\n       outbound_caller_id_name = Column(String, nullable=True)\n       outbound_caller_id_number = Column(String, nullable=True)\n       enabled = Column(Boolean, default=True)\n       description = Column(Text, nullable=True)\n   ```\n\n   - `schemas.py`:\n   ```python\n   # schemas.py\n   from pydantic import BaseModel\n   from typing import Optional\n   from uuid import UUID\n\n   class ExtensionBase(BaseModel):\n       extension: Optional[str]\n       number_alias: Optional[str]\n       password: Optional[str]\n       accountcode: Optional[str]\n       effective_caller_id_name: Optional[str]\n       effective_caller_id_number: Optional[str]\n       outbound_caller_id_name: Optional[str]\n       outbound_caller_id_number: Optional[str]\n       enabled: Optional[bool]\n       description: Optional[str]\n\n   class ExtensionCreate(ExtensionBase):\n       extension: str\n       password: str\n\n   class ExtensionUpdate(ExtensionBase):\n       pass\n\n   class Extension(ExtensionBase):\n       extension_uuid: UUID\n       domain_uuid: UUID\n\n       class Config:\n           orm_mode = True\n   ```\n\n5. **Funções CRUD (`crud.py`)**\n   Vamos criar funções para as operações de criar, ler, atualizar e excluir extensões.\n\n   ```python\n   # crud.py\n   from sqlalchemy.orm import Session\n   from models import Extension\n   from schemas import ExtensionCreate, ExtensionUpdate\n   from uuid import UUID\n\n   def get_extensions(db: Session, skip: int = 0, limit: int = 100):\n       return db.query(Extension).offset(skip).limit(limit).all()\n\n   def get_extension(db: Session, extension_uuid: UUID):\n       return db.query(Extension).filter(Extension.extension_uuid == extension_uuid).first()\n\n   def create_extension(db: Session, extension: ExtensionCreate):\n       db_extension = Extension(**extension.dict())\n       db.add(db_extension)\n       db.commit()\n       db.refresh(db_extension)\n       return db_extension\n\n   def update_extension(db: Session, extension_uuid: UUID, extension: ExtensionUpdate):\n       db_extension = get_extension(db, extension_uuid)\n       if db_extension:\n           for key, value in extension.dict(exclude_unset=True).items():\n               setattr(db_extension, key, value)\n           db.commit()\n           db.refresh(db_extension)\n       return db_extension\n\n   def delete_extension(db: Session, extension_uuid: UUID):\n       db_extension = get_extension(db, extension_uuid)\n       if db_extension:\n           db.delete(db_extension)\n           db.commit()\n       return db_extension\n   ```\n\n6. **API Principal (`main.py`)**\n   Este arquivo é o ponto de entrada da FastAPI.\n\n   ```python\n   # main.py\n   from fastapi import FastAPI, Depends, HTTPException\n   from sqlalchemy.orm import Session\n   from typing import List\n   from uuid import UUID\n\n   import models, schemas, crud\n   from database import engine, get_db\n\n   models.Base.metadata.create_all(bind=engine)\n\n   app = FastAPI()\n\n   @app.get(\"/extensions/\", response_model=List[schemas.Extension])\n   def read_extensions(skip: int = 0, limit: int = 100, db: Session = Depends(get_db)):\n       extensions = crud.get_extensions(db, skip=skip, limit=limit)\n       return extensions\n\n   @app.get(\"/extensions/{extension_uuid}\", response_model=schemas.Extension)\n   def read_extension(extension_uuid: UUID, db: Session = Depends(get_db)):\n       db_extension = crud.get_extension(db, extension_uuid)\n       if db_extension is None:\n           raise HTTPException(status_code=404, detail=\"Extension not found\")\n       return db_extension\n\n   @app.post(\"/extensions/\", response_model=schemas.Extension)\n   def create_extension(extension: schemas.ExtensionCreate, db: Session = Depends(get_db)):\n       return crud.create_extension(db, extension)\n\n   @app.put(\"/extensions/{extension_uuid}\", response_model=schemas.Extension)\n   def update_extension(extension_uuid: UUID, extension: schemas.ExtensionUpdate, db: Session = Depends(get_db)):\n       return crud.update_extension(db, extension_uuid, extension)\n\n   @app.delete(\"/extensions/{extension_uuid}\", response_model=schemas.Extension)\n   def delete_extension(extension_uuid: UUID, db: Session = Depends(get_db)):\n       return crud.delete_extension(db, extension_uuid)\n   ```\n\n7. **Executar a API**\n\n   Inicie o servidor FastAPI com o `uvicorn`:\n\n   ```bash\n   uvicorn main:app --reload --host 0.0.0.0 --port 8000\n   ```\n\n8. **Testar a API**\n\n   - Acesse `http://localhost:8000/docs` para ver a documentação interativa da API.\n   - Use os endpoints para listar, criar, atualizar e excluir extensões.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjosuejuca%2Fapi-pbx","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjosuejuca%2Fapi-pbx","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjosuejuca%2Fapi-pbx/lists"}