Project Structure - luckydeva03/barbershop_app GitHub Wiki

๐Ÿ—๏ธ Project Structure

Panduan lengkap arsitektur dan struktur proyek barbershop management system.

๐Ÿ“ Directory Overview

barbershop_app/
โ”œโ”€โ”€ app/                          # Core application logic
โ”‚   โ”œโ”€โ”€ Console/Commands/         # Artisan commands
โ”‚   โ”œโ”€โ”€ Http/                     # HTTP layer
โ”‚   โ”‚   โ”œโ”€โ”€ Controllers/          # Controllers
โ”‚   โ”‚   โ”œโ”€โ”€ Middleware/           # Custom middleware
โ”‚   โ”‚   โ””โ”€โ”€ Requests/             # Form requests
โ”‚   โ”œโ”€โ”€ Models/                   # Eloquent models
โ”‚   โ”œโ”€โ”€ Policies/                 # Authorization policies
โ”‚   โ”œโ”€โ”€ Providers/                # Service providers
โ”‚   โ””โ”€โ”€ Helper/                   # Helper functions
โ”œโ”€โ”€ bootstrap/                    # Application bootstrap
โ”œโ”€โ”€ config/                       # Configuration files
โ”œโ”€โ”€ database/                     # Database related files
โ”‚   โ”œโ”€โ”€ factories/                # Model factories
โ”‚   โ”œโ”€โ”€ migrations/               # Database migrations
โ”‚   โ””โ”€โ”€ seeders/                  # Database seeders
โ”œโ”€โ”€ public/                       # Public web assets
โ”‚   โ”œโ”€โ”€ assets/                   # Static assets
โ”‚   โ”œโ”€โ”€ build/                    # Built frontend assets
โ”‚   โ”œโ”€โ”€ clients/                  # Client-side resources
โ”‚   โ””โ”€โ”€ images/                   # Image assets
โ”œโ”€โ”€ resources/                    # Raw application resources
โ”‚   โ”œโ”€โ”€ css/                      # Stylesheets
โ”‚   โ”œโ”€โ”€ js/                       # JavaScript files
โ”‚   โ””โ”€โ”€ views/                    # Blade templates
โ”œโ”€โ”€ routes/                       # Route definitions
โ”œโ”€โ”€ storage/                      # Generated files & logs
โ”‚   โ”œโ”€โ”€ app/                      # Application generated files
โ”‚   โ”œโ”€โ”€ framework/                # Framework generated files
โ”‚   โ””โ”€โ”€ logs/                     # Log files
โ”œโ”€โ”€ vendor/                       # Composer dependencies
โ”œโ”€โ”€ wiki/                         # Documentation files
โ”œโ”€โ”€ .env.example                  # Environment variables template
โ”œโ”€โ”€ composer.json                 # PHP dependencies
โ”œโ”€โ”€ package.json                  # Node.js dependencies
โ”œโ”€โ”€ vite.config.js               # Vite configuration
โ””โ”€โ”€ tailwind.config.js           # Tailwind CSS configuration

๐ŸŽฏ Application Architecture

MVC Pattern Implementation

graph TD
    A[User Request] --> B[Route]
    B --> C[Middleware]
    C --> D[Controller]
    D --> E[Model]
    E --> F[Database]
    D --> G[View]
    G --> H[Response]
    
    subgraph "Additional Layers"
        I[Policies]
        J[Requests]
        K[Services]
        L[Jobs]
    end
    
    D --> I
    D --> J
    D --> K
    D --> L

๐Ÿ“‚ Core Application Structure

1. Controllers (app/Http/Controllers/)

Authentication Controllers

Auth/
โ”œโ”€โ”€ LoginController.php           # User login logic
โ”œโ”€โ”€ RegisterController.php        # User registration
โ”œโ”€โ”€ GoogleAuthController.php      # Google OAuth integration
โ””โ”€โ”€ AdminAuthController.php       # Admin authentication

Main Controllers

โ”œโ”€โ”€ HomeController.php            # Homepage & dashboard
โ”œโ”€โ”€ UserController.php            # User management
โ”œโ”€โ”€ AdminController.php           # Admin operations
โ”œโ”€โ”€ StoreController.php           # Store listings
โ”œโ”€โ”€ ReviewController.php          # Review system
โ”œโ”€โ”€ PointController.php           # Point management
โ””โ”€โ”€ CodeController.php            # Redeem code system

