197 lines
6.1 KiB
Markdown
197 lines
6.1 KiB
Markdown
# Updated Approval Flow Logic
|
|
|
|
## 🎯 **Overview**
|
|
|
|
Flow approval telah diubah sesuai permintaan untuk memberikan pengalaman yang lebih baik dalam proses revisi dan penolakan artikel.
|
|
|
|
## 🔄 **Flow Behavior Changes**
|
|
|
|
### **1. Approve Action**
|
|
- ✅ **Behavior**: Tetap sama seperti sebelumnya
|
|
- ✅ **Result**: Naik ke step berikutnya atau selesai jika sudah step terakhir
|
|
- ✅ **Status**: Workflow berlanjut normal
|
|
|
|
### **2. Revision Action (Baru)**
|
|
- ✅ **Behavior**: Mundur ke step awal (step 1) dengan status pending
|
|
- ✅ **Result**: Flow approval direset seperti belum berjalan
|
|
- ✅ **Status**: `StatusId = 1` (pending)
|
|
- ✅ **Article Status**: `StatusId = 1` (draft), `IsDraft = true`
|
|
- ✅ **Restart**: Ketika user melakukan update artikel, approval akan berjalan kembali dari step 1
|
|
|
|
### **3. Reject Action (Baru)**
|
|
- ✅ **Behavior**: Mundur ke step awal (step 1) dengan status pending
|
|
- ✅ **Result**: Flow approval direset seperti belum berjalan
|
|
- ✅ **Status**: `StatusId = 1` (pending)
|
|
- ✅ **Article Status**: `StatusId = 1` (draft), `IsDraft = true`
|
|
- ✅ **Restart**: Ketika user melakukan update artikel, approval akan berjalan kembali dari step 1
|
|
|
|
## 📊 **Database Changes**
|
|
|
|
### **Article Approval Flows Table:**
|
|
```sql
|
|
-- Untuk Revision Action
|
|
UPDATE article_approval_flows
|
|
SET current_step = 1,
|
|
status_id = 1, -- pending
|
|
revision_requested = true,
|
|
revision_message = 'message',
|
|
completed_at = NULL -- Reset completed_at
|
|
WHERE id = flow_id;
|
|
|
|
-- Untuk Reject Action
|
|
UPDATE article_approval_flows
|
|
SET current_step = 1,
|
|
status_id = 1, -- pending
|
|
revision_message = 'message',
|
|
completed_at = NULL -- Reset completed_at
|
|
WHERE id = flow_id;
|
|
```
|
|
|
|
### **Articles Table:**
|
|
```sql
|
|
-- Untuk Revision & Reject Action
|
|
UPDATE articles
|
|
SET status_id = 1, -- draft
|
|
is_draft = true,
|
|
workflow_id = workflow_id, -- Keep workflow ID
|
|
current_approval_step = 1 -- Reset to step 1
|
|
WHERE id = article_id;
|
|
```
|
|
|
|
## 🎯 **Action Types & Behavior Summary**
|
|
|
|
| Action | Flow Behavior | Article Status | Restart Behavior |
|
|
|--------|---------------|----------------|------------------|
|
|
| **`approve`** | Naik ke step berikutnya | Tetap dalam approval | Workflow berlanjut |
|
|
| **`revision`** | Reset ke step 1, status pending | Draft | Restart dari step 1 saat update |
|
|
| **`reject`** | Reset ke step 1, status pending | Draft | Restart dari step 1 saat update |
|
|
|
|
## 🚀 **API Usage Examples**
|
|
|
|
### **Revision Request:**
|
|
```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"
|
|
}'
|
|
```
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"success": true,
|
|
"messages": ["Article successfully revision through active approval flow"],
|
|
"data": {
|
|
"article_id": 123,
|
|
"flow_id": 456,
|
|
"action": "revision",
|
|
"current_step": 1,
|
|
"current_branch": "Branch_A",
|
|
"workflow_id": 1
|
|
}
|
|
}
|
|
```
|
|
|
|
### **Reject Request:**
|
|
```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"
|
|
}'
|
|
```
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"success": true,
|
|
"messages": ["Article successfully reject through active approval flow"],
|
|
"data": {
|
|
"article_id": 123,
|
|
"flow_id": 456,
|
|
"action": "reject",
|
|
"current_step": 1,
|
|
"current_branch": "Branch_A",
|
|
"workflow_id": 1
|
|
}
|
|
}
|
|
```
|
|
|
|
## 🔄 **Restart Flow Logic**
|
|
|
|
### **Ketika User Update Artikel:**
|
|
|
|
1. **System Check**: Apakah artikel memiliki `workflow_id` dan `current_approval_step = 1`?
|
|
2. **Auto Restart**: Jika ya, approval flow akan berjalan kembali dari step 1
|
|
3. **Status Update**: Artikel status berubah dari draft ke pending approval
|
|
4. **Flow Continuation**: Approval flow berlanjut dengan step yang sudah direset
|
|
|
|
### **Implementation dalam Articles Service:**
|
|
```go
|
|
// Ketika artikel diupdate, check apakah perlu restart approval
|
|
if article.WorkflowId != nil && article.CurrentApprovalStep != nil && *article.CurrentApprovalStep == 1 {
|
|
// Restart approval flow
|
|
err := articleApprovalFlowsService.RestartApprovalFlow(article.ID)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
```
|
|
|
|
## 📈 **Benefits**
|
|
|
|
### **1. Better User Experience**
|
|
- ✅ User bisa melakukan revisi tanpa kehilangan progress workflow
|
|
- ✅ Reject tidak menghapus workflow, hanya reset
|
|
- ✅ Mudah untuk restart approval setelah update
|
|
|
|
### **2. Workflow Continuity**
|
|
- ✅ Workflow ID tetap tersimpan untuk restart
|
|
- ✅ Tidak perlu membuat workflow baru
|
|
- ✅ History approval tetap tersimpan
|
|
|
|
### **3. Flexible Process**
|
|
- ✅ User bisa update artikel dan approval otomatis restart
|
|
- ✅ Tidak ada duplikasi workflow
|
|
- ✅ Konsisten dengan business logic
|
|
|
|
## 🎯 **Use Cases**
|
|
|
|
### **Scenario 1: Revision Process**
|
|
1. Editor review artikel di step 2
|
|
2. Editor request revision → Flow reset ke step 1, artikel jadi draft
|
|
3. Author update artikel
|
|
4. Approval flow restart otomatis dari step 1
|
|
5. Editor review lagi dari awal
|
|
|
|
### **Scenario 2: Rejection Process**
|
|
1. Editor review artikel di step 2
|
|
2. Editor reject artikel → Flow reset ke step 1, artikel jadi draft
|
|
3. Author update artikel
|
|
4. Approval flow restart otomatis dari step 1
|
|
5. Editor review lagi dari awal
|
|
|
|
### **Scenario 3: Multiple Revisions**
|
|
1. Editor request revision → Reset ke step 1
|
|
2. Author update → Restart approval
|
|
3. Editor request revision lagi → Reset ke step 1 lagi
|
|
4. Author update lagi → Restart approval lagi
|
|
5. Proses bisa berulang sampai approved
|
|
|
|
## 🎉 **Summary**
|
|
|
|
Perubahan flow ini memberikan:
|
|
|
|
1. **✅ Flexibility**: User bisa melakukan revisi/reject tanpa kehilangan workflow
|
|
2. **✅ Continuity**: Workflow tidak terputus, hanya direset
|
|
3. **✅ Auto Restart**: Approval otomatis restart saat artikel diupdate
|
|
4. **✅ Better UX**: Proses yang lebih intuitif dan user-friendly
|
|
5. **✅ Data Integrity**: Workflow ID dan history tetap tersimpan
|
|
|
|
Sekarang sistem approval memberikan pengalaman yang lebih baik dengan flow yang lebih fleksibel! 🚀
|