{"id":30313870,"url":"https://github.com/ilramdhan/holidayapi","last_synced_at":"2025-08-17T18:52:24.687Z","repository":{"id":310295506,"uuid":"1039380997","full_name":"ilramdhan/holidayApi","owner":"ilramdhan","description":"Holiday API Indonesia 🇮🇩 API untuk mendapatkan informasi hari libur nasional dan cuti bersama Indonesia berdasarkan SKB 3 Menteri.","archived":false,"fork":false,"pushed_at":"2025-08-17T05:10:22.000Z","size":0,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-08-17T05:37:06.326Z","etag":null,"topics":["api","go","golang","golang-api","golang-examples","holiday-api","holidays-api"],"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/ilramdhan.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-08-17T05:09:58.000Z","updated_at":"2025-08-17T05:12:16.000Z","dependencies_parsed_at":"2025-08-17T05:37:14.509Z","dependency_job_id":"746c86d4-f95a-4f69-bbe8-f20434e1d0e1","html_url":"https://github.com/ilramdhan/holidayApi","commit_stats":null,"previous_names":["ilramdhan/holidayapi"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/ilramdhan/holidayApi","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ilramdhan%2FholidayApi","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ilramdhan%2FholidayApi/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ilramdhan%2FholidayApi/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ilramdhan%2FholidayApi/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ilramdhan","download_url":"https://codeload.github.com/ilramdhan/holidayApi/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ilramdhan%2FholidayApi/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":270892209,"owners_count":24663543,"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-08-17T02:00:09.016Z","response_time":129,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","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":["api","go","golang","golang-api","golang-examples","holiday-api","holidays-api"],"created_at":"2025-08-17T18:52:18.601Z","updated_at":"2025-08-17T18:52:24.618Z","avatar_url":"https://github.com/ilramdhan.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Holiday API Indonesia 🇮🇩\n\nAPI untuk mendapatkan informasi hari libur nasional dan cuti bersama Indonesia berdasarkan SKB 3 Menteri.\n\n## ✨ Features\n\n### 🔐 **Authentication \u0026 Security**\n- ✅ **JWT Authentication** dengan access \u0026 refresh tokens\n- ✅ **Role-Based Access Control (RBAC)** - Super Admin \u0026 Admin roles\n- ✅ **User Management** - Registration, login, profile management\n- ✅ **Password Security** - Bcrypt hashing dengan password policy\n- ✅ **Comprehensive Audit Logging** - Track semua user actions\n- ✅ **Security Headers** - XSS, CSRF, Content Security Policy protection\n- ✅ **Input Sanitization** - Protection dari injection attacks\n- ✅ **Enhanced Rate Limiting** - Per-user rate limiting\n\n### 🚀 **API Features**\n- ✅ **REST API** dengan versioning (v1)\n- ✅ **CRUD operations** untuk admin (JWT protected)\n- ✅ **Filter berdasarkan jenis** holiday (libur nasional, cuti bersama, atau keduanya)\n- ✅ **Filter berdasarkan periode** (tahun, bulan, hari)\n- ✅ **Swagger documentation** dengan authentication\n- ✅ **SQLite database** (pure Go, no CGO required)\n- ✅ **Comprehensive logging** dengan structured format\n- ✅ **Input validation** dengan custom validators\n- ✅ **Docker support** dengan production-ready configuration\n- ✅ **Unit \u0026 Integration tests** dengan mocking\n\n## 🚀 Quick Start\n\n### Prerequisites\n- Go 1.21 or higher\n- Git\n\n### Installation \u0026 Running\n\n1. **Clone the repository**\n```bash\ngit clone \u003crepository-url\u003e\ncd holidayApi\n```\n\n2. **Install dependencies**\n```bash\ngo mod tidy\n```\n\n3. **Run the application**\n\n**Option 1: Using Go directly**\n```bash\n# Windows\nscripts/run.bat\n\n# Linux/Mac\nchmod +x scripts/run.sh\n./scripts/run.sh\n```\n\n**Option 2: Using environment variables**\n```bash\nexport SERVER_HOST=localhost\nexport SERVER_PORT=8080\nexport DATABASE_PATH=./data/holidays.db\nexport MIGRATIONS_PATH=./migrations\nexport ADMIN_API_KEY=your-secret-key\n\ngo run cmd/server/main.go\n```\n\n**Option 3: Using Docker**\n```bash\ndocker-compose up --build\n```\n\n4. **Access the API**\n- **API Base URL**: http://localhost:8080/api/v1\n- **Swagger Documentation**: http://localhost:8080/swagger/index.html\n- **Health Check**: http://localhost:8080/health\n\n5. **Setup Admin User**\n```bash\n# First, create your admin user via API or database\n# See DEPLOYMENT.md for secure setup instructions\n```\n\n6. **Login \u0026 Get JWT Token**\n```bash\ncurl -X POST \"http://localhost:8080/api/v1/auth/login\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"username\": \"your-admin-username\",\n    \"password\": \"your-secure-password\"\n  }'\n```\n\n## 📋 API Endpoints\n\n### 🔓 **Public Endpoints (No Authentication Required)**\n```\nGET /api/v1/holidays                    - Get all holidays with filters\nGET /api/v1/holidays/year/{year}        - Get holidays by year\nGET /api/v1/holidays/month/{year}/{month} - Get holidays by month\nGET /api/v1/holidays/today              - Get today's holiday (if any)\nGET /api/v1/holidays/this-year          - Get holidays for current year\nGET /api/v1/holidays/this-month         - Get holidays for current month\nGET /api/v1/holidays/upcoming           - Get upcoming holidays\nGET /health                             - Health check endpoint\n```\n\n### 🔐 **Authentication Endpoints**\n```\nPOST /api/v1/auth/login                 - User login (get JWT tokens)\nPOST /api/v1/auth/refresh               - Refresh access token\nGET  /api/v1/auth/profile               - Get user profile (JWT required)\nPOST /api/v1/auth/change-password       - Change password (JWT required)\nGET  /api/v1/auth/audit-logs            - Get my audit logs (JWT required)\n```\n\n### 👑 **Super Admin Only Endpoints**\n```\nPOST /api/v1/auth/register              - Register new user\nGET  /api/v1/auth/users                 - Get all users\nDELETE /api/v1/auth/users/{id}          - Delete user\n```\n\n### 🛡️ **Admin Endpoints (JWT Required - Admin/Super Admin)**\n```\nPOST /api/v1/admin/holidays             - Create new holiday\nGET  /api/v1/admin/holidays/{id}        - Get holiday by ID\nPUT  /api/v1/admin/holidays/{id}        - Update holiday\nDELETE /api/v1/admin/holidays/{id}      - Delete holiday\nGET  /api/v1/admin/audit-logs           - Get all audit logs\nGET  /api/v1/admin/audit-logs/user/{id} - Get user audit logs\n```\n\n## 🔧 Configuration\n\nEnvironment variables:\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `SERVER_HOST` | `localhost` | Server host |\n| `SERVER_PORT` | `8080` | Server port |\n| `DATABASE_PATH` | `./data/holidays.db` | SQLite database path |\n| `MIGRATIONS_PATH` | `./migrations` | Database migrations path |\n| `RATE_LIMIT_RPM` | `60` | Rate limit requests per minute |\n| `RATE_LIMIT_BURST` | `10` | Rate limit burst size |\n| `JWT_SECRET_KEY` | `your-secret-key` | JWT signing secret key |\n| `JWT_ACCESS_TOKEN_TTL` | `15m` | Access token expiration time |\n| `JWT_REFRESH_TOKEN_TTL` | `168h` | Refresh token expiration time (7 days) |\n| `ADMIN_API_KEY` | `admin-secret-key` | Legacy admin API key (backward compatibility) |\n\n## 📖 Usage Examples\n\n### 🔓 **Public API Usage (No Authentication)**\n\n#### Get all holidays for 2024\n```bash\ncurl \"http://localhost:8080/api/v1/holidays/year/2024\"\n```\n\n#### Get only national holidays for 2024\n```bash\ncurl \"http://localhost:8080/api/v1/holidays/year/2024?type=national\"\n```\n\n#### Get today's holiday\n```bash\ncurl \"http://localhost:8080/api/v1/holidays/today\"\n```\n\n### 🔐 **Authentication Examples**\n\n#### 1. Login and get JWT tokens\n```bash\ncurl -X POST \"http://localhost:8080/api/v1/auth/login\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"username\": \"admin\",\n    \"password\": \"Admin123!\"\n  }'\n```\n\n**Response:**\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"user\": {\n      \"id\": 1,\n      \"username\": \"admin\",\n      \"role\": \"super_admin\"\n    },\n    \"access_token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\",\n    \"refresh_token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\",\n    \"expires_in\": 900,\n    \"token_type\": \"Bearer\"\n  }\n}\n```\n\n#### 2. Use JWT token for admin operations\n```bash\n# Save the access_token from login response\nACCESS_TOKEN=\"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\"\n\n# Create a new holiday\ncurl -X POST \"http://localhost:8080/api/v1/admin/holidays\" \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"name\": \"Hari Libur Khusus\",\n    \"date\": \"2024-12-31\",\n    \"type\": \"national\",\n    \"description\": \"Hari libur khusus akhir tahun\"\n  }'\n```\n\n#### 3. Get user profile\n```bash\ncurl -X GET \"http://localhost:8080/api/v1/auth/profile\" \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\"\n```\n\n#### 4. View audit logs\n```bash\ncurl -X GET \"http://localhost:8080/api/v1/admin/audit-logs\" \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\"\n```\n\n#### 5. Register new user (Super Admin only)\n```bash\ncurl -X POST \"http://localhost:8080/api/v1/auth/register\" \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"username\": \"newadmin\",\n    \"email\": \"newadmin@holidayapi.com\",\n    \"password\": \"NewAdmin123!\",\n    \"role\": \"admin\"\n  }'\n```\n\n## 🏗️ Project Structure\n\n```\nholidayapi/\n├── cmd/\n│   └── server/          # Application entrypoints\n├── internal/\n│   ├── config/          # Configuration\n│   ├── database/        # Database setup and migrations\n│   ├── handlers/        # HTTP handlers\n│   ├── middleware/      # HTTP middleware\n│   ├── models/          # Data models\n│   ├── repository/      # Data access layer\n│   └── services/        # Business logic\n├── pkg/\n│   └── utils/           # Shared utilities\n├── api/\n│   └── swagger/         # API documentation\n├── migrations/          # Database migrations\n├── scripts/             # Helper scripts\n└── docs/               # Additional documentation\n```\n\n## 🧪 Testing\n\n```bash\n# Run all tests\ngo test ./...\n\n# Run tests with coverage\ngo test -v -coverprofile=coverage.out ./...\ngo tool cover -html=coverage.out -o coverage.html\n\n# Run specific test\ngo test -v ./internal/services/\n```\n\n## 🐳 Docker\n\n```bash\n# Build and run with Docker Compose\ndocker-compose up --build\n\n# Build Docker image\ndocker build -t holidayapi .\n\n# Run Docker container\ndocker run -p 8080:8080 holidayapi\n```\n\n## 📚 Documentation\n\n- **API Documentation**: Available at `/swagger/index.html` when server is running\n- **Detailed API Guide**: See [docs/API.md](docs/API.md)\n\n## 🔒 Security Features\n\n### 🛡️ **Authentication \u0026 Authorization**\n- **JWT Authentication**: Secure token-based authentication\n- **Role-Based Access Control**: Super Admin, Admin roles with different permissions\n- **Password Security**: Bcrypt hashing with strong password policy\n- **Token Management**: Access tokens (15min) + Refresh tokens (7 days)\n- **Session Security**: Secure token validation and refresh mechanism\n\n### 🔐 **Security Middleware**\n- **Security Headers**: XSS protection, CSRF protection, Content Security Policy\n- **Input Sanitization**: Protection from XSS and injection attacks\n- **SQL Injection Protection**: Pattern detection and prevention\n- **Rate Limiting**: 60 requests per minute per user/IP\n- **CORS Protection**: Proper cross-origin resource sharing\n- **Request Validation**: Comprehensive input validation\n\n### 📊 **Audit \u0026 Monitoring**\n- **Comprehensive Audit Logging**: All user actions tracked\n- **Security Events**: Login attempts, failed authentications\n- **User Activity**: CRUD operations, system access\n- **Audit Trail**: User, IP, User-Agent, timestamp, success/failure status\n\n## 🎯 Holiday Types\n\n- **`national`**: Libur Nasional (National Holiday) - Berdasarkan SKB 3 Menteri\n- **`collective_leave`**: Cuti Bersama (Collective Leave) - Berdasarkan SKB 3 Menteri\n\n## 📅 Sample Data\n\nAPI sudah termasuk data hari libur Indonesia untuk tahun 2024-2025 berdasarkan SKB 3 Menteri:\n\n**Libur Nasional 2024:**\n- Tahun Baru Masehi (1 Januari)\n- Isra Mikraj (8 Februari)\n- Tahun Baru Imlek (10 Februari)\n- Hari Raya Nyepi (11 Maret)\n- Wafat Isa Almasih (29 Maret)\n- Hari Raya Idul Fitri (10-11 April)\n- Hari Buruh (1 Mei)\n- Kenaikan Isa Almasih (9 Mei)\n- Hari Raya Waisak (23 Mei)\n- Hari Lahir Pancasila (1 Juni)\n- Hari Raya Idul Adha (17 Juni)\n- Tahun Baru Islam (7 Juli)\n- HUT RI ke-79 (17 Agustus)\n- Maulid Nabi (16 September)\n- Hari Raya Natal (25 Desember)\n\n**Cuti Bersama 2024:**\n- Berbagai tanggal cuti bersama sesuai SKB 3 Menteri\n\n## 🤝 Contributing\n\n1. Fork the repository\n2. Create your feature branch (`git checkout -b feature/amazing-feature`)\n3. Commit your changes (`git commit -m 'Add some amazing feature'`)\n4. Push to the branch (`git push origin feature/amazing-feature`)\n5. Open a Pull Request\n\n## 📄 License\n\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.\n\n## 🙏 Acknowledgments\n\n- Data hari libur berdasarkan SKB 3 Menteri Republik Indonesia\n- Built with Go, Gin, SQLite, dan Swagger\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Filramdhan%2Fholidayapi","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Filramdhan%2Fholidayapi","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Filramdhan%2Fholidayapi/lists"}