API Controllers (if needed)

Api/
โ”œโ”€โ”€ AuthController.php            # API authentication
โ”œโ”€โ”€ UserController.php            # User API endpoints
โ””โ”€โ”€ StoreController.php           # Store API endpoints

2. Models (app/Models/)

// Core Models Structure
Models/
โ”œโ”€โ”€ User.php                      # Customer model
โ”œโ”€โ”€ Admin.php                     # Administrator model
โ”œโ”€โ”€ Store.php                     # Barbershop stores
โ”œโ”€โ”€ Review.php                    # Store reviews
โ”œโ”€โ”€ HistoryPoint.php             # Point transactions
โ””โ”€โ”€ ReedemCode.php               # Redeem codes

// Model Relationships Example
class User extends Authenticatable
{
    // Relationships
    public function historyPoints() { return $this->hasMany(HistoryPoint::class); }
    public function reviews() { return $this->hasMany(Review::class); }
    
    // Accessors
    public function getTotalPointsAttribute() { 
        return $this->historyPoints()->sum('points'); 
    }
    
    // Scopes
    public function scopeActive($query) {
        return $query->whereNull('deleted_at');
    }
}

3. Middleware (app/Http/Middleware/)

Middleware/
โ”œโ”€โ”€ Authenticate.php              # User authentication
โ”œโ”€โ”€ AdminAuthenticate.php         # Admin authentication
โ”œโ”€โ”€ RedirectIfAuthenticated.php   # Guest middleware
โ”œโ”€โ”€ VerifyCsrfToken.php          # CSRF protection
โ”œโ”€โ”€ EncryptCookies.php           # Cookie encryption
โ””โ”€โ”€ RedeemThrottle.php           # Custom rate limiting for redeem

4. Requests (app/Http/Requests/)

Requests/
โ”œโ”€โ”€ Auth/
โ”‚   โ”œโ”€โ”€ LoginRequest.php          # Login validation
โ”‚   โ””โ”€โ”€ RegisterRequest.php       # Registration validation
โ”œโ”€โ”€ UserUpdateRequest.php         # User profile updates
โ”œโ”€โ”€ ReviewStoreRequest.php        # Review submission
โ”œโ”€โ”€ RedeemCodeRequest.php         # Code redemption
โ””โ”€โ”€ AdminCreateCodeRequest.php    # Admin code creation

5. Policies (app/Policies/)

Policies/
โ”œโ”€โ”€ UserPolicy.php                # User authorization
โ”œโ”€โ”€ AdminPolicy.php               # Admin authorization
โ”œโ”€โ”€ ReviewPolicy.php              # Review permissions
โ””โ”€โ”€ StorePolicy.php               # Store permissions

// Example Policy Structure
class UserPolicy
{
    public function viewAny(User $user) { return true; }
    public function view(User $user, User $model) { return $user->id === $model->id; }
    public function update(User $user, User $model) { return $user->id === $model->id; }
    public function delete(User $user, User $model) { return false; } // Users can't delete themselves
}

๐Ÿ—„๏ธ Database Structure

Migrations (database/migrations/)

migrations/
โ”œโ”€โ”€ 0001_01_01_000000_create_users_table.php
โ”œโ”€โ”€ 0001_01_01_000001_create_cache_table.php
โ”œโ”€โ”€ 0001_01_01_000002_create_jobs_table.php
โ”œโ”€โ”€ 2024_12_17_093431_create_admins_table.php
โ”œโ”€โ”€ 2024_12_17_111332_create_history_points_table.php
โ”œโ”€โ”€ 2024_12_17_151944_create_reedem_codes_table.php
โ”œโ”€โ”€ 2024_12_18_032226_create_reviews_table.php
โ”œโ”€โ”€ 2025_08_03_121518_create_personal_access_tokens_table.php
โ”œโ”€โ”€ 2025_08_03_122319_add_soft_deletes_to_users_table.php
โ””โ”€โ”€ 2025_08_03_122512_add_soft_deletes_to_admins_table.php

Seeders (database/seeders/)

seeders/
โ”œโ”€โ”€ DatabaseSeeder.php            # Main seeder orchestrator
โ”œโ”€โ”€ AdminSeeder.php               # Admin accounts
โ”œโ”€โ”€ UserSeeder.php                # Sample users
โ”œโ”€โ”€ StoreSeeder.php               # Store data
โ””โ”€โ”€ ReedemCodeSeeder.php         # Sample redeem codes

