Equipment Repositories Reference

Consolidated reference for equipment configuration repositories.


Overview

Equipment repositories provide data access for bow components and configurations, following a consistent pattern with offline-first architecture.

Repositories Covered (9):

  • SightConfigurationRepository
  • RestConfigurationRepository
  • StabilizerConfigurationRepository
  • PlungerConfigurationRepository
  • TabConfigurationRepository
  • ReleaseAidConfigurationRepository
  • ClkrConfigurationRepository
  • StringConfigurationRepository
  • LimbsConfigurationRepository

Already Documented:

  • BowSetupRepository
  • ArrowSetupRepository
  • RiserConfigurationRepository

Common Repository Pattern

All equipment repositories follow this structure:

class EquipmentConfigurationRepository(
    private val dao: EquipmentConfigurationDao
) {
    // Get configuration for bow setup
    suspend fun getForBowSetup(setupId: Long): Result<Configuration?>
 
    // Save configuration
    suspend fun save(config: Configuration): Result<Long>
 
    // Update configuration
    suspend fun update(config: Configuration): Result<Unit>
 
    // Delete configuration
    suspend fun delete(config: Configuration): Result<Unit>
 
    // Observe configuration changes
    fun observeForBowSetup(setupId: Long): Flow<Configuration?>
}

SightConfigurationRepository

File: data/repositories/SightConfigurationRepository.kt Purpose: Sight settings with distance marks

API

class SightConfigurationRepository(
    private val dao: SightConfigurationDao
) {
    // CRUD operations
    suspend fun getForBowSetup(setupId: Long): Result<SightConfiguration?>
    suspend fun save(config: SightConfiguration): Result<Long>
    suspend fun update(config: SightConfiguration): Result<Unit>
    suspend fun delete(config: SightConfiguration): Result<Unit>
 
    // Distance marks
    suspend fun getDistanceMarks(sightId: Long): Result<Map<Int, Double>>
    suspend fun updateDistanceMark(sightId: Long, distance: Int, mark: Double): Result<Unit>
    suspend fun deleteDistanceMark(sightId: Long, distance: Int): Result<Unit>
 
    // Observe changes
    fun observeForBowSetup(setupId: Long): Flow<SightConfiguration?>
}

Usage Example

// Create sight configuration
val sightConfig = SightConfiguration(
    bowSetupId = bowId,
    manufacturer = "Shibuya",
    model = "Ultima RC II",
    scopeMagnification = 4.0,
    apertureDiameter = 0.5,
    notes = "Competition sight"
)
 
val sightId = sightRepository.save(sightConfig)
    .getOrThrow()
 
// Add distance marks
sightRepository.updateDistanceMark(sightId, 18, 6.5)  // 18m @ 6.5
sightRepository.updateDistanceMark(sightId, 30, 4.2)  // 30m @ 4.2
sightRepository.updateDistanceMark(sightId, 50, 2.1)  // 50m @ 2.1
 
// Retrieve with marks
val config = sightRepository.getForBowSetup(bowId).getOrNull()
val marks = sightRepository.getDistanceMarks(sightId).getOrNull()

RestConfigurationRepository

File: data/repositories/RestConfigurationRepository.kt Purpose: Arrow rest position settings

API

class RestConfigurationRepository(
    private val dao: RestConfigurationDao
) {
    suspend fun getForBowSetup(setupId: Long): Result<RestConfiguration?>
    suspend fun save(config: RestConfiguration): Result<Long>
    suspend fun update(config: RestConfiguration): Result<Unit>
    suspend fun delete(config: RestConfiguration): Result<Unit>
 
    // Position adjustments
    suspend fun updatePosition(
        configId: Long,
        vertical: Double,
        horizontal: Double
    ): Result<Unit>
 
    fun observeForBowSetup(setupId: Long): Flow<RestConfiguration?>
}

Usage Example

val restConfig = RestConfiguration(
    bowSetupId = bowId,
    manufacturer = "Shibuya",
    model = "Ultima Rest II",
    verticalPosition = 2.5,
    horizontalPosition = 0.0,
    notes = "Center shot"
)
 
restRepository.save(restConfig)
 
// Adjust position
restRepository.updatePosition(
    configId = restId,
    vertical = 2.6,     // +0.1mm up
    horizontal = -0.2   // 0.2mm left
)

StabilizerConfigurationRepository

File: data/repositories/StabilizerConfigurationRepository.kt Purpose: Stabilizer rod configuration

API

