Skip to content

Commit 05418f3

Browse files
committed
feat/qg-253: добавлена возможность повторного подключения Google аккаунтов
Т.к. без верификации приложени в Гугле refresh-токены живут всего неделю, обновить их программно невозможно, а верификация - этот тот ещё челлендж, который сейчас проходить не целесообразно. Поэтому в качестве костыля будем слать напоминания внести приёмы на следующуюю неделю если их там нет и пользователь по напоминанию будет заходить в календарь, видеть предупреждение и заново добавлять свой аккаунт.
1 parent 90a8ed9 commit 05418f3

3 files changed

Lines changed: 58 additions & 9 deletions

File tree

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

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
11
package pro.qyoga.i9ns.calendars.google.persistance
22

33
import org.springframework.data.jdbc.core.JdbcAggregateTemplate
4-
import org.springframework.data.jdbc.core.findAllById
54
import org.springframework.jdbc.core.simple.JdbcClient
65
import org.springframework.stereotype.Repository
76
import pro.azhidkov.platform.spring.jdbc.taDataClassRowMapper
87
import pro.azhidkov.platform.spring.sdj.query.query
98
import pro.qyoga.core.users.therapists.TherapistRef
109
import pro.qyoga.i9ns.calendars.google.model.GoogleAccount
11-
import pro.qyoga.i9ns.calendars.google.model.GoogleAccountRef
1210

1311

