Skip to content

TomaszWojtyniak/BeatRate

Repository files navigation

BeatRate App Architecture Overview

Your BeatRate app follows a Clean Architecture pattern with a modular, layered approach designed for iOS music discovery. The app is built using Swift 6.2 with modern concurrency patterns (actors, async/await) and is structured around several distinct layers.

Core Architecture Layers

1. Presentation Layer

  • Views: SwiftUI-based UI components (LoginView, HomeView, etc.)
  • Data Models: Observable view models that manage UI state
    • HomeDataModel: Manages home screen state and user interactions
    • LoginDataModel: Handles authentication flow and login state
  • Navigation: Custom navigation stacks (LoginNavigationStack)

2. Domain Layer (Use Cases)

  • Use Cases: Business logic abstraction between UI and data layers
    • GetHomeUseCase / SetHomeUseCase: Home screen business logic
    • GetLoginUseCase / SetLoginUseCase: Authentication business logic
  • Protocols: Define contracts for dependency injection and testing

3. Data Layer

  • Repositories: Data access abstraction layer
    • HomeRepository: Aggregates data from multiple sources (Firebase + MusicKit + Cache)
    • MusicRepository: Manages MusicKit integration and music data
    • LoginRepository: Handles authentication data operations

4. Service Layer

  • Firebase Services:
    • AuthFirebaseService: Apple Sign-In with Firebase authentication
    • DatabaseFirebaseService: Firebase Realtime Database integration
  • MusicKit Service: Apple Music integration
  • SwiftDataManager: Local caching and persistence using SwiftData

5. Cross-Cutting Concerns

  • Analytics: AnalyticsManager for Firebase Analytics integration
  • Crash Reporting: CrashLogger for Firebase Crashlytics
  • Logging: Comprehensive OSLog-based logging with categorized loggers

Key Architectural Patterns

Dependency Injection

  • Singleton pattern with protocol-based abstractions
  • Constructor injection for testability
  • Shared instances (.shared) for system-wide services

Actor-Based Concurrency

  • HomeRepository, MusicRepository, AuthFirebaseService, DatabaseFirebaseService are all actors
  • Thread-safe data access and mutation
  • Modern Swift concurrency throughout

Caching Strategy

Three-tier data fetching:

  1. SwiftData local cache (24-hour validity)
  2. Firebase remote database
  3. MusicKit API calls

Intelligent cache invalidation and refresh mechanisms

Modular Package Structure

Your app is organized into Swift Packages:

  • FirebaseService: Authentication and database services
  • Analytics: Logging and crash reporting
  • Models: Shared data models
  • Core modules: MusicRepository, SwiftDataManager, etc.

Data Flow Pattern

  1. UI Layer (SwiftUI Views) ↔ Data Models (Observable classes)
  2. Data ModelsUse Cases (Business logic)
  3. Use CasesRepositories (Data orchestration)
  4. RepositoriesServices (External API/Database calls)
  5. ServicesExternal APIs (Firebase, MusicKit)

Key Features of Your Architecture

Strengths:

  • ✅ Clean separation of concerns with clear layer boundaries
  • ✅ Modern Swift concurrency (actors, async/await)
  • ✅ Protocol-oriented design for testability and flexibility
  • ✅ Comprehensive logging with categorized loggers
  • ✅ Multi-tier caching for optimal performance
  • ✅ Error handling with proper logging and crash reporting
  • ✅ Dependency injection for loose coupling

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors 2

  •  
  •  

Languages