diff --git a/app/src/main/java/com/msg/gcms/data/remote/datasource/notification/NotificationDataSource.kt b/app/src/main/java/com/msg/gcms/data/remote/datasource/notification/NotificationDataSource.kt new file mode 100644 index 00000000..f92725b1 --- /dev/null +++ b/app/src/main/java/com/msg/gcms/data/remote/datasource/notification/NotificationDataSource.kt @@ -0,0 +1,15 @@ +package com.msg.gcms.data.remote.datasource.notification + +import com.msg.gcms.data.remote.dto.notification.request.PatchModifyNotificationRequest +import com.msg.gcms.data.remote.dto.notification.request.PostWriteNotificationRequest +import com.msg.gcms.data.remote.dto.notification.response.GetDetailNotificationResponse +import com.msg.gcms.data.remote.dto.notification.response.GetNotificationListResponse +import kotlinx.coroutines.flow.Flow + +interface NotificationDataSource { + suspend fun postWriteNotice(clubId: Long, body: PostWriteNotificationRequest): Flow + suspend fun getNoticeList(clubId: Long): Flow + suspend fun getDetailNotice(id: Long): Flow + suspend fun patchNotice(id: Long ,body: PatchModifyNotificationRequest): Flow + suspend fun deleteNotice(id: Long): Flow +} \ No newline at end of file diff --git a/app/src/main/java/com/msg/gcms/data/remote/datasource/notification/NotificationDataSourceImpl.kt b/app/src/main/java/com/msg/gcms/data/remote/datasource/notification/NotificationDataSourceImpl.kt new file mode 100644 index 00000000..263b0971 --- /dev/null +++ b/app/src/main/java/com/msg/gcms/data/remote/datasource/notification/NotificationDataSourceImpl.kt @@ -0,0 +1,71 @@ +package com.msg.gcms.data.remote.datasource.notification + +import com.msg.gcms.data.remote.dto.notification.request.PatchModifyNotificationRequest +import com.msg.gcms.data.remote.dto.notification.request.PostWriteNotificationRequest +import com.msg.gcms.data.remote.dto.notification.response.GetDetailNotificationResponse +import com.msg.gcms.data.remote.dto.notification.response.GetNotificationListResponse +import com.msg.gcms.data.remote.network.api.NotificationAPI +import com.msg.gcms.data.remote.util.GCMSApiHandler +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.flow +import javax.inject.Inject + +class NotificationDataSourceImpl @Inject constructor( + private val noticeService: NotificationAPI +) : NotificationDataSource { + override suspend fun postWriteNotice(clubId: Long, body: PostWriteNotificationRequest): Flow = flow { + emit( + GCMSApiHandler() + .httpRequest { + noticeService.writeNotification( + clubId = clubId, + body = body + ) + } + .sendRequest() + ) + } + + override suspend fun getNoticeList(clubId: Long): Flow = flow { + emit( + GCMSApiHandler() + .httpRequest { + noticeService.getNoticeList(clubId = clubId) + } + .sendRequest() + ) + } + + override suspend fun getDetailNotice(id: Long): Flow = flow { + emit( + GCMSApiHandler() + .httpRequest { + noticeService.getDetailNotification(id = id) + } + .sendRequest() + ) + } + + override suspend fun patchNotice(id: Long, body: PatchModifyNotificationRequest): Flow = flow { + emit( + GCMSApiHandler() + .httpRequest { + noticeService.patchNotification( + id = id, + body = body + ) + } + .sendRequest() + ) + } + + override suspend fun deleteNotice(id: Long): Flow = flow { + emit( + GCMSApiHandler() + .httpRequest { + noticeService.deleteNotification(id = id) + } + .sendRequest() + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/msg/gcms/data/remote/dto/notification/request/PatchModifyNotificationRequest.kt b/app/src/main/java/com/msg/gcms/data/remote/dto/notification/request/PatchModifyNotificationRequest.kt new file mode 100644 index 00000000..4a6510e7 --- /dev/null +++ b/app/src/main/java/com/msg/gcms/data/remote/dto/notification/request/PatchModifyNotificationRequest.kt @@ -0,0 +1,10 @@ +package com.msg.gcms.data.remote.dto.notification.request + +import com.google.gson.annotations.SerializedName + +data class PatchModifyNotificationRequest( + @SerializedName("title") + val title: String, + @SerializedName("content") + val content: String +) diff --git a/app/src/main/java/com/msg/gcms/data/remote/dto/notification/request/PostWriteNotificationRequest.kt b/app/src/main/java/com/msg/gcms/data/remote/dto/notification/request/PostWriteNotificationRequest.kt new file mode 100644 index 00000000..fa000d2e --- /dev/null +++ b/app/src/main/java/com/msg/gcms/data/remote/dto/notification/request/PostWriteNotificationRequest.kt @@ -0,0 +1,10 @@ +package com.msg.gcms.data.remote.dto.notification.request + +import com.google.gson.annotations.SerializedName + +data class PostWriteNotificationRequest( + @SerializedName("title") + val title: String, + @SerializedName("content") + val content: String +) diff --git a/app/src/main/java/com/msg/gcms/data/remote/dto/notification/response/GetDetailNotificationResponse.kt b/app/src/main/java/com/msg/gcms/data/remote/dto/notification/response/GetDetailNotificationResponse.kt new file mode 100644 index 00000000..793b142d --- /dev/null +++ b/app/src/main/java/com/msg/gcms/data/remote/dto/notification/response/GetDetailNotificationResponse.kt @@ -0,0 +1,28 @@ +package com.msg.gcms.data.remote.dto.notification.response + +import com.google.gson.annotations.SerializedName +import com.msg.gcms.domain.data.notification.GetDetailNotificationResponseData +import java.time.LocalDateTime + +data class GetDetailNotificationResponse( + @SerializedName("title") + val title: String, + @SerializedName("content") + val content: String, + @SerializedName("username") + val username: String, + @SerializedName("userProfileImg") + val userProfileImg: String, + @SerializedName("createdAt") + val createdAt: LocalDateTime +) + +fun GetDetailNotificationResponse.toDetailNotificationData(): GetDetailNotificationResponseData { + return GetDetailNotificationResponseData( + title = title, + content = content, + username = username, + userProfileImg = userProfileImg, + createdAt = createdAt + ) +} diff --git a/app/src/main/java/com/msg/gcms/data/remote/dto/notification/response/GetNotificationListResponse.kt b/app/src/main/java/com/msg/gcms/data/remote/dto/notification/response/GetNotificationListResponse.kt new file mode 100644 index 00000000..39864b05 --- /dev/null +++ b/app/src/main/java/com/msg/gcms/data/remote/dto/notification/response/GetNotificationListResponse.kt @@ -0,0 +1,37 @@ +package com.msg.gcms.data.remote.dto.notification.response + +import com.google.gson.annotations.SerializedName +import com.msg.gcms.domain.data.notification.GetNotificationListResponseData +import com.msg.gcms.domain.data.notification.GetNotificationListResponseData.Notice as DomainNotice +import java.time.LocalDateTime + +data class GetNotificationListResponse( + @SerializedName("notices") + val notices: List +) { + data class Notice( + @SerializedName("id") + val id: Long, + @SerializedName("title") + val title: String, + @SerializedName("username") + val username: String, + @SerializedName("createdAt") + val createdAt: LocalDateTime + ) + + fun Notice.toDomainNotice(): DomainNotice { + return DomainNotice( + id = id, + title = title, + username = username, + createdAt = createdAt + ) + } +} + +fun GetNotificationListResponse.toGetNotificationListResponseData(): GetNotificationListResponseData { + return GetNotificationListResponseData( + notices = notices.map { it.toDomainNotice() } + ) +} \ No newline at end of file diff --git a/app/src/main/java/com/msg/gcms/data/remote/network/api/AttendAPI.kt b/app/src/main/java/com/msg/gcms/data/remote/network/api/AttendAPI.kt index be81c797..190e7783 100644 --- a/app/src/main/java/com/msg/gcms/data/remote/network/api/AttendAPI.kt +++ b/app/src/main/java/com/msg/gcms/data/remote/network/api/AttendAPI.kt @@ -11,7 +11,6 @@ import retrofit2.http.POST import retrofit2.http.Path import retrofit2.http.Query import java.time.LocalDate -import java.time.LocalTime interface AttendAPI { diff --git a/app/src/main/java/com/msg/gcms/data/remote/network/api/NotificationAPI.kt b/app/src/main/java/com/msg/gcms/data/remote/network/api/NotificationAPI.kt new file mode 100644 index 00000000..43848087 --- /dev/null +++ b/app/src/main/java/com/msg/gcms/data/remote/network/api/NotificationAPI.kt @@ -0,0 +1,42 @@ +package com.msg.gcms.data.remote.network.api + +import com.msg.gcms.data.remote.dto.notification.request.PatchModifyNotificationRequest +import com.msg.gcms.data.remote.dto.notification.request.PostWriteNotificationRequest +import com.msg.gcms.data.remote.dto.notification.response.GetDetailNotificationResponse +import com.msg.gcms.data.remote.dto.notification.response.GetNotificationListResponse +import retrofit2.http.Body +import retrofit2.http.DELETE +import retrofit2.http.GET +import retrofit2.http.PATCH +import retrofit2.http.POST +import retrofit2.http.Path + +interface NotificationAPI { + + @POST("notification/{club_id}") + fun writeNotification( + @Path("club_id") clubId: Long, + @Body body: PostWriteNotificationRequest + ) + + @GET("notification/{club_id}/all") + fun getNoticeList( + @Path("club_id") clubId: Long + ): GetNotificationListResponse + + @GET("notification/{id}") + fun getDetailNotification( + @Path("id") id: Long + ): GetDetailNotificationResponse + + @PATCH("notification/{id}") + fun patchNotification( + @Path("id") id: Long, + @Body body: PatchModifyNotificationRequest + ) + + @DELETE("notification/{id}") + fun deleteNotification( + @Path("id") id: Long + ) +} \ No newline at end of file diff --git a/app/src/main/java/com/msg/gcms/data/repository/NotificationRepositoryImpl.kt b/app/src/main/java/com/msg/gcms/data/repository/NotificationRepositoryImpl.kt new file mode 100644 index 00000000..669f0373 --- /dev/null +++ b/app/src/main/java/com/msg/gcms/data/repository/NotificationRepositoryImpl.kt @@ -0,0 +1,66 @@ +package com.msg.gcms.data.repository + +import com.msg.gcms.data.remote.datasource.notification.NotificationDataSource +import com.msg.gcms.data.remote.dto.notification.request.PatchModifyNotificationRequest +import com.msg.gcms.data.remote.dto.notification.request.PostWriteNotificationRequest +import com.msg.gcms.data.remote.dto.notification.response.GetDetailNotificationResponse +import com.msg.gcms.data.remote.dto.notification.response.toDetailNotificationData +import com.msg.gcms.data.remote.dto.notification.response.toGetNotificationListResponseData +import com.msg.gcms.domain.data.notification.GetDetailNotificationResponseData +import com.msg.gcms.domain.data.notification.GetNotificationListResponseData +import com.msg.gcms.domain.data.notification.PatchModifyNotificationRequestData +import com.msg.gcms.domain.data.notification.PostWriteNotificationRequestData +import com.msg.gcms.domain.repository.NotificationRepository +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.map +import javax.inject.Inject + +class NotificationRepositoryImpl @Inject constructor( + private val notificationDataSource: NotificationDataSource +) : NotificationRepository { + override suspend fun postWriteNotice( + clubId: Long, + body: PostWriteNotificationRequestData + ): Flow { + return notificationDataSource.postWriteNotice( + clubId = clubId, + body = PostWriteNotificationRequest( + title = body.title, + content = body.content + ) + ) + } + + override suspend fun getNoticeList(clubId: Long): Flow { + return notificationDataSource.getNoticeList( + clubId = clubId + ).map { + it.toGetNotificationListResponseData() + } + } + + override suspend fun getDetailNotice(id: Long): Flow { + return notificationDataSource.getDetailNotice(id = id).map { + it.toDetailNotificationData() + } + } + + override suspend fun patchNotice( + id: Long, + body: PatchModifyNotificationRequestData + ): Flow { + return notificationDataSource.patchNotice( + id = id, + body = PatchModifyNotificationRequest( + title = body.title, + content = body.content + ) + ) + } + + override suspend fun deleteNotice(id: Long): Flow { + return notificationDataSource.deleteNotice( + id = id + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/msg/gcms/di/module/NetworkModule.kt b/app/src/main/java/com/msg/gcms/di/module/NetworkModule.kt index cf9908f9..eb2cb23a 100644 --- a/app/src/main/java/com/msg/gcms/di/module/NetworkModule.kt +++ b/app/src/main/java/com/msg/gcms/di/module/NetworkModule.kt @@ -9,6 +9,7 @@ import com.msg.gcms.data.remote.network.LoginInterceptor import com.msg.gcms.data.remote.network.api.ApplicantAPI import com.msg.gcms.data.remote.network.api.AttendAPI import com.msg.gcms.data.remote.network.api.ClubMemberAPI +import com.msg.gcms.data.remote.network.api.NotificationAPI import com.msg.gcms.data.remote.network.api.UserAPI import dagger.Module import dagger.Provides @@ -110,4 +111,10 @@ object NetworkModule { fun provideAttendService(retrofit: Retrofit): AttendAPI { return retrofit.create(AttendAPI::class.java) } + + @Provides + @Singleton + fun provideNotificationService(retrofit: Retrofit): NotificationAPI { + return retrofit.create(NotificationAPI::class.java) + } } diff --git a/app/src/main/java/com/msg/gcms/di/module/RemoteDataSourceModule.kt b/app/src/main/java/com/msg/gcms/di/module/RemoteDataSourceModule.kt index ffe35d04..4e369c83 100644 --- a/app/src/main/java/com/msg/gcms/di/module/RemoteDataSourceModule.kt +++ b/app/src/main/java/com/msg/gcms/di/module/RemoteDataSourceModule.kt @@ -12,6 +12,8 @@ import com.msg.gcms.data.remote.datasource.club_member.ClubMemberDataSource import com.msg.gcms.data.remote.datasource.club_member.ClubMemberDataSourceImpl import com.msg.gcms.data.remote.datasource.image.ImageDataSource import com.msg.gcms.data.remote.datasource.image.ImageDataSourceImpl +import com.msg.gcms.data.remote.datasource.notification.NotificationDataSource +import com.msg.gcms.data.remote.datasource.notification.NotificationDataSourceImpl import com.msg.gcms.data.remote.datasource.user.UserDataSource import com.msg.gcms.data.remote.datasource.user.UserDataSourceImpl import dagger.Binds @@ -57,4 +59,9 @@ abstract class RemoteDataSourceModule { abstract fun bindAttendDataSource( attendDataSourceImpl: AttendDataSourceImpl ): AttendDataSource + + @Binds + abstract fun bindNotificationDataSource( + notificationDataSourceImpl: NotificationDataSourceImpl + ): NotificationDataSource } diff --git a/app/src/main/java/com/msg/gcms/di/module/RepositoryModule.kt b/app/src/main/java/com/msg/gcms/di/module/RepositoryModule.kt index 917d5838..14a7dd6e 100644 --- a/app/src/main/java/com/msg/gcms/di/module/RepositoryModule.kt +++ b/app/src/main/java/com/msg/gcms/di/module/RepositoryModule.kt @@ -6,6 +6,7 @@ import com.msg.gcms.data.repository.AuthRepositoryImpl import com.msg.gcms.data.repository.ClubMemberRepositoryImpl import com.msg.gcms.data.repository.ClubRepositoryImpl import com.msg.gcms.data.repository.ImageRepositoryImpl +import com.msg.gcms.data.repository.NotificationRepositoryImpl import com.msg.gcms.data.repository.UserRepositoryImpl import com.msg.gcms.domain.repository.ApplicantRepository import com.msg.gcms.domain.repository.AttendRepository @@ -13,6 +14,7 @@ import com.msg.gcms.domain.repository.AuthRepository import com.msg.gcms.domain.repository.ClubMemberRepository import com.msg.gcms.domain.repository.ClubRepository import com.msg.gcms.domain.repository.ImageRepository +import com.msg.gcms.domain.repository.NotificationRepository import com.msg.gcms.domain.repository.UserRepository import dagger.Binds import dagger.Module @@ -57,4 +59,9 @@ abstract class RepositoryModule { abstract fun bindAttendRepository( attendRepositoryImpl: AttendRepositoryImpl ): AttendRepository + + @Binds + abstract fun bindNotification( + notificationImpl: NotificationRepositoryImpl + ): NotificationRepository } diff --git a/app/src/main/java/com/msg/gcms/domain/data/notification/GetDetailNotificationResponseData.kt b/app/src/main/java/com/msg/gcms/domain/data/notification/GetDetailNotificationResponseData.kt new file mode 100644 index 00000000..bb3c3462 --- /dev/null +++ b/app/src/main/java/com/msg/gcms/domain/data/notification/GetDetailNotificationResponseData.kt @@ -0,0 +1,11 @@ +package com.msg.gcms.domain.data.notification + +import java.time.LocalDateTime + +data class GetDetailNotificationResponseData( + val title: String, + val content: String, + val username: String, + val userProfileImg: String, + val createdAt: LocalDateTime +) diff --git a/app/src/main/java/com/msg/gcms/domain/data/notification/GetNotificationListResponseData.kt b/app/src/main/java/com/msg/gcms/domain/data/notification/GetNotificationListResponseData.kt new file mode 100644 index 00000000..9877668b --- /dev/null +++ b/app/src/main/java/com/msg/gcms/domain/data/notification/GetNotificationListResponseData.kt @@ -0,0 +1,14 @@ +package com.msg.gcms.domain.data.notification + +import java.time.LocalDateTime + +data class GetNotificationListResponseData( + val notices: List +) { + data class Notice( + val id: Long, + val title: String, + val username: String, + val createdAt: LocalDateTime + ) +} diff --git a/app/src/main/java/com/msg/gcms/domain/data/notification/PatchModifyNotificationRequestData.kt b/app/src/main/java/com/msg/gcms/domain/data/notification/PatchModifyNotificationRequestData.kt new file mode 100644 index 00000000..d8e262ac --- /dev/null +++ b/app/src/main/java/com/msg/gcms/domain/data/notification/PatchModifyNotificationRequestData.kt @@ -0,0 +1,6 @@ +package com.msg.gcms.domain.data.notification + +data class PatchModifyNotificationRequestData( + val title: String, + val content: String +) diff --git a/app/src/main/java/com/msg/gcms/domain/data/notification/PostWriteNotificationRequestData.kt b/app/src/main/java/com/msg/gcms/domain/data/notification/PostWriteNotificationRequestData.kt new file mode 100644 index 00000000..50e19fa3 --- /dev/null +++ b/app/src/main/java/com/msg/gcms/domain/data/notification/PostWriteNotificationRequestData.kt @@ -0,0 +1,6 @@ +package com.msg.gcms.domain.data.notification + +data class PostWriteNotificationRequestData( + val title: String, + val content: String +) diff --git a/app/src/main/java/com/msg/gcms/domain/repository/NotificationRepository.kt b/app/src/main/java/com/msg/gcms/domain/repository/NotificationRepository.kt new file mode 100644 index 00000000..4a55da4a --- /dev/null +++ b/app/src/main/java/com/msg/gcms/domain/repository/NotificationRepository.kt @@ -0,0 +1,15 @@ +package com.msg.gcms.domain.repository + +import com.msg.gcms.domain.data.notification.GetDetailNotificationResponseData +import com.msg.gcms.domain.data.notification.GetNotificationListResponseData +import com.msg.gcms.domain.data.notification.PatchModifyNotificationRequestData +import com.msg.gcms.domain.data.notification.PostWriteNotificationRequestData +import kotlinx.coroutines.flow.Flow + +interface NotificationRepository { + suspend fun postWriteNotice(clubId: Long, body: PostWriteNotificationRequestData): Flow + suspend fun getNoticeList(clubId: Long): Flow + suspend fun getDetailNotice(id: Long): Flow + suspend fun patchNotice(id: Long ,body: PatchModifyNotificationRequestData): Flow + suspend fun deleteNotice(id: Long): Flow +} \ No newline at end of file diff --git a/app/src/main/java/com/msg/gcms/domain/usecase/notification/DeleteNoticeUseCase.kt b/app/src/main/java/com/msg/gcms/domain/usecase/notification/DeleteNoticeUseCase.kt new file mode 100644 index 00000000..ef8d9b64 --- /dev/null +++ b/app/src/main/java/com/msg/gcms/domain/usecase/notification/DeleteNoticeUseCase.kt @@ -0,0 +1,12 @@ +package com.msg.gcms.domain.usecase.notification + +import com.msg.gcms.domain.repository.NotificationRepository +import javax.inject.Inject + +class DeleteNoticeUseCase @Inject constructor( + private val notificationRepository: NotificationRepository +) { + suspend operator fun invoke(id: Long) = runCatching { + notificationRepository.deleteNotice(id = id) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/msg/gcms/domain/usecase/notification/GetDetailNoticeUseCase.kt b/app/src/main/java/com/msg/gcms/domain/usecase/notification/GetDetailNoticeUseCase.kt new file mode 100644 index 00000000..e4cb2313 --- /dev/null +++ b/app/src/main/java/com/msg/gcms/domain/usecase/notification/GetDetailNoticeUseCase.kt @@ -0,0 +1,12 @@ +package com.msg.gcms.domain.usecase.notification + +import com.msg.gcms.domain.repository.NotificationRepository +import javax.inject.Inject + +class GetDetailNoticeUseCase @Inject constructor( + private val notificationRepository: NotificationRepository +) { + suspend operator fun invoke(id: Long) = runCatching { + notificationRepository.getDetailNotice(id = id) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/msg/gcms/domain/usecase/notification/GetNoticeListUseCase.kt b/app/src/main/java/com/msg/gcms/domain/usecase/notification/GetNoticeListUseCase.kt new file mode 100644 index 00000000..3c9b870d --- /dev/null +++ b/app/src/main/java/com/msg/gcms/domain/usecase/notification/GetNoticeListUseCase.kt @@ -0,0 +1,12 @@ +package com.msg.gcms.domain.usecase.notification + +import com.msg.gcms.domain.repository.NotificationRepository +import javax.inject.Inject + +class GetNoticeListUseCase @Inject constructor( + private val notificationRepository: NotificationRepository +) { + suspend operator fun invoke(clubId: Long) = runCatching { + notificationRepository.getNoticeList(clubId = clubId) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/msg/gcms/domain/usecase/notification/PatchNoticeUseCase.kt b/app/src/main/java/com/msg/gcms/domain/usecase/notification/PatchNoticeUseCase.kt new file mode 100644 index 00000000..122d32a0 --- /dev/null +++ b/app/src/main/java/com/msg/gcms/domain/usecase/notification/PatchNoticeUseCase.kt @@ -0,0 +1,16 @@ +package com.msg.gcms.domain.usecase.notification + +import com.msg.gcms.domain.data.notification.PatchModifyNotificationRequestData +import com.msg.gcms.domain.repository.NotificationRepository +import javax.inject.Inject + +class PatchNoticeUseCase @Inject constructor( + private val notificationRepository: NotificationRepository +) { + suspend operator fun invoke(id: Long, body: PatchModifyNotificationRequestData) = runCatching { + notificationRepository.patchNotice( + id = id, + body = body + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/msg/gcms/domain/usecase/notification/PostWriteNoticeUseCase.kt b/app/src/main/java/com/msg/gcms/domain/usecase/notification/PostWriteNoticeUseCase.kt new file mode 100644 index 00000000..e52e3236 --- /dev/null +++ b/app/src/main/java/com/msg/gcms/domain/usecase/notification/PostWriteNoticeUseCase.kt @@ -0,0 +1,16 @@ +package com.msg.gcms.domain.usecase.notification + +import com.msg.gcms.domain.data.notification.PostWriteNotificationRequestData +import com.msg.gcms.domain.repository.NotificationRepository +import javax.inject.Inject + +class PostWriteNoticeUseCase @Inject constructor( + private val notificationRepository: NotificationRepository +) { + suspend operator fun invoke(clubId: Long, body: PostWriteNotificationRequestData) = runCatching { + notificationRepository.postWriteNotice( + clubId = clubId, + body = body + ) + } +} \ No newline at end of file