class StabilizerConfigurationRepository(
    private val dao: StabilizerConfigurationDao
) {
    suspend fun getForBowSetup(setupId: Long): Result<StabilizerConfiguration?>
    suspend fun save(config: StabilizerConfiguration): Result<Long>
    suspend fun update(config: StabilizerConfiguration): Result<Unit>
    suspend fun delete(config: StabilizerConfiguration): Result<Unit>
 
    // Rod configuration
    suspend fun updateFrontRod(
        configId: Long,
        length: Double,
        weight: Double
    ): Result<Unit>
 
    suspend fun updateSideRods(
        configId: Long,
        length: Double,
        weight: Double
    ): Result<Unit>
 
    fun observeForBowSetup(setupId: Long): Flow<StabilizerConfiguration?>
}

Usage Example

val stabConfig = StabilizerConfiguration(
    bowSetupId = bowId,
    manufacturer = "Doinker",
    frontRodLength = 30.0,      // inches
    frontRodWeight = 12.0,      // oz
    sideRodLength = 12.0,       // inches
    sideRodWeight = 8.0,        // oz
    vBarAngle = 45.0            // degrees
)
 
stabRepository.save(stabConfig)
 
// Experiment with front rod
stabRepository.updateFrontRod(
    configId = stabId,
    length = 32.0,
    weight = 14.0
)

PlungerConfigurationRepository

File: data/repositories/PlungerConfigurationRepository.kt Purpose: Plunger/button settings

API

class PlungerConfigurationRepository(
    private val dao: PlungerConfigurationDao
) {
    suspend fun getForBowSetup(setupId: Long): Result<PlungerConfiguration?>
    suspend fun save(config: PlungerConfiguration): Result<Long>
    suspend fun update(config: PlungerConfiguration): Result<Unit>
    suspend fun delete(config: PlungerConfiguration): Result<Unit>
 
    // Tension and position
    suspend fun adjustTension(configId: Long, tension: Double): Result<Unit>
    suspend fun adjustPosition(configId: Long, position: Double): Result<Unit>
 
    fun observeForBowSetup(setupId: Long): Flow<PlungerConfiguration?>
}

Usage Example

val plungerConfig = PlungerConfiguration(
    bowSetupId = bowId,
    manufacturer = "Beiter",
    model = "Plunger",
    tension = 3.5,       // clicks
    position = 1.5,      // mm from riser
    notes = "Medium-stiff spring"
)
 
plungerRepository.save(plungerConfig)
 
// Fine-tune
plungerRepository.adjustTension(plungerId, 3.75)
plungerRepository.adjustPosition(plungerId, 1.6)

Release Mechanism Repositories

TabConfigurationRepository

File: data/repositories/TabConfigurationRepository.kt Purpose: Finger tab settings (recurve)

class TabConfigurationRepository(
    private val dao: TabConfigurationDao
) {
    suspend fun getForBowSetup(setupId: Long): Result<TabConfiguration?>
    suspend fun save(config: TabConfiguration): Result<Long>
    suspend fun update(config: TabConfiguration): Result<Unit>
    suspend fun delete(config: TabConfiguration): Result<Unit>
 
    fun observeForBowSetup(setupId: Long): Flow<TabConfiguration?>
}

Usage:

val tabConfig = TabConfiguration(
    bowSetupId = bowId,
    manufacturer = "AAE",
    model = "Elite Tab",
    size = "Medium",
    thickness = 3.5,      // mm
    material = "Cordovan"
)
 
tabRepository.save(tabConfig)

ReleaseAidConfigurationRepository

File: data/repositories/ReleaseAidConfigurationRepository.kt Purpose: Release aid settings (compound)

class ReleaseAidConfigurationRepository(
    private val dao: ReleaseAidConfigurationDao
) {
    suspend fun getForBowSetup(setupId: Long): Result<ReleaseAidConfiguration?>
    suspend fun save(config: ReleaseAidConfiguration): Result<Long>
    suspend fun update(config: ReleaseAidConfiguration): Result<Unit>
    suspend fun delete(config: ReleaseAidConfiguration): Result<Unit>
 
    // Release settings
    suspend fun adjustSensitivity(configId: Long, sensitivity: Double): Result<Unit>
    suspend fun adjustTravel(configId: Long, travel: Double): Result<Unit>
 
    fun observeForBowSetup(setupId: Long): Flow<ReleaseAidConfiguration?>
}

Usage:

val releaseConfig = ReleaseAidConfiguration(
    bowSetupId = bowId,
    manufacturer = "Scott",
    model = "Halo Pro",
    type = "Thumb",
    sensitivity = 2.5,
    travelDistance = 0.75
)
 
releaseRepository.save(releaseConfig)

Bow Component Repositories

ClkrConfigurationRepository (Clicker)

File: data/repositories/ClkrConfigurationRepository.kt Purpose: Clicker settings (recurve)

