appwrite / appwrite/sdk-for-android
🐛 Bug Report: Crash when trying to createRow with transaction
- Dominant language
- Kotlin
- Stars
- 154
- Forks
- 30
- Avg merge
- 5h 41m
- Merged PRs (30d)
- 3
Description
### 👟 Reproduction steps
The new sdk for Android has a bug when trying to creating a row using a transaction.
Main problem is that the Row is looking for a $createdAt property when, if using a transaction, does not make sense because has not been executed. App crashes on Row.kt in the following lines:
```
@Suppress("UNCHECKED_CAST")
fun from(
map: Map,
nestedType: Class
) = Row(
id = map["\$id"] as String,
sequence = (map["\$sequence"] as Number).toLong(),
tableId = map["\$tableId"] as String,
databaseId = map["\$databaseId"] as String,
createdAt = map["\$createdAt"] as String,
updatedAt = map["\$updatedAt"] as String,
permissions = map["\$permissions"] as List,
data = map["data"]?.jsonCast(to = nestedType) ?: map.jsonCast(to = nestedType)
)
```
One possible solution (markeing the fields as nullable) is the following:
```
data class Row(
/**
* Row ID.
*/
@SerializedName("\$id")
val id: String,
.....
/**
* Row creation date in ISO 8601 format.
*/
@SerializedName("\$createdAt")
val createdAt: String?,
/**
* Row update date in ISO 8601 format.
*/
@SerializedName("\$updatedAt")
val updatedAt: String?,
....
createdAt = map["\$createdAt"] as String?,
updatedAt = map["\$updatedAt"] as String?,
```
I removed the transaction attribute when debuging the code and it worked perfectly.
### 👍 Expected behavior
Work as well as if no transaction is place
### 👎 Actual Behavior
The app crashes, here is the error from the logcat
```
E FATAL EXCEPTION: OkHttp Dispatcher (Ask Gemini)
Process: com.X.X, PID: 17597
java.lang.NullPointerException: null cannot be cast to non-null type kotlin.String at io.appwrite.models.Row$Companion.from(Row.kt:99)
at io.appwrite.services.TablesDB$createRow$converter$1.invoke(TablesDb.kt:316)
at io.appwrite.services.TablesDB$createRow$converter$1.invoke(TablesDb.kt:314)
at io.appwrite.Client$awaitResponse$2$1.onResponse(Client.kt:602)
at okhttp3.internal.connection.RealCall$AsyncCall.run(RealCall.kt:519)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:923)
```
### 🎲 Appwrite version
Version 1.8.x
### 💻 Operating system
Linux
### 🧱 Your Environment
Appwrite SDK 11.3.0
### 👀 Have you spent some time to check if this issue has been raised before?
- [x] I checked and didn't find similar issue
### 🏢 Have you read the Code of Conduct?
- [x] I have read the [Code of Conduct](https://github.com/appwrite/.github/blob/main/CODE_OF_CONDUCT.md)
Contributor guide
Research direction
Start with the Row.kt from method and the failing casts at the reported lines, then trace the createRow response conversion in TablesDb.kt. Reproduce the transaction case and verify that a row can be created without $createdAt or $updatedAt while the non-transaction case continues to work.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- android, kotlin
- Domain
- mobile
- Issue type
- Bug
- Difficulty
- 2/5
- Estimated time
- 1-3 hours
- Activity status
- Stale
- Clarity
- Clearly specified
- Newbie friendliness
- 52/100