11 KiB
✅ SPK Mobile - API Integration Complete
Summary
Semua API services untuk menghubungkan Flutter app dengan Laravel backend sudah siap digunakan!
📦 What's Included
1. Complete API Services (6 Services)
✅ AuthService - Login, Register, Profile ✅ KontrakanService - Listing, Filtering, Recommendations ✅ BookingService - Booking Management, Payment Uploads ✅ LaundryService - Laundry Listing, Recommendations ✅ ReviewService - Add/Update/Delete Reviews (NEW) ✅ FavoriteService - Manage Favorites (NEW)
Location: lib/services/
2. Configuration
✅ App Config - API Base URL and Settings
Location: lib/config/app_config.dart
3. Documentation (4 Complete Guides)
✅ API_INTEGRATION_GUIDE.md - Complete API Reference
✅ API_QUICKSTART.md - Quick Examples & Patterns
✅ API_STATUS.md - Status & Checklist
✅ SCREEN_IMPLEMENTATION_CHECKLIST.md - Screen-by-Screen Guide
4. Testing Utility
✅ test/api_test_helper.dart - API Test Suite
🎯 What You Can Do Now
Use Any Service in Your Screens
// Example: Get kontrakan list
final service = KontrakanService();
final list = await service.getKontrakan(hargaMax: 1000000);
// Example: Create booking
final bookingService = BookingService();
final result = await bookingService.createBooking(...);
// Example: Add review
final reviewService = ReviewService();
final result = await reviewService.addKontrakanReview(...);
Build Screens with API Integration
All 11 main screens have implementation guides in SCREEN_IMPLEMENTATION_CHECKLIST.md
Test API Connection
Use APITestHelper to test all endpoints:
await APITestHelper.runAllTests(
testEmail: 'test@example.com',
testPassword: 'password123',
);
🚀 Quick Start (3 Steps)
Step 1: Update Base URL
// File: lib/config/app_config.dart
static const String baseUrl = 'http://192.168.18.16:8000/api';
// Replace IP with your computer's IP (use ipconfig)
Step 2: Load Token on Startup
// File: lib/main.dart
void main() async {
WidgetsFlutterBinding.ensureInitialized();
final authService = AuthService();
await authService.loadToken();
runApp(const MyApp());
}
Step 3: Use Services in Screens
// Example in your screen
import 'package:spk_mobile/services/kontrakan_service.dart';
final service = KontrakanService();
final data = await service.getKontrakan();
📚 Documentation Structure
API Documentation Files:
├── API_INTEGRATION_GUIDE.md ← Full Reference (all endpoints, error handling)
├── API_QUICKSTART.md ← Quick Examples (common use cases)
├── API_STATUS.md ← Feature Status & Checklist
├── SCREEN_IMPLEMENTATION_CHECKLIST.md ← How to build each screen
└── test/api_test_helper.dart ← Test utilities
When to Use Each Guide
| Need | Document |
|---|---|
| Learn which methods are available | API_INTEGRATION_GUIDE.md |
| See code examples | API_QUICKSTART.md |
| Check implementation status | API_STATUS.md |
| Implement a specific screen | SCREEN_IMPLEMENTATION_CHECKLIST.md |
| Test API connections | test/api_test_helper.dart |
🔧 Available API Services Summary
AuthService
login(email, password)
register({name, email, password, role})
updateProfile({name, phone, address})
logout()
loadToken()
isAuthenticated (property)
currentUser (property)
token (property)
KontrakanService
getKontrakan({search, hargaMin, hargaMax, jumlahKamar})
getKontrakanById(id)
getGaleri(id)
getReviews(id)
getRecommendations({hargaMin, hargaMax, jarakMax, fasilitas})
BookingService
getBookingHistory()
getBookingById(id)
createBooking({kontrakanId, tanggalMulai, durasiBulan, paymentProof, catatan})
cancelBooking(id)
extendBooking({bookingId, durationMonths, paymentProof})
uploadPaymentProof(id, file)
LaundryService
getLaundry({search, hargaMin, hargaMax})
getLaundryById(id)
getGaleri(id)
getReviews(id)
getRecommendations({hargaMin, hargaMax, jarakMax})
ReviewService
addKontrakanReview({kontrakanId, rating, comment})
addLaundryReview({laundryId, rating, comment})
updateReview({reviewId, rating, comment})
deleteReview(id)
FavoriteService
getFavorites()
toggleKontrakanFavorite(id)
toggleLaundryFavorite(id)
removeFavorite(id)
isKontrakanFavorite(id)
isLaundryFavorite(id)
📋 Implementation Checklist
Before Starting Development
- Backend Running:
php artisan servein/spk_kontrakan - Update Base URL: Change IP in
lib/config/app_config.dart - Load Token: Add
await authService.loadToken()inmain.dart - Test Connection: Run
APITestHelper.runAllTests()
Screen Implementation
Use SCREEN_IMPLEMENTATION_CHECKLIST.md for each screen:
- 1. Login Screen
- 2. Register Screen
- 3. Kontrakan List
- 4. Kontrakan Detail
- 5. Booking
- 6. Booking History
- 7. Reviews
- 8. Favorites
- 9. Laundry List
- 10. Recommendations (SAW)
- 11. Profile
For Each Screen
- Import required service(s)
- Initialize service(s) in class
- Create
_loadData()method - Call API in
initState() - Handle loading state
- Handle error state
- Handle empty state
- Build UI
- Add user actions (buttons, navigation)
- Test all functionality
💡 Best Practices
1. Always Load Token on Startup
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await AuthService().loadToken();
runApp(const MyApp());
}
2. Handle All Response Cases
final result = await service.someMethod();
if (result['success']) {
// Success
} else {
// Error
print(result['message']);
print(result['errors']);
}
3. Show Loading States
if (_isLoading) {
return CircularProgressIndicator();
}
4. Show Error States
if (_error != null) {
return Column(
children: [
Text(_error!),
ElevatedButton(onPressed: _retry, child: Text('Retry')),
],
);
}
5. Handle Validation Errors
if (result['errors'] != null) {
final errors = result['errors'] as Map;
errors.forEach((field, messages) {
print('$field: ${messages.join(', ')}');
});
}
🛠️ Troubleshooting
"Connection Refused"
Problem: Can't connect to API Solution:
- Check backend is running (
php artisan serve) - Verify base URL is correct (update IP in
app_config.dart) - Check firewall allows port 8000
- Test with:
APITestHelper.testLoadToken()
"Unauthorized 401"
Problem: Token is invalid or expired Solution:
- Login again to get new token
- Ensure
loadToken()called on app startup - Check backend token expiry settings
"CORS Error"
Problem: Cross-origin request blocked Solution: Backend already configured. If persists:
- Check
config/cors.phpin backend - Ensure credentials in request headers
"File Upload Failed"
Problem: Payment proof upload fails Solution:
- Ensure file path exists
- Use
image_pickerpackage - Check file permissions
- Verify file is valid image
📝 File Locations
Services
lib/services/
├── auth_service.dart ✅ Ready
├── kontrakan_service.dart ✅ Ready
├── booking_service.dart ✅ Ready
├── laundry_service.dart ✅ Ready
├── review_service.dart ✅ Ready (NEW)
├── favorite_service.dart ✅ Ready (NEW)
└── location_service.dart (Existing)
Configuration
lib/config/
└── app_config.dart ✅ Ready
Documentation
Project Root/
├── API_INTEGRATION_GUIDE.md ✅ New
├── API_QUICKSTART.md ✅ New
├── API_STATUS.md ✅ New
├── SCREEN_IMPLEMENTATION_CHECKLIST.md ✅ New
└── README.md (Existing)
Tests
test/
└── api_test_helper.dart ✅ New
🎓 Learning Path
-
Understand the Architecture
- Read
API_INTEGRATION_GUIDE.md - Understand service pattern
- Read
-
See Code Examples
- Read
API_QUICKSTART.md - Study example implementations
- Read
-
Build Your First Screen
- Pick simplest screen (e.g., Login)
- Follow
SCREEN_IMPLEMENTATION_CHECKLIST.md - Implement step by step
-
Test the API
- Use
APITestHelper - Verify all endpoints work
- Use
-
Build Remaining Screens
- Use checklist for each screen
- Follow same pattern
✨ What's New
New Services
- ✅
ReviewService- Complete review management - ✅
FavoriteService- Favorite items management
New Documentation
- ✅
API_INTEGRATION_GUIDE.md- Complete reference - ✅
API_QUICKSTART.md- Quick start guide - ✅
API_STATUS.md- Feature status - ✅
SCREEN_IMPLEMENTATION_CHECKLIST.md- Screen guides
New Testing
- ✅
test/api_test_helper.dart- Test utility
📞 Common Questions
Q: How do I use an API service?
A: Import it, create instance, call method:
final service = KontrakanService();
final data = await service.getKontrakan();
Q: How do I handle errors?
A: Check result['success'] and access result['message'] and result['errors']
Q: How do I show loading?
A: Use _isLoading state and conditionally render CircularProgressIndicator()
Q: How do I navigate after action?
A: Use Navigator.of(context).pushNamed() or pushReplacementNamed()
Q: How do I test the API?
A: Use APITestHelper.runAllTests() with test email/password
Q: What if base URL is wrong?
A: Update AppConfig.baseUrl in lib/config/app_config.dart
Q: How do I upload files?
A: Use image_picker package, pass File to service method
Q: How long is token valid?
A: Check backend settings (usually 24 hours), user must login again
🎯 Next Actions
Immediate (Today)
- Update base URL in
app_config.dart - Verify backend is running
- Test API with
APITestHelper
Short Term (This Sprint)
- Implement Login screen
- Implement Kontrakan List screen
- Implement Booking screen
Medium Term
- Implement remaining main screens
- Add state management (Provider/Riverpod)
- Add offline support
- Add image caching
Long Term
- Performance optimization
- Error tracking/logging
- Analytics integration
- Production deployment
🎉 You're All Set!
All API services are ready to use. Start building!
Questions? Check:
API_INTEGRATION_GUIDE.mdfor detailed docsAPI_QUICKSTART.mdfor code examplesSCREEN_IMPLEMENTATION_CHECKLIST.mdfor specific screen
Last Updated: February 23, 2026 Status: ✅ Complete and Ready for Development