1717package io.getstream.chat.android.client.api2.mapping
1818
1919import io.getstream.chat.android.PrivacySettings
20+ import io.getstream.chat.android.client.api.models.Pagination
21+ import io.getstream.chat.android.client.api.models.QueryChannelRequest
2022import io.getstream.chat.android.client.api2.model.dto.DeviceDto
2123import io.getstream.chat.android.client.api2.model.dto.UpstreamConnectedEventDto
2224import io.getstream.chat.android.client.api2.model.dto.UpstreamUserDto
2325import io.getstream.chat.android.client.events.ConnectedEvent
26+ import io.getstream.chat.android.client.parser2.adapters.internal.StreamDateFormatter
2427import io.getstream.chat.android.models.Attachment
2528import io.getstream.chat.android.models.ChatPreferences
2629import io.getstream.chat.android.models.Device
@@ -35,16 +38,21 @@ import io.getstream.chat.android.models.Reaction
3538import io.getstream.chat.android.models.User
3639import io.getstream.chat.android.models.UserGroup
3740import io.getstream.chat.android.models.UserTransformer
41+ import io.getstream.chat.android.network.models.ChannelGetOrCreateRequest
42+ import io.getstream.chat.android.network.models.ChannelInput
3843import io.getstream.chat.android.network.models.ChannelMemberRequest
3944import io.getstream.chat.android.network.models.ChatPreferencesInput
4045import io.getstream.chat.android.network.models.DeliveryReceiptsResponse
46+ import io.getstream.chat.android.network.models.MessagePaginationParams
4147import io.getstream.chat.android.network.models.MessageRequest
48+ import io.getstream.chat.android.network.models.PaginationParams
4249import io.getstream.chat.android.network.models.PrivacySettingsResponse
4350import io.getstream.chat.android.network.models.ReactionRequest
4451import io.getstream.chat.android.network.models.ReadReceiptsResponse
4552import io.getstream.chat.android.network.models.SharedLocation
4653import io.getstream.chat.android.network.models.TypingIndicatorsResponse
4754import io.getstream.chat.android.network.models.UserRequest
55+ import java.util.Date
4856import io.getstream.chat.android.network.models.Attachment as AttachmentRequest
4957
5058@Suppress(" TooManyFunctions" )
@@ -55,6 +63,8 @@ internal class DtoMapping(
5563
5664 private val supportedUpstreamMessageTypes = setOf (MessageType .REGULAR , MessageType .SYSTEM )
5765
66+ private val dateFormatter = StreamDateFormatter ()
67+
5868 /* *
5969 * Converts [Device] to [DeviceDto].
6070 */
@@ -113,8 +123,8 @@ internal class DtoMapping(
113123 * Maps the domain [Member] to the generated network [ChannelMemberRequest] model.
114124 *
115125 * The query endpoint hashes the user ids to resolve a distinct channel and reads nothing else, but the role
116- * and custom data are carried anyway since the domain member has them. `user` stays absent: the outgoing
117- * model embeds a read-only [io.getstream.chat.android.network.models.UserResponse] .
126+ * and custom data are carried anyway since the domain member has them. `user` stays absent: the member is
127+ * identified by its user id .
118128 */
119129 internal fun Member.toChannelMemberRequest (): ChannelMemberRequest = ChannelMemberRequest (
120130 userId = getUserId(),
@@ -123,6 +133,57 @@ internal class DtoMapping(
123133 custom = extraData,
124134 )
125135
136+ /* *
137+ * Maps the public [QueryChannelRequest] to the generated network [ChannelGetOrCreateRequest] model.
138+ *
139+ * The whole `data` map goes into [ChannelInput.custom], which the adapter flattens back into `data`: the
140+ * backend reads undeclared `data` keys as channel custom data, and matches declared ones first. Pagination
141+ * keys the generated models do not declare are not sent.
142+ */
143+ internal fun QueryChannelRequest.toChannelGetOrCreateRequest (): ChannelGetOrCreateRequest =
144+ ChannelGetOrCreateRequest (
145+ state = state,
146+ watch = watch,
147+ presence = presence,
148+ // Always present, even when empty: the backend decodes them into pointers.
149+ messages = messages.toMessagePaginationParams(),
150+ members = members.toPaginationParams(),
151+ watchers = watchers.toPaginationParams(),
152+ data = ChannelInput (custom = data),
153+ )
154+
155+ private fun Map <String , Any >.toMessagePaginationParams () = MessagePaginationParams (
156+ limit = int(" limit" ),
157+ idGt = this [Pagination .GREATER_THAN .toString()] as ? String ,
158+ idGte = this [Pagination .GREATER_THAN_OR_EQUAL .toString()] as ? String ,
159+ idLt = this [Pagination .LESS_THAN .toString()] as ? String ,
160+ idLte = this [Pagination .LESS_THAN_OR_EQUAL .toString()] as ? String ,
161+ idAround = this [Pagination .AROUND_ID .toString()] as ? String ,
162+ createdAtAfter = date(" created_at_after" ),
163+ createdAtAfterOrEqual = date(" created_at_after_or_equal" ),
164+ createdAtBefore = date(" created_at_before" ),
165+ createdAtBeforeOrEqual = date(" created_at_before_or_equal" ),
166+ createdAtAround = date(" created_at_around" ),
167+ )
168+
169+ private fun Map <String , Any >.toPaginationParams () = PaginationParams (
170+ limit = int(" limit" ),
171+ offset = int(" offset" ),
172+ idGt = int(" id_gt" ),
173+ idGte = int(" id_gte" ),
174+ idLt = int(" id_lt" ),
175+ idLte = int(" id_lte" ),
176+ )
177+
178+ private fun Map <String , Any >.int (key : String ): Int? = (this [key] as ? Number )?.toInt()
179+
180+ // The maps are public, so a date can arrive as the ISO string the backend also accepts.
181+ private fun Map <String , Any >.date (key : String ): Date ? = when (val value = this [key]) {
182+ is Date -> value
183+ is String -> dateFormatter.parse(value)
184+ else -> null
185+ }
186+
126187 /* *
127188 * Maps the domain [Location] to the generated network [SharedLocation] model.
128189 */
0 commit comments