suspend fun upsert(googleId: String, name: String, emailAddress: String) = connection.query { transaction(readOnly = false) { val existingUser = Users.selectAll().where { Users.googleUserId eq googleId }.limit(1).singleOrNull() ?.let { User.fromRow(it) } if (existingUser != null) { if (existingUser.emailAddress == emailAddress && existingUser.name == name) { return@transaction existingUser } return@transaction Users.updateReturning(where = { Users.id eq existingUser.id }) { it[Users.updatedAt] = clock.now().toLocalDateTime(TimeZone.UTC) it[Users.name] = name it[Users.emailAddress] = emailAddress }.single().let(User::fromRow) } Users.insertReturning { it[Users.createdAt] = clock.now().toLocalDateTime(TimeZone.UTC) it[Users.updatedAt] = clock.now().toLocalDateTime(TimeZone.UTC) it[Users.name] = name it[Users.emailAddress] = emailAddress it[Users.googleUserId] = googleId }.single().let(User::fromRow) } }