From d7326cdffe007d1db2d2b34360354094133a681a Mon Sep 17 00:00:00 2001 From: Maximilian Stiede Date: Thu, 12 Mar 2020 20:18:09 +0100 Subject: [PATCH 01/13] change(service-food-crawler): move package into service-food --- service-food-crawler/build.gradle | 31 ------------------- service-food/build.gradle | 10 ++++++ .../kotlin/de/hpi/cloud/food/crawler/Main.kt | 0 .../cloud/food/crawler/OpenMensaCrawler.kt | 0 .../hpi/cloud/food/crawler/OpenMensaTypes.kt | 0 .../food/crawler/canteens/Griebnitzsee.kt | 0 .../de/hpi/cloud/food/crawler/canteens/Ulf.kt | 0 .../hpi/cloud/food/crawler/utils/UrlUtils.kt | 0 8 files changed, 10 insertions(+), 31 deletions(-) delete mode 100644 service-food-crawler/build.gradle rename {service-food-crawler => service-food}/src/main/kotlin/de/hpi/cloud/food/crawler/Main.kt (100%) rename {service-food-crawler => service-food}/src/main/kotlin/de/hpi/cloud/food/crawler/OpenMensaCrawler.kt (100%) rename {service-food-crawler => service-food}/src/main/kotlin/de/hpi/cloud/food/crawler/OpenMensaTypes.kt (100%) rename {service-food-crawler => service-food}/src/main/kotlin/de/hpi/cloud/food/crawler/canteens/Griebnitzsee.kt (100%) rename {service-food-crawler => service-food}/src/main/kotlin/de/hpi/cloud/food/crawler/canteens/Ulf.kt (100%) rename {service-food-crawler => service-food}/src/main/kotlin/de/hpi/cloud/food/crawler/utils/UrlUtils.kt (100%) diff --git a/service-food-crawler/build.gradle b/service-food-crawler/build.gradle deleted file mode 100644 index 2b8241c..0000000 --- a/service-food-crawler/build.gradle +++ /dev/null @@ -1,31 +0,0 @@ -buildscript { - repositories { - mavenCentral() - } - dependencies { - classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.40") - classpath("com.github.jengelman.gradle.plugins:shadow:5.1.0") - } -} - -plugins { - id "kotlin" - id "application" - id "com.github.johnrengelman.shadow" version "5.1.0" -} - -repositories { - jcenter() - maven { url "https://dl.bintray.com/hpi/hpi-cloud-mvn" } -} - -dependencies { - implementation(project(":common")) - - // Crawling - implementation("com.beust:klaxon:5.0.11") -} - -application { - mainClassName = "de.hpi.cloud.food.crawler.MainKt" -} diff --git a/service-food/build.gradle b/service-food/build.gradle index a47aba3..d856476 100644 --- a/service-food/build.gradle +++ b/service-food/build.gradle @@ -14,10 +14,20 @@ plugins { id "com.github.johnrengelman.shadow" version "5.1.0" } +repositories { + jcenter() + maven { url "https://dl.bintray.com/hpi/hpi-cloud-mvn" } +} + dependencies { implementation(project(":common")) + + // Crawling + implementation("com.beust:klaxon:5.0.11") } application { + // mainClassName = "de.hpi.cloud.food.crawler.MainKt" + mainClassName = "de.hpi.cloud.food.FoodServiceKt" } diff --git a/service-food-crawler/src/main/kotlin/de/hpi/cloud/food/crawler/Main.kt b/service-food/src/main/kotlin/de/hpi/cloud/food/crawler/Main.kt similarity index 100% rename from service-food-crawler/src/main/kotlin/de/hpi/cloud/food/crawler/Main.kt rename to service-food/src/main/kotlin/de/hpi/cloud/food/crawler/Main.kt diff --git a/service-food-crawler/src/main/kotlin/de/hpi/cloud/food/crawler/OpenMensaCrawler.kt b/service-food/src/main/kotlin/de/hpi/cloud/food/crawler/OpenMensaCrawler.kt similarity index 100% rename from service-food-crawler/src/main/kotlin/de/hpi/cloud/food/crawler/OpenMensaCrawler.kt rename to service-food/src/main/kotlin/de/hpi/cloud/food/crawler/OpenMensaCrawler.kt diff --git a/service-food-crawler/src/main/kotlin/de/hpi/cloud/food/crawler/OpenMensaTypes.kt b/service-food/src/main/kotlin/de/hpi/cloud/food/crawler/OpenMensaTypes.kt similarity index 100% rename from service-food-crawler/src/main/kotlin/de/hpi/cloud/food/crawler/OpenMensaTypes.kt rename to service-food/src/main/kotlin/de/hpi/cloud/food/crawler/OpenMensaTypes.kt diff --git a/service-food-crawler/src/main/kotlin/de/hpi/cloud/food/crawler/canteens/Griebnitzsee.kt b/service-food/src/main/kotlin/de/hpi/cloud/food/crawler/canteens/Griebnitzsee.kt similarity index 100% rename from service-food-crawler/src/main/kotlin/de/hpi/cloud/food/crawler/canteens/Griebnitzsee.kt rename to service-food/src/main/kotlin/de/hpi/cloud/food/crawler/canteens/Griebnitzsee.kt diff --git a/service-food-crawler/src/main/kotlin/de/hpi/cloud/food/crawler/canteens/Ulf.kt b/service-food/src/main/kotlin/de/hpi/cloud/food/crawler/canteens/Ulf.kt similarity index 100% rename from service-food-crawler/src/main/kotlin/de/hpi/cloud/food/crawler/canteens/Ulf.kt rename to service-food/src/main/kotlin/de/hpi/cloud/food/crawler/canteens/Ulf.kt diff --git a/service-food-crawler/src/main/kotlin/de/hpi/cloud/food/crawler/utils/UrlUtils.kt b/service-food/src/main/kotlin/de/hpi/cloud/food/crawler/utils/UrlUtils.kt similarity index 100% rename from service-food-crawler/src/main/kotlin/de/hpi/cloud/food/crawler/utils/UrlUtils.kt rename to service-food/src/main/kotlin/de/hpi/cloud/food/crawler/utils/UrlUtils.kt From 3be6644dd952499224728a942fb4703ed8237a51 Mon Sep 17 00:00:00 2001 From: Maximilian Stiede Date: Thu, 12 Mar 2020 20:43:47 +0100 Subject: [PATCH 02/13] feat(service-food): add entities --- .../de/hpi/cloud/food/entities/Counter.kt | 39 +++++++++++ .../de/hpi/cloud/food/entities/MenuItem.kt | 64 +++++++++++++++++++ .../de/hpi/cloud/food/entities/Restaurant.kt | 32 ++++++++++ 3 files changed, 135 insertions(+) create mode 100644 service-food/src/main/kotlin/de/hpi/cloud/food/entities/Counter.kt create mode 100644 service-food/src/main/kotlin/de/hpi/cloud/food/entities/MenuItem.kt create mode 100644 service-food/src/main/kotlin/de/hpi/cloud/food/entities/Restaurant.kt diff --git a/service-food/src/main/kotlin/de/hpi/cloud/food/entities/Counter.kt b/service-food/src/main/kotlin/de/hpi/cloud/food/entities/Counter.kt new file mode 100644 index 0000000..8cb76ab --- /dev/null +++ b/service-food/src/main/kotlin/de/hpi/cloud/food/entities/Counter.kt @@ -0,0 +1,39 @@ +package de.hpi.cloud.food.entities + +import de.hpi.cloud.common.Context +import de.hpi.cloud.common.entity.Entity +import de.hpi.cloud.common.entity.Id +import de.hpi.cloud.common.entity.Wrapper +import de.hpi.cloud.common.protobuf.builder +import de.hpi.cloud.common.serializers.json.UrlSerializer +import de.hpi.cloud.common.types.L10n +import kotlinx.serialization.Serializable +import java.net.URL +import de.hpi.cloud.food.v1test.Counter as ProtoCounter + +@Serializable +data class Counter( + val restaurantId: Id, + val title: L10n, + val iconUrl: @Serializable(UrlSerializer::class) URL +) : Entity() { + companion object : Entity.Companion("counter") + + object ProtoSerializer : Entity.ProtoSerializer() { + override fun fromProto(proto: ProtoCounter, context: Context): Counter = + throw UnsupportedOperationException("Counter cannot be created via protobuf") + + override fun toProtoBuilder(entity: Counter, context: Context): ProtoCounter.Builder = + ProtoCounter.newBuilder().builder(entity) { + restaurantId = it.restaurantId.value + title = it.title[context] + icon = it.iconUrl.toString() + } + } +} + +fun ProtoCounter.parse(context: Context): Counter = + Counter.ProtoSerializer.fromProto(this, context) + +fun Wrapper.toProto(context: Context): ProtoCounter = + Counter.ProtoSerializer.toProto(this, context) diff --git a/service-food/src/main/kotlin/de/hpi/cloud/food/entities/MenuItem.kt b/service-food/src/main/kotlin/de/hpi/cloud/food/entities/MenuItem.kt new file mode 100644 index 0000000..31391b4 --- /dev/null +++ b/service-food/src/main/kotlin/de/hpi/cloud/food/entities/MenuItem.kt @@ -0,0 +1,64 @@ +package de.hpi.cloud.food.entities + +import de.hpi.cloud.common.Context +import de.hpi.cloud.common.entity.Entity +import de.hpi.cloud.common.entity.Id +import de.hpi.cloud.common.entity.Wrapper +import de.hpi.cloud.common.entity.asId +import de.hpi.cloud.common.protobuf.builder +import de.hpi.cloud.common.protobuf.toLocalDate +import de.hpi.cloud.common.protobuf.toProtoDate +import de.hpi.cloud.common.serializers.json.LocalDateSerializer +import de.hpi.cloud.common.serializers.proto.parse +import de.hpi.cloud.common.serializers.proto.toProto +import de.hpi.cloud.common.types.L10n +import de.hpi.cloud.common.types.Money +import de.hpi.cloud.common.types.l10n +import kotlinx.serialization.Serializable +import java.time.LocalDate +import de.hpi.cloud.food.v1test.MenuItem as ProtoMenuItem + +@Serializable +data class MenuItem( + val openMensaId: String?, + val date: @Serializable(LocalDateSerializer::class) LocalDate, + val restaurantId: Id, + val offerTitle: L10n, + val title: L10n, + val counterId: Id, + val labelIds: List>, + val prices: Map +) : Entity() { + companion object : Entity.Companion("menuItem") + + object ProtoSerializer : Entity.ProtoSerializer() { + override fun fromProto(proto: ProtoMenuItem, context: Context): MenuItem = + MenuItem( + openMensaId = null, + date = proto.date.toLocalDate(), + restaurantId = proto.restaurantId.asId(), + offerTitle = proto.offerTitle.l10n(context), + title = proto.title.l10n(context), + counterId = proto.counterId.asId(), + labelIds = proto.labelIdsList.map { it.asId() }, + prices = proto.pricesMap.mapValues { (_, money) -> money.parse(context) } + ) + + override fun toProtoBuilder(entity: MenuItem, context: Context): ProtoMenuItem.Builder = + ProtoMenuItem.newBuilder().builder(entity) { + date = it.date.toProtoDate() + restaurantId = it.restaurantId.value + offerTitle = it.offerTitle[context] + title = it.title[context] + counterId = it.counterId.value + addAllLabelIds(it.labelIds.map { l -> l.value }) + putAllPrices(it.prices.mapValues { (_, money) -> money.toProto(context) }) + } + } +} + +fun ProtoMenuItem.parse(context: Context): MenuItem = + MenuItem.ProtoSerializer.fromProto(this, context) + +fun Wrapper.toProto(context: Context): ProtoMenuItem = + MenuItem.ProtoSerializer.toProto(this, context) diff --git a/service-food/src/main/kotlin/de/hpi/cloud/food/entities/Restaurant.kt b/service-food/src/main/kotlin/de/hpi/cloud/food/entities/Restaurant.kt new file mode 100644 index 0000000..b3ef165 --- /dev/null +++ b/service-food/src/main/kotlin/de/hpi/cloud/food/entities/Restaurant.kt @@ -0,0 +1,32 @@ +package de.hpi.cloud.food.entities + +import de.hpi.cloud.common.Context +import de.hpi.cloud.common.entity.Entity +import de.hpi.cloud.common.entity.Wrapper +import de.hpi.cloud.common.protobuf.builder +import de.hpi.cloud.common.types.L10n +import kotlinx.serialization.Serializable +import de.hpi.cloud.food.v1test.Restaurant as ProtoRestaurant + +@Serializable +data class Restaurant( + val title: L10n +) : Entity() { + companion object : Entity.Companion("restaurant") + + object ProtoSerializer : Entity.ProtoSerializer() { + override fun fromProto(proto: ProtoRestaurant, context: Context): Restaurant = + throw UnsupportedOperationException("Restaurants cannot be created via protobuf") + + override fun toProtoBuilder(entity: Restaurant, context: Context): ProtoRestaurant.Builder = + ProtoRestaurant.newBuilder().builder(entity) { + title = it.title[context] + } + } +} + +fun ProtoRestaurant.parse(context: Context): Restaurant = + Restaurant.ProtoSerializer.fromProto(this, context) + +fun Wrapper.toProto(context: Context): ProtoRestaurant = + Restaurant.ProtoSerializer.toProto(this, context) From 46fc30148bf6787490102ec3060402afaa0f7b23 Mon Sep 17 00:00:00 2001 From: Maximilian Stiede Date: Thu, 30 Apr 2020 19:08:23 +0200 Subject: [PATCH 03/13] build(service-food): update dependencies --- common/build.gradle | 2 +- service-food/build.gradle | 10 +++++++--- settings.gradle | 2 +- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/common/build.gradle b/common/build.gradle index dc4bfa6..669a586 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -13,7 +13,7 @@ dependencies { // API api("com.google.protobuf:protobuf-java:3.6.1") api("io.grpc:grpc-stub:1.18.0") - api("de.hpi.cloud:hpi-cloud:0.0.13") + api("de.hpi.cloud:hpi-cloud:0.0.14") // Storage api("com.couchbase.client:java-client:2.7.9") diff --git a/service-food/build.gradle b/service-food/build.gradle index d856476..3ac5158 100644 --- a/service-food/build.gradle +++ b/service-food/build.gradle @@ -3,16 +3,16 @@ buildscript { mavenCentral() } dependencies { - classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.40") - classpath("com.github.jengelman.gradle.plugins:shadow:5.1.0") + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } - plugins { id "kotlin" id "application" id "com.github.johnrengelman.shadow" version "5.1.0" } +apply plugin: 'kotlinx-serialization' +apply plugin: 'kotlin' repositories { jcenter() @@ -24,6 +24,7 @@ dependencies { // Crawling implementation("com.beust:klaxon:5.0.11") + implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" } application { @@ -31,3 +32,6 @@ application { mainClassName = "de.hpi.cloud.food.FoodServiceKt" } +repositories { + mavenCentral() +} diff --git a/settings.gradle b/settings.gradle index b20b7fc..1e79c48 100644 --- a/settings.gradle +++ b/settings.gradle @@ -4,7 +4,7 @@ include 'service-club' include 'service-course', 'service-course-crawler' include 'service-crashreporting' include 'service-feedback' -include 'service-food', 'service-food-crawler' +include 'service-food' include 'service-myhpi' include 'service-news' include 'service-runner' From 6dfd27f417c238b370ee65dcf039497f654787b2 Mon Sep 17 00:00:00 2001 From: Maximilian Stiede Date: Thu, 30 Apr 2020 19:08:55 +0200 Subject: [PATCH 04/13] feat(service-food): add label entity --- .../de/hpi/cloud/food/entities/Label.kt | 43 ++++++++++ .../de/hpi/cloud/food/fixtures/Labels.kt | 81 +++++++++++++++++++ 2 files changed, 124 insertions(+) create mode 100644 service-food/src/main/kotlin/de/hpi/cloud/food/entities/Label.kt create mode 100644 service-food/src/main/kotlin/de/hpi/cloud/food/fixtures/Labels.kt diff --git a/service-food/src/main/kotlin/de/hpi/cloud/food/entities/Label.kt b/service-food/src/main/kotlin/de/hpi/cloud/food/entities/Label.kt new file mode 100644 index 0000000..e7dc100 --- /dev/null +++ b/service-food/src/main/kotlin/de/hpi/cloud/food/entities/Label.kt @@ -0,0 +1,43 @@ +package de.hpi.cloud.food.entities + +import de.hpi.cloud.common.Context +import de.hpi.cloud.common.entity.Entity +import de.hpi.cloud.common.entity.Id +import de.hpi.cloud.common.entity.Wrapper +import de.hpi.cloud.common.entity.asId +import de.hpi.cloud.common.protobuf.builder +import de.hpi.cloud.common.serializers.json.UrlSerializer +import de.hpi.cloud.common.types.L10n +import de.hpi.cloud.common.utils.contains +import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient +import java.net.URL +import java.util.Locale.GERMAN +import de.hpi.cloud.food.v1test.Label as ProtoLabel + +@Serializable +data class Label( + val title: L10n, + val iconUrl: @Serializable(UrlSerializer::class) URL, + val aliases: Set +) : Entity