Skip to content

Commit fbe2440

Browse files
authored
feat(notToBeMissedPartOfAgenda): adding the part notBeMissed Events (#7)
1 parent e9fc098 commit fbe2440

File tree

23 files changed

+667
-7
lines changed

23 files changed

+667
-7
lines changed

.github/pull_request_template.md

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
# New change proposal
2+
3+
Thank you for contributing to XpeApp Android
4+
5+
<!-- Please first describe your change. -->
6+
7+
# Change category
8+
9+
- [ ] Feature
10+
- [ ] Fix
11+
- [ ] Documentation
12+
- [ ] Chore
13+
14+
# Description
15+
16+
<!-- Put a full description of your modifications -->
17+
18+
# Screenshots (if any)
19+
20+
<!-- Add screens to show your changes -->
21+
22+
# Checklist
23+
24+
- [ ] I have tested my changes
25+
- [ ] The previous tests still works
26+
- [ ] I did not broke anything to ensure reverse compatibility
27+
- [ ] README updated

app/src/main/java/com/xpeho/xpeapp/data/Constants.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,6 @@ enum class FeatureFlippingEnum(val value: String) {
1010
EXPENSE_REPORT("expenseReport"),
1111
COLLEAGUES("colleagues"),
1212
QVST("campaign"),
13-
PROFILE("profile")
13+
PROFILE("profile"),
14+
AGENDA("agenda"),
1415
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.xpeho.xpeapp.data.dateConverter
2+
3+
import com.google.gson.*
4+
import java.lang.reflect.Type
5+
import java.time.LocalTime
6+
import java.time.format.DateTimeFormatter
7+
8+
class DateTimeTypeAdapter : JsonSerializer<LocalTime?>, JsonDeserializer<LocalTime?> {
9+
private val formatter = DateTimeFormatter.ofPattern("HH:mm:ss")
10+
11+
override fun serialize(src: LocalTime?, typeOfSrc: Type?, context: JsonSerializationContext?): JsonElement {
12+
return if (src == null) JsonNull.INSTANCE else JsonPrimitive(src.format(formatter))
13+
}
14+
15+
override fun deserialize(json: JsonElement?, typeOfT: Type?, context: JsonDeserializationContext?): LocalTime? {
16+
return if (json == null || json.isJsonNull) null else LocalTime.parse(json.asString, formatter)
17+
}
18+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package com.xpeho.xpeapp.data.dateConverter
2+
3+
import com.google.gson.*
4+
import java.lang.reflect.Type
5+
import java.text.ParseException
6+
import java.text.SimpleDateFormat
7+
import java.util.Date
8+
import java.util.Locale
9+
10+
class DateTypeAdapter : JsonSerializer<Date>, JsonDeserializer<Date> {
11+
// Format for input dates
12+
private val inputFormats = listOf(
13+
SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.FRENCH),
14+
SimpleDateFormat("yyyy-MM-dd", Locale.FRENCH)
15+
)
16+
// Format for output dates
17+
private val outputFormat = SimpleDateFormat("dd/MM/yyyy", Locale.FRENCH)
18+
19+
override fun serialize(src: Date?, typeOfSrc: Type?, context: JsonSerializationContext?): JsonElement {
20+
return JsonPrimitive(src?.let { outputFormat.format(it) })
21+
}
22+
23+
override fun deserialize(json: JsonElement?, typeOfT: Type?, context: JsonDeserializationContext?): Date? {
24+
val dateStr = json?.asString
25+
if (dateStr != null) {
26+
for (format in inputFormats) {
27+
try {
28+
return format.parse(dateStr)
29+
} catch (e: ParseException) {
30+
// Ignore and try the next format
31+
println(e.message)
32+
}
33+
}
34+
}
35+
throw JsonParseException("Unparseable date in dateTypeAdapter: \"$dateStr\"")
36+
}
37+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.xpeho.xpeapp.data.model.agenda
2+
3+
import com.google.gson.annotations.SerializedName
4+
import java.util.Date
5+
6+
data class AgendaBirthday(
7+
val id: Int,
8+
@SerializedName("first_name") val firstName: String,
9+
val birthdate: Date,
10+
val email: String,
11+
)
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.xpeho.xpeapp.data.model.agenda
2+
3+
import com.google.gson.annotations.SerializedName
4+
import java.time.LocalTime
5+
import java.util.Date
6+
7+
data class AgendaEvent(
8+
val id: Int,
9+
val date: Date,
10+
@SerializedName("start_time") val startTime: LocalTime?,
11+
@SerializedName("end_time") val endTime: LocalTime?,
12+
val title: String,
13+
val location: String?,
14+
@SerializedName("type_id") val typeId: String,
15+
val topic: String?
16+
)
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.xpeho.xpeapp.data.model.agenda
2+
3+
import com.google.gson.annotations.SerializedName
4+
5+
data class AgendaEventType(
6+
val id: Int,
7+
val label: String,
8+
@SerializedName("color_code") val colorCode: String
9+
)

app/src/main/java/com/xpeho/xpeapp/data/service/WordpressRepository.kt

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,17 @@ package com.xpeho.xpeapp.data.service
22

33
import android.util.Log
44
import androidx.annotation.VisibleForTesting
5+
import com.google.api.Page
56
import com.xpeho.xpeapp.data.entity.AuthentificationBody
67
import com.xpeho.xpeapp.data.entity.QvstAnswerBody
78
import com.xpeho.xpeapp.data.entity.QvstCampaignEntity
89
import com.xpeho.xpeapp.data.entity.user.UserEditPassword
910
import com.xpeho.xpeapp.data.model.AuthResult
1011
import com.xpeho.xpeapp.data.model.user.UserInfos
1112
import com.xpeho.xpeapp.data.model.WordpressToken
13+
import com.xpeho.xpeapp.data.model.agenda.AgendaBirthday
14+
import com.xpeho.xpeapp.data.model.agenda.AgendaEvent
15+
import com.xpeho.xpeapp.data.model.agenda.AgendaEventType
1216
import com.xpeho.xpeapp.data.model.qvst.QvstCampaign
1317
import com.xpeho.xpeapp.data.model.qvst.QvstProgress
1418
import com.xpeho.xpeapp.data.model.qvst.QvstQuestion
@@ -278,6 +282,50 @@ class WordpressRepository(
278282
)
279283
}
280284

285+
// Agenda features methods
286+
287+
// getAllEvents
288+
289+
suspend fun getAllEvents(page: String): List<AgendaEvent>? {
290+
handleServiceExceptions(
291+
tryBody = {
292+
return api.fetchEvents(page)
293+
},
294+
catchBody = { e ->
295+
Log.e("WordpressRepository: getAllEvents", "Network error: ${e.message}")
296+
return null
297+
}
298+
)
299+
}
300+
301+
// getAllEventsTypes
302+
303+
suspend fun getAllEventsTypes(): List<AgendaEventType>? {
304+
handleServiceExceptions(
305+
tryBody = {
306+
return api.fetchEventTypes()
307+
},
308+
catchBody = { e ->
309+
Log.e("WordpressRepository: getAllEventsTypes", "Network error: ${e.message}")
310+
return null
311+
}
312+
)
313+
}
314+
315+
// getAllBirthdays
316+
317+
suspend fun getAllBirthdays(page: String): List<AgendaBirthday>? {
318+
handleServiceExceptions(
319+
tryBody = {
320+
return api.fetchBirthdays(page)
321+
},
322+
catchBody = { e ->
323+
Log.e("WordpressRepository: getAllBirthdays", "Network error: ${e.message}")
324+
return null
325+
}
326+
)
327+
}
328+
281329
// Exceptions handling
282330

283331
@Suppress("ReturnCount")

app/src/main/java/com/xpeho/xpeapp/data/service/WordpressService.kt

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ import com.xpeho.xpeapp.data.entity.QvstAnswerBody
55
import com.xpeho.xpeapp.data.entity.user.UserEditPassword
66
import com.xpeho.xpeapp.data.model.user.UserInfos
77
import com.xpeho.xpeapp.data.model.WordpressToken
8+
import com.xpeho.xpeapp.data.model.agenda.AgendaBirthday
9+
import com.xpeho.xpeapp.data.model.agenda.AgendaEvent
10+
import com.xpeho.xpeapp.data.model.agenda.AgendaEventType
811
import com.xpeho.xpeapp.data.model.qvst.QvstCampaign
912
import com.xpeho.xpeapp.data.model.qvst.QvstProgress
1013
import com.xpeho.xpeapp.data.model.qvst.QvstQuestion
@@ -82,5 +85,27 @@ interface WordpressService {
8285
suspend fun submitOpenAnswer(
8386
@Query("text") text: String,
8487
): Response<Unit>
88+
89+
// Agenda Feature
90+
91+
// Fetch all the events
92+
@Headers("Content-Type: application/json")
93+
@GET ("xpeho/v1/agenda/events")
94+
suspend fun fetchEvents(
95+
@Query("page") page: String = "",
96+
): List<AgendaEvent>
97+
98+
// Fetch all the event types
99+
@Headers("Content-Type: application/json")
100+
@GET ("xpeho/v1/agenda/events-types")
101+
suspend fun fetchEventTypes(): List<AgendaEventType>
102+
103+
// Fetch all birthdays
104+
@Headers("Content-Type: application/json")
105+
@GET ("xpeho/v1/agenda/birthday")
106+
suspend fun fetchBirthdays(
107+
@Query("page") page: String = "",
108+
): List<AgendaBirthday>
109+
85110
}
86111

app/src/main/java/com/xpeho/xpeapp/di/AppModule.kt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,11 @@ package com.xpeho.xpeapp.di
33
import android.content.Context
44
import com.google.firebase.analytics.FirebaseAnalytics
55
import com.google.gson.GsonBuilder
6+
import com.google.type.DateTime
67
import com.xpeho.xpeapp.BuildConfig
78
import com.xpeho.xpeapp.data.DatastorePref
9+
import com.xpeho.xpeapp.data.dateConverter.DateTimeTypeAdapter
10+
import com.xpeho.xpeapp.data.dateConverter.DateTypeAdapter
811
import com.xpeho.xpeapp.data.service.FirebaseService
912
import com.xpeho.xpeapp.data.service.WordpressRepository
1013
import com.xpeho.xpeapp.data.service.WordpressService
@@ -15,6 +18,8 @@ import okhttp3.OkHttpClient
1518
import okhttp3.logging.HttpLoggingInterceptor
1619
import retrofit2.Retrofit
1720
import retrofit2.converter.gson.GsonConverterFactory
21+
import java.time.LocalTime
22+
import java.util.Date
1823

1924
interface AppModule {
2025
val authenticationManager: AuthenticationManager
@@ -33,7 +38,11 @@ class MainAppModule(
3338

3439
private val baseUrl = BuildConfig.BACKEND_URL
3540

36-
private val gson = GsonBuilder().setLenient().create()
41+
private val gson = GsonBuilder()
42+
// Register custom date format for Date and DateTime
43+
.registerTypeAdapter(Date::class.java, DateTypeAdapter())
44+
.registerTypeAdapter(LocalTime::class.java, DateTimeTypeAdapter())
45+
.setLenient().create()
3746

3847
private val logging = HttpLoggingInterceptor().apply { level = HttpLoggingInterceptor.Level.BASIC }
3948
private val authorization by lazy {

0 commit comments

Comments
 (0)