Skip to content

Commit 386e6f2

Browse files
committed
refactor/qg-253: поиск CalendarItem по строковому идентификатору инкапсулирован в CalendarItemsResolver
1 parent 15eed39 commit 386e6f2

File tree

15 files changed

+92
-83
lines changed

15 files changed

+92
-83
lines changed

app/src/main/kotlin/pro/qyoga/app/QYogaApp.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import pro.azhidkov.platform.spring.sdj.ErgoSdjConfig
88
import pro.qyoga.app.publc.PublicAppConfig
99
import pro.qyoga.app.therapist.TherapistWebAppConfig
1010
import pro.qyoga.core.appointments.AppointmentsConfig
11+
import pro.qyoga.core.calendar.gateways.CalendarGatewaysConf
1112
import pro.qyoga.core.clients.ClientsConfig
1213
import pro.qyoga.core.survey_forms.SurveyFormsSettingsConfig
1314
import pro.qyoga.core.therapy.TherapyConfig
@@ -35,11 +36,12 @@ import pro.qyoga.tech.captcha.CaptchaConf
3536
TherapyConfig::class,
3637
UsersConfig::class,
3738
SurveyFormsSettingsConfig::class,
38-
ICalCalendarsConfig::class,
39-
GoogleCalendarConf::class,
39+
CalendarGatewaysConf::class,
4040

4141
// I9ns
4242
EmailsConfig::class,
43+
ICalCalendarsConfig::class,
44+
GoogleCalendarConf::class,
4345

4446
// Tech
4547
CaptchaConf::class,

app/src/main/kotlin/pro/qyoga/app/therapist/appointments/core/edit/CreateAppointmentPageController.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,10 @@ import pro.qyoga.app.publc.components.toComboBoxItem
1616
import pro.qyoga.app.therapist.appointments.core.edit.errors.AppointmentsIntersectionException
1717
import pro.qyoga.app.therapist.appointments.core.edit.ops.CreateAppointmentOp
1818
import pro.qyoga.app.therapist.appointments.core.edit.ops.GetAppointmentPrefillDataOp
19-
import pro.qyoga.app.therapist.appointments.core.edit.view_model.SourceItem
2019
import pro.qyoga.app.therapist.appointments.core.edit.view_model.appointmentPageModelAndView
2120
import pro.qyoga.app.therapist.appointments.core.schedule.SchedulePageController.Companion.calendarForDayWithFocus
2221
import pro.qyoga.core.appointments.core.commands.EditAppointmentRequest
22+
import pro.qyoga.core.calendar.api.SourceItem
2323
import pro.qyoga.core.users.auth.dtos.QyogaUserDetails
2424
import pro.qyoga.core.users.therapists.ref
2525
import java.time.LocalDateTime

app/src/main/kotlin/pro/qyoga/app/therapist/appointments/core/edit/ops/GetAppointmentPrefillDataOp.kt

Lines changed: 4 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,17 @@ package pro.qyoga.app.therapist.appointments.core.edit.ops
33
import org.springframework.stereotype.Component
44
import pro.azhidkov.timezones.TimeZones
55
import pro.qyoga.app.therapist.appointments.core.edit.forms.CreateAppointmentForm
6-
import pro.qyoga.app.therapist.appointments.core.edit.view_model.SourceItem
7-
import pro.qyoga.app.therapist.appointments.core.edit.view_model.googleEventId
8-
import pro.qyoga.app.therapist.appointments.core.edit.view_model.icsEventId
6+
import pro.qyoga.core.calendar.api.SourceItem
7+
import pro.qyoga.core.calendar.gateways.CalendarItemsResolver
98
import pro.qyoga.core.users.auth.model.UserRef
109
import pro.qyoga.core.users.settings.UserSettingsRepo
1110
import pro.qyoga.core.users.therapists.TherapistRef
12-
import pro.qyoga.i9ns.calendars.google.GoogleCalendar
13-
import pro.qyoga.i9ns.calendars.google.GoogleCalendarsService
14-
import pro.qyoga.i9ns.calendars.ical.ICalCalendarsRepo
15-
import pro.qyoga.i9ns.calendars.ical.model.ICalCalendar
1611
import java.time.LocalDateTime
1712

1813

