Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
464b879
#58 [MOD] ScheduleItem 레이아웃 fillMaxWidth 적용하여 가로 정렬 수정
youjin09222 Mar 2, 2025
f0b8855
Merge branch 'develop' of https://github.com/Noostak/Noostak_Android …
youjin09222 Mar 12, 2025
e02aa4e
Merge branch 'develop' of https://github.com/Noostak/Noostak_Android …
youjin09222 Mar 20, 2025
0507612
#58 [ADD] ApiKeyStorage에 CALENDAR 추가
youjin09222 Mar 21, 2025
3694484
#58 [ADD] ApiKeyStorage에 YEAR, MONTH 추가
youjin09222 Mar 21, 2025
29a2106
#58 [ADD] ResponseGetCalendarDto 추가
youjin09222 Mar 21, 2025
3fb2ba1
#58 [FEAT] CalendarApiService 구현
youjin09222 Mar 21, 2025
3bcc5fb
#58 [ADD] CalendarEntity 추가
youjin09222 Mar 21, 2025
d7812ae
#58 [ADD] ResponseGetCalendarDtoMapper 추가
youjin09222 Mar 21, 2025
9e6aa14
#58 [FEAT] CalendarDataSource 추가
youjin09222 Mar 21, 2025
e0f30c4
#58 [FEAT] CalendarDataSourceImpl 구현
youjin09222 Mar 21, 2025
7bc6672
#58 [FEAT] CalendarRepository 추가
youjin09222 Mar 21, 2025
051315d
#58 [FEAT] CalendarRepositoryImpl 구현
youjin09222 Mar 21, 2025
fa1c8bc
#58 [FEAT] DataSourceModule에 CalendarDataSource 바인딩 추가
youjin09222 Mar 21, 2025
f605596
#58 [FEAT] RepositoryModule에 CalendarRepository 바인딩 추가
youjin09222 Mar 21, 2025
7e1f44f
#58 [FEAT] ServiceModule에 provideCalendarService 추가
youjin09222 Mar 21, 2025
384f514
#58 [FEAT] GetCalendarAppointmentsUseCase 구현
youjin09222 Mar 21, 2025
cd62947
#58 [DEL] 캘린더 더미 데이터 삭제
youjin09222 Mar 21, 2025
a32eda7
#58 [FEAT] 캘린더 약속 정보 가져오기 API 연동
youjin09222 Mar 21, 2025
ef07fbe
#58 [FEAT] 현재 월 변경 시 캘린더 API 재호출
youjin09222 Mar 21, 2025
c72426d
#58 [DEL] getLocalDateByPage 확장 함수 제거
youjin09222 Mar 21, 2025
2f9e4ec
#58 [FIX] 캘린더 일정 키 포맷 yyyy-MM-dd로 변경
youjin09222 Mar 24, 2025
4977e18
Merge branch 'develop' of https://github.com/Noostak/Noostak_Android …
youjin09222 Mar 24, 2025
d1e5207
#58 [MOD] ScheduleEntity 수정
youjin09222 Mar 24, 2025
08d0612
#58 [MOD] CalendarAppointmentEntity로 변경
youjin09222 Mar 24, 2025
565feb4
#58 [REFACTOR] 바텀시트에 캘린더 데이터 적용
youjin09222 Mar 24, 2025
a3e1349
#58 [FEAT] toFormattedKoreanDate 확장 함수 적용
youjin09222 Mar 24, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions app/src/main/java/com/sopt/noostak/di/DataSourceModule.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,14 @@ package com.sopt.noostak.di
import com.sopt.data.datasource.AccountDataSource
import com.sopt.data.datasource.AppointmentConfirmDataSource
import com.sopt.data.datasource.AuthDataSource
import com.sopt.data.datasource.CalendarDataSource
import com.sopt.data.datasource.ExampleDataSource
import com.sopt.data.datasource.GroupDataSource
import com.sopt.data.datasource.UserDataSource
import com.sopt.data.datasourceimpl.AccountDataSourceImpl
import com.sopt.data.datasourceimpl.AppointmentConfirmDataSourceImpl
import com.sopt.data.datasourceimpl.AuthDataSourceImpl
import com.sopt.data.datasourceimpl.CalendarDataSourceImpl
import com.sopt.data.datasourceimpl.ExampleDataSourceImpl
import com.sopt.data.datasourceimpl.GroupDataSourceImpl
import com.sopt.data.datasourceimpl.UserDataSourceImpl
Expand Down Expand Up @@ -42,6 +44,10 @@ abstract class DataSourceModule {
@Singleton
abstract fun bindAppointmentConfirmDataSource(appointmentConfirmDataSourceImpl: AppointmentConfirmDataSourceImpl): AppointmentConfirmDataSource

@Binds
@Singleton
abstract fun bindCalendarDataSource(calendarDataSourceImpl: CalendarDataSourceImpl): CalendarDataSource

@Binds
@Singleton
abstract fun bindGroupDataSource(groupDataSourceImpl: GroupDataSourceImpl): GroupDataSource
Expand Down
6 changes: 6 additions & 0 deletions app/src/main/java/com/sopt/noostak/di/RepositoryModule.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,14 @@ package com.sopt.noostak.di
import com.sopt.data.repositoryimpl.AccountRepositoryImpl
import com.sopt.data.repositoryimpl.AppointmentConfirmRepositoryImpl
import com.sopt.data.repositoryimpl.AuthRepositoryImpl
import com.sopt.data.repositoryimpl.CalendarRepositoryImpl
import com.sopt.data.repositoryimpl.ExampleRepositoryImpl
import com.sopt.data.repositoryimpl.GroupRepositoryImpl
import com.sopt.data.repositoryimpl.UserInfoRepositoryImpl
import com.sopt.domain.repository.AccountRepository
import com.sopt.domain.repository.AppointmentConfirmRepository
import com.sopt.domain.repository.AuthRepository
import com.sopt.domain.repository.CalendarRepository
import com.sopt.domain.repository.ExampleRepository
import com.sopt.domain.repository.GroupRepository
import com.sopt.domain.repository.UserInfoRepository
Expand Down Expand Up @@ -42,6 +44,10 @@ abstract class RepositoryModule {
@Singleton
abstract fun bindAppointmentConfirmRepository(appointmentConfirmRepositoryImpl: AppointmentConfirmRepositoryImpl): AppointmentConfirmRepository

@Binds
@Singleton
abstract fun bindCalendarRepository(calendarRepositoryImpl: CalendarRepositoryImpl): CalendarRepository

@Binds
@Singleton
abstract fun bindGroupRepository(groupRepositoryImpl: GroupRepositoryImpl): GroupRepository
Expand Down
7 changes: 7 additions & 0 deletions app/src/main/java/com/sopt/noostak/di/ServiceModule.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package com.sopt.noostak.di
import com.sopt.data.service.AccountApiService
import com.sopt.data.service.AppointmentConfirmApiService
import com.sopt.data.service.AuthApiService
import com.sopt.data.service.CalendarApiService
import com.sopt.data.service.ExampleApiService
import com.sopt.data.service.GroupApiService
import dagger.Module
Expand Down Expand Up @@ -40,6 +41,12 @@ object ServiceModule {
@AccessToken retrofit: Retrofit
): AppointmentConfirmApiService = retrofit.create(AppointmentConfirmApiService::class.java)

@Provides
@Singleton
fun provideCalendarService(
@AccessToken retrofit: Retrofit
): CalendarApiService = retrofit.create(CalendarApiService::class.java)

@Provides
@Singleton
fun provideGroupApiService(@AccessToken retrofit: Retrofit): GroupApiService =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,15 @@ import com.sopt.core.designsystem.theme.NoostakTheme
import com.sopt.core.extension.getMonthDays
import com.sopt.domain.entity.CalendarSchedule
import com.sopt.domain.entity.DayEntity
import java.time.LocalDate
import java.time.YearMonth

@Composable
fun CalendarMonth(
weeks: List<List<DayEntity>>,
modifier: Modifier = Modifier,
scheduleMap: Map<String, List<CalendarSchedule>> = emptyMap(),
onItemClick: () -> Unit = {}
onItemClick: (LocalDate) -> Unit = {}
) {
Column(
modifier = modifier
Expand All @@ -32,7 +33,7 @@ fun CalendarMonth(
dayInfo = week,
scheduleMap = scheduleMap,
modifier = Modifier.padding(top = if (index == 0) 0.dp else 4.dp),
onItemClick = { onItemClick() }
onItemClick = onItemClick
)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,14 @@ import com.sopt.core.extension.getYearMonthByPage
import com.sopt.core.extension.initialPage
import com.sopt.core.extension.pageCount
import com.sopt.domain.entity.CalendarSchedule
import java.time.LocalDate

@Composable
fun CalendarMonthPager(
pagerState: PagerState,
scheduleMap: Map<String, List<CalendarSchedule>>,
modifier: Modifier = Modifier,
onItemClick: () -> Unit = {}
onItemClick: (LocalDate) -> Unit = {}
) {
HorizontalPager(
state = pagerState,
Expand All @@ -29,7 +30,7 @@ fun CalendarMonthPager(
weeks = getMonthDays(getYearMonthByPage(page)),
scheduleMap = scheduleMap,
modifier = Modifier.fillMaxSize(),
onItemClick = { onItemClick() }
onItemClick = onItemClick
)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ internal fun CalendarWeek(
dayInfo: List<DayEntity>,
modifier: Modifier = Modifier,
scheduleMap: Map<String, List<CalendarSchedule>> = emptyMap(),
onItemClick: () -> Unit = {}
onItemClick: (LocalDate) -> Unit = {}
) {
Row(
modifier = modifier.background(NoostakTheme.colors.white),
Expand All @@ -41,7 +41,7 @@ internal fun CalendarWeek(
modifier = Modifier
.height(84.dp)
.weight(1f)
.noRippleClickable { onItemClick() },
.noRippleClickable { onItemClick(day.day) },
horizontalAlignment = Alignment.CenterHorizontally
) {
CalendarDay(
Expand Down
5 changes: 0 additions & 5 deletions core/src/main/java/com/sopt/core/extension/CalendarExt.kt
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package com.sopt.core.extension

import com.sopt.domain.entity.DayEntity
import java.time.LocalDate
import java.time.YearMonth

private val monthsInRange =
Expand All @@ -14,10 +13,6 @@ fun getYearMonthByPage(page: Int): YearMonth {
return monthsInRange[page]
}

fun getLocalDateByPage(page: Int): LocalDate {
return getYearMonthByPage(page).atDay(1)
}

fun getMonthDays(yearMonth: YearMonth): List<List<DayEntity>> {
val startDayOfWeek = yearMonth.atDay(1).dayOfWeek.value % 7 // 이번 달 1일의 요일 (일요일 기준)

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.sopt.core.util.calendar

import java.time.LocalDate
import java.time.format.TextStyle
import java.util.Locale

fun String.toFormattedKoreanDate(): String {
return try {
val date = LocalDate.parse(this.substring(0, 10))
val month = date.monthValue
val day = date.dayOfMonth
val dayOfWeek = date.dayOfWeek.getDisplayName(TextStyle.SHORT, Locale.KOREAN)
"${month}월 ${day}일 ($dayOfWeek)"
} catch (e: Exception) {
this
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.sopt.data.datasource

import com.sopt.data.dto.BaseResponse
import com.sopt.data.dto.response.ResponseGetCalendarDto

interface CalendarDataSource {
suspend fun getCalendarAppointments(
groupId: Long,
year: Int,
month: Int
): BaseResponse<ResponseGetCalendarDto>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.sopt.data.datasourceimpl

import com.sopt.data.datasource.CalendarDataSource
import com.sopt.data.dto.BaseResponse
import com.sopt.data.dto.response.ResponseGetCalendarDto
import com.sopt.data.service.CalendarApiService
import javax.inject.Inject

class CalendarDataSourceImpl @Inject constructor(
private val calendarApiService: CalendarApiService
) : CalendarDataSource {
override suspend fun getCalendarAppointments(
groupId: Long,
year: Int,
month: Int
): BaseResponse<ResponseGetCalendarDto> {
return calendarApiService.getCalendarAppointments(groupId, year, month)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.sopt.data.dto.response

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
data class ResponseGetCalendarDto(
@SerialName("year") val year: Int,
@SerialName("month") val month: Int,
@SerialName("previousMonthAppointments") val previousMonthAppointments: List<CalendarAppointmentDayDto>,
@SerialName("currentMonthAppointments") val currentMonthAppointments: List<CalendarAppointmentDayDto>
)

@Serializable
data class CalendarAppointmentDayDto(
@SerialName("day") val day: Int,
@SerialName("appointments") val appointments: List<CalendarAppointmentDto>
)

@Serializable
data class CalendarAppointmentDto(
@SerialName("id") val id: Long,
@SerialName("name") val name: String,
@SerialName("date") val date: String,
@SerialName("startTime") val startTime: String,
@SerialName("endTime") val endTime: String,
@SerialName("duration") val duration: Long,
@SerialName("category") val category: String
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.sopt.data.mapper

import com.sopt.data.dto.response.CalendarAppointmentDayDto
import com.sopt.data.dto.response.CalendarAppointmentDto
import com.sopt.data.dto.response.ResponseGetCalendarDto
import com.sopt.domain.entity.CalendarAppointmentDayEntity
import com.sopt.domain.entity.CalendarAppointmentEntity
import com.sopt.domain.entity.CalendarEntity

fun ResponseGetCalendarDto.toCalendarEntity() = CalendarEntity(
year = year,
month = month,
previousMonthAppointments = previousMonthAppointments.map { it.toCalendarAppointmentDayEntity() },
currentMonthAppointments = currentMonthAppointments.map { it.toCalendarAppointmentDayEntity() }
)

fun CalendarAppointmentDayDto.toCalendarAppointmentDayEntity() = CalendarAppointmentDayEntity(
day = day,
appointments = appointments.map { it.toCalendarAppointmentEntity() }
)

fun CalendarAppointmentDto.toCalendarAppointmentEntity() = CalendarAppointmentEntity(
id = id,
name = name,
date = date,
startTime = startTime,
endTime = endTime,
duration = duration,
category = category
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.sopt.data.repositoryimpl

import com.sopt.data.datasource.CalendarDataSource
import com.sopt.data.mapper.toCalendarEntity
import com.sopt.domain.entity.CalendarEntity
import com.sopt.domain.repository.CalendarRepository
import javax.inject.Inject

class CalendarRepositoryImpl @Inject constructor(
private val calendarDataSource: CalendarDataSource
) : CalendarRepository {
override suspend fun getCalendarAppointments(
groupId: Long,
year: Int,
month: Int
): Result<CalendarEntity> {
return runCatching {
calendarDataSource.getCalendarAppointments(
groupId,
year,
month
).result?.toCalendarEntity()
?: throw Exception("getCalendarAppointments failed")
}
}
}
3 changes: 3 additions & 0 deletions data/src/main/java/com/sopt/data/service/ApiKeyStorage.kt
Original file line number Diff line number Diff line change
Expand Up @@ -31,4 +31,7 @@ object ApiKeyStorage {
const val APPOINTMENT_MEMBERS = "appointment-members"
const val TIMETABLE = "timetable"
const val AUTHORIZE = "authorize"
const val CALENDAR = "calendar"
const val YEAR = "year"
const val MONTH = "month"
}
24 changes: 24 additions & 0 deletions data/src/main/java/com/sopt/data/service/CalendarApiService.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.sopt.data.service

import com.sopt.data.dto.BaseResponse
import com.sopt.data.dto.response.ResponseGetCalendarDto
import com.sopt.data.service.ApiKeyStorage.API
import com.sopt.data.service.ApiKeyStorage.APPOINTMENTS
import com.sopt.data.service.ApiKeyStorage.CALENDAR
import com.sopt.data.service.ApiKeyStorage.GROUPS
import com.sopt.data.service.ApiKeyStorage.GROUP_ID
import com.sopt.data.service.ApiKeyStorage.MONTH
import com.sopt.data.service.ApiKeyStorage.V1
import com.sopt.data.service.ApiKeyStorage.YEAR
import retrofit2.http.GET
import retrofit2.http.Path
import retrofit2.http.Query

interface CalendarApiService {
@GET("/$API/$V1/$GROUPS/{$GROUP_ID}/$APPOINTMENTS/$CALENDAR")
suspend fun getCalendarAppointments(
@Path(GROUP_ID) groupId: Long,
@Query(YEAR) year: Int,
@Query(MONTH) month: Int
): BaseResponse<ResponseGetCalendarDto>
}
23 changes: 23 additions & 0 deletions domain/src/main/java/com/sopt/domain/entity/CalendarEntity.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.sopt.domain.entity

data class CalendarEntity(
val year: Int,
val month: Int,
val previousMonthAppointments: List<CalendarAppointmentDayEntity>,
val currentMonthAppointments: List<CalendarAppointmentDayEntity>
)

data class CalendarAppointmentDayEntity(
val day: Int,
val appointments: List<CalendarAppointmentEntity>
)

data class CalendarAppointmentEntity(
val id: Long,
val name: String,
val date: String,
val startTime: String,
val endTime: String,
val duration: Long,
val category: String
)
17 changes: 2 additions & 15 deletions domain/src/main/java/com/sopt/domain/entity/ScheduleEntity.kt
Original file line number Diff line number Diff line change
@@ -1,20 +1,7 @@
package com.sopt.domain.entity

import android.os.Parcelable
import kotlinx.parcelize.Parcelize

data class ScheduleEntity(
val groupId: Long = -1,
val date: String, // M월 D일 (E) - ex) 1월 13일 (월)
val scheduleList: List<ScheduleListDetailEntity>
)

@Parcelize
data class ScheduleListDetailEntity(
val scheduleId: Long = -1,
val name: String = "",
val category: String = "",
val startTime: String = "", // H:m - ex) 1:10, 13:01
val endTime: String = "", // H:m - ex) 1:10, 13:01
val duration: Long = 0
) : Parcelable
val scheduleList: List<CalendarAppointmentEntity>
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.sopt.domain.repository

import com.sopt.domain.entity.CalendarEntity

interface CalendarRepository {
suspend fun getCalendarAppointments(
groupId: Long,
year: Int,
month: Int
): Result<CalendarEntity>
}
Loading