# Refactoring: Unified Approval Actions Implementation

## 🎯 **Overview**

Refactoring ini dilakukan untuk menyelaraskan implementasi approval actions dan menghilangkan duplikasi field message. Sekarang semua action menggunakan field yang sama dan dibedakan hanya berdasarkan `statusId`.

## 🔄 **Perubahan yang Dilakukan**

### **1. Service Layer Changes**

#### **Method yang Dihapus:**
- ✅ `RejectArticle(authToken string, flowId uint, rejectedById uint, reason string)`
- ✅ `RequestRevision(authToken string, flowId uint, requestedById uint, revisionMessage string)`

#### **Method yang Dipertahankan:**
- ✅ `ProcessApprovalAction(authToken string, flowId uint, action string, actionById uint, message string)`
- ✅ `processApproveAction()` - untuk action `approve`
- ✅ `processRequestUpdateAction()` - untuk action `revision`
- ✅ `processRejectAction()` - untuk action `reject`

### **2. Controller Layer Changes**

#### **Method yang Dihapus:**
- ✅ `Reject(c *fiber.Ctx) error`
- ✅ `RequestRevision(c *fiber.Ctx) error`

#### **Method yang Dipertahankan:**
- ✅ `ApproveArticleByFlow(c *fiber.Ctx) error` - menggunakan `ProcessApprovalAction`

### **3. Route Changes**

#### **Route yang Dihapus:**
- ✅ `PUT /article-approval-flows/{id}/reject`
- ✅ `PUT /article-approval-flows/{id}/request-revision`

#### **Route yang Dipertahankan:**
- ✅ `POST /article-approval-flows/articles/{articleId}/approve` - dengan action parameter

## 📊 **Field Unification**

### **Sebelum (Duplikasi Field):**
```go
// Untuk reject
flow.RejectionReason = &message

// Untuk revision
flow.RevisionMessage = &message
```

### **Sesudah (Field Unified):**
```go
// Untuk semua action
flow.RevisionMessage = &message

// Dibedakan berdasarkan statusId
switch action {
case "approve":
    // StatusId tetap atau naik step
case "revision":
    flow.StatusId = 4 // revision_requested
case "reject":
    flow.StatusId = 3 // rejected
}
```

## 🎯 **Action Types & Status Mapping**

| Action | StatusId | Field Used | Behavior |
|--------|----------|------------|----------|
| **`approve`** | 1 atau 2 | `RevisionMessage` | Naik ke step berikutnya |
| **`revision`** | 4 | `RevisionMessage` | Mundur 1 step |
| **`reject`** | 3 | `RevisionMessage` | Balik ke draft |

## 🔧 **Database Field Usage**

### **Unified Field:**
- **`revision_message`**: Digunakan untuk menyimpan pesan dari semua action types
- **`revision_requested`**: Boolean flag untuk revision (hanya untuk action `revision`)
- **`status_id`**: Pembeda utama antara approve/revision/reject

### **Status ID Values:**
- **1**: `pending` - Menunggu approval
- **2**: `approved` - Disetujui
- **3**: `rejected` - Ditolak
- **4**: `revision_requested` - Diminta revisi

## 🚀 **API Usage**

### **Single Endpoint untuk Semua Actions:**
```bash
POST /api/article-approval-flows/articles/{articleId}/approve
```

### **Request Body:**
```json
{
  "action": "approve|revision|reject",
  "message": "Your message here"
}
```

### **Examples:**

#### **Approve:**
```bash
curl -X POST "http://localhost:8080/api/article-approval-flows/articles/123/approve" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -d '{
    "action": "approve",
    "message": "Content looks good, approved"
  }'
```

#### **Revision:**
```bash
curl -X POST "http://localhost:8080/api/article-approval-flows/articles/123/approve" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -d '{
    "action": "revision",
    "message": "Please fix grammar and improve conclusion"
  }'
```

#### **Reject:**
```bash
curl -X POST "http://localhost:8080/api/article-approval-flows/articles/123/approve" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -d '{
    "action": "reject",
    "message": "Content does not meet quality standards"
  }'
```

## 📈 **Benefits**

### **1. Consistency**
- ✅ Semua action menggunakan field yang sama untuk message
- ✅ Tidak ada duplikasi field `RejectionReason` vs `RevisionMessage`
- ✅ Konsisten dengan naming convention

### **2. Simplicity**
- ✅ Satu endpoint untuk semua action types
- ✅ Satu field untuk semua message types
- ✅ StatusId sebagai pembeda utama

### **3. Maintainability**
- ✅ Code lebih mudah di-maintain
- ✅ Tidak ada duplikasi logic
- ✅ Single source of truth untuk message

### **4. Backward Compatibility**
- ✅ Field `revision_message` tetap ada dan digunakan
- ✅ Field `rejection_reason` tetap ada tapi tidak digunakan
- ✅ Tidak ada breaking change untuk database schema

## 🔄 **Migration Guide**

### **Untuk Client yang Menggunakan API Lama:**

#### **Before (Multiple Endpoints):**
```bash
# Reject
PUT /article-approval-flows/{id}/reject
{"reason": "Content not suitable"}

# Request Revision
PUT /article-approval-flows/{id}/request-revision
{"message": "Please fix grammar"}
```

#### **After (Single Endpoint):**
```bash
# Reject
POST /article-approval-flows/articles/{articleId}/approve
{"action": "reject", "message": "Content not suitable"}

# Request Revision
POST /article-approval-flows/articles/{articleId}/approve
{"action": "revision", "message": "Please fix grammar"}
```

## 🎉 **Summary**

Refactoring ini berhasil:

1. **✅ Menghilangkan duplikasi** field message
2. **✅ Menyederhanakan** API dengan single endpoint
3. **✅ Menyelaraskan** implementasi dengan field yang sama
4. **✅ Mempertahankan** backward compatibility
5. **✅ Meningkatkan** maintainability code

Sekarang sistem approval menggunakan implementasi yang lebih konsisten dan mudah di-maintain! 🚀