// Example Seeder Structure
class DatabaseSeeder extends Seeder
{
    public function run()
    {
        $this->call([
            AdminSeeder::class,
            UserSeeder::class,
            StoreSeeder::class,
            ReedemCodeSeeder::class,
        ]);
    }
}

Factories (database/factories/)

factories/
โ”œโ”€โ”€ UserFactory.php               # User test data
โ”œโ”€โ”€ AdminFactory.php              # Admin test data
โ””โ”€โ”€ ReviewFactory.php             # Review test data

// Example Factory
class UserFactory extends Factory
{
    public function definition()
    {
        return [
            'name' => fake()->name(),
            'email' => fake()->unique()->safeEmail(),
            'password' => Hash::make('password'),
            'phone' => fake()->phoneNumber(),
        ];
    }
}

๐ŸŽจ Frontend Structure

Views (resources/views/)

views/
โ”œโ”€โ”€ layouts/                      # Layout templates
โ”‚   โ”œโ”€โ”€ app.blade.php            # Main application layout
โ”‚   โ”œโ”€โ”€ admin.blade.php          # Admin dashboard layout
โ”‚   โ””โ”€โ”€ guest.blade.php          # Guest/public layout
โ”œโ”€โ”€ components/                   # Reusable components
โ”‚   โ”œโ”€โ”€ forms/                   # Form components
โ”‚   โ”œโ”€โ”€ cards/                   # Card components
โ”‚   โ””โ”€โ”€ navigation/              # Navigation components
โ”œโ”€โ”€ auth/                        # Authentication views
โ”‚   โ”œโ”€โ”€ login.blade.php          # Login page
โ”‚   โ”œโ”€โ”€ register.blade.php       # Registration page
โ”‚   โ””โ”€โ”€ google-callback.blade.php # OAuth callback
โ”œโ”€โ”€ admin/                       # Admin dashboard views
โ”‚   โ”œโ”€โ”€ dashboard.blade.php      # Admin dashboard
โ”‚   โ”œโ”€โ”€ users/                   # User management
โ”‚   โ”œโ”€โ”€ codes/                   # Code management
โ”‚   โ””โ”€โ”€ analytics/               # Analytics views
โ”œโ”€โ”€ pages/                       # Public pages
โ”‚   โ”œโ”€โ”€ home.blade.php           # Homepage
โ”‚   โ”œโ”€โ”€ stores/                  # Store listings
โ”‚   โ””โ”€โ”€ profile/                 # User profile
โ””โ”€โ”€ errors/                      # Error pages
    โ”œโ”€โ”€ 404.blade.php            # Not found
    โ”œโ”€โ”€ 500.blade.php            # Server error
    โ””โ”€โ”€ maintenance.blade.php     # Maintenance mode

Assets (resources/)

resources/
โ”œโ”€โ”€ css/
โ”‚   โ”œโ”€โ”€ app.css                  # Main stylesheet
โ”‚   โ”œโ”€โ”€ admin.css                # Admin-specific styles
โ”‚   โ””โ”€โ”€ components/              # Component-specific styles
โ”œโ”€โ”€ js/
โ”‚   โ”œโ”€โ”€ app.js                   # Main JavaScript entry
โ”‚   โ”œโ”€โ”€ admin.js                 # Admin dashboard JS
โ”‚   โ”œโ”€โ”€ components/              # JavaScript components
โ”‚   โ””โ”€โ”€ utils/                   # Utility functions
โ””โ”€โ”€ images/                      # Source images
    โ”œโ”€โ”€ logos/                   # Brand logos
    โ”œโ”€โ”€ icons/                   # Custom icons
    โ””โ”€โ”€ placeholders/            # Placeholder images

Public Assets (public/)

public/
โ”œโ”€โ”€ build/                       # Vite compiled assets
โ”œโ”€โ”€ assets/                      # Static assets
โ”‚   โ”œโ”€โ”€ css/                     # Additional stylesheets
โ”‚   โ”œโ”€โ”€ js/                      # Additional JavaScript
โ”‚   โ”œโ”€โ”€ images/                  # Public images
โ”‚   โ””โ”€โ”€ extensions/              # Third-party libraries
โ”œโ”€โ”€ clients/                     # Client-side resources
โ”œโ”€โ”€ storage/                     # Storage symlink
โ”œโ”€โ”€ favicon.ico                  # Site favicon
โ”œโ”€โ”€ robots.txt                   # Search engine directives
โ””โ”€โ”€ index.php                    # Application entry point