1914
@Component
2015
class GetAppointmentPrefillDataOp(
21-
private val iCalCalendarsRepo: ICalCalendarsRepo,
22-
private val googleCalendarsService: GoogleCalendarsService,
16+
private val calendarItemsResolver: CalendarItemsResolver,
2317
private val userSettingsRepo: UserSettingsRepo,
2418
private val timeZones: TimeZones,
2519
) : (TherapistRef, SourceItem?, LocalDateTime?) -> CreateAppointmentForm {
@@ -31,16 +25,7 @@ class GetAppointmentPrefillDataOp(
3125
): CreateAppointmentForm {
3226
val currentUserTimeZone = userSettingsRepo.getUserTimeZone(UserRef(therapistRef))
3327

34-
val sourceEvent = when (sourceItem?.type) {
35-
ICalCalendar.Type.name ->
36-
iCalCalendarsRepo.findById(therapistRef, sourceItem.icsEventId())
37-
38-
GoogleCalendar.Type.name ->
39-
googleCalendarsService.findById(therapistRef, sourceItem.googleEventId())
40-
41-
else ->
42-
null
43-
}
28+
val sourceEvent = calendarItemsResolver.findCalendarItem(therapistRef, sourceItem!!)
4429

4530
val timeZoneTitle = timeZones.findById(currentUserTimeZone)?.displayName
4631

app/src/main/kotlin/pro/qyoga/app/therapist/appointments/core/edit/view_model/SourceItem.kt

Lines changed: 0 additions & 41 deletions
This file was deleted.

app/src/main/kotlin/pro/qyoga/app/therapist/appointments/core/schedule/CalendarPageModel.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ package pro.qyoga.app.therapist.appointments.core.schedule
55
import org.springframework.web.servlet.ModelAndView
66
import pro.qyoga.app.therapist.appointments.core.edit.CreateAppointmentPageController
77
import pro.qyoga.app.therapist.appointments.core.edit.EditAppointmentPageController
8-
import pro.qyoga.app.therapist.appointments.core.edit.view_model.SourceItem
98
import pro.qyoga.app.therapist.appointments.core.schedule.AppointmentCard.CssClasses.CLIENT_CAME_CARD
109
import pro.qyoga.app.therapist.appointments.core.schedule.AppointmentCard.CssClasses.CLIENT_DO_NOT_CAME_CARD
1110
import pro.qyoga.app.therapist.appointments.core.schedule.AppointmentCard.CssClasses.DRAFT_CARD
@@ -18,6 +17,7 @@ import pro.qyoga.core.appointments.core.model.AppointmentStatus
1817
import pro.qyoga.core.appointments.core.views.LocalizedAppointmentSummary
1918
import pro.qyoga.core.calendar.api.CalendarItem
2019
import pro.qyoga.core.calendar.api.CalendarItemId
20+
import pro.qyoga.core.calendar.api.SourceItem
2121
import pro.qyoga.l10n.russianDayOfMonthLongFormat
2222
import pro.qyoga.l10n.russianTimeFormat
2323
import pro.qyoga.l10n.systemLocale

app/src/main/kotlin/pro/qyoga/core/calendar/api/CalendarsService.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,6 @@ interface CalendarsService<ID> {
2222

2323
fun findById(therapistRef: TherapistRef, eventId: ID): CalendarItem<ID, ZonedDateTime>?
2424

25+
fun parseStringId(sourceItem: SourceItem): ID
26+
2527
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package pro.qyoga.core.calendar.api
2+
3+
data class SourceItem(
4+
val type: String,
5+
val id: String
6+
) {
7+
8+
constructor(eventId: CalendarItemId) : this(eventId.type.name, eventId.toQueryParamStr())
9+
10+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package pro.qyoga.core.calendar.gateways
2+
3+
import org.springframework.context.annotation.ComponentScan
4+
import org.springframework.context.annotation.Configuration
5+
6+
7+
@ComponentScan
8+
@Configuration
9+
class CalendarGatewaysConf
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package pro.qyoga.core.calendar.gateways
2+
3+
import org.springframework.stereotype.Service
4+
import pro.qyoga.core.calendar.api.CalendarItem
5+
import pro.qyoga.core.calendar.api.CalendarItemId
6+
import pro.qyoga.core.calendar.api.CalendarsService
7+
import pro.qyoga.core.calendar.api.SourceItem
8+
import pro.qyoga.core.users.therapists.TherapistRef
9+
import java.time.ZonedDateTime
10+
11+
@Service
12+
class CalendarItemsResolver(
13+
calendarsServices: List<CalendarsService<*>>
14+
) {
15+
16+
private val services = calendarsServices.associateBy { it.type.name }
17+
18+
fun findCalendarItem(
19+
therapistRef: TherapistRef,
20+
sourceItem: SourceItem
21+
): CalendarItem<CalendarItemId, ZonedDateTime>? {
22+
@Suppress("UNCHECKED_CAST")
23+
val service = services[sourceItem.type] as CalendarsService<CalendarItemId>
24+
val id = service.parseStringId(sourceItem)
25+
return service.findById(therapistRef, id)
26+
}
27+
28+
}

app/src/main/kotlin/pro/qyoga/i9ns/calendars/google/GoogleCalendarsService.kt

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,7 @@ import pro.azhidkov.platform.java.time.Interval
99
import pro.azhidkov.platform.java.time.zoneId
1010
import pro.azhidkov.platform.kotlin.tryExecute
1111
import pro.azhidkov.platform.spring.sdj.ergo.hydration.ref
12-
import pro.qyoga.core.calendar.api.CalendarItem
13-
import pro.qyoga.core.calendar.api.CalendarType
14-
import pro.qyoga.core.calendar.api.CalendarsService
15-
import pro.qyoga.core.calendar.api.SearchResult
12+
import pro.qyoga.core.calendar.api.*
1613
import pro.qyoga.core.users.therapists.TherapistRef
1714
import java.time.ZonedDateTime
1815
import java.util.*
@@ -152,6 +149,9 @@ class GoogleCalendarsService(
152149
return googleCalendarsClient.findById(account, eventId)
153150
}
154151

152+
override fun parseStringId(sourceItem: SourceItem): GoogleCalendarItemId =
153+
sourceItem.googleEventId()
154+
155155
fun updateCalendarSettings(
156156
therapist: TherapistRef,
157157
googleAccount: GoogleAccountRef,
@@ -162,3 +162,10 @@ class GoogleCalendarsService(
162162
}
163163

164164
}
165+
166+
fun SourceItem.googleEventId(): GoogleCalendarItemId {
167+
check(type == GoogleCalendar.Type.name)
168+
val matcher = "(.+),(.+)".toRegex().matchEntire(id)
169+
check(matcher != null)
170+
return GoogleCalendarItemId(matcher.groups[1]!!.value, matcher.groups[2]!!.value)
171+
}

0 commit comments

Comments
 (0)