Skip to content

Commit b7def4e

Browse files
committed
Refactor iOS target configurations by removing deprecated iosX64() references across multiple Gradle files. Update .gitignore to only include root-level local development data and adjust documentation for iOS targets in composeApp. Enhance Gradle properties by removing obsolete settings related to Kotlin native cache. Update dependencies to use explicit coordinates for material icons, improving clarity and consistency in the project structure.
1 parent 33fe265 commit b7def4e

309 files changed

Lines changed: 7915 additions & 68 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.gitignore

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -88,10 +88,8 @@ compose-resources/
8888
.dockerignore
8989
docker/storage/
9090

91-
# Local Development Data
92-
data/
93-
# Compose App data layer (package com.vaultstadio.app.data) must be committed
94-
!compose-frontend/composeApp/src/commonMain/kotlin/com/vaultstadio/app/data/
91+
# Local Development Data (root-level only; frontend/data/ are KMP modules and must be committed)
92+
backend/api/data/
9593

9694
# Testing
9795
coverage/

docs/development/PLATFORM_BUILD_REPORT.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,15 +108,15 @@
108108

109109
### 6.2 Cambios realizados
110110

111-
1. **Targets iOS en composeApp**: Añadidos `iosX64()`, `iosArm64()`, `iosSimulatorArm64()` y source set `iosMain` con dependencia `ktor-client-darwin`.
111+
1. **Targets iOS en composeApp**: Añadidos `iosArm64()`, `iosSimulatorArm64()` y source set `iosMain` con dependencia `ktor-client-darwin`.
112112
2. **Koin**: En composeApp se añadió `fun sharedModule(apiBaseUrl: String) = allModules(apiBaseUrl)`. En iosApp, `KoinHelper.initKoin(apiBaseUrl)` y `doInitKoin(apiBaseUrl?)` usan `sharedModule(apiBaseUrl)` con URL por defecto o pasada desde Swift.
113113
3. **Actuales iOS**: En `composeApp/src/iosMain/` se añadieron implementaciones *stub* para: `Download`, `DragDrop`, `FilePicker`, `MediaPlayer`, `PlatformStorage`. Son válidas para compilar; para producción conviene sustituirlas por implementaciones nativas (UIDocumentPickerViewController, NSUserDefaults, AVPlayer, etc.).
114114

115115
### 6.3 Resumen iOS
116116

117117
| Tema | Estado | Nota |
118118
|-------------------|--------|------|
119-
| Target iOS en composeApp | Hecho | iosX64, iosArm64, iosSimulatorArm64 + iosMain. |
119+
| Target iOS en composeApp | Hecho | iosArm64, iosSimulatorArm64 + iosMain. |
120120
| Koin `sharedModule` | Hecho | `sharedModule(apiBaseUrl)` en composeApp; KoinHelper actualizado. |
121121
| Expect/actual iOS | Stubs | Download, DragDrop, FilePicker, MediaPlayer, PlatformStorage en iosMain; completar con APIs nativas cuando se requiera. |
122122
| Link framework | Requiere Xcode | En macOS con Xcode el link del framework debería funcionar. |

frontend/composeApp/build.gradle.kts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ kotlin {
3737
// so only the active screen is instantiated; all code remains in a single bundle (Kotlin/Wasm has no chunk splitting yet).
3838
}
3939

40-
iosX64()
4140
iosArm64()
4241
iosSimulatorArm64()
4342

@@ -95,7 +94,7 @@ kotlin {
9594
implementation(compose.runtime)
9695
implementation(compose.foundation)
9796
implementation(compose.material3)
98-
implementation(compose.materialIconsExtended)
97+
implementation(libs.compose.material.icons.extended)
9998
implementation(compose.ui)
10099
implementation(compose.components.resources)
101100
implementation(compose.components.uiToolingPreview)
@@ -157,12 +156,10 @@ kotlin {
157156
}
158157
}
159158

