Skip to content

Commit

Permalink
Merge pull request #350 from 6QuizOnTheBlock/and/feat#320-teacher_man…
Browse files Browse the repository at this point in the history
…age_class

And/feat#320 선생님 학급 설정 탭 세부 기능 구현
  • Loading branch information
SteelZoo authored May 18, 2024
2 parents e7537b7 + 8b9dc8d commit 4c9e51d
Show file tree
Hide file tree
Showing 52 changed files with 1,625 additions and 9 deletions.
5 changes: 5 additions & 0 deletions android/core/designsystem/src/main/res/drawable/ic_copy.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" android:tint="#000000" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp">

<path android:fillColor="@android:color/white" android:pathData="M16,1L4,1c-1.1,0 -2,0.9 -2,2v14h2L4,3h12L16,1zM19,5L8,5c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h11c1.1,0 2,-0.9 2,-2L21,7c0,-1.1 -0.9,-2 -2,-2zM19,21L8,21L8,7h11v14z"/>

</vector>
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.sixkids.model

data class ChatFilterWord(
val id: Long,
val badWord: String,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.sixkids.model

data class ClassSummary(
val challengeCounts: List<MemberSimpleClassSummary>,
val relayCounts: List<MemberSimpleClassSummary>,
val postsCounts: List<MemberSimpleClassSummary>,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.sixkids.model

data class MemberSimpleClassSummary (
val member: MemberSimple,
val count: Int
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package com.sixkids.data.api

import com.sixkids.data.model.request.ChatFilterRequest
import com.sixkids.data.model.response.ChattingFilterListResponse
import com.sixkids.data.model.response.ChattingFilterResponse
import com.sixkids.data.network.ApiResponse
import com.sixkids.data.network.ApiResult
import retrofit2.http.Body
import retrofit2.http.DELETE
import retrofit2.http.GET
import retrofit2.http.PATCH
import retrofit2.http.POST
import retrofit2.http.Path
import retrofit2.http.Query

interface ChatFilterService {
@GET("filters")
suspend fun getChatFilters(
@Query("organizationId") organizationId: Int,
@Query("page") page: Int,
@Query("size") size: Int,
): ApiResult<ApiResponse<ChattingFilterListResponse>>

@DELETE("filters/{id}")
suspend fun deleteChatFilter(
@Path("id") id: Long,
): ApiResult<ApiResponse<Boolean>>

@POST("filters/{organizationId}")
suspend fun createChatFilter(
@Path("organizationId") organizationId: Long,
@Body badWord: ChatFilterRequest,
): ApiResult<ApiResponse<Long>>

@PATCH("filters/{organizationId}/{id}")
suspend fun updateChatFilter(
@Path("organizationId") organizationId: Long,
@Path("id") id: Long,
@Body badWord: ChatFilterRequest,
): ApiResult<ApiResponse<Boolean>>
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,15 @@ package com.sixkids.data.api
import com.sixkids.data.model.request.JoinOrganizationRequest
import com.sixkids.data.model.request.NewOrganizationRequest
import com.sixkids.data.model.response.ApiResponse
import com.sixkids.data.model.response.ClassSummaryResponse
import com.sixkids.data.model.response.OrganizationInviteCodeResponse
import com.sixkids.data.model.response.OrganizationNameResponse
import com.sixkids.data.model.response.OrganizationMemberResponse
import com.sixkids.data.model.response.OrganizationResponse
import com.sixkids.data.network.ApiResult
import retrofit2.http.Body
import retrofit2.http.GET
import retrofit2.http.PATCH
import retrofit2.http.POST
import retrofit2.http.Path

Expand All @@ -24,6 +28,22 @@ interface OrganizationService {
@Body joinOrganizationRequest: JoinOrganizationRequest
): ApiResult<ApiResponse<Long>>

@GET("organizations/{id}/summary")
suspend fun getOrganizationSummary(
@Path(value = "id") organizationId: Int
): ApiResult<ApiResponse<ClassSummaryResponse>>

@PATCH("organizations/{id}")
suspend fun updateOrganization(
@Path(value = "id") organizationId: Int,
@Body newOrganizationRequest: NewOrganizationRequest
): ApiResult<ApiResponse<OrganizationNameResponse>>

@GET("organizations/{id}/code")
suspend fun getOrganizationInviteCode(
@Path(value = "id") organizationId: Int
): ApiResult<ApiResponse<OrganizationInviteCodeResponse>>

@GET("organizations/{id}/members")
suspend fun getOrganizationMembers(
@Path(value = "id") orgId: Int
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ import com.sixkids.data.repository.challenge.remote.ChallengeRemoteDataSource
import com.sixkids.data.repository.challenge.remote.ChallengeRemoteDataSourceImpl
import com.sixkids.data.repository.chatting.remote.ChattingRemoteDataSource
import com.sixkids.data.repository.chatting.remote.ChattingRemoteDataSourceImpl
import com.sixkids.data.repository.chattingfilter.remote.ChattingFilterRemoteDataSource
import com.sixkids.data.repository.chattingfilter.remote.ChattingFilterRemoteDataSourceImpl
import com.sixkids.data.repository.comment.remote.CommentRemoteDataSource
import com.sixkids.data.repository.comment.remote.CommentRemoteDataSourceImpl
import com.sixkids.data.repository.group.remote.GroupDataSource
Expand Down Expand Up @@ -73,6 +75,11 @@ abstract class DataSourceModule {
relayRemoteDataSource: RelayRemoteDataSourceImpl
): RelayRemoteDataSource

@Binds
abstract fun bindChattingFilterRemoteDataSource(
chattingFilterRemoteDataSource: ChattingFilterRemoteDataSourceImpl
): ChattingFilterRemoteDataSource

@Binds
abstract fun bindGroupDataSource(
groupDataSource: GroupDataSourceImpl
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,15 @@ package com.sixkids.data.di
import com.sixkids.data.repository.TokenRepositoryImpl
import com.sixkids.data.repository.challenge.ChallengeRepositoryImpl
import com.sixkids.data.repository.chatting.ChattingRepositoryImpl
import com.sixkids.data.repository.chattingfilter.ChattingFilterRepositoryImpl
import com.sixkids.data.repository.comment.CommentRepositoryImpl
import com.sixkids.data.repository.group.GroupRepositoryImpl
import com.sixkids.data.repository.organization.OrganizationRepositoryImpl
import com.sixkids.data.repository.post.PostRepositoryImpl
import com.sixkids.data.repository.relay.RelayRepositoryImpl
import com.sixkids.data.repository.user.UserRepositoryImpl
import com.sixkids.domain.repository.ChallengeRepository
import com.sixkids.domain.repository.ChattingFilterRepository
import com.sixkids.domain.repository.ChattingRepository
import com.sixkids.domain.repository.CommentRepository
import com.sixkids.domain.repository.GroupRepository
Expand Down Expand Up @@ -76,9 +78,16 @@ abstract class RepositoryModule {
relayRepository: RelayRepositoryImpl
): RelayRepository

@Singleton
@Binds
abstract fun bindChattingFilterRepository(
chattingFilterRepository: ChattingFilterRepositoryImpl
): ChattingFilterRepository

@Singleton
@Binds
abstract fun bindGroupRepository(
groupRepository: GroupRepositoryImpl
): GroupRepository

}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.sixkids.data.di

import com.sixkids.data.api.ChallengeService
import com.sixkids.data.api.ChatFilterService
import com.sixkids.data.api.CommentService
import com.sixkids.data.api.ChattingService
import com.sixkids.data.api.GroupService
Expand Down Expand Up @@ -102,6 +103,14 @@ object ServiceModule {
return retrofit.create(MemberOrgService::class.java)
}

@Singleton
@Provides
fun provideChatFilterService(
@NetworkModule.AuthRetrofit retrofit: Retrofit
): ChatFilterService {
return retrofit.create(ChatFilterService::class.java)
}

@Singleton
@Provides
fun provideGroupService(
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.sixkids.data.model.request

data class ChatFilterRequest(
val badWord: String,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.sixkids.data.model.response

import com.sixkids.model.ChatFilterWord

data class ChattingFilterListResponse(
val hasNext: Boolean,
val words: List<ChattingFilterResponse>,
)

data class ChattingFilterResponse(
val id: Long,
val badWord: String,
)

fun ChattingFilterResponse.toModel(): ChatFilterWord {
return ChatFilterWord(
id = id,
badWord = badWord,
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.sixkids.data.model.response

import com.sixkids.model.MemberSimpleClassSummary

data class ClassSummaryResponse(
val challengeCounts: List<ClassSummaryMemberResponse>,
val relayCounts: List<ClassSummaryMemberResponse>,
val postsCounts: List<ClassSummaryMemberResponse>,
)

data class ClassSummaryMemberResponse(
val member: MemberSimpleInfoResponse,
val count: Int
)

fun ClassSummaryMemberResponse.toModel(): MemberSimpleClassSummary {
return MemberSimpleClassSummary(
member.toModel(),
count
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.sixkids.data.model.response

data class OrganizationInviteCodeResponse(
val code: String
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.sixkids.data.model.response

data class OrganizationNameResponse(
val name: String
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package com.sixkids.data.repository.chattingfilter

import androidx.paging.Pager
import androidx.paging.PagingConfig
import androidx.paging.PagingData
import androidx.paging.map
import com.sixkids.data.api.ChatFilterService
import com.sixkids.data.model.response.toModel
import com.sixkids.data.repository.chattingfilter.remote.ChattingFilterPagingSource
import com.sixkids.data.repository.chattingfilter.remote.ChattingFilterRemoteDataSource
import com.sixkids.domain.repository.ChattingFilterRepository
import com.sixkids.model.ChatFilterWord
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map
import javax.inject.Inject

class ChattingFilterRepositoryImpl @Inject constructor(
private val chattingFilterRemoteDataSource: ChattingFilterRemoteDataSource,
private val chatFilterService: ChatFilterService
) : ChattingFilterRepository {
override suspend fun getChattingFilters(
organizationId: Int
): Flow<PagingData<ChatFilterWord>> {
return Pager(
config = PagingConfig(ChattingFilterPagingSource.DEFAULT_SIZE),
pagingSourceFactory = {
ChattingFilterPagingSource(
chatFilterService,
organizationId
)
}
).flow.map {pagingData ->
pagingData.map {
chattingFilterResponse -> chattingFilterResponse.toModel()
}
}
}

override suspend fun deleteChatFilter(id: Long): Boolean {
return chattingFilterRemoteDataSource.deleteChatFilter(id)
}

override suspend fun createChatFilter(organizationId: Long, badWord: String): Long {
return chattingFilterRemoteDataSource.createChatFilter(organizationId, badWord)
}

override suspend fun updateChatFilter(
organizationId: Long,
id: Long,
badWord: String
): Boolean {
return chattingFilterRemoteDataSource.updateChatFilter(organizationId, id, badWord)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package com.sixkids.data.repository.chattingfilter.remote

import androidx.paging.PagingSource
import androidx.paging.PagingState
import com.sixkids.data.api.ChatFilterService
import com.sixkids.data.api.ChattingService
import com.sixkids.data.model.response.ChattingFilterListResponse
import com.sixkids.data.model.response.ChattingFilterResponse
import javax.inject.Inject

class ChattingFilterPagingSource @Inject constructor(
private val chatFilterService: ChatFilterService,
private val organizationId: Int,
): PagingSource<Int, ChattingFilterResponse>() {
override fun getRefreshKey(state: PagingState<Int, ChattingFilterResponse>): Int? {
return state.anchorPosition?.let { anchorPosition ->
state.closestPageToPosition(anchorPosition)?.prevKey?.plus(1)
?: state.closestPageToPosition(anchorPosition)?.nextKey?.minus(1)
}
}

override suspend fun load(params: LoadParams<Int>): LoadResult<Int, ChattingFilterResponse> {
val page = params.key ?: 0
return try {
val response = chatFilterService.getChatFilters(
organizationId,
page,
DEFAULT_SIZE
).getOrThrow().data.words

LoadResult.Page(
data = response,
prevKey = if (page == 0) null else page.minus(1),
nextKey = if (response.isEmpty()) null else page.plus(1)
)
} catch (e: Exception) {
LoadResult.Error(e)
}
}

companion object {
const val DEFAULT_SIZE = 30
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.sixkids.data.repository.chattingfilter.remote

import com.sixkids.data.model.response.ChattingFilterListResponse

interface ChattingFilterRemoteDataSource {

suspend fun deleteChatFilter(
id: Long
): Boolean

suspend fun createChatFilter(
organizationId: Long,
badWord: String,
): Long

suspend fun updateChatFilter(
organizationId: Long,
id: Long,
badWord: String,
): Boolean

}
Loading

0 comments on commit 4c9e51d

Please sign in to comment.