1412
private val googleAccountRowMapper = taDataClassRowMapper<GoogleAccount>()
@@ -20,7 +18,17 @@ class GoogleAccountsDao(
2018
) {
2119

2220
fun addGoogleAccount(googleAccount: GoogleAccount) {
23-
jdbcAggregateTemplate.insert(googleAccount)
21+
val sql = """
22+
INSERT INTO therapist_google_accounts (id, owner_ref, refresh_token, email)
23+
VALUES (:id, :ownerRef, :refreshToken, :email)
24+
ON CONFLICT (owner_ref, email) DO UPDATE SET refresh_token = :refreshToken
25+
""".trimIndent()
26+
jdbcClient.sql(sql)
27+
.param("id", googleAccount.id)
28+
.param("ownerRef", googleAccount.ownerRef.id)
29+
.param("refreshToken", googleAccount.refreshToken.show())
30+
.param("email", googleAccount.email)
31+
.update()
2432
}
2533

2634
fun findGoogleAccounts(therapist: TherapistRef): List<GoogleAccount> {
@@ -30,10 +38,6 @@ class GoogleAccountsDao(
3038
return jdbcAggregateTemplate.findAll(query, GoogleAccount::class.java)
3139
}
3240

33-
fun findGoogleAccounts(accountIds: List<GoogleAccountRef>): List<GoogleAccount> {
34-
return jdbcAggregateTemplate.findAllById(accountIds.map { it.id })
35-
}
36-
3741
fun findGoogleAccounts(therapistRef: TherapistRef, calendarId: String): List<GoogleAccount> {
3842
val query = """
3943
SELECT *

app/src/test/kotlin/pro/qyoga/tests/cases/app/therapist/calendars/google/GoogleAuthorizationIntegrationTest.kt

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@ import pro.qyoga.tests.clients.TherapistClient
1313
import pro.qyoga.tests.fixture.data.faker
1414
import pro.qyoga.tests.fixture.oauth.OAuthObjectMother
1515
import pro.qyoga.tests.fixture.oauth.OAuthObjectMother.aOAuth2AuthorizationResponse
16+
import pro.qyoga.tests.fixture.object_mothers.calendars.google.GoogleCalendarObjectMother.aGoogleAccount
1617
import pro.qyoga.tests.fixture.object_mothers.therapists.THE_THERAPIST_REF
18+
import pro.qyoga.tests.fixture.test_apis.GoogleCalendarTestApi
1719
import pro.qyoga.tests.fixture.wiremocks.MockGoogleCalendar
1820
import pro.qyoga.tests.fixture.wiremocks.MockGoogleOAuthServer
1921
import pro.qyoga.tests.infra.test_config.spring.context
@@ -29,6 +31,7 @@ class GoogleAuthorizationIntegrationTest : QYogaAppIntegrationBaseKoTest({
2931
val clientId = context.environment["spring.security.oauth2.client.registration.google.client-id"]!!
3032
val clientSecret = context.environment["spring.security.oauth2.client.registration.google.client-secret"]!!
3133
val googleCalendarsService = getBean<GoogleCalendarsService>()
34+
val googleCalendarsTestApi = getBean<GoogleCalendarTestApi>()
3235

3336
"Spring Security" - {
3437
"при запросе на авторизацию в Google" - {
@@ -98,6 +101,45 @@ class GoogleAuthorizationIntegrationTest : QYogaAppIntegrationBaseKoTest({
98101
}
99102

100103
}
104+
105+
"в случае успешной авторизации уже подключенного аккаунта должен" - {
106+
// Сетап
107+
val googleEmail = faker.internet().emailAddress()
108+
googleCalendarsTestApi.addAccount(aGoogleAccount(THE_THERAPIST_REF, googleEmail))
109+
110+
val mockGoogleOAuthServer = MockGoogleOAuthServer(WireMock.wiremock)
111+
val mockGoogleCalendar = MockGoogleCalendar(WireMock.wiremock)
112+
val oAuthRequest = therapist.googleCalendarIntegration.authorizeInGoogle()
113+
.let { OAuthObjectMother.oAuth2AuthorizationRequest(it) }
114+
val aOAuthResponse = aOAuth2AuthorizationResponse(oAuthRequest.state)
115+
val accessToken = "accessToken"
116+
val refreshToken = "refreshToken"
117+
val calendars = emptyList<GoogleCalendar>()
118+
mockGoogleOAuthServer.OnGetToken(clientId, clientSecret, aOAuthResponse.code)
119+
.returnsToken(accessToken, refreshToken)
120+
mockGoogleOAuthServer.OnGetUserInfo(accessToken).returnsUserInfo(googleEmail)
121+
mockGoogleOAuthServer.OnRefreshToken(refreshToken).returnsToken(accessToken)
122+
mockGoogleCalendar.OnGetCalendars(accessToken).returnsCalendars(calendars)
123+
124+
therapist.googleCalendarIntegration.handleOAuthCallbackForResponse(aOAuthResponse)
125+
126+
// Действие
127+
val response = therapist.googleCalendarIntegration.finalizeOAuthCallbackForResponse()
128+
129+
// Проверка
130+
"возвращать редирект на страницу календаря с параметром google-connected=true" {
131+
with(response.redirectLocation()) {
132+
path shouldBe SchedulePageController.PATH
133+
query shouldBe "google-connected=true"
134+
}
135+
}
136+
137+
"обеспечивать возможность дальнейших запросов к Google Calendar" {
138+
val gotCalendars = googleCalendarsService.findGoogleAccountCalendars(THE_THERAPIST_REF)
139+
(gotCalendars.single().content as GoogleCalendarsSettingsView.Calendars).calendars shouldBe calendars
140+
}
141+
142+
}
101143
}
102144

103145
})

app/src/testFixtures/kotlin/pro/qyoga/tests/fixture/object_mothers/calendars/google/GoogleCalendarObjectMother.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,13 @@ import java.util.*
1414

1515
object GoogleCalendarObjectMother {
1616

17-
fun aGoogleAccount(therapist: TherapistRef): GoogleAccount =
17+
fun aGoogleAccount(
18+
therapist: TherapistRef,
19+
email: String = faker.internet().emailAddress()
20+
): GoogleAccount =
1821
GoogleAccount(
1922
therapist,
20-
faker.internet().emailAddress(),
23+
email,
2124
aGoogleToken()
2225
)
2326

0 commit comments

Comments
 (0)