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
app/Http/Controllers/
)
1. 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
app/Models/
)
2. 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');
}
}
app/Http/Middleware/
)
3. 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
app/Http/Requests/
)
4. 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
app/Policies/
)
5. 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
database/migrations/
)
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
database/seeders/
)
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,
]);
}
}
database/factories/
)
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
resources/views/
)
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
resources/
)
Assets (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/
)
Public Assets (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
app/Providers/
)
Service 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'));
});
}
}
app/Services/
)
Custom 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/
)
Config Files (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
app/Helper/
)
Helper Functions (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
app/Console/Commands/
)
Custom 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.