{"id":29664928,"url":"https://github.com/atoktajuddin/clubwebdev_x_hacktiv8_assignment","last_synced_at":"2025-07-22T13:08:04.624Z","repository":{"id":304839107,"uuid":"1020202471","full_name":"AtokTajuddin/clubwebdev_X_hacktiv8_assignment","owner":"AtokTajuddin","description":null,"archived":false,"fork":false,"pushed_at":"2025-07-15T13:59:52.000Z","size":7818,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-07-16T07:06:36.705Z","etag":null,"topics":["go-backend","go-programming","go-programming-language","golang"],"latest_commit_sha":null,"homepage":"","language":"Go","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/AtokTajuddin.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-07-15T13:52:56.000Z","updated_at":"2025-07-15T13:59:56.000Z","dependencies_parsed_at":"2025-07-16T10:56:12.041Z","dependency_job_id":"2409bbf4-2fac-4d57-b8d1-bfb85f251e27","html_url":"https://github.com/AtokTajuddin/clubwebdev_X_hacktiv8_assignment","commit_stats":null,"previous_names":["atoktajuddin/clubwebdev_x_hacktiv8_assignment"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/AtokTajuddin/clubwebdev_X_hacktiv8_assignment","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AtokTajuddin%2Fclubwebdev_X_hacktiv8_assignment","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AtokTajuddin%2Fclubwebdev_X_hacktiv8_assignment/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AtokTajuddin%2Fclubwebdev_X_hacktiv8_assignment/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AtokTajuddin%2Fclubwebdev_X_hacktiv8_assignment/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/AtokTajuddin","download_url":"https://codeload.github.com/AtokTajuddin/clubwebdev_X_hacktiv8_assignment/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AtokTajuddin%2Fclubwebdev_X_hacktiv8_assignment/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266499704,"owners_count":23938909,"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","status":"online","status_checked_at":"2025-07-22T02:00:09.085Z","response_time":66,"last_error":null,"robots_txt_status":null,"robots_txt_updated_at":null,"robots_txt_url":"https://github.com/robots.txt","online":true,"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":["go-backend","go-programming","go-programming-language","golang"],"created_at":"2025-07-22T13:08:03.811Z","updated_at":"2025-07-22T13:08:04.616Z","avatar_url":"https://github.com/AtokTajuddin.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# E-Commerce REST API\n\nREST API sederhana untuk manajemen produk, sumber barang (supplier), dan transaksi penjualan menggunakan Golang dan Gin framework.\n\n## 🚀 Cara Menjalankan\n\n```bash\n# Install dependencies\ngo mod tidy\n\n# Jalankan server\ngo run main.go\n```\n\nServer akan berjalan di `http://localhost:8080`\n\n## 📋 Daftar Endpoint\n\n### 🛍️ Product Endpoints\n\n| Method | Endpoint | Deskripsi |\n|--------|----------|-----------|\n| GET | `/products` | Ambil semua produk |\n| GET | `/products/:id` | Ambil produk berdasarkan ID |\n| POST | `/products` | Tambah produk baru |\n| PUT | `/products/:id` | Update produk |\n| DELETE | `/products/:id` | Hapus produk |\n\n### 🏪 Source Endpoints\n\n| Method | Endpoint | Deskripsi |\n|--------|----------|-----------|\n| GET | `/sources` | Ambil semua source |\n| GET | `/sources/:id` | Ambil source berdasarkan ID |\n| POST | `/sources` | Tambah source baru |\n| PUT | `/sources/:id` | Update source |\n| DELETE | `/sources/:id` | Hapus source |\n\n### 💳 Transaction Endpoints\n\n| Method | Endpoint | Deskripsi |\n|--------|----------|-----------|\n| POST | `/transactions` | Buat transaksi baru |\n| GET | `/transactions` | Ambil semua transaksi |\n| GET | `/transactions/:id` | Ambil transaksi berdasarkan ID |\n\n## 📊 Struktur Data\n\n### Product\n```json\n{\n  \"id\": \"string\",\n  \"name\": \"string\",\n  \"description\": \"string\",\n  \"price\": 0,\n  \"stock\": 0,\n  \"source_id\": \"string\"\n}\n```\n\n### Source\n```json\n{\n  \"id\": \"string\",\n  \"name\": \"string\"\n}\n```\n\n### Transaction\n```json\n{\n  \"id\": \"string\",\n  \"product_id\": \"string\",\n  \"quantity\": 0,\n  \"total\": 0\n}\n```\n\n## 📝 Format Response\n\nSemua response menggunakan format yang konsisten:\n\n```json\n{\n  \"message\": \"string\",\n  \"data\": {},\n  \"error\": null\n}\n```\n\n## 🔧 Contoh Penggunaan\n\n### 1. Membuat Source Baru\n```bash\ncurl -X POST http://localhost:8080/sources \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"name\": \"Supplier C\"\n  }'\n```\n\n**Response:**\n```json\n{\n  \"message\": \"Source created successfully\",\n  \"data\": {\n    \"id\": \"3\",\n    \"name\": \"Supplier C\"\n  },\n  \"error\": null\n}\n```\n\n### 2. Membuat Product Baru\n```bash\ncurl -X POST http://localhost:8080/products \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"name\": \"Keyboard\",\n    \"description\": \"Mechanical keyboard\",\n    \"price\": 500000,\n    \"stock\": 25,\n    \"source_id\": \"1\"\n  }'\n```\n\n**Response:**\n```json\n{\n  \"message\": \"Product created successfully\",\n  \"data\": {\n    \"id\": \"3\",\n    \"name\": \"Keyboard\",\n    \"description\": \"Mechanical keyboard\",\n    \"price\": 500000,\n    \"stock\": 25,\n    \"source_id\": \"1\"\n  },\n  \"error\": null\n}\n```\n\n### 3. Membuat Transaksi\n```bash\ncurl -X POST http://localhost:8080/transactions \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"product_id\": \"1\",\n    \"quantity\": 2\n  }'\n```\n\n**Response:**\n```json\n{\n  \"message\": \"Transaction created successfully\",\n  \"data\": {\n    \"id\": \"1\",\n    \"product_id\": \"1\",\n    \"quantity\": 2,\n    \"total\": 30000000\n  },\n  \"error\": null\n}\n```\n\n### 4. Mengambil Semua Produk\n```bash\ncurl -X GET http://localhost:8080/products\n```\n\n**Response:**\n```json\n{\n  \"message\": \"Products retrieved successfully\",\n  \"data\": [\n    {\n      \"id\": \"1\",\n      \"name\": \"Laptop\",\n      \"description\": \"Gaming laptop\",\n      \"price\": 15000000,\n      \"stock\": 8,\n      \"source_id\": \"1\"\n    },\n    {\n      \"id\": \"2\",\n      \"name\": \"Mouse\",\n      \"description\": \"Wireless mouse\",\n      \"price\": 250000,\n      \"stock\": 50,\n      \"source_id\": \"2\"\n    }\n  ],\n  \"error\": null\n}\n```\n\n### 5. Filter Produk Berdasarkan Source\n```bash\ncurl -X GET \"http://localhost:8080/products?source_id=1\"\n```\n\n### 6. Update Produk\n```bash\ncurl -X PUT http://localhost:8080/products/1 \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"name\": \"Gaming Laptop Updated\",\n    \"description\": \"High-end gaming laptop\",\n    \"price\": 18000000,\n    \"stock\": 5,\n    \"source_id\": \"1\"\n  }'\n```\n\n### 7. Hapus Produk\n```bash\ncurl -X DELETE http://localhost:8080/products/1\n```\n\n## ✅ Validasi\n\n### Product\n- `name`: Tidak boleh kosong\n- `price`: Harus lebih besar dari 0\n- `stock`: Harus lebih besar atau sama dengan 0\n- `source_id`: Harus ada di daftar source\n\n### Source\n- `name`: Tidak boleh kosong\n\n### Transaction\n- `quantity`: Harus lebih besar dari 0\n- `product_id`: Harus ada di daftar produk\n- Stock produk harus mencukupi\n\n## 🚨 Error Handling\n\n### Status Code\n- `200`: Success\n- `201`: Created\n- `400`: Bad Request (validation error)\n- `404`: Not Found\n- `500`: Internal Server Error\n\n### Contoh Error Response\n```json\n{\n  \"message\": \"Validation failed\",\n  \"data\": null,\n  \"error\": \"Price must be greater than 0\"\n}\n```\n\n## 🔋 Fitur Bonus\n\n1. **Filter Produk**: Query parameter `source_id` untuk filter produk berdasarkan source\n2. **Validasi Lengkap**: Validasi untuk semua input\n3. **Konsistensi Response**: Format response yang konsisten\n4. **Logger Middleware**: Logging untuk setiap request\n\n## 📁 Struktur Project\n\n```\ne-commerce/\n├───products\n├───source\n├───transaction\n└───users\n```\n\n## 💡 Catatan Penting\n\n- Data disimpan di memory (tidak persisten)\n- Saat transaksi dibuat, stock produk akan berkurang otomatis\n- ID dihasilkan secara otomatis menggunakan counter\n- Semua endpoint menggunakan format response yang konsisten\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fatoktajuddin%2Fclubwebdev_x_hacktiv8_assignment","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fatoktajuddin%2Fclubwebdev_x_hacktiv8_assignment","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fatoktajuddin%2Fclubwebdev_x_hacktiv8_assignment/lists"}