From 81f7e5ebde6ff5b98d777688c849958955e5df63 Mon Sep 17 00:00:00 2001 From: kashiuno Date: Sat, 4 Jan 2025 12:00:40 +0300 Subject: [PATCH] Add logic for qrs extracting and add database change log for oauth2 clients --- .../controller/QrSyncController.kt | 12 ++++ .../controller/QrUsedController.kt | 12 ++++ .../qr_access_api/repository/QrRepository.kt | 34 ++++++++++ .../qr_access_api/service/QrSyncService.kt | 15 +++++ src/main/resources/application.properties | 5 +- .../db/changelog/1.0.0/changelog.yml | 63 +++++++++++++++++++ .../db/changelog/db.changelog-master.yaml | 3 + 7 files changed, 143 insertions(+), 1 deletion(-) create mode 100644 src/main/kotlin/ru/vyatsu/qr_access_api/controller/QrSyncController.kt create mode 100644 src/main/kotlin/ru/vyatsu/qr_access_api/controller/QrUsedController.kt create mode 100644 src/main/kotlin/ru/vyatsu/qr_access_api/repository/QrRepository.kt create mode 100644 src/main/kotlin/ru/vyatsu/qr_access_api/service/QrSyncService.kt create mode 100644 src/main/resources/db/changelog/1.0.0/changelog.yml create mode 100644 src/main/resources/db/changelog/db.changelog-master.yaml diff --git a/src/main/kotlin/ru/vyatsu/qr_access_api/controller/QrSyncController.kt b/src/main/kotlin/ru/vyatsu/qr_access_api/controller/QrSyncController.kt new file mode 100644 index 0000000..9145413 --- /dev/null +++ b/src/main/kotlin/ru/vyatsu/qr_access_api/controller/QrSyncController.kt @@ -0,0 +1,12 @@ +package ru.vyatsu.qr_access_api.controller + +import org.springframework.http.ResponseEntity +import ru.vyatsu.apis.QrApi +import ru.vyatsu.models.QrCodesResponse +import ru.vyatsu.qr_access_api.service.QrSyncService + +class QrSyncController(val syncService: QrSyncService) : QrApi { + + override fun getQrCodes(): ResponseEntity = + ResponseEntity.ok(QrCodesResponse(syncService.getQrCodes())) +} \ No newline at end of file diff --git a/src/main/kotlin/ru/vyatsu/qr_access_api/controller/QrUsedController.kt b/src/main/kotlin/ru/vyatsu/qr_access_api/controller/QrUsedController.kt new file mode 100644 index 0000000..d3548af --- /dev/null +++ b/src/main/kotlin/ru/vyatsu/qr_access_api/controller/QrUsedController.kt @@ -0,0 +1,12 @@ +package ru.vyatsu.qr_access_api.controller + +import org.springframework.http.HttpStatusCode +import org.springframework.http.ResponseEntity +import org.springframework.web.client.HttpServerErrorException +import ru.vyatsu.apis.QrUsedApi + +class QrUsedController : QrUsedApi { + override fun markQrCodeAsUsed(qrId: String): ResponseEntity { + throw HttpServerErrorException(HttpStatusCode.valueOf(501)) + } +} \ No newline at end of file diff --git a/src/main/kotlin/ru/vyatsu/qr_access_api/repository/QrRepository.kt b/src/main/kotlin/ru/vyatsu/qr_access_api/repository/QrRepository.kt new file mode 100644 index 0000000..e26189c --- /dev/null +++ b/src/main/kotlin/ru/vyatsu/qr_access_api/repository/QrRepository.kt @@ -0,0 +1,34 @@ +package ru.vyatsu.qr_access_api.repository + +import org.springframework.jdbc.core.JdbcTemplate +import org.springframework.stereotype.Repository +import ru.vyatsu.models.QrCode +import java.time.ZoneOffset +import java.util.* + +private const val GET_QRS_BY_DOOR_IDS = + "SELECT key_code, door_id, start_date_time, end_date_time FROM qrs WHERE door_id IN (?)" + +@Repository +class QrRepository(private val template: JdbcTemplate) { + + fun getActualQrCodesByDoorIds(doorIds: Array): List { + return when { + doorIds.isNotEmpty() -> template.query({ conn -> + val doorIdsDbArray = conn.createArrayOf("TEXT", doorIds) + val stmt = conn.prepareStatement(GET_QRS_BY_DOOR_IDS) + stmt.setArray(1, doorIdsDbArray) + stmt + }, { rs, _ -> + QrCode( + rs.getTimestamp("start_date_time").toLocalDateTime().atOffset(ZoneOffset.UTC), + rs.getTimestamp("end_date_time").toLocalDateTime().atOffset(ZoneOffset.UTC), + UUID.fromString(rs.getString("door_id")), + UUID.fromString(rs.getString("key_code")) + ) + }) + + else -> listOf() + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/ru/vyatsu/qr_access_api/service/QrSyncService.kt b/src/main/kotlin/ru/vyatsu/qr_access_api/service/QrSyncService.kt new file mode 100644 index 0000000..8e5ef85 --- /dev/null +++ b/src/main/kotlin/ru/vyatsu/qr_access_api/service/QrSyncService.kt @@ -0,0 +1,15 @@ +package ru.vyatsu.qr_access_api.service + +import org.springframework.stereotype.Service +import ru.vyatsu.models.QrCode +import ru.vyatsu.qr_access_api.repository.QrRepository + +@Service +class QrSyncService(val qrRepository: QrRepository) { + fun getQrCodes(): List { + // TODO: Тут логика с извлечением клайма из jwt в котором идентификатор клиента лежит + val extractedDoorIds = arrayOf("945c8621-9adc-4a49-bc56-10253d27c581", "4dbf27d7-df77-493d-b970-67f8a5178eb9") + // TODO: Переделать на передачу unitId и извлечь из бд unit и двери, которые ему принадлежат + return qrRepository.getActualQrCodesByDoorIds(extractedDoorIds) + } +} \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 36aaa68..b35f27a 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1 +1,4 @@ -spring.application.name=qr-access-api \ No newline at end of file +spring.application.name=qr-access-api +spring.datasource.url=jdbc:postgresql://localhost:5432/qr_access +spring.datasource.username=qr_access_user +spring.datasource.password=123 \ No newline at end of file diff --git a/src/main/resources/db/changelog/1.0.0/changelog.yml b/src/main/resources/db/changelog/1.0.0/changelog.yml new file mode 100644 index 0000000..f2cb7ac --- /dev/null +++ b/src/main/resources/db/changelog/1.0.0/changelog.yml @@ -0,0 +1,63 @@ +databaseChangeLog: + - changeSet: + id: create-oauth2-registered-clients + author: d.krupin + changes: + - createTable: + tableName: oauth2_authorized_client + columns: + - column: + constraints: + nullable: false + primaryKey: true + primaryKeyName: PK_oauth2_client + name: client_registration_id + type: VARCHAR(100) + - column: + constraints: + nullable: false + primaryKey: true + primaryKeyName: PK_oauth2_client + name: principal_name + type: VARCHAR(200) + - column: + name: access_token_type + type: VARCHAR(100) + constraints: + nullable: false + - column: + name: access_token_value + type: TEXT + constraints: + nullable: false + - column: + name: access_token_issued_at + type: TIMESTAMP + constraints: + nullable: false + - column: + name: access_token_expires_at + type: TIMESTAMP + constraints: + nullable: false + - column: + name: access_token_scopes + type: TEXT + constraints: + nullable: true + - column: + name: refresh_token_value + type: TEXT + constraints: + nullable: true + - column: + name: refresh_token_issued_at + type: TIMESTAMP + constraints: + nullable: true + - column: + name: created_at + type: TIMESTAMP + constraints: + nullable: false + defaultValueComputed: CURRENT_TIMESTAMP \ No newline at end of file diff --git a/src/main/resources/db/changelog/db.changelog-master.yaml b/src/main/resources/db/changelog/db.changelog-master.yaml new file mode 100644 index 0000000..a79def6 --- /dev/null +++ b/src/main/resources/db/changelog/db.changelog-master.yaml @@ -0,0 +1,3 @@ +databaseChangeLog: + - include: + file: db/changelog/1.0.0/changelog.yml \ No newline at end of file