287 lines
8.2 KiB
Markdown
287 lines
8.2 KiB
Markdown
# Enhanced Approval Actions API
|
|
|
|
## 🚀 **Overview**
|
|
|
|
API ini telah ditingkatkan untuk mendukung 3 jenis action approval yang berbeda: **Approve**, **Request Update**, dan **Reject**. Setiap action memiliki behavior yang berbeda sesuai dengan kebutuhan workflow.
|
|
|
|
## 📋 **Endpoint**
|
|
|
|
```
|
|
POST /api/article-approval-flows/articles/{articleId}/approve
|
|
```
|
|
|
|
## 🔧 **Request Body**
|
|
|
|
```json
|
|
{
|
|
"action": "approve",
|
|
"message": "Content looks good, approved for next level"
|
|
}
|
|
```
|
|
|
|
## 📝 **Action Types**
|
|
|
|
### **1. Approve (`approve`)**
|
|
- **Behavior**: Naik ke step berikutnya dalam workflow
|
|
- **Use Case**: Content sudah sesuai dan siap untuk step selanjutnya
|
|
- **Result**: Article akan diproses menggunakan multi-branch logic
|
|
|
|
### **2. Revision (`revision`)**
|
|
- **Behavior**: Mundur 1 step dalam workflow
|
|
- **Use Case**: Content perlu diperbaiki tapi masih bisa diperbaiki
|
|
- **Result**: Article akan kembali ke step sebelumnya untuk revisi
|
|
|
|
### **3. Reject (`reject`)**
|
|
- **Behavior**: Balik ke status Draft
|
|
- **Use Case**: Content tidak sesuai dan perlu dibuat ulang
|
|
- **Result**: Article akan dikembalikan ke status draft dan workflow dihentikan
|
|
|
|
## 📤 **Response Examples**
|
|
|
|
### **Approve Response (200):**
|
|
```json
|
|
{
|
|
"success": true,
|
|
"messages": ["Article successfully approve through active approval flow"],
|
|
"data": {
|
|
"article_id": 123,
|
|
"flow_id": 456,
|
|
"action": "approve",
|
|
"current_step": 2,
|
|
"current_branch": "Branch_A",
|
|
"workflow_id": 1
|
|
}
|
|
}
|
|
```
|
|
|
|
### **Revision Response (200):**
|
|
```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 Response (200):**
|
|
```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
|
|
}
|
|
}
|
|
```
|
|
|
|
## 🧪 **Curl Examples**
|
|
|
|
### **1. Approve Article:**
|
|
```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 reviewed and approved. Ready for next level."
|
|
}'
|
|
```
|
|
|
|
### **2. Request 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 the grammar and improve the conclusion section."
|
|
}'
|
|
```
|
|
|
|
### **3. Reject Article:**
|
|
```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 our quality standards. Please rewrite the entire article."
|
|
}'
|
|
```
|
|
|
|
## 🔄 **Workflow Behavior**
|
|
|
|
### **Approve Flow:**
|
|
1. **Input**: `{"action": "approve", "message": "..."}`
|
|
2. **Process**: Menggunakan multi-branch approval logic
|
|
3. **Result**: Article naik ke step berikutnya
|
|
4. **Status**: Workflow berlanjut
|
|
|
|
### **Revision Flow:**
|
|
1. **Input**: `{"action": "revision", "message": "..."}`
|
|
2. **Process**:
|
|
- Current step dikurangi 1
|
|
- `revision_requested` = true
|
|
- `revision_message` = message
|
|
3. **Result**: Article kembali ke step sebelumnya
|
|
4. **Status**: Workflow berlanjut tapi mundur 1 step
|
|
|
|
### **Reject Flow:**
|
|
1. **Input**: `{"action": "reject", "message": "..."}`
|
|
2. **Process**:
|
|
- Flow status = rejected (3)
|
|
- Article status = draft (1)
|
|
- `is_draft` = true
|
|
- `workflow_id` = null
|
|
- `current_approval_step` = null
|
|
3. **Result**: Article dikembalikan ke draft
|
|
4. **Status**: Workflow dihentikan
|
|
|
|
## 📊 **Database Changes**
|
|
|
|
### **Article Approval Flows Table:**
|
|
- `revision_requested`: Boolean flag untuk request update
|
|
- `revision_message`: Pesan untuk revisi
|
|
- `rejection_reason`: Alasan penolakan
|
|
- `completed_at`: Timestamp ketika workflow selesai
|
|
|
|
### **Articles Table:**
|
|
- `status_id`: 1 (draft), 2 (published), 3 (rejected)
|
|
- `is_draft`: Boolean flag untuk draft status
|
|
- `workflow_id`: Null ketika di-reject
|
|
- `current_approval_step`: Null ketika di-reject
|
|
|
|
### **Article Approval Step Logs Table:**
|
|
- `action`: "approve", "request_update", "reject"
|
|
- `message`: Pesan dari approver
|
|
- `action_by_id`: ID user yang melakukan action
|
|
|
|
## 🎯 **Use Cases**
|
|
|
|
### **1. Content Review Process:**
|
|
```bash
|
|
# Step 1: Editor review
|
|
curl -X POST "http://localhost:8080/api/article-approval-flows/articles/123/approve" \
|
|
-H "Content-Type: application/json" \
|
|
-H "Authorization: Bearer EDITOR_TOKEN" \
|
|
-d '{"action": "approve", "message": "Content is good"}'
|
|
|
|
# Step 2: Senior Editor review
|
|
curl -X POST "http://localhost:8080/api/article-approval-flows/articles/123/approve" \
|
|
-H "Content-Type: application/json" \
|
|
-H "Authorization: Bearer SENIOR_EDITOR_TOKEN" \
|
|
-d '{"action": "request_update", "message": "Please add more examples"}'
|
|
|
|
# Step 3: After revision, approve again
|
|
curl -X POST "http://localhost:8080/api/article-approval-flows/articles/123/approve" \
|
|
-H "Content-Type: application/json" \
|
|
-H "Authorization: Bearer SENIOR_EDITOR_TOKEN" \
|
|
-d '{"action": "approve", "message": "Much better now"}'
|
|
```
|
|
|
|
### **2. Quality Control Process:**
|
|
```bash
|
|
# Quality check fails
|
|
curl -X POST "http://localhost:8080/api/article-approval-flows/articles/123/approve" \
|
|
-H "Content-Type: application/json" \
|
|
-H "Authorization: Bearer QUALITY_CHECKER_TOKEN" \
|
|
-d '{"action": "reject", "message": "Content does not meet quality standards"}'
|
|
```
|
|
|
|
## 🔒 **Validation Rules**
|
|
|
|
### **Action Validation:**
|
|
- `action` harus salah satu dari: `approve`, `request_update`, `reject`
|
|
- `action` adalah field required
|
|
|
|
### **Message Validation:**
|
|
- `message` adalah optional
|
|
- Jika ada, akan disimpan dalam step log
|
|
|
|
### **Authorization Validation:**
|
|
- User harus memiliki permission untuk approve
|
|
- User level harus sesuai dengan step yang sedang berjalan
|
|
|
|
## 🚨 **Error Handling**
|
|
|
|
### **Invalid Action (400):**
|
|
```json
|
|
{
|
|
"success": false,
|
|
"messages": ["Validation failed: [Action must be one of: approve, request_update, reject]"]
|
|
}
|
|
```
|
|
|
|
### **No Active Flow (400):**
|
|
```json
|
|
{
|
|
"success": false,
|
|
"messages": ["No active approval flow found for this article"]
|
|
}
|
|
```
|
|
|
|
### **Unauthorized (401):**
|
|
```json
|
|
{
|
|
"success": false,
|
|
"messages": ["Invalid authorization token"]
|
|
}
|
|
```
|
|
|
|
## 🔄 **Migration from Old API**
|
|
|
|
### **Before (Only 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 '{"message": "Approved"}'
|
|
```
|
|
|
|
### **After (3 Actions):**
|
|
```bash
|
|
# Approve
|
|
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": "Approved"}'
|
|
|
|
# Revision
|
|
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"}'
|
|
|
|
# Reject
|
|
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 not suitable"}'
|
|
```
|
|
|
|
## 🎉 **Benefits**
|
|
|
|
1. **Flexible Workflow**: Support untuk berbagai jenis feedback
|
|
2. **Better User Experience**: User bisa memberikan feedback yang lebih spesifik
|
|
3. **Improved Quality Control**: Reject option untuk content yang tidak sesuai
|
|
4. **Revision Support**: Revision untuk perbaikan tanpa menghentikan workflow
|
|
5. **Audit Trail**: Semua action dicatat dalam step logs
|
|
|
|
---
|
|
|
|
**🎉 Enhanced Approval Actions API memberikan kontrol yang lebih baik atas workflow approval dengan 3 pilihan action yang berbeda!**
|
|
|
|
Sekarang approver bisa memilih apakah akan approve, revision, atau reject artikel dengan behavior yang sesuai untuk setiap pilihan. 🚀
|