Skip to content

Commit c29cc3d

Browse files
committed
Migrate remaining usage of CheckIn
1 parent 7b78223 commit c29cc3d

File tree

7 files changed

+78
-40
lines changed

7 files changed

+78
-40
lines changed

libpretixsync/src/main/java/eu/pretix/libpretixsync/check/AsyncCheckProvider.kt

Lines changed: 37 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import eu.pretix.libpretixsync.crypto.isValidSignature
88
import eu.pretix.libpretixsync.crypto.readPubkeyFromPem
99
import eu.pretix.libpretixsync.crypto.sig1.TicketProtos
1010
import eu.pretix.libpretixsync.db.Answer
11-
import eu.pretix.libpretixsync.db.CheckIn
1211
import eu.pretix.libpretixsync.db.CheckInList
1312
import eu.pretix.libpretixsync.db.CheckInList_Item
1413
import eu.pretix.libpretixsync.db.Item
@@ -19,6 +18,7 @@ import eu.pretix.libpretixsync.db.QuestionLike
1918
import eu.pretix.libpretixsync.db.QueuedCall
2019
import eu.pretix.libpretixsync.db.QueuedCheckIn
2120
import eu.pretix.libpretixsync.db.ReusableMedium
21+
import eu.pretix.libpretixsync.models.CheckIn
2222
import eu.pretix.libpretixsync.models.Event
2323
import eu.pretix.libpretixsync.models.Question
2424
import eu.pretix.libpretixsync.models.db.toModel
@@ -713,11 +713,9 @@ class AsyncCheckProvider(private val config: ConfigStore, private val dataStore:
713713
res.isRequireAttention = require_attention || variation?.isCheckin_attention == true
714714
res.checkinTexts = listOfNotNull(order.checkin_text?.trim(), variation?.checkin_text?.trim(), item.checkin_text?.trim()).filterNot { it.isBlank() || it == "null" }
715715

716-
val storedCheckIns = dataStore.select(CheckIn::class.java)
717-
.where(CheckIn.POSITION_ID.eq(position.getId()))
718-
.get().toList()
716+
val storedCheckIns = db.checkInQueries.selectByPositionId(position.getId()).executeAsList().map { it.toModel() }
719717
val checkIns = storedCheckIns.filter {
720-
it.getListId() == listId
718+
it.listServerId == listId
721719
}.sortedWith(compareBy({ it.fullDatetime }, { it.id }))
722720

723721
if (order.getStatus() != "p" && order.getStatus() != "n") {
@@ -797,41 +795,41 @@ class AsyncCheckProvider(private val config: ConfigStore, private val dataStore:
797795
data.put("now_isoweekday", dt.withZone(tz).dayOfWeek().get())
798796
data.put("entries_number", checkIns.filter { it.type == "entry" }.size)
799797
data.put("entries_today", checkIns.filter {
800-
DateTime(it.fullDatetime).withZone(tz).toLocalDate() == dt.withZone(tz).toLocalDate() && it.type == "entry"
798+
it.fullDatetime.withZone(tz).toLocalDate() == dt.withZone(tz).toLocalDate() && it.type == "entry"
801799
}.size)
802800
data.put("entries_since", { cutoff: DateTime ->
803801
checkIns.filter {
804-
DateTime(it.fullDatetime).withZone(tz).isAfter(cutoff.minus(Duration.millis(1))) && it.type == "entry"
802+
it.fullDatetime.withZone(tz).isAfter(cutoff.minus(Duration.millis(1))) && it.type == "entry"
805803
}.size
806804
})
807805
data.put("entries_days_since", { cutoff: DateTime ->
808806
checkIns.filter {
809-
DateTime(it.fullDatetime).withZone(tz).isAfter(cutoff.minus(Duration.millis(1))) && it.type == "entry"
807+
it.fullDatetime.withZone(tz).isAfter(cutoff.minus(Duration.millis(1))) && it.type == "entry"
810808
}.map {
811-
DateTime(it.fullDatetime).withZone(tz).toLocalDate()
809+
it.fullDatetime.withZone(tz).toLocalDate()
812810
}.toHashSet().size
813811
})
814812
data.put("entries_before", { cutoff: DateTime ->
815813
checkIns.filter {
816-
DateTime(it.fullDatetime).withZone(tz).isBefore(cutoff) && it.type == "entry"
814+
it.fullDatetime.withZone(tz).isBefore(cutoff) && it.type == "entry"
817815
}.size
818816
})
819817
data.put("entries_days_before", { cutoff: DateTime ->
820818
checkIns.filter {
821-
DateTime(it.fullDatetime).withZone(tz).isBefore(cutoff) && it.type == "entry"
819+
it.fullDatetime.withZone(tz).isBefore(cutoff) && it.type == "entry"
822820
}.map {
823-
DateTime(it.fullDatetime).withZone(tz).toLocalDate()
821+
it.fullDatetime.withZone(tz).toLocalDate()
824822
}.toHashSet().size
825823
})
826824
data.put("entries_days", checkIns.filter { it.type == "entry" }.map {
827-
DateTime(it.fullDatetime).withZone(tz).toLocalDate()
825+
it.fullDatetime.withZone(tz).toLocalDate()
828826
}.toHashSet().size)
829827
val minutes_since_entries = checkIns.filter { it.type == "entry" }.map {
830-
Duration(DateTime(it.fullDatetime).withZone(tz), dt).toStandardMinutes().minutes
828+
Duration(it.fullDatetime.withZone(tz), dt).toStandardMinutes().minutes
831829
}
832830
data.put("minutes_since_last_entry", minutes_since_entries.minOrNull() ?: -1)
833831
data.put("minutes_since_first_entry", minutes_since_entries.maxOrNull() ?: -1)
834-
data.put("entry_status", if (checkIns.lastOrNull()?.getType() == "entry") {
832+
data.put("entry_status", if (checkIns.lastOrNull()?.type == "entry") {
835833
"present"
836834
} else {
837835
"absent"
@@ -916,7 +914,7 @@ class AsyncCheckProvider(private val config: ConfigStore, private val dataStore:
916914
)
917915
if (!entry_allowed) {
918916
res.isCheckinAllowed = false
919-
res.firstScanned = checkIns.first().fullDatetime
917+
res.firstScanned = checkIns.first().fullDatetime.toDate()
920918
res.type = TicketCheckProvider.CheckResult.Type.USED
921919
storeFailedCheckin(eventSlug, list.getServer_id(), "already_redeemed", position.secret, type, position = position.getServer_id(), item = position.getItem().getServer_id(), variation = position.getVariation_id(), subevent = position.getSubevent_id(), nonce = nonce)
922920
} else {
@@ -936,13 +934,14 @@ class AsyncCheckProvider(private val config: ConfigStore, private val dataStore:
936934
qci.setType(type.toString().lowercase(Locale.getDefault()))
937935
qci.setCheckinListId(listId)
938936
dataStore.insert(qci)
939-
val ci = CheckIn()
940-
ci.setListId(listId)
941-
ci.setPosition(position)
942-
ci.setType(type.toString().lowercase(Locale.getDefault()))
943-
ci.setDatetime(dt.toDate())
944-
ci.setJson_data("{\"local\": true, \"type\": \"${type.toString().lowercase(Locale.getDefault())}\", \"datetime\": \"${QueuedCheckIn.formatDatetime(dt.toDate())}\"}")
945-
dataStore.insert(ci)
937+
db.checkInQueries.insert(
938+
server_id = null,
939+
listId = listId,
940+
position = position.getId(),
941+
type = type.toString().lowercase(Locale.getDefault()),
942+
datetime = dt.toDate(),
943+
json_data = "{\"local\": true, \"type\": \"${type.toString().lowercase(Locale.getDefault())}\", \"datetime\": \"${QueuedCheckIn.formatDatetime(dt.toDate())}\"}",
944+
)
946945
}
947946
}
948947

@@ -1083,9 +1082,10 @@ class AsyncCheckProvider(private val config: ConfigStore, private val dataStore:
10831082

10841083
if (onlyCheckedIn) {
10851084
lq = lq.and(OrderPosition.ID.`in`(
1086-
dataStore.select(CheckIn.POSITION_ID)
1087-
.where(CheckIn.LIST_ID.eq(list.getServer_id()))
1088-
.and(CheckIn.TYPE.eq("entry"))
1085+
db.checkInQueries.selectPositionIdByListIdAndType(
1086+
list_server_id = list.getServer_id(),
1087+
type = "entry"
1088+
).executeAsList().map { it.position }
10891089
))
10901090
}
10911091
q = q.or(lq)
@@ -1160,4 +1160,15 @@ class AsyncCheckProvider(private val config: ConfigStore, private val dataStore:
11601160
private fun now(): DateTime {
11611161
return overrideNow ?: DateTime()
11621162
}
1163+
1164+
private val CheckIn.fullDatetime : DateTime
1165+
get() {
1166+
// To avoid Joda Time code in the models, handle the case where we don't have a datetime value from JSON here
1167+
return if (this.datetime != null) {
1168+
DateTime(this.datetime.toInstant())
1169+
} else {
1170+
val date = db.checkInQueries.selectById(this.id).executeAsOne().datetime
1171+
DateTime(date)
1172+
}
1173+
}
11631174
}

libpretixsync/src/main/java/eu/pretix/libpretixsync/sync/SyncManager.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
import eu.pretix.libpretixsync.SentryInterface;
1919
import eu.pretix.libpretixsync.config.ConfigStore;
2020
import eu.pretix.libpretixsync.db.Answer;
21-
import eu.pretix.libpretixsync.db.CheckIn;
2221
import eu.pretix.libpretixsync.db.Closing;
2322
import eu.pretix.libpretixsync.db.Order;
2423
import eu.pretix.libpretixsync.db.OrderPosition;
@@ -478,7 +477,7 @@ protected void downloadData(ProgressFeedback feedback, Boolean skip_orders, Stri
478477
configStore.setLastCleanup(System.currentTimeMillis());
479478
}
480479
} else if (profile == Profile.PRETIXSCAN_ONLINE && overrideEventSlug == null) {
481-
dataStore.delete(CheckIn.class).get().value();
480+
db.getCompatQueries().truncateCheckIn();
482481
dataStore.delete(OrderPosition.class).get().value();
483482
dataStore.delete(Order.class).get().value();
484483
dataStore.delete(ResourceSyncStatus.class).where(ResourceSyncStatus.RESOURCE.like("order%")).get().value();
@@ -491,7 +490,7 @@ protected void downloadData(ProgressFeedback feedback, Boolean skip_orders, Stri
491490

492491

493492
} catch (DeviceAccessRevokedException e) {
494-
dataStore.delete(CheckIn.class).get().value();
493+
db.getCompatQueries().truncateCheckIn();
495494
dataStore.delete(OrderPosition.class).get().value();
496495
dataStore.delete(Order.class).get().value();
497496
dataStore.delete(ReusableMedium.class).get().value();

libpretixsync/src/main/sqldelight/common/eu/pretix/libpretixsync/sqldelight/CheckIn.sq

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,20 @@ SELECT *
33
FROM CheckIn
44
WHERE id = ?;
55

6+
selectByPositionId:
7+
SELECT *
8+
FROM CheckIn
9+
WHERE position = :postion_id;
10+
11+
selectPositionIdByListIdAndType:
12+
SELECT position
13+
FROM CheckIn
14+
WHERE listId = :list_server_id AND type = :type;
15+
16+
count:
17+
SELECT COUNT(*)
18+
FROM CheckIn;
19+
620
deleteById:
721
DELETE FROM CheckIn WHERE id = ?;
822

@@ -54,3 +68,10 @@ WHERE position IN (
5468
WHERE orders.code IN :order_codes
5569
)
5670
);
71+
72+
-- for tests only:
73+
testCountByOrderPositionSecret:
74+
SELECT COUNT(*)
75+
FROM CheckIn
76+
LEFT JOIN OrderPosition ON CheckIn.position = OrderPosition.id
77+
WHERE OrderPosition.secret = :secret;

libpretixsync/src/main/sqldelight/postgres/eu/pretix/libpretixsync/sqldelight/compat.sq

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@ SELECT currval('question_id_seq') AS Long;
2525
getLastInsertedQuotaId:
2626
SELECT currval('quota_id_seq') AS Long;
2727

28+
truncateCheckIn:
29+
TRUNCATE CheckIn;
30+
2831
truncateAllTables:
2932
TRUNCATE
3033
BadgeLayout,

libpretixsync/src/main/sqldelight/sqlite/eu/pretix/libpretixsync/sqldelight/compat.sq

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@ SELECT last_insert_rowid();
2525
getLastInsertedQuotaId:
2626
SELECT last_insert_rowid();
2727

28+
truncateCheckIn:
29+
DELETE FROM CheckIn;
30+
2831
truncateAllTables {
2932
DELETE FROM BadgeLayout;
3033
DELETE FROM BadgeLayoutItem;

libpretixsync/src/test/java/eu/pretix/libpretixsync/check/AsyncCheckProviderTest.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,8 @@ class AsyncCheckProviderTest : BaseDatabaseTest() {
239239
r = p!!.check(mapOf("demo" to 2L), "kfndgffgyw4tdgcacx6bb3bgemq69cxj")
240240
assertEquals(TicketCheckProvider.CheckResult.Type.VALID, r.type)
241241
assertEquals(dataStore.count(QueuedCheckIn::class.java).get().value(), 2)
242-
assertEquals(dataStore.count(CheckIn::class.java).join(OrderPosition::class.java).on(OrderPosition.ID.eq(CheckIn.POSITION_ID)).where(OrderPosition.SECRET.eq("kfndgffgyw4tdgcacx6bb3bgemq69cxj")).get().value(), 3)
242+
assertEquals(db.checkInQueries.testCountByOrderPositionSecret("kfndgffgyw4tdgcacx6bb3bgemq69cxj").executeAsOne(), 3L)
243+
243244
}
244245

245246
@Test
@@ -608,7 +609,7 @@ class AsyncCheckProviderTest : BaseDatabaseTest() {
608609
r = p2.check(mapOf("demo" to 2L), "kfndgffgyw4tdgcacx6bb3bgemq69cxj")
609610
assertEquals(TicketCheckProvider.CheckResult.Type.VALID, r.type)
610611

611-
dataStore.delete(CheckIn::class.java).get().value()
612+
db.compatQueries.truncateCheckIn()
612613

613614
r = p2.check(mapOf("demo" to 2L), "kfndgffgyw4tdgcacx6bb3bgemq69cxj")
614615
assertEquals(TicketCheckProvider.CheckResult.Type.RULES, r.type)

libpretixsync/src/test/java/eu/pretix/libpretixsync/sync/OrderSyncTest.kt

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ class OrderSyncTest : BaseDatabaseTest() {
6363

6464
assertEquals(2, dataStore.count(Order::class.java).get().value())
6565
assertEquals(5, dataStore.count(OrderPosition::class.java).get().value())
66-
assertEquals(3, dataStore.count(CheckIn::class.java).get().value())
66+
assertEquals(3L, db.checkInQueries.count().executeAsOne())
6767
val rlm = dataStore.select(ResourceSyncStatus::class.java).where(ResourceSyncStatus.RESOURCE.eq("orders_withpdfdata")).get().first()
6868
assertEquals(rlm.getEvent_slug(), "demo")
6969
assertEquals(rlm.getLast_modified(), "timestamp1")
@@ -97,7 +97,7 @@ class OrderSyncTest : BaseDatabaseTest() {
9797

9898
assertEquals(2, dataStore.count(Order::class.java).get().value())
9999
assertEquals(5, dataStore.count(OrderPosition::class.java).get().value())
100-
assertEquals(3, dataStore.count(CheckIn::class.java).get().value())
100+
assertEquals(3L, db.checkInQueries.count().executeAsOne())
101101

102102
val rlm = dataStore.select(ResourceSyncStatus::class.java).where(ResourceSyncStatus.RESOURCE.eq("orders_withpdfdata")).get().first()
103103
assertEquals(rlm.getEvent_slug(), "demo")
@@ -138,7 +138,7 @@ class OrderSyncTest : BaseDatabaseTest() {
138138

139139
assertEquals(2, dataStore.count(Order::class.java).get().value())
140140
assertEquals(5, dataStore.count(OrderPosition::class.java).get().value())
141-
assertEquals(3, dataStore.count(CheckIn::class.java).get().value())
141+
assertEquals(3L, db.checkInQueries.count().executeAsOne())
142142

143143
val rlm = dataStore.select(ResourceSyncStatus::class.java).where(ResourceSyncStatus.RESOURCE.eq("orders_withpdfdata")).get().first()
144144
assertEquals(rlm.getEvent_slug(), "demo")
@@ -200,7 +200,7 @@ class OrderSyncTest : BaseDatabaseTest() {
200200

201201
assertEquals(2, dataStore.count(Order::class.java).get().value())
202202
assertEquals(5, dataStore.count(OrderPosition::class.java).get().value())
203-
assertEquals(3, dataStore.count(CheckIn::class.java).get().value())
203+
assertEquals(3L, db.checkInQueries.count().executeAsOne())
204204

205205
val rlm = dataStore.select(ResourceSyncStatus::class.java).where(ResourceSyncStatus.RESOURCE.eq("orders_withpdfdata")).get().first()
206206
assertEquals(rlm.getEvent_slug(), "demo")
@@ -274,7 +274,7 @@ class OrderSyncTest : BaseDatabaseTest() {
274274
osa.download()
275275
assertEquals(4, dataStore.count(Order::class.java).get().value())
276276
assertEquals(9, dataStore.count(OrderPosition::class.java).get().value())
277-
assertEquals(5, dataStore.count(CheckIn::class.java).get().value())
277+
assertEquals(5L, db.checkInQueries.count().executeAsOne())
278278

279279
fakeApi.fetchResponses.add {
280280
val respdata = JSONObject()
@@ -290,7 +290,7 @@ class OrderSyncTest : BaseDatabaseTest() {
290290
osa.download()
291291
assertEquals("http://1.1.1.1/api/v1/organizers/demo/events/demo/orders/?testmode=false&exclude=downloads&exclude=payment_date&exclude=payment_provider&exclude=fees&exclude=positions.downloads&exclude=payments&exclude=refunds&pdf_data=true&ordering=-last_modified&modified_since=timestamp1", fakeApi.lastRequestUrl)
292292
assertEquals(11, dataStore.count(OrderPosition::class.java).get().value())
293-
assertEquals(6, dataStore.count(CheckIn::class.java).get().value())
293+
assertEquals(6L, db.checkInQueries.count().executeAsOne())
294294
val rlm = dataStore.select(ResourceSyncStatus::class.java).where(ResourceSyncStatus.RESOURCE.eq("orders_withpdfdata")).get().first()
295295
assertEquals(rlm.getEvent_slug(), "demo")
296296
assertEquals(rlm.getLast_modified(), "timestamp2")
@@ -314,7 +314,7 @@ class OrderSyncTest : BaseDatabaseTest() {
314314

315315
osa.download()
316316
assertEquals(4, dataStore.count(Order::class.java).get().value())
317-
assertEquals(5, dataStore.count(CheckIn::class.java).get().value())
317+
assertEquals(5L, db.checkInQueries.count().executeAsOne())
318318

319319
fakeApi.fetchResponses.add {
320320
val respdata = JSONObject()
@@ -335,7 +335,7 @@ class OrderSyncTest : BaseDatabaseTest() {
335335

336336
assertEquals("%page2?testmode=false&exclude=downloads&exclude=payment_date&exclude=payment_provider&exclude=fees&exclude=positions.downloads&exclude=payments&exclude=refunds&pdf_data=true&ordering=-last_modified&modified_since=timestamp1", fakeApi.lastRequestUrl)
337337
assertEquals(4, dataStore.count(Order::class.java).get().value())
338-
assertEquals(6, dataStore.count(CheckIn::class.java).get().value())
338+
assertEquals(6L, db.checkInQueries.count().executeAsOne())
339339

340340
val rlm = dataStore.select(ResourceSyncStatus::class.java).where(ResourceSyncStatus.RESOURCE.eq("orders_withpdfdata")).get().first()
341341
assertEquals(rlm.getEvent_slug(), "demo")
@@ -356,7 +356,7 @@ class OrderSyncTest : BaseDatabaseTest() {
356356
osa.download()
357357
assertEquals("http://1.1.1.1/api/v1/organizers/demo/events/demo/orders/?testmode=false&exclude=downloads&exclude=payment_date&exclude=payment_provider&exclude=fees&exclude=positions.downloads&exclude=payments&exclude=refunds&pdf_data=true&ordering=-last_modified&modified_since=timestamp1", fakeApi.lastRequestUrl)
358358
assertEquals(11, dataStore.count(OrderPosition::class.java).get().value())
359-
assertEquals(6, dataStore.count(CheckIn::class.java).get().value())
359+
assertEquals(6L, db.checkInQueries.count().executeAsOne())
360360
val rlm2 = dataStore.select(ResourceSyncStatus::class.java).where(ResourceSyncStatus.RESOURCE.eq("orders_withpdfdata")).get().first()
361361
assertEquals(rlm2.getEvent_slug(), "demo")
362362
assertEquals(rlm2.getLast_modified(), "timestamp2")

0 commit comments

Comments
 (0)