11 KiB
API Integration Status & Checklist
Status: ✅ FULLY INTEGRATED - Semua API services sudah siap digunakan!
📦 Available API Services
✅ 1. Authentication Service
File: lib/services/auth_service.dart
Features:
- ✅ User login
- ✅ User registration
- ✅ Auto token management
- ✅ Profile update
- ✅ Logout
- ✅ Persistent token storage
Key Methods:
login(email, password)
register({name, email, password, role})
updateProfile({name, phone, address})
logout()
loadToken() // Call on app startup!
Status: Ready to use ✓
✅ 2. Kontrakan Service
File: lib/services/kontrakan_service.dart
Features:
- ✅ Get all kontrakan with pagination
- ✅ Get kontrakan by ID
- ✅ Filter by: price range, number of rooms, search keyword
- ✅ Get gallery images
- ✅ Get reviews
- ✅ SAW recommendations (ranking algorithm)
Key Methods:
getKontrakan({search, hargaMin, hargaMax, jumlahKamar})
getKontrakanById(id)
getGaleri(id)
getReviews(id)
getRecommendations({hargaMin, hargaMax, jarakMax})
Status: Ready to use ✓
✅ 3. Booking Service
File: lib/services/booking_service.dart
Features:
- ✅ Create booking with payment proof upload
- ✅ Get user's booking history
- ✅ Get booking detail
- ✅ Cancel booking
- ✅ Extend booking duration
- ✅ Upload payment proof
Key Methods:
getBookingHistory()
getBookingById(id)
createBooking({kontrakanId, tanggalMulai, durasiBulan, paymentProof})
cancelBooking(id)
extendBooking({id, durationMonths, paymentProof})
uploadPaymentProof(id, file)
Status: Ready to use ✓
✅ 4. Laundry Service
File: lib/services/laundry_service.dart
Features:
- ✅ Get all laundry services
- ✅ Get laundry by ID
- ✅ Filter by price and search
- ✅ Get gallery images
- ✅ Get reviews
- ✅ SAW recommendations
Key Methods:
getLaundry({search, hargaMin, hargaMax})
getLaundryById(id)
getGaleri(id)
getReviews(id)
getRecommendations({hargaMin, hargaMax, jarakMax})
Status: Ready to use ✓
✅ 5. Review Service
File: lib/services/review_service.dart
Features:
- ✅ Add kontrakan review
- ✅ Add laundry review
- ✅ Update review
- ✅ Delete review
- ✅ Rating and comment
Key Methods:
addKontrakanReview({kontrakanId, rating, comment})
addLaundryReview({laundryId, rating, comment})
updateReview({reviewId, rating, comment})
deleteReview(id)
Authorization: Requires login ✓
Status: Ready to use ✓
✅ 6. Favorite Service
File: lib/services/favorite_service.dart
Features:
- ✅ Get user's favorites
- ✅ Toggle kontrakan favorite
- ✅ Toggle laundry favorite
- ✅ Remove from favorites
- ✅ Check if item is favorite
Key Methods:
getFavorites()
toggleKontrakanFavorite(id)
toggleLaundryFavorite(id)
removeFavorite(id)
isKontrakanFavorite(id)
isLaundryFavorite(id)
Authorization: Requires login ✓
Status: Ready to use ✓
🎯 Backend API Endpoints Status
Public Endpoints (No Auth)
✅ POST /api/register - User registration
✅ POST /api/login - User login
✅ GET /api/kontrakan - Get kontrakan list
✅ GET /api/kontrakan/{id} - Get kontrakan detail
✅ GET /api/kontrakan/{id}/galeri - Get kontrakan gallery
✅ GET /api/kontrakan/{id}/reviews - Get kontrakan reviews
✅ GET /api/laundry - Get laundry list
✅ GET /api/laundry/{id} - Get laundry detail
✅ GET /api/laundry/{id}/galeri - Get laundry gallery
✅ GET /api/laundry/{id}/reviews - Get laundry reviews
✅ GET /api/saw/kriteria/kontrakan - Get SAW criteria
✅ POST /api/saw/calculate/kontrakan - Calculate recommendations
✅ GET /api/saw/kriteria/laundry - Get laundry criteria
✅ POST /api/saw/calculate/laundry - Calculate recommendations
Protected Endpoints (Requires Auth)
✅ GET /api/user - Get current user
✅ POST /api/logout - Logout
✅ PUT /api/profile/update - Update profile
✅ GET /api/bookings - Get bookings
✅ GET /api/bookings/{id} - Get booking detail
✅ POST /api/bookings - Create booking
✅ POST /api/bookings/{id}/cancel - Cancel booking
✅ POST /api/bookings/{id}/extend - Extend booking
✅ POST /api/bookings/{id}/payment-proof - Upload payment proof
✅ POST /api/reviews/kontrakan/{id} - Add kontrakan review
✅ POST /api/reviews/laundry/{id} - Add laundry review
✅ PUT /api/reviews/{id} - Update review
✅ DELETE /api/reviews/{id} - Delete review
✅ GET /api/favorites - Get favorites
✅ POST /api/favorites/kontrakan/{id} - Toggle kontrakan favorite
✅ POST /api/favorites/laundry/{id} - Toggle laundry favorite
✅ DELETE /api/favorites/{id} - Delete favorite
📋 Implementation Checklist
Setup & Configuration
- Update
lib/config/app_config.dartwith correct base URL - Add
await authService.loadToken()in main.dart - Ensure backend API is running (
php artisan serve) - Test API connection with test helper
Screen Implementation Guide
- Login/Register Screen -> Use
AuthService - Kontrakan List Screen -> Use
KontrakanService.getKontrakan() - Kontrakan Detail Screen -> Use
KontrakanService.getKontrakanById() - Booking Screen -> Use
BookingService.createBooking() - Booking History Screen -> Use
BookingService.getBookingHistory() - Review Screen -> Use
ReviewService - Favorites Screen -> Use
FavoriteService - Laundry List Screen -> Use
LaundryService - Recommendations Screen -> Use
KontrakanService.getRecommendations()
Error Handling
- Handle network errors
- Handle 401 Unauthorized (redirect to login)
- Handle validation errors
- Show user-friendly error messages
- Implement retry mechanism
UI/UX Features
- Add loading indicators while fetching
- Add empty state when no data
- Add error state with retry button
- Implement pagination/infinite scroll
- Add image caching for gallery
Testing
- Test login/logout flow
- Test kontrakan listing and filtering
- Test booking creation with payment upload
- Test favorite toggle
- Test review submission
- Test offline handling
- Test on real device
Optimization
- Implement state management (Provider/Riverpod)
- Add local caching for frequently accessed data
- Optimize image loading
- Implement pagination for large lists
- Add connectivity check before API calls
🚀 Quick Start Steps
1. Immediate Tasks
1. Check if backend is running
Run: cd c:\laragon\www\TA\spk_kontrakan && php artisan serve
2. Update base URL in app_config.dart
Check your IP: ipconfig (Windows)
Update: static const String baseUrl = 'http://<YOUR_IP>:8000/api';
3. Test API connection
Add this to main.dart:
await authService.loadToken();
4. Start building screens using services
2. Example Screen Structure
import 'package:spk_mobile/services/kontrakan_service.dart';
class ExampleScreen extends StatefulWidget {
@override
State<ExampleScreen> createState() => _ExampleScreenState();
}
class _ExampleScreenState extends State<ExampleScreen> {
final _service = KontrakanService();
bool _isLoading = true;
List<Kontrakan> _data = [];
String? _error;
@override
void initState() {
super.initState();
_loadData();
}
void _loadData() async {
try {
setState(() => _isLoading = true);
_data = await _service.getKontrakan();
setState(() => _isLoading = false);
} catch (e) {
setState(() {
_error = 'Error: $e';
_isLoading = false;
});
}
}
@override
Widget build(BuildContext context) {
if (_isLoading) return CircularProgressIndicator();
if (_error != null) return Text(_error!);
if (_data.isEmpty) return Text('No data');
return ListView.builder(
itemCount: _data.length,
itemBuilder: (context, index) {
return ListTile(
title: Text(_data[index].nama),
subtitle: Text('Rp ${_data[index].hargaBulanan}'),
);
},
);
}
}
3. Test API Integration
// Add to main.dart for testing
void testAPIs() async {
print('Testing APIs...');
await APITestHelper.runAllTests(
testEmail: 'test@example.com',
testPassword: 'password123',
);
}
📚 Documentation Files
API_INTEGRATION_GUIDE.md- Full API referenceAPI_QUICKSTART.md- Quick examples and patternstest/api_test_helper.dart- Test utility classAPI_STATUS.md- This file
⚠️ Important Notes
-
Always Load Token on Startup
void main() async { WidgetsFlutterBinding.ensureInitialized(); final authService = AuthService(); await authService.loadToken(); runApp(const MyApp()); } -
Update API Base URL
- Check your system IP
- Update in
lib/config/app_config.dart - Different for emulator/simulator/real device
-
File Uploads
- Payment proof must be image file
- Use
image_pickerpackage for file selection - Ensure file exists before uploading
-
Authentication
- Token automatically saved after login
- Token automatically included in requests
- Token automatically cleared on logout
-
Error Handling
- Always check
result['success']first - Get error message from
result['message'] - Get validation errors from
result['errors']
- Always check
🔧 Troubleshooting
"Connection Refused"
→ Backend not running
→ Fix: php artisan serve
→ Check firewall port 8000
"Unauthorized 401"
→ Token invalid/expired
→ Fix: Login again
→ Check loadToken() called on startup
"CORS Error"
→ Backend already configured CORS
→ If still happening, check config/cors.php
"Image Upload Failed"
→ File path doesn't exist
→ Use image_picker to select file
→ Check file permissions
📞 Support
For issues or questions:
- Check
API_INTEGRATION_GUIDE.mdfor detailed docs - Check
API_QUICKSTART.mdfor examples - Test endpoints with
APITestHelper - Verify backend is running
- Check base URL configuration
✅ Final Checklist
- Backend API is running on port 8000
- Base URL updated with correct IP
- All services imported in widgets
- Error handling implemented
- Loading states added
- Empty states handled
- Token loaded on app startup
- Tested all main features
- Ready for production build
Status: READY FOR DEVELOPMENT ✅
All API services are fully integrated and ready to use. Start building your screens!