๐Ÿ› ๏ธ Service Layer Architecture

Service Providers (app/Providers/)

Providers/
โ”œโ”€โ”€ AppServiceProvider.php       # Main service provider
โ”œโ”€โ”€ SecurityServiceProvider.php  # Security configurations
โ”œโ”€โ”€ AuthServiceProvider.php      # Authentication policies
โ”œโ”€โ”€ EventServiceProvider.php     # Event listeners
โ””โ”€โ”€ RouteServiceProvider.php     # Route configurations

// Example Service Provider
class AppServiceProvider extends ServiceProvider
{
    public function register()
    {
        $this->app->singleton(PointService::class);
        $this->app->singleton(WhatsAppService::class);
    }
    
    public function boot()
    {
        // Global view composers
        View::composer('*', function ($view) {
            $view->with('appName', config('app.name'));
        });
    }
}

Custom Services (app/Services/)

Services/
โ”œโ”€โ”€ PointService.php             # Point system logic
โ”œโ”€โ”€ WhatsAppService.php          # WhatsApp integration
โ”œโ”€โ”€ GoogleOAuthService.php       # Google OAuth handling
โ””โ”€โ”€ ReportService.php            # Report generation

// Example Service Class
class PointService
{
    public function addPoints(User $user, int $points, string $description)
    {
        return HistoryPoint::create([
            'user_id' => $user->id,
            'points' => $points,
            'type' => 'earned',
            'description' => $description,
        ]);
    }
    
    public function getTotalPoints(User $user): int
    {
        return $user->historyPoints()->sum('points');
    }
}

๐Ÿ”ง Configuration Structure

Config Files (config/)

config/
โ”œโ”€โ”€ app.php                      # Application configuration
โ”œโ”€โ”€ auth.php                     # Authentication configuration
โ”œโ”€โ”€ cache.php                    # Cache configuration
โ”œโ”€โ”€ database.php                 # Database configuration
โ”œโ”€โ”€ filesystems.php              # File storage configuration
โ”œโ”€โ”€ logging.php                  # Logging configuration
โ”œโ”€โ”€ mail.php                     # Mail configuration
โ”œโ”€โ”€ queue.php                    # Queue configuration
โ”œโ”€โ”€ sanctum.php                  # API authentication
โ”œโ”€โ”€ services.php                 # Third-party services
โ””โ”€โ”€ session.php                  # Session configuration

Custom Config Files

config/
โ”œโ”€โ”€ points.php                   # Point system configuration
โ”œโ”€โ”€ codes.php                    # Redeem code configuration
โ”œโ”€โ”€ whatsapp.php                 # WhatsApp settings
โ””โ”€โ”€ barbershop.php               # Application-specific settings

๐Ÿ›ฃ๏ธ Route Structure

Routes (routes/)

routes/
โ”œโ”€โ”€ web.php                      # Web routes
โ”œโ”€โ”€ api.php                      # API routes (if needed)
โ””โ”€โ”€ console.php                  # Artisan commands

// Example Route Structure (web.php)
// Public routes
Route::get('/', [HomeController::class, 'index'])->name('home');
Route::get('/stores', [StoreController::class, 'index'])->name('stores.index');

// Authentication routes
Route::middleware('guest')->group(function () {
    Route::get('/login', [LoginController::class, 'show'])->name('login');
    Route::post('/login', [LoginController::class, 'authenticate']);
    Route::get('/register', [RegisterController::class, 'show'])->name('register');
});

// User dashboard routes
Route::middleware('auth')->group(function () {
    Route::get('/dashboard', [UserController::class, 'dashboard'])->name('dashboard');
    Route::post('/redeem', [PointController::class, 'redeem'])->name('points.redeem');
});

// Admin routes
Route::prefix('admin')->middleware(['auth:admin'])->group(function () {
    Route::get('/', [AdminController::class, 'dashboard'])->name('admin.dashboard');
    Route::resource('users', AdminUserController::class);
    Route::resource('codes', AdminCodeController::class);
});

๐Ÿงช Testing Structure

Tests (tests/)