160-
val iosX64Main by getting
161159
val iosArm64Main by getting
162160
val iosSimulatorArm64Main by getting
163161
val iosMain by creating {
164162
dependsOn(commonMain)
165-
iosX64Main.dependsOn(this)
166163
iosArm64Main.dependsOn(this)
167164
iosSimulatorArm64Main.dependsOn(this)
168165
dependencies {

frontend/core/resources/build.gradle.kts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ kotlin {
2121
compilerOptions { jvmTarget.set(org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_17) }
2222
}
2323
wasmJs { browser() }
24-
iosX64()
2524
iosArm64()
2625
iosSimulatorArm64()
2726

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
plugins { alias(libs.plugins.kotlin.multiplatform); alias(libs.plugins.kotlin.serialization); alias(libs.plugins.android.kotlin.multiplatform.library) }
2+
3+
val libNamespace = "com.vaultstadio.app.data.activity"
4+
5+
kotlin {
6+
jvm("desktop")
7+
android {
8+
namespace = libNamespace
9+
compileSdk = 36
10+
minSdk = 24
11+
compilerOptions { jvmTarget.set(org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_17) }
12+
}
13+
wasmJs { browser() }
14+
iosArm64(); iosSimulatorArm64()
15+
sourceSets {
16+
val commonMain by getting {
17+
kotlin.srcDirs("src/main")
18+
dependencies {
19+
implementation(project(":domain:result"))
20+
implementation(project(":domain:activity"))
21+
implementation(project(":data:network"))
22+
implementation(libs.kotlinx.serialization.json)
23+
implementation(libs.kotlinx.datetime)
24+
implementation(libs.ktor.client.core)
25+
implementation(libs.koin.core)
26+
}
27+
}
28+
}
29+
}
30+
afterEvaluate { group = libNamespace }
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
/**
2+
* Activity API
3+
*/
4+
5+
package com.vaultstadio.app.data.activity.api
6+
7+
import com.vaultstadio.app.data.activity.dto.ActivityDTO
8+
import com.vaultstadio.app.data.network.ApiResult
9+
import com.vaultstadio.app.data.network.BaseApi
10+
import io.ktor.client.HttpClient
11+
12+
class ActivityApi(client: HttpClient) : BaseApi(client) {
13+
14+
suspend fun getRecentActivity(limit: Int = 20): ApiResult<List<ActivityDTO>> =
15+
get("/api/v1/activity", mapOf("limit" to limit.toString()))
16+
17+
suspend fun getItemActivity(itemId: String, limit: Int = 20): ApiResult<List<ActivityDTO>> =
18+
get("/api/v1/activity/item/$itemId", mapOf("limit" to limit.toString()))
19+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/**
2+
* Koin module for activity (API, service, repository, use cases).
3+
* ComposeApp loads it via modules(... + activityModule).
4+
*/
5+
6+
package com.vaultstadio.app.data.activity.di
7+
8+
import com.vaultstadio.app.data.activity.api.ActivityApi
9+
import com.vaultstadio.app.data.activity.repository.ActivityRepositoryImpl
10+
import com.vaultstadio.app.data.activity.service.ActivityService
11+
import com.vaultstadio.app.data.activity.usecase.GetItemActivityUseCaseImpl
12+
import com.vaultstadio.app.data.activity.usecase.GetRecentActivityUseCaseImpl
13+
import com.vaultstadio.app.domain.activity.ActivityRepository
14+
import com.vaultstadio.app.domain.activity.usecase.GetItemActivityUseCase
15+
import com.vaultstadio.app.domain.activity.usecase.GetRecentActivityUseCase
16+
import io.ktor.client.HttpClient
17+
import org.koin.dsl.module
18+
19+
val activityModule = module {
20+
single { ActivityApi(get<HttpClient>()) }
21+
single { ActivityService(get()) }
22+
single<ActivityRepository> { ActivityRepositoryImpl(get()) }
23+
24+
factory<GetRecentActivityUseCase> { GetRecentActivityUseCaseImpl(get()) }
25+
factory<GetItemActivityUseCase> { GetItemActivityUseCaseImpl(get()) }
26+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
/**
2+
* Activity Data Transfer Objects
3+
*/
4+
5+
package com.vaultstadio.app.data.activity.dto
6+
7+
import kotlinx.datetime.Instant
8+
import kotlinx.serialization.Serializable
9+
10+
@Serializable
11+
data class ActivityDTO(
12+
val id: String,
13+
val type: String,
14+
val userId: String?,
15+
val itemId: String?,
16+
val itemPath: String?,
17+
val details: String?,
18+
@kotlinx.serialization.Contextual
19+
val createdAt: Instant,
20+
)
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
/**
2+
* Activity Mappers
3+
*/
4+
5+
package com.vaultstadio.app.data.activity.mapper
6+
7+
import com.vaultstadio.app.data.activity.dto.ActivityDTO
8+
import com.vaultstadio.app.domain.activity.model.Activity
9+
10+
fun ActivityDTO.toDomain(): Activity = Activity(
11+
id = id,
12+
type = type,
13+
userId = userId,
14+
itemId = itemId,
15+
itemPath = itemPath,
16+
details = details,
17+
createdAt = createdAt,
18+
)
19+
20+
fun List<ActivityDTO>.toActivityList(): List<Activity> = map { it.toDomain() }
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
/**
2+
* Activity Repository implementation
3+
*/
4+
5+
package com.vaultstadio.app.data.activity.repository
6+
7+
import com.vaultstadio.app.data.activity.service.ActivityService
8+
import com.vaultstadio.app.data.network.mapper.toResult
9+
import com.vaultstadio.app.domain.activity.ActivityRepository
10+
11+
class ActivityRepositoryImpl(
12+
private val activityService: ActivityService,
13+
) : ActivityRepository {
14+
15+
override suspend fun getRecentActivity(limit: Int) =
16+
activityService.getRecentActivity(limit).toResult()
17+
18+
override suspend fun getItemActivity(itemId: String, limit: Int) =
19+
activityService.getItemActivity(itemId, limit).toResult()
20+
}

0 commit comments

Comments
 (0)