{"id":29190844,"url":"https://github.com/bforbilly24/detectionpest-fastapi-backend-restapi","last_synced_at":"2026-04-13T22:34:42.254Z","repository":{"id":286290023,"uuid":"956643868","full_name":"bforbilly24/detectionpest-fastapi-backend-restapi","owner":"bforbilly24","description":"Backend for plant disease detection system due to caterpillar or insect bites","archived":false,"fork":false,"pushed_at":"2025-06-26T14:28:02.000Z","size":19948,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-06-26T15:29:23.486Z","etag":null,"topics":["alembic","classification","fastapi","postgresql","yolo"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bforbilly24.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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,"zenodo":null}},"created_at":"2025-03-28T15:52:39.000Z","updated_at":"2025-06-26T14:28:06.000Z","dependencies_parsed_at":"2025-06-26T15:42:17.352Z","dependency_job_id":null,"html_url":"https://github.com/bforbilly24/detectionpest-fastapi-backend-restapi","commit_stats":null,"previous_names":["bforbilly24/dectionpest-fastapi-backend-restapi","bforbilly24/detectionpest-fastapi-backend-restapi"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/bforbilly24/detectionpest-fastapi-backend-restapi","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bforbilly24%2Fdetectionpest-fastapi-backend-restapi","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bforbilly24%2Fdetectionpest-fastapi-backend-restapi/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bforbilly24%2Fdetectionpest-fastapi-backend-restapi/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bforbilly24%2Fdetectionpest-fastapi-backend-restapi/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bforbilly24","download_url":"https://codeload.github.com/bforbilly24/detectionpest-fastapi-backend-restapi/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bforbilly24%2Fdetectionpest-fastapi-backend-restapi/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":263052434,"owners_count":23406106,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["alembic","classification","fastapi","postgresql","yolo"],"created_at":"2025-07-02T00:12:07.099Z","updated_at":"2026-04-13T22:34:37.217Z","avatar_url":"https://github.com/bforbilly24.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Pest Detection FastAPI Backend\n\nBackend REST API untuk deteksi hama (belalang dan ulat) menggunakan FastAPI dan model YOLO. API ini menyediakan endpoint untuk upload gambar, deteksi hama, dan riwayat deteksi dengan pagination.\n\n## Prasyarat\n\n- **Python 3.11+**: Pastikan Python sudah terinstall (`python --version`).\n- **PostgreSQL**: Database untuk menyimpan data (opsional, bisa ganti SQLite).\n- **Git**: Untuk clone repository ini.\n\n## Struktur Proyek\n\n```\n└── 📁alembic\n        └── env.cpython-311.pyc\n    └── 📁versions\n            └── 8c7212f007b8_create_uploads_table.cpython-311.pyc\n        └── 8c7212f007b8_create_uploads_table.py\n    └── env.py\n    └── README\n    └── script.py.mako\n└── 📁src\n    └── 📁app\n        └── __init__.py\n            └── __init__.cpython-311.pyc\n        └── cli.py\n        └── 📁config\n                └── database.cpython-311.pyc\n            └── database.py\n            └── test_db.py\n        └── 📁controllers\n            └── 📁api\n                    └── AuthController.cpython-311.pyc\n                    └── DetectionController.cpython-311.pyc\n                └── AuthController.py\n                └── DetectionController.py\n        └── 📁models\n                └── AuthModel.cpython-311.pyc\n                └── UploadModel.cpython-311.pyc\n            └── AuthModel.py\n            └── UploadModel.py\n        └── 📁routes\n                └── v1.cpython-311.pyc\n            └── v1.py\n        └── 📁services\n                └── DetectionService.cpython-311.pyc\n                └── ServiceFactory.cpython-311.pyc\n            └── DetectionService.py\n            └── ServiceFactory.py\n    └── 📁ml_models\n        └── best.pt\n└── .env\n└── .gitignore\n└── alembic.ini\n└── LICENSE\n└── README.md\n└── requirements.txt\n```\n\n## Instalasi\n\n### 1. Clone Repository\n\nClone proyek ini ke lokal:\n\n```bash\ngit clone \u003crepository-url\u003e\ncd dectionpest-fastapi-backend-restapi\n```\n\n### 2. Buat Virtual Environment\n\n```bash\npython -m venv .venv\n```\n\n#### MacOS/Linux\n\n```bash\nsource .venv/bin/activate\n```\n\n#### Windows\n\n```bash\n.venv\\Scripts\\activate\n```\n\n### 3. Install Dependencies\n\n```bash\npip install -r requirements.txt\n```\n\n### 4. Setup Environment Variables\n\nBuat file .env di root proyek untuk konfigurasi environment:\n\n```bash\ncp .env.example .env\n```\n\nIsi dengan contoh:\n\n```bash\nDATABASE_URL=postgresql://postgres@localhost:5432/pest\nSECRET_KEY=d8Ywj4DCm8JoDocuPlcC8akDQuiIojLlVwGFYA40CUg=\n```\n\n- Ganti **DATABASE_URL** sesuai database kamu:\n  - SQLite: DATABASE_URL=sqlite:///app.db\n  - PostgreSQL: Sesuaikan username, password, dan nama database.\n- **SECRET_KEY** bisa digenerate ulang kalau perlu (untuk keamanan).\n\nBuat database pest:\n\n#### Jika pakai PostgreSQL\n\n```bash\npsql -U postgres -c \"CREATE DATABASE pest;\"\n```\n\n#### Jika pakai MySQL\n\n```bash\nmysql -u root -p\n```\n\n```bash\nCREATE DATABASE pest;\n```\n\n### 5. Inisialisasi Alembic\n\nAlembic digunakan untuk migrasi database. Inisialisasi Alembic:\n\n```bash\nalembic init alembic\n```\n\n- Ini akan buat folder alembic/ dan file alembic.ini.\n\n**Konfigurasi** alembic/env.py\nEdit alembic/env.py supaya terhubung ke model dan .env:\n\n```bash\nfrom logging.config import fileConfig\nimport os\nfrom sqlalchemy import engine_from_config, pool\nfrom alembic import context\nfrom dotenv import load_dotenv\n\nload_dotenv()\nconfig = context.config\nsqlalchemy_url = os.getenv(\"DATABASE_URL\")\nif sqlalchemy_url:\n    config.set_main_option(\"sqlalchemy.url\", sqlalchemy_url)\nelse:\n    raise ValueError(\"DATABASE_URL not found in .env\")\n\nif config.config_file_name is not None:\n    fileConfig(config.config_file_name)\n\nfrom src.app.models.UploadModel import Upload\nfrom src.app.config.database import Base\ntarget_metadata = Base.metadata\n\ndef run_migrations_offline() -\u003e None:\n    url = config.get_main_option(\"sqlalchemy.url\")\n    context.configure(\n        url=url,\n        target_metadata=target_metadata,\n        literal_binds=True,\n        dialect_opts={\"paramstyle\": \"named\"},\n    )\n    with context.begin_transaction():\n        context.run_migrations()\n\ndef run_migrations_online() -\u003e None:\n    connectable = engine_from_config(\n        config.get_section(config.config_ini_section, {}),\n        prefix=\"sqlalchemy.\",\n        poolclass=pool.NullPool,\n    )\n    with connectable.connect() as connection:\n        context.configure(\n            connection=connection,\n            target_metadata=target_metadata\n        )\n        with context.begin_transaction():\n            context.run_migrations()\n\nif context.is_offline_mode():\n    run_migrations_offline()\nelse:\n    run_migrations_online()\n```\n\n### 6. Buat Migrasi untuk Tabel uploads\n\nBuat file migrasi pertama:\n\n```bash\nalembic revision -m \"create uploads table\"\n```\n\nEdit file di alembic/versions/xxxxxxx_create_uploads_table.py:\n\n#### Jika pakai PostgreSQL\n\n```bash\n\"\"\"create uploads table\n\nRevision ID: xxxxxxx\nRevises:\nCreate Date: 2025-04-05 16:00:00\n\n\"\"\"\nfrom alembic import op\nimport sqlalchemy as sa\n\nrevision: str = 'xxxxxxx'\ndown_revision: Union[str, None] = None\nbranch_labels: Union[str, Sequence[str], None] = None\ndepends_on: Union[str, Sequence[str], None] = None\n\ndef upgrade():\n    op.create_table(\n        \"uploads\",\n        sa.Column(\"id\", sa.Integer, primary_key=True, index=True),\n        sa.Column(\"original_image\", sa.String, nullable=False),\n        sa.Column(\"detected_image\", sa.String, nullable=False),\n        sa.Column(\"detection_result\", sa.String, nullable=False),\n        sa.Column(\"created_at\", sa.DateTime, server_default=sa.func.now())\n    )\n\ndef downgrade():\n    op.drop_table(\"uploads\")\n```\n\n#### Jika pakai MySQL\n\n```bash\n\"\"\"create uploads table\n\nRevision ID: xxxxxxx\nRevises:\nCreate Date: 2025-04-05 17:00:00\n\n\"\"\"\nfrom alembic import op\nimport sqlalchemy as sa\n\nrevision: str = 'xxxxxxx'\ndown_revision: Union[str, None] = None\nbranch_labels: Union[str, Sequence[str], None] = None\ndepends_on: Union[str, Sequence[str], None] = None\n\ndef upgrade():\n    op.create_table(\n        \"uploads\",\n        sa.Column(\"id\", sa.Integer, primary_key=True, index=True),\n        sa.Column(\"original_image\", sa.String(255), nullable=False),\n        sa.Column(\"detected_image\", sa.String(255), nullable=False),\n        sa.Column(\"detection_result\", sa.Text, nullable=False),\n        sa.Column(\"created_at\", sa.DateTime, server_default=sa.func.now())\n    )\n\ndef downgrade():\n    op.drop_table(\"uploads\")\n```\n\n### 7. Jalankan Migrasi\n\nJalankan migrasi untuk buat tabel uploads:\n\n```bash\nalembic upgrade head\n```\n\nVerifikasi\nCek tabel di PostgreSQL:\n\n```bash\npsql -U postgres -d pest -c \"\\dt\"\n```\n\n### 8. Jalankan FastAPI\nJalankan aplikasi:\n\n```bash\nuvicorn src.app:app --reload\n```\n\nBuka browser di [http://localhost:8000/docs](http://localhost:8000/docs) untuk lihat Swagger UI.\n\n### 9. Tes Swagger\n\nDi Swagger UI (/docs):\n\n- Upload Gambar:\n  Endpoint: POST /api/v1/detect\n  Klik \"Try it out\", upload file gambar, pilih model_version (v1 atau v2), lalu \"Execute\".\n  Cek respons JSON dengan hasil deteksi.\n- Lihat Riwayat:\n  Endpoint: GET /api/v1/history\n  Tambah parameter page=1 dan limit=10, lalu \"Execute\".\n  Pastikan data muncul dengan pagination.\n- Detail Deteksi:\n  Endpoint: GET /api/v1/detect/{upload_id}\n  Masukkan ID dari upload sebelumnya.\n- Hapus Deteksi:\n  Endpoint: DELETE /api/v1/detect/{upload_id}\n  Masukkan ID untuk hapus data.\n\n## Troubleshooting\n\n\"Connection refused\": Pastikan PostgreSQL jalan dan DATABASE_URL benar.\n\"Module not found\": Cek path src.app.models.UploadModel sesuai struktur proyek.\nModel YOLO error: Pastikan file best.pt dan best_v2.pt ada di src/ml_models/.\n\n## Catatan\n\nTabel users akan ditambah di V2 dengan migrasi baru (Coming Soon).\nSimpan .env di .gitignore supaya aman.\n\n## Collaborators\n\n- [Muhammad Farhan Mustafa](https://github.com/farhanmustafa15)\n- [Muhammad Daniel Krisna Halim Putra](https://github.com/bforbilly24)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbforbilly24%2Fdetectionpest-fastapi-backend-restapi","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbforbilly24%2Fdetectionpest-fastapi-backend-restapi","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbforbilly24%2Fdetectionpest-fastapi-backend-restapi/lists"}