tests/
โ”œโ”€โ”€ Feature/                     # Feature tests
โ”‚   โ”œโ”€โ”€ Auth/                    # Authentication tests
โ”‚   โ”œโ”€โ”€ User/                    # User functionality tests
โ”‚   โ”œโ”€โ”€ Admin/                   # Admin functionality tests
โ”‚   โ””โ”€โ”€ Api/                     # API tests
โ”œโ”€โ”€ Unit/                        # Unit tests
โ”‚   โ”œโ”€โ”€ Models/                  # Model tests
โ”‚   โ”œโ”€โ”€ Services/                # Service layer tests
โ”‚   โ””โ”€โ”€ Helpers/                 # Helper function tests
โ”œโ”€โ”€ Browser/                     # Browser tests (Dusk)
โ””โ”€โ”€ TestCase.php                 # Base test class

Example Test Structure

// tests/Feature/Auth/LoginTest.php
class LoginTest extends TestCase
{
    use RefreshDatabase;
    
    public function test_user_can_login_with_valid_credentials()
    {
        $user = User::factory()->create(['password' => Hash::make('password')]);
        
        $response = $this->post('/login', [
            'email' => $user->email,
            'password' => 'password',
        ]);
        
        $response->assertRedirect('/dashboard');
        $this->assertAuthenticatedAs($user);
    }
}

๐Ÿ“ฆ Helper Structure

Helper Functions (app/Helper/)

Helper/
โ””โ”€โ”€ Common.php                   # Common utility functions

// Example Helper Functions
if (!function_exists('formatPoints')) {
    function formatPoints($points) {
        return number_format($points) . ' pts';
    }
}

if (!function_exists('generateCode')) {
    function generateCode($length = 8) {
        $characters = 'ABCDEFGHJKLMNPQRSTUVWXYZ123456789';
        return substr(str_shuffle($characters), 0, $length);
    }
}

๐Ÿ”จ Console Commands

Custom Commands (app/Console/Commands/)

Commands/
โ”œโ”€โ”€ CleanupExpiredCodes.php      # Clean expired redeem codes
โ”œโ”€โ”€ GenerateReport.php           # Generate analytics reports
โ”œโ”€โ”€ OptimizeDatabase.php         # Database optimization
โ””โ”€โ”€ SendNotifications.php        # Send batch notifications

// Example Command
class CleanupExpiredCodes extends Command
{
    protected $signature = 'barbershop:cleanup-codes';
    protected $description = 'Remove expired redeem codes';
    
    public function handle()
    {
        $deletedCount = ReedemCode::where('expires_at', '<', now())
            ->where('is_active', false)
            ->delete();
            
        $this->info("Deleted {$deletedCount} expired codes.");
    }
}

๐Ÿ“Š Performance Considerations

Caching Strategy

// Model caching example
class Store extends Model
{
    public function getCachedReviews()
    {
        return Cache::remember("store.{$this->id}.reviews", 3600, function () {
            return $this->reviews()->with('user')->get();
        });
    }
}

// Query optimization
class UserController extends Controller
{
    public function dashboard()
    {
        $user = auth()->user()->load(['historyPoints' => function ($query) {
            $query->latest()->limit(10);
        }]);
        
        return view('dashboard', compact('user'));
    }
}

Database Optimization

// Eager loading to prevent N+1 queries
$stores = Store::with(['reviews.user'])
    ->withAvg('reviews', 'rating')
    ->withCount('reviews')
    ->get();

// Chunking for large datasets
User::chunk(1000, function ($users) {
    foreach ($users as $user) {
        // Process large user base in chunks
    }
});

๐Ÿ”’ Security Considerations

Input Validation

// Request validation
class RedeemCodeRequest extends FormRequest
{
    public function rules()
    {
        return [
            'code' => ['required', 'string', 'max:20', 'regex:/^[A-Z0-9]+$/'],
        ];
    }
}

// Model protection
class User extends Model
{
    protected $fillable = ['name', 'email', 'phone'];
    protected $hidden = ['password', 'remember_token'];
    protected $casts = ['email_verified_at' => 'datetime'];
}

Authorization

// Policy-based authorization
class ReviewController extends Controller
{
    public function update(Review $review)
    {
        $this->authorize('update', $review);
        // Update logic
    }
}

Next: Frontend Components untuk detail komponen UI dan interaksi frontend.