class ClkrConfigurationRepository(
    private val dao: ClkrConfigurationDao
) {
    suspend fun getForBowSetup(setupId: Long): Result<ClkrConfiguration?>
    suspend fun save(config: ClkrConfiguration): Result<Long>
    suspend fun update(config: ClkrConfiguration): Result<Unit>
    suspend fun delete(config: ClkrConfiguration): Result<Unit>
 
    // Length adjustment
    suspend fun adjustClickerLength(configId: Long, length: Double): Result<Unit>
 
    fun observeForBowSetup(setupId: Long): Flow<ClkrConfiguration?>
}

Usage:

val clickerConfig = ClkrConfiguration(
    bowSetupId = bowId,
    manufacturer = "Beiter",
    model = "Clicker",
    clickerLength = 28.5,        // mm
    clickerThickness = 0.20,     // mm
    position = "Above"
)
 
clickerRepository.save(clickerConfig)
 
// Adjust for new arrows
clickerRepository.adjustClickerLength(clickerId, 28.75)

StringConfigurationRepository

File: data/repositories/StringConfigurationRepository.kt Purpose: Bowstring configuration

class StringConfigurationRepository(
    private val dao: StringConfigurationDao
) {
    suspend fun getForBowSetup(setupId: Long): Result<StringConfiguration?>
    suspend fun save(config: StringConfiguration): Result<Long>
    suspend fun update(config: StringConfiguration): Result<Unit>
    suspend fun delete(config: StringConfiguration): Result<Unit>
 
    // String maintenance
    suspend fun recordStringChange(
        bowSetupId: Long,
        config: StringConfiguration
    ): Result<Long>
 
    suspend fun getStringHistory(bowSetupId: Long): Result<List<StringConfiguration>>
 
    fun observeForBowSetup(setupId: Long): Flow<StringConfiguration?>
}

Usage:

val stringConfig = StringConfiguration(
    bowSetupId = bowId,
    manufacturer = "BCY",
    material = "X99",
    strandCount = 18,
    servingType = "Halo",
    length = 68.5,              // inches
    twists = 20,
    dateInstalled = System.currentTimeMillis()
)
 
stringRepository.recordStringChange(bowId, stringConfig)
 
// Track string history
val history = stringRepository.getStringHistory(bowId).getOrNull()
// Shows progression over time

LimbsConfigurationRepository

File: data/repositories/LimbsConfigurationRepository.kt Purpose: Bow limb settings

class LimbsConfigurationRepository(
    private val dao: LimbsConfigurationDao
) {
    suspend fun getForBowSetup(setupId: Long): Result<LimbsConfiguration?>
    suspend fun save(config: LimbsConfiguration): Result<Long>
    suspend fun update(config: LimbsConfiguration): Result<Unit>
    suspend fun delete(config: LimbsConfiguration): Result<Unit>
 
    // Limb adjustments
    suspend fun adjustTiller(configId: Long, tiller: Double): Result<Unit>
    suspend fun recordLimbChange(
        bowSetupId: Long,
        config: LimbsConfiguration
    ): Result<Long>
 
    fun observeForBowSetup(setupId: Long): Flow<LimbsConfiguration?>
}

Usage:

val limbsConfig = LimbsConfiguration(
    bowSetupId = bowId,
    manufacturer = "Win&Win",
    model = "Winex",
    length = 68,                // inches
    poundage = 38.0,            // lbs
    tiller = 0.5,               // mm (top - bottom)
    dateInstalled = System.currentTimeMillis()
)
 
limbsRepository.save(limbsConfig)
 
// Adjust tiller
limbsRepository.adjustTiller(limbsId, 0.75)

Complete Equipment Setup Example

suspend fun createCompleteEquipmentSetup(bowSetupId: Long) {
    // Bow components
    val sight = SightConfiguration(
        bowSetupId = bowSetupId,
        manufacturer = "Shibuya",
        model = "Ultima RC II",
        scopeMagnification = 4.0,
        apertureDiameter = 0.5
    )
    sightRepository.save(sight)
 
    val rest = RestConfiguration(
        bowSetupId = bowSetupId,
        manufacturer = "Shibuya",
        model = "Ultima Rest II",
        verticalPosition = 2.5,
        horizontalPosition = 0.0
    )
    restRepository.save(rest)
 
    val stabilizer = StabilizerConfiguration(
        bowSetupId = bowSetupId,
        manufacturer = "Doinker",
        frontRodLength = 30.0,
        frontRodWeight = 12.0,
        sideRodLength = 12.0,
        sideRodWeight = 8.0,
        vBarAngle = 45.0
    )
    stabilizerRepository.save(stabilizer)
 
    val plunger = PlungerConfiguration(
        bowSetupId = bowSetupId,
        manufacturer = "Beiter",
        model = "Plunger",
        tension = 3.5,
        position = 1.5
    )
    plungerRepository.save(plunger)
 
    val tab = TabConfiguration(
        bowSetupId = bowSetupId,
        manufacturer = "AAE",
        model = "Elite Tab",
        size = "Medium",
        thickness = 3.5,
        material = "Cordovan"
    )
    tabRepository.save(tab)
 
    val clicker = ClkrConfiguration(
        bowSetupId = bowSetupId,
        manufacturer = "Beiter",
        model = "Clicker",
        clickerLength = 28.5,
        clickerThickness = 0.20,
        position = "Above"
    )
    clickerRepository.save(clicker)
 
    val string = StringConfiguration(
        bowSetupId = bowSetupId,
        manufacturer = "BCY",
        material = "X99",
        strandCount = 18,
        servingType = "Halo",
        length = 68.5,
        twists = 20,
        dateInstalled = System.currentTimeMillis()
    )
    stringRepository.save(string)
 
    val limbs = LimbsConfiguration(
        bowSetupId = bowSetupId,
        manufacturer = "Win&Win",
        model = "Winex",
        length = 68,
        poundage = 38.0,
        tiller = 0.5,
        dateInstalled = System.currentTimeMillis()
    )
    limbsRepository.save(limbs)
}

