diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml
new file mode 100644
index 0000000000..1a6a2143a6
--- /dev/null
+++ b/.github/workflows/dotnet.yml
@@ -0,0 +1,547 @@
+# This workflow will build a .NET project
+# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-net
+
+name: .NET
+
+on:
+ push:
+ branches: [ "main" ]
+ pull_request:
+ branches: [ "main" ]
+
+jobs:
+ build:
+
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@v4
+ - name: Setup .NET
+ uses: actions/setup-dotnet@v4
+ with:
+ dotnet-version: 8.0.x
+ - name: Restore dependencies
+ run: dotnet restore
+ - name: Build
+ run: dotnet build --no-restore
+ - name: Test
+ run: dotnet test --no-build --verbosity normal
+# 📦 Complete Technical Documentation Collection
+
+Berikut adalah kumpulan dokumentasi lengkap dari semua topik yang telah kita bahas. Semua panduan, konfigurasi, dan contoh kode telah disusun untuk memudahkan referensi Anda.
+
+---
+
+## 📱 1. Android CI Workflow (GitHub Actions)
+
+### **File: `.github/workflows/android-ci.yml`**
+
+```yaml
+name: Android CI
+
+on:
+ push:
+ branches: [ main, develop ]
+ pull_request:
+ branches: [ main, develop ]
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4
+
+ - name: Set up JDK 17
+ uses: actions/setup-java@v4
+ with:
+ java-version: '17'
+ distribution: 'temurin'
+
+ - name: Setup Android SDK
+ uses: android-actions/setup-android@v3
+
+ - name: Cache Gradle dependencies
+ uses: actions/cache@v3
+ with:
+ path: |
+ ~/.gradle/caches
+ ~/.gradle/wrapper
+ key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
+ restore-keys: |
+ ${{ runner.os }}-gradle-
+
+ - name: Make gradlew executable
+ run: chmod +x ./gradlew
+
+ - name: Build with Gradle
+ run: ./gradlew build
+
+ - name: Run tests
+ run: ./gradlew test
+
+ - name: Run instrumented tests
+ uses: reactivecircus/android-emulator-runner@v2
+ with:
+ api-level: 34
+ script: ./gradlew connectedCheck
+
+ - name: Upload test results
+ uses: actions/upload-artifact@v3
+ if: failure()
+ with:
+ name: test-results
+ path: app/build/reports/
+
+ lint:
+ runs-on: ubuntu-latest
+ needs: build
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4
+ - name: Set up JDK 17
+ uses: actions/setup-java@v4
+ - name: Cache Gradle
+ uses: actions/cache@v3
+ with:
+ path: |
+ ~/.gradle/caches
+ ~/.gradle/wrapper
+ key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
+ restore-keys: |
+ ${{ runner.os }}-gradle-
+ - name: Run lint
+ run: ./gradlew lint
+ - name: Upload lint results
+ uses: actions/upload-artifact@v3
+ if: always()
+ with:
+ name: lint-results
+ path: app/build/reports/lint/
+
+ security:
+ runs-on: ubuntu-latest
+ needs: build
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4
+ - name: Set up JDK 17
+ uses: actions/setup-java@v4
+ - name: Run dependency vulnerability check
+ run: ./gradlew dependencyCheckAnalyze
+ - name: Upload security report
+ uses: actions/upload-artifact@v3
+ if: always()
+ with:
+ name: security-report
+ path: app/build/reports/dependency-check-report.html
+```
+
+### **Dependencies (`app/build.gradle`)**
+
+```gradle
+plugins {
+ id 'com.android.application'
+ id 'org.owasp.dependencycheck' version '8.4.0'
+}
+
+android {
+ compileSdk 34
+ // ... your configuration
+}
+
+dependencies {
+ testImplementation 'junit:junit:4.13.2'
+ testImplementation 'org.robolectric:robolectric:4.10.3'
+ androidTestImplementation 'androidx.test.ext:junit:1.1.5'
+ androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
+}
+
+dependencyCheck {
+ suppressionFile = file("$project.rootDir/dependency-suppressions.xml")
+ analyzers { assemblyEnabled = false }
+}
+```
+
+### **Dependency Suppression File (`dependency-suppressions.xml`)**
+
+```xml
+
+
+
+
+```
+
+---
+
+## 🖥️ 2. Deploy Nuxt.js ke MS IIS
+
+### **Perbandingan SSG vs SSR**
+
+| Fitur | Static Site Generation (SSG) | Server-Side Rendering (SSR) |
+|-------|-------------------------------|------------------------------|
+| Kasus Penggunaan | Blog, marketing, konten statis | Aplikasi dinamis, konten personal |
+| Perintah Build | `npm run generate` | `npm run build` |
+| Folder Output | `dist/` | `.output/` atau `.nuxt/` |
+| Setup IIS | Arahkan ke folder `dist`; tanpa Node.js | Butuh **iisnode** dan `web.config` |
+| Kelebihan | Sederhana, cepat, skalabel | Fungsionalitas dinamis penuh |
+| Kekurangan | Tidak bisa konten dinamis real-time | Konfigurasi lebih kompleks |
+
+### **SSR Deployment dengan iisnode**
+
+**Prasyarat:**
+- Install [iisnode](https://github.com/Azure/iisnode)
+- Install [URL Rewrite Module](https://www.iis.net/downloads/microsoft/url-rewrite)
+
+**`nuxt.config.ts`**
+```typescript
+export default defineNuxtConfig({
+ ssr: true,
+ nitro: { preset: 'iis_node' }
+})
+```
+
+**Perintah Build**
+```bash
+npx nuxi build --preset=iis_node
+```
+
+**`web.config` (letakkan di root proyek)**
+```xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+**Catatan:** Jika menggunakan `nuxt.config.js` (CommonJS), ubah `export default` menjadi `module.exports`.
+
+### **Static Site Deployment (SSG)**
+```bash
+npm run generate
+# Deploy folder `dist/` ke IIS sebagai website statis.
+```
+
+### **Troubleshooting**
+- Aktifkan detailed errors di `web.config`:
+ ```xml
+
+
+
+
+ ```
+- Cek log iisnode di `C:\inetpub\logs\iisnode`
+- Tambahkan MIME type `.mjs` di IIS: `application/javascript`
+
+---
+
+## 🔔 3. Complete Guide to Managing Notifications
+
+### **Kategori & Channel Notifikasi**
+
+```javascript
+const NOTIFICATION_CATEGORIES = {
+ SECURITY: { id: 'security', name: 'Security Alerts', channels: ['push', 'email', 'sms'], priority: 'high', userControllable: false },
+ TRANSACTIONAL: { id: 'transactional', name: 'Transactions', channels: ['push', 'in_app', 'email'], priority: 'medium', userControllable: true },
+ MARKETING: { id: 'marketing', name: 'Promotions', channels: ['push', 'email', 'in_app'], priority: 'low', userControllable: true },
+ SYSTEM: { id: 'system', name: 'System Updates', channels: ['email', 'in_app'], priority: 'medium', userControllable: false },
+ SOCIAL: { id: 'social', name: 'Social Interactions', channels: ['push', 'in_app', 'email'], priority: 'low', userControllable: true }
+};
+```
+
+### **Manajemen Izin (Soft Ask + Hard Ask)**
+
+```javascript
+class PermissionManager {
+ async requestNotificationPermission() {
+ if (!this.shouldAskForPermission()) return 'denied';
+ const result = await this.softAsk();
+ if (result === 'interested') return await this.hardAsk();
+ return result;
+ }
+ // ... implementasi lengkap ada di pembahasan sebelumnya
+}
+```
+
+### **React Hooks untuk Notifikasi**
+
+```jsx
+// NotificationContext, useNotifications, NotificationStack, NotificationItem
+// (Lihat kode lengkap di bagian sebelumnya)
+```
+
+### **Backend Microservice (Node.js/Express)**
+
+```javascript
+const express = require('express');
+const router = express.Router();
+
+router.post('/send', async (req, res) => { /* kirim notifikasi */ });
+router.get('/preferences/:userId', async (req, res) => { /* ambil preferensi */ });
+router.put('/preferences/:userId', async (req, res) => { /* update preferensi */ });
+
+module.exports = router;
+```
+
+### **Skema Database (PostgreSQL)**
+
+```sql
+CREATE TABLE notifications (
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
+ user_id UUID NOT NULL,
+ type VARCHAR(50) NOT NULL,
+ category VARCHAR(50) NOT NULL,
+ title VARCHAR(255) NOT NULL,
+ message TEXT NOT NULL,
+ data JSONB,
+ channels VARCHAR(50)[] NOT NULL,
+ status VARCHAR(20) DEFAULT 'pending',
+ priority VARCHAR(20) DEFAULT 'medium',
+ scheduled_for TIMESTAMPTZ,
+ created_at TIMESTAMPTZ DEFAULT NOW()
+);
+
+CREATE TABLE notification_deliveries ( ... );
+CREATE TABLE user_notification_preferences ( ... );
+CREATE TABLE notification_templates ( ... );
+```
+
+### **Fitur Lanjutan**
+- **Smart Delivery Engine** – mengirim pada waktu optimal berdasarkan pola pengguna.
+- **A/B Testing Framework** – menguji variasi notifikasi.
+- **Analytics** – melacak pengiriman, buka, klik, konversi.
+- **Performance Monitoring** – mengukur waktu pengiriman dan error rate.
+- **Privacy & Compliance** – manajemen consent GDPR, rate limiting.
+
+---
+
+## 🐳 4. Devcontainer.json – Panduan Lengkap
+
+### **Apa itu Dev Container?**
+
+File konfigurasi (`.devcontainer/devcontainer.json`) yang mendefinisikan environment development berbasis container, digunakan oleh VS Code, GitHub Codespaces, dan Gitpod.
+
+### **Struktur Dasar**
+
+```json
+{
+ "name": "My Project",
+ "image": "node:18",
+ "features": {
+ "ghcr.io/devcontainers/features/git:1": {}
+ },
+ "extensions": ["dbaeumer.vscode-eslint"],
+ "settings": { "editor.formatOnSave": true },
+ "forwardPorts": [3000],
+ "postCreateCommand": "npm install",
+ "remoteUser": "node"
+}
+```
+
+### **Properti Penting**
+
+| Properti | Deskripsi |
+|----------|-----------|
+| `name` | Nama tampilan container |
+| `image` | Docker image yang digunakan |
+| `build` | Build custom Dockerfile |
+| `features` | Tambahkan tools (Docker-in-Docker, AWS CLI, dll.) |
+| `extensions` | Ekstensi VS Code |
+| `settings` | Pengaturan VS Code |
+| `forwardPorts` | Port yang diteruskan ke host |
+| `postCreateCommand` | Perintah setelah container dibuat |
+| `remoteUser` | User yang digunakan di dalam container |
+
+### **Contoh untuk Berbagai Stack**
+
+**Node.js**
+```json
+{
+ "name": "Node.js App",
+ "image": "node:18",
+ "extensions": ["dbaeumer.vscode-eslint"],
+ "postCreateCommand": "npm install"
+}
+```
+
+**Python**
+```json
+{
+ "name": "Python 3.10",
+ "image": "mcr.microsoft.com/devcontainers/python:3.10",
+ "extensions": ["ms-python.python"],
+ "postCreateCommand": "pip install -r requirements.txt"
+}
+```
+
+**Java**
+```json
+{
+ "name": "Java",
+ "image": "mcr.microsoft.com/devcontainers/java:17",
+ "features": {
+ "ghcr.io/devcontainers/features/java:1": {
+ "installMaven": true
+ }
+ }
+}
+```
+
+### **Best Practices**
+- Commit `devcontainer.json` ke repository.
+- Gunakan **features** daripada script kustom.
+- Tentukan versi image yang spesifik.
+- Uji dengan perintah `Remote-Containers: Rebuild Container`.
+
+---
+
+## 🔄 5. Rename `package-lock.json`
+
+### **Mengapa rename?**
+- Backup sebelum regenerasi.
+- Pindah package manager (misal ke Yarn).
+- Menonaktifkan sementara (tidak direkomendasikan).
+
+### **Perintah**
+
+**Linux/macOS/Git Bash**
+```bash
+mv package-lock.json package-lock.json.bak
+```
+
+**Windows Command Prompt**
+```cmd
+ren package-lock.json package-lock.json.bak
+```
+
+**Windows PowerShell**
+```powershell
+Rename-Item package-lock.json package-lock.json.bak
+```
+
+Setelah rename, jalankan `npm install` untuk membuat file baru. Kembalikan dengan `mv package-lock.json.bak package-lock.json` jika diperlukan.
+
+**⚠️ Catatan:** Tambahkan file backup ke `.gitignore`. Beri tahu tim agar tidak terjadi inkonsistensi.
+
+---
+
+## 🛠️ 6. .NET GitHub Workflow (dotnet.yml)
+
+### **File: `.github/workflows/dotnet.yml` (Basic)**
+
+```yaml
+name: .NET CI
+
+on:
+ push:
+ branches: [ main, develop ]
+ pull_request:
+ branches: [ main ]
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v4
+
+ - name: Setup .NET
+ uses: actions/setup-dotnet@v4
+ with:
+ dotnet-version: 8.0.x
+
+ - name: Restore dependencies
+ run: dotnet restore
+
+ - name: Build
+ run: dotnet build --configuration Release --no-restore
+
+ - name: Test
+ run: dotnet test --configuration Release --no-build --verbosity normal
+```
+
+### **Advanced Workflow (dengan cache, matrix, publish)**
+
+```yaml
+name: .NET CI/CD
+
+on:
+ push:
+ branches: [ main ]
+ pull_request:
+ branches: [ main ]
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+ strategy:
+ matrix:
+ dotnet-version: [ '6.0.x', '7.0.x', '8.0.x' ]
+
+ steps:
+ - uses: actions/checkout@v4
+
+ - name: Cache NuGet packages
+ uses: actions/cache@v3
+ with:
+ path: ~/.nuget/packages
+ key: ${{ runner.os }}-nuget-${{ hashFiles('**/*.csproj', '**/*.sln') }}
+ restore-keys: |
+ ${{ runner.os }}-nuget-
+
+ - name: Setup .NET ${{ matrix.dotnet-version }}
+ uses: actions/setup-dotnet@v4
+ with:
+ dotnet-version: ${{ matrix.dotnet-version }}
+
+ - name: Restore
+ run: dotnet restore
+
+ - name: Build
+ run: dotnet build --configuration Release --no-restore
+
+ - name: Test
+ run: dotnet test --configuration Release --no-build --verbosity normal
+
+ - name: Publish (if on main)
+ if: github.ref == 'refs/heads/main' && github.event_name == 'push'
+ run: dotnet publish --configuration Release --output ./publish
+
+ - name: Upload artifact
+ if: github.ref == 'refs/heads/main' && github.event_name == 'push'
+ uses: actions/upload-artifact@v4
+ with:
+ name: my-app-${{ matrix.dotnet-version }}
+ path: ./publish
+```
+
+### **Tips Troubleshooting**
+- Pastikan file `.yml` berada di `.github/workflows/`.
+- Cek versi .NET sesuai target project.
+- Jika restore gagal, periksa `nuget.config`.
+- Gunakan `--verbosity diag` untuk log lebih detail.
+
+---
+
+📌 **Semua dokumentasi di atas telah dirangkum dari percakapan sebelumnya. Jika ada bagian yang perlu diperjelas atau ditambahkan, silakan beri tahu!**