MIF_E31230069/spk_mobile/README_API_INTEGRATION.md

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 serve in /spk_kontrakan
  • Update Base URL: Change IP in lib/config/app_config.dart
  • Load Token: Add await authService.loadToken() in main.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:

  1. Check backend is running (php artisan serve)
  2. Verify base URL is correct (update IP in app_config.dart)
  3. Check firewall allows port 8000
  4. Test with: APITestHelper.testLoadToken()

"Unauthorized 401"

Problem: Token is invalid or expired Solution:

  1. Login again to get new token
  2. Ensure loadToken() called on app startup
  3. Check backend token expiry settings

"CORS Error"

Problem: Cross-origin request blocked Solution: Backend already configured. If persists:

  • Check config/cors.php in backend
  • Ensure credentials in request headers

"File Upload Failed"

Problem: Payment proof upload fails Solution:

  1. Ensure file path exists
  2. Use image_picker package
  3. Check file permissions
  4. 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

  1. Understand the Architecture

    • Read API_INTEGRATION_GUIDE.md
    • Understand service pattern
  2. See Code Examples

    • Read API_QUICKSTART.md
    • Study example implementations
  3. Build Your First Screen

    • Pick simplest screen (e.g., Login)
    • Follow SCREEN_IMPLEMENTATION_CHECKLIST.md
    • Implement step by step
  4. Test the API

    • Use APITestHelper
    • Verify all endpoints work
  5. 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)

  1. Update base URL in app_config.dart
  2. Verify backend is running
  3. Test API with APITestHelper

Short Term (This Sprint)

  1. Implement Login screen
  2. Implement Kontrakan List screen
  3. Implement Booking screen

Medium Term

  1. Implement remaining main screens
  2. Add state management (Provider/Riverpod)
  3. Add offline support
  4. Add image caching

Long Term

  1. Performance optimization
  2. Error tracking/logging
  3. Analytics integration
  4. Production deployment

🎉 You're All Set!

All API services are ready to use. Start building!

Questions? Check:

  1. API_INTEGRATION_GUIDE.md for detailed docs
  2. API_QUICKSTART.md for code examples
  3. SCREEN_IMPLEMENTATION_CHECKLIST.md for specific screen

Last Updated: February 23, 2026 Status: Complete and Ready for Development