Querying Complete Equipment

data class CompleteEquipmentSetup(
    val bowSetup: BowSetup,
    val sight: SightConfiguration?,
    val rest: RestConfiguration?,
    val stabilizer: StabilizerConfiguration?,
    val plunger: PlungerConfiguration?,
    val tab: TabConfiguration?,
    val clicker: ClkrConfiguration?,
    val string: StringConfiguration?,
    val limbs: LimbsConfiguration?
)
 
suspend fun getCompleteSetup(bowSetupId: Long): Result<CompleteEquipmentSetup> {
    return runCatching {
        CompleteEquipmentSetup(
            bowSetup = bowSetupRepository.getById(bowSetupId).getOrThrow(),
            sight = sightRepository.getForBowSetup(bowSetupId).getOrNull(),
            rest = restRepository.getForBowSetup(bowSetupId).getOrNull(),
            stabilizer = stabilizerRepository.getForBowSetup(bowSetupId).getOrNull(),
            plunger = plungerRepository.getForBowSetup(bowSetupId).getOrNull(),
            tab = tabRepository.getForBowSetup(bowSetupId).getOrNull(),
            clicker = clickerRepository.getForBowSetup(bowSetupId).getOrNull(),
            string = stringRepository.getForBowSetup(bowSetupId).getOrNull(),
            limbs = limbsRepository.getForBowSetup(bowSetupId).getOrNull()
        )
    }
}

Reactive Updates

All equipment repositories support reactive updates via Flow:

@Composable
fun EquipmentConfigScreen(
    bowSetupId: Long,
    sightRepository: SightConfigurationRepository,
    restRepository: RestConfigurationRepository
    // ... other repositories
) {
    val sightConfig by sightRepository
        .observeForBowSetup(bowSetupId)
        .collectAsState(initial = null)
 
    val restConfig by restRepository
        .observeForBowSetup(bowSetupId)
        .collectAsState(initial = null)
 
    // UI automatically updates when configurations change
    Column {
        sightConfig?.let { sight ->
            SightConfigCard(sight)
        }
 
        restConfig?.let { rest ->
            RestConfigCard(rest)
        }
    }
}

Best Practices

1. Configuration Consistency

// GOOD: Create all components for a bow setup
suspend fun setupNewBow(bowId: Long) {
    // Create all essential configurations
    createSightConfiguration(bowId)
    createRestConfiguration(bowId)
    createStabilizerConfiguration(bowId)
}
 
// BAD: Partial configuration
suspend fun setupNewBow(bowId: Long) {
    createSightConfiguration(bowId)
    // Missing other essential components
}

2. Error Handling

// GOOD: Handle missing configurations gracefully
val sight = sightRepository.getForBowSetup(bowId)
    .getOrNull()
 
if (sight == null) {
    showPrompt("Add sight configuration?")
} else {
    displaySightSettings(sight)
}
 
// BAD: Assume configuration exists
val sight = sightRepository.getForBowSetup(bowId)
    .getOrThrow()  // May crash if not configured

3. Atomic Updates

// GOOD: Transaction for related changes
suspend fun updateBowSetup(
    bowId: Long,
    sightAdjustment: Double,
    restAdjustment: Double
) {
    database.withTransaction {
        sightRepository.adjustPosition(sightId, sightAdjustment)
        restRepository.updatePosition(restId, 0.0, restAdjustment)
    }
}


Status: ✅ All 9 equipment repositories in production Pattern: Consistent CRUD with bow setup foreign key Offline-First: All operations local-first with optional sync Last Updated: 2025-11-01