@@ -4,8 +4,10 @@ import ai.elimu.analytics.BaseApplication
4
4
import ai.elimu.analytics.BuildConfig
5
5
import ai.elimu.analytics.enum.EventType
6
6
import ai.elimu.analytics.enum.toServiceClass
7
+ import ai.elimu.analytics.rest.NumberAssessmentEventService
7
8
import ai.elimu.analytics.util.SharedPreferencesHelper
8
9
import ai.elimu.analytics.util.VersionHelper.extractVersionCode
10
+ import ai.elimu.model.v2.enums.Language
9
11
import android.content.Context
10
12
import androidx.work.Worker
11
13
import androidx.work.WorkerParameters
@@ -28,6 +30,7 @@ class UploadEventsWorker(context: Context, workerParams: WorkerParameters) :
28
30
for (eventType in EventType .entries) {
29
31
uploadLearningEvents(eventType = eventType)
30
32
}
33
+ uploadNumberAssessmentEvents()
31
34
32
35
return Result .success()
33
36
}
@@ -86,4 +89,46 @@ class UploadEventsWorker(context: Context, workerParams: WorkerParameters) :
86
89
}
87
90
}
88
91
}
92
+
93
+ // Upload CSV files generated by the current version of the app, e.g:
94
+ // lang-THA/number-assessment-events/5b7c682a12ecbe2e_4000021_number-assessment-events_2025-06-29.csv
95
+ // lang-THA/number-assessment-events/5b7c682a12ecbe2e_4000021_number-assessment-events_2025-06-30.csv
96
+ private fun uploadNumberAssessmentEvents () {
97
+ Timber .i(" uploadNumberAssessmentEvents" )
98
+
99
+ val languageDir = File (applicationContext.filesDir, " lang-${SharedPreferencesHelper .getLanguage(applicationContext)} " )
100
+ val eventsDir = File (languageDir, " number-assessment-events" )
101
+ for (csvFile in eventsDir.listFiles()) {
102
+ Timber .i(" csvFile: ${csvFile} " )
103
+
104
+ // Skip files that were not generated by the current app version, e.g. "_4000021_"
105
+ if (! csvFile.name.contains(" _${BuildConfig .VERSION_CODE } _" )) {
106
+ continue
107
+ }
108
+
109
+ // Prepare upload service
110
+ val baseApplication = applicationContext as BaseApplication
111
+ val retrofit = baseApplication.retrofit
112
+ val uploadService = retrofit.create(NumberAssessmentEventService ::class .java)
113
+
114
+ // Prepare upload request
115
+ val requestBody = RequestBody .create(MediaType .parse(" multipart/form-data" ), csvFile)
116
+ val part = MultipartBody .Part .createFormData(" file" , csvFile.name, requestBody)
117
+ val call = uploadService.uploadCsvFile(part)
118
+ Timber .i(" call.request(): ${call.request()} " )
119
+
120
+ // Upload file
121
+ val response = call.execute()
122
+ Timber .i(" response: $response " )
123
+ if (response.isSuccessful) {
124
+ val bodyString = response.body()?.string()
125
+ Timber .i(" bodyString: $bodyString " )
126
+ } else {
127
+ val errorBodyString = response.errorBody()?.string()
128
+ Timber .e(" errorBodyString: $errorBodyString " )
129
+ }
130
+ }
131
+
132
+ Timber .i(" uploadNumberAssessmentEvents complete!" )
133
+ }
89
134
}
0 commit comments