From 4826478a2a28d2ea93f72a323c2a3c50cb732c9a Mon Sep 17 00:00:00 2001 From: Kirill Kamakin Date: Mon, 28 Nov 2022 21:22:24 +0100 Subject: [PATCH] Implement saving recipes by URLs --- app/src/main/AndroidManifest.xml | 17 ++++++- .../data/network/MealieDataSourceWrapper.kt | 24 +++++++++- .../data/share/ParseRecipeDataSource.kt | 6 +++ .../mealient/data/share/ParseRecipeURLInfo.kt | 6 +++ .../mealient/data/share/ShareRecipeRepo.kt | 6 +++ .../data/share/ShareRecipeRepoImpl.kt | 18 +++++++ .../kirmanak/mealient/di/ShareRecipeModule.kt | 24 ++++++++++ .../mealient/extensions/ModelMappings.kt | 35 ++++++++++++-- .../mealient/ui/share/ShareRecipeActivity.kt | 48 +++++++++++++++++++ .../mealient/ui/share/ShareRecipeViewModel.kt | 37 ++++++++++++++ app/src/main/res/values-ru/strings.xml | 2 + app/src/main/res/values/strings.xml | 2 + .../datasource/v0/MealieDataSourceV0.kt | 7 +++ .../datasource/v0/MealieDataSourceV0Impl.kt | 18 ++++++- .../mealient/datasource/v0/MealieServiceV0.kt | 7 +++ .../v0/models/ParseRecipeURLRequestV0.kt | 9 ++++ .../datasource/v1/MealieDataSourceV1.kt | 13 ++++- .../datasource/v1/MealieDataSourceV1Impl.kt | 19 +++++++- .../mealient/datasource/v1/MealieServiceV1.kt | 7 +++ .../v1/models/ParseRecipeURLRequestV1.kt | 10 ++++ 20 files changed, 305 insertions(+), 10 deletions(-) create mode 100644 app/src/main/java/gq/kirmanak/mealient/data/share/ParseRecipeDataSource.kt create mode 100644 app/src/main/java/gq/kirmanak/mealient/data/share/ParseRecipeURLInfo.kt create mode 100644 app/src/main/java/gq/kirmanak/mealient/data/share/ShareRecipeRepo.kt create mode 100644 app/src/main/java/gq/kirmanak/mealient/data/share/ShareRecipeRepoImpl.kt create mode 100644 app/src/main/java/gq/kirmanak/mealient/di/ShareRecipeModule.kt create mode 100644 app/src/main/java/gq/kirmanak/mealient/ui/share/ShareRecipeActivity.kt create mode 100644 app/src/main/java/gq/kirmanak/mealient/ui/share/ShareRecipeViewModel.kt create mode 100644 datasource/src/main/kotlin/gq/kirmanak/mealient/datasource/v0/models/ParseRecipeURLRequestV0.kt create mode 100644 datasource/src/main/kotlin/gq/kirmanak/mealient/datasource/v1/models/ParseRecipeURLRequestV1.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b4d3649..d1dfc1e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -19,14 +19,27 @@ tools:ignore="UnusedAttribute"> + android:exported="true" + android:windowSoftInputMode="adjustPan"> + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/gq/kirmanak/mealient/data/network/MealieDataSourceWrapper.kt b/app/src/main/java/gq/kirmanak/mealient/data/network/MealieDataSourceWrapper.kt index 4f451fc..f830766 100644 --- a/app/src/main/java/gq/kirmanak/mealient/data/network/MealieDataSourceWrapper.kt +++ b/app/src/main/java/gq/kirmanak/mealient/data/network/MealieDataSourceWrapper.kt @@ -8,11 +8,18 @@ import gq.kirmanak.mealient.data.baseurl.ServerVersion import gq.kirmanak.mealient.data.recipes.network.FullRecipeInfo import gq.kirmanak.mealient.data.recipes.network.RecipeDataSource import gq.kirmanak.mealient.data.recipes.network.RecipeSummaryInfo +import gq.kirmanak.mealient.data.share.ParseRecipeDataSource +import gq.kirmanak.mealient.data.share.ParseRecipeURLInfo import gq.kirmanak.mealient.datasource.NetworkError import gq.kirmanak.mealient.datasource.runCatchingExceptCancel import gq.kirmanak.mealient.datasource.v0.MealieDataSourceV0 import gq.kirmanak.mealient.datasource.v1.MealieDataSourceV1 -import gq.kirmanak.mealient.extensions.* +import gq.kirmanak.mealient.extensions.toFullRecipeInfo +import gq.kirmanak.mealient.extensions.toRecipeSummaryInfo +import gq.kirmanak.mealient.extensions.toV0Request +import gq.kirmanak.mealient.extensions.toV1CreateRequest +import gq.kirmanak.mealient.extensions.toV1Request +import gq.kirmanak.mealient.extensions.toV1UpdateRequest import gq.kirmanak.mealient.logging.Logger import javax.inject.Inject import javax.inject.Singleton @@ -24,7 +31,7 @@ class MealieDataSourceWrapper @Inject constructor( private val v0Source: MealieDataSourceV0, private val v1Source: MealieDataSourceV1, private val logger: Logger, -) : AddRecipeDataSource, RecipeDataSource { +) : AddRecipeDataSource, RecipeDataSource, ParseRecipeDataSource { override suspend fun addRecipe( recipe: AddRecipeInfo, @@ -64,6 +71,19 @@ class MealieDataSourceWrapper @Inject constructor( } } + override suspend fun parseRecipeFromURL( + parseRecipeURLInfo: ParseRecipeURLInfo, + ): String = makeCall { token, url, version -> + when (version) { + ServerVersion.V0 -> { + v0Source.parseRecipeFromURL(url, token, parseRecipeURLInfo.toV0Request()) + } + ServerVersion.V1 -> { + v1Source.parseRecipeFromURL(url, token, parseRecipeURLInfo.toV1Request()) + } + } + } + private suspend inline fun makeCall(block: (String?, String, ServerVersion) -> T): T { val authHeader = authRepo.getAuthHeader() val url = serverInfoRepo.requireUrl() diff --git a/app/src/main/java/gq/kirmanak/mealient/data/share/ParseRecipeDataSource.kt b/app/src/main/java/gq/kirmanak/mealient/data/share/ParseRecipeDataSource.kt new file mode 100644 index 0000000..27c3def --- /dev/null +++ b/app/src/main/java/gq/kirmanak/mealient/data/share/ParseRecipeDataSource.kt @@ -0,0 +1,6 @@ +package gq.kirmanak.mealient.data.share + +interface ParseRecipeDataSource { + + suspend fun parseRecipeFromURL(parseRecipeURLInfo: ParseRecipeURLInfo): String +} \ No newline at end of file diff --git a/app/src/main/java/gq/kirmanak/mealient/data/share/ParseRecipeURLInfo.kt b/app/src/main/java/gq/kirmanak/mealient/data/share/ParseRecipeURLInfo.kt new file mode 100644 index 0000000..7866216 --- /dev/null +++ b/app/src/main/java/gq/kirmanak/mealient/data/share/ParseRecipeURLInfo.kt @@ -0,0 +1,6 @@ +package gq.kirmanak.mealient.data.share + +data class ParseRecipeURLInfo( + val url: String, + val includeTags: Boolean +) diff --git a/app/src/main/java/gq/kirmanak/mealient/data/share/ShareRecipeRepo.kt b/app/src/main/java/gq/kirmanak/mealient/data/share/ShareRecipeRepo.kt new file mode 100644 index 0000000..4475f28 --- /dev/null +++ b/app/src/main/java/gq/kirmanak/mealient/data/share/ShareRecipeRepo.kt @@ -0,0 +1,6 @@ +package gq.kirmanak.mealient.data.share + +interface ShareRecipeRepo { + + suspend fun saveRecipeByURL(url: CharSequence): String +} \ No newline at end of file diff --git a/app/src/main/java/gq/kirmanak/mealient/data/share/ShareRecipeRepoImpl.kt b/app/src/main/java/gq/kirmanak/mealient/data/share/ShareRecipeRepoImpl.kt new file mode 100644 index 0000000..e040d25 --- /dev/null +++ b/app/src/main/java/gq/kirmanak/mealient/data/share/ShareRecipeRepoImpl.kt @@ -0,0 +1,18 @@ +package gq.kirmanak.mealient.data.share + +import gq.kirmanak.mealient.logging.Logger +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class ShareRecipeRepoImpl @Inject constructor( + private val logger: Logger, + private val parseRecipeDataSource: ParseRecipeDataSource, +) : ShareRecipeRepo { + + override suspend fun saveRecipeByURL(url: CharSequence): String { + logger.v { "saveRecipeByURL() called with: url = $url" } + val request = ParseRecipeURLInfo(url = url.toString(), includeTags = true) + return parseRecipeDataSource.parseRecipeFromURL(request) + } +} \ No newline at end of file diff --git a/app/src/main/java/gq/kirmanak/mealient/di/ShareRecipeModule.kt b/app/src/main/java/gq/kirmanak/mealient/di/ShareRecipeModule.kt new file mode 100644 index 0000000..7c7ace6 --- /dev/null +++ b/app/src/main/java/gq/kirmanak/mealient/di/ShareRecipeModule.kt @@ -0,0 +1,24 @@ +package gq.kirmanak.mealient.di + +import dagger.Binds +import dagger.Module +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import gq.kirmanak.mealient.data.network.MealieDataSourceWrapper +import gq.kirmanak.mealient.data.share.ParseRecipeDataSource +import gq.kirmanak.mealient.data.share.ShareRecipeRepo +import gq.kirmanak.mealient.data.share.ShareRecipeRepoImpl +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +interface ShareRecipeModule { + + @Binds + @Singleton + fun bindShareRecipeRepo(shareRecipeRepoImpl: ShareRecipeRepoImpl): ShareRecipeRepo + + @Binds + @Singleton + fun bindParseRecipeDataSource(mealieDataSourceWrapper: MealieDataSourceWrapper): ParseRecipeDataSource +} \ No newline at end of file diff --git a/app/src/main/java/gq/kirmanak/mealient/extensions/ModelMappings.kt b/app/src/main/java/gq/kirmanak/mealient/extensions/ModelMappings.kt index 1ae6168..cf6e27c 100644 --- a/app/src/main/java/gq/kirmanak/mealient/extensions/ModelMappings.kt +++ b/app/src/main/java/gq/kirmanak/mealient/extensions/ModelMappings.kt @@ -9,12 +9,32 @@ import gq.kirmanak.mealient.data.recipes.network.FullRecipeInfo import gq.kirmanak.mealient.data.recipes.network.RecipeIngredientInfo import gq.kirmanak.mealient.data.recipes.network.RecipeInstructionInfo import gq.kirmanak.mealient.data.recipes.network.RecipeSummaryInfo +import gq.kirmanak.mealient.data.share.ParseRecipeURLInfo import gq.kirmanak.mealient.database.recipe.entity.RecipeEntity import gq.kirmanak.mealient.database.recipe.entity.RecipeIngredientEntity import gq.kirmanak.mealient.database.recipe.entity.RecipeInstructionEntity import gq.kirmanak.mealient.database.recipe.entity.RecipeSummaryEntity -import gq.kirmanak.mealient.datasource.v0.models.* -import gq.kirmanak.mealient.datasource.v1.models.* +import gq.kirmanak.mealient.datasource.v0.models.AddRecipeIngredientV0 +import gq.kirmanak.mealient.datasource.v0.models.AddRecipeInstructionV0 +import gq.kirmanak.mealient.datasource.v0.models.AddRecipeRequestV0 +import gq.kirmanak.mealient.datasource.v0.models.AddRecipeSettingsV0 +import gq.kirmanak.mealient.datasource.v0.models.GetRecipeIngredientResponseV0 +import gq.kirmanak.mealient.datasource.v0.models.GetRecipeInstructionResponseV0 +import gq.kirmanak.mealient.datasource.v0.models.GetRecipeResponseV0 +import gq.kirmanak.mealient.datasource.v0.models.GetRecipeSummaryResponseV0 +import gq.kirmanak.mealient.datasource.v0.models.ParseRecipeURLRequestV0 +import gq.kirmanak.mealient.datasource.v0.models.VersionResponseV0 +import gq.kirmanak.mealient.datasource.v1.models.AddRecipeIngredientV1 +import gq.kirmanak.mealient.datasource.v1.models.AddRecipeInstructionV1 +import gq.kirmanak.mealient.datasource.v1.models.AddRecipeSettingsV1 +import gq.kirmanak.mealient.datasource.v1.models.CreateRecipeRequestV1 +import gq.kirmanak.mealient.datasource.v1.models.GetRecipeIngredientResponseV1 +import gq.kirmanak.mealient.datasource.v1.models.GetRecipeInstructionResponseV1 +import gq.kirmanak.mealient.datasource.v1.models.GetRecipeResponseV1 +import gq.kirmanak.mealient.datasource.v1.models.GetRecipeSummaryResponseV1 +import gq.kirmanak.mealient.datasource.v1.models.ParseRecipeURLRequestV1 +import gq.kirmanak.mealient.datasource.v1.models.UpdateRecipeRequestV1 +import gq.kirmanak.mealient.datasource.v1.models.VersionResponseV1 import gq.kirmanak.mealient.datastore.recipe.AddRecipeDraft import java.util.* @@ -170,4 +190,13 @@ private fun AddRecipeInstructionInfo.toV1Instruction() = AddRecipeInstructionV1( id = UUID.randomUUID().toString(), text = text, ingredientReferences = emptyList(), -) \ No newline at end of file +) + +fun ParseRecipeURLInfo.toV1Request() = ParseRecipeURLRequestV1( + url = url, + includeTags = includeTags, +) + +fun ParseRecipeURLInfo.toV0Request() = ParseRecipeURLRequestV0( + url = url, +) diff --git a/app/src/main/java/gq/kirmanak/mealient/ui/share/ShareRecipeActivity.kt b/app/src/main/java/gq/kirmanak/mealient/ui/share/ShareRecipeActivity.kt new file mode 100644 index 0000000..437dd30 --- /dev/null +++ b/app/src/main/java/gq/kirmanak/mealient/ui/share/ShareRecipeActivity.kt @@ -0,0 +1,48 @@ +package gq.kirmanak.mealient.ui.share + +import android.content.Intent +import android.os.Bundle +import androidx.activity.viewModels +import androidx.appcompat.app.AppCompatActivity +import dagger.hilt.android.AndroidEntryPoint +import gq.kirmanak.mealient.R +import gq.kirmanak.mealient.extensions.showLongToast +import gq.kirmanak.mealient.logging.Logger +import javax.inject.Inject + +@AndroidEntryPoint +class ShareRecipeActivity : AppCompatActivity() { + + private val viewModel: ShareRecipeViewModel by viewModels() + + @Inject + lateinit var logger: Logger + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + logger.v { "onCreate() called with: savedInstanceState = $savedInstanceState" } + + if (intent.action != Intent.ACTION_SEND || intent.type != "text/plain") { + logger.w { "onCreate: intent.action = ${intent.action}, intent.type = ${intent.type}" } + finish() + return + } + + val url: CharSequence? = intent.getCharSequenceExtra(Intent.EXTRA_TEXT) + if (url == null) { + logger.w { "onCreate: Intent's EXTRA_TEXT was null" } + finish() + return + } + + viewModel.saveOperationResult.observe(this) { + showLongToast( + if (it.isSuccess) R.string.activity_share_recipe_success_toast + else R.string.activity_share_recipe_failure_toast + ) + finish() + } + + viewModel.saveRecipeByURL(url) + } +} \ No newline at end of file diff --git a/app/src/main/java/gq/kirmanak/mealient/ui/share/ShareRecipeViewModel.kt b/app/src/main/java/gq/kirmanak/mealient/ui/share/ShareRecipeViewModel.kt new file mode 100644 index 0000000..b82569d --- /dev/null +++ b/app/src/main/java/gq/kirmanak/mealient/ui/share/ShareRecipeViewModel.kt @@ -0,0 +1,37 @@ +package gq.kirmanak.mealient.ui.share + +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import dagger.hilt.android.lifecycle.HiltViewModel +import gq.kirmanak.mealient.data.share.ShareRecipeRepo +import gq.kirmanak.mealient.datasource.runCatchingExceptCancel +import gq.kirmanak.mealient.logging.Logger +import kotlinx.coroutines.launch +import javax.inject.Inject + +@HiltViewModel +class ShareRecipeViewModel @Inject constructor( + private val shareRecipeRepo: ShareRecipeRepo, + private val logger: Logger, +) : ViewModel() { + + private val _saveOperationResult = MutableLiveData>() + val saveOperationResult: LiveData> get() = _saveOperationResult + + fun saveRecipeByURL(url: CharSequence) { + logger.v { "saveRecipeByURL() called with: url = $url" } + viewModelScope.launch { + runCatchingExceptCancel { + shareRecipeRepo.saveRecipeByURL(url) + }.onSuccess { + logger.d { "Successfully saved recipe by URL" } + _saveOperationResult.postValue(Result.success(it)) + }.onFailure { + logger.e(it) { "Can't save recipe by URL" } + _saveOperationResult.postValue(Result.failure(it)) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index eb4ec6a..9ea13b7 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -51,4 +51,6 @@ Найти рецепты Открыть меню навигации Нет рецептов + Рецепт успешно сохранен. + Что-то пошло не так. \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f14a3ab..abdee58 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -54,4 +54,6 @@ @string/app_name Open navigation drawer No recipes + Recipe saved successfully. + Something went wrong. \ No newline at end of file diff --git a/datasource/src/main/kotlin/gq/kirmanak/mealient/datasource/v0/MealieDataSourceV0.kt b/datasource/src/main/kotlin/gq/kirmanak/mealient/datasource/v0/MealieDataSourceV0.kt index a51d5a7..79e3263 100644 --- a/datasource/src/main/kotlin/gq/kirmanak/mealient/datasource/v0/MealieDataSourceV0.kt +++ b/datasource/src/main/kotlin/gq/kirmanak/mealient/datasource/v0/MealieDataSourceV0.kt @@ -3,6 +3,7 @@ package gq.kirmanak.mealient.datasource.v0 import gq.kirmanak.mealient.datasource.v0.models.AddRecipeRequestV0 import gq.kirmanak.mealient.datasource.v0.models.GetRecipeResponseV0 import gq.kirmanak.mealient.datasource.v0.models.GetRecipeSummaryResponseV0 +import gq.kirmanak.mealient.datasource.v0.models.ParseRecipeURLRequestV0 import gq.kirmanak.mealient.datasource.v0.models.VersionResponseV0 interface MealieDataSourceV0 { @@ -38,4 +39,10 @@ interface MealieDataSourceV0 { token: String?, slug: String, ): GetRecipeResponseV0 + + suspend fun parseRecipeFromURL( + baseUrl: String, + token: String?, + request: ParseRecipeURLRequestV0, + ): String } \ No newline at end of file diff --git a/datasource/src/main/kotlin/gq/kirmanak/mealient/datasource/v0/MealieDataSourceV0Impl.kt b/datasource/src/main/kotlin/gq/kirmanak/mealient/datasource/v0/MealieDataSourceV0Impl.kt index db7b276..d39485a 100644 --- a/datasource/src/main/kotlin/gq/kirmanak/mealient/datasource/v0/MealieDataSourceV0Impl.kt +++ b/datasource/src/main/kotlin/gq/kirmanak/mealient/datasource/v0/MealieDataSourceV0Impl.kt @@ -3,7 +3,12 @@ package gq.kirmanak.mealient.datasource.v0 import gq.kirmanak.mealient.datasource.NetworkError import gq.kirmanak.mealient.datasource.NetworkRequestWrapper import gq.kirmanak.mealient.datasource.decode -import gq.kirmanak.mealient.datasource.v0.models.* +import gq.kirmanak.mealient.datasource.v0.models.AddRecipeRequestV0 +import gq.kirmanak.mealient.datasource.v0.models.ErrorDetailV0 +import gq.kirmanak.mealient.datasource.v0.models.GetRecipeResponseV0 +import gq.kirmanak.mealient.datasource.v0.models.GetRecipeSummaryResponseV0 +import gq.kirmanak.mealient.datasource.v0.models.ParseRecipeURLRequestV0 +import gq.kirmanak.mealient.datasource.v0.models.VersionResponseV0 import kotlinx.serialization.SerializationException import kotlinx.serialization.json.Json import retrofit2.HttpException @@ -77,4 +82,15 @@ class MealieDataSourceV0Impl @Inject constructor( logMethod = { "requestRecipeInfo" }, logParameters = { "baseUrl = $baseUrl, token = $token, slug = $slug" } ) + + override suspend fun parseRecipeFromURL( + baseUrl: String, + token: String?, + request: ParseRecipeURLRequestV0 + ): String = networkRequestWrapper.makeCallAndHandleUnauthorized( + block = { service.createRecipeFromURL("$baseUrl/api/recipes/create-url", token, request) }, + logMethod = { "parseRecipeFromURL" }, + logParameters = { "baseUrl = $baseUrl, token = $token, request = $request" } + + ) } diff --git a/datasource/src/main/kotlin/gq/kirmanak/mealient/datasource/v0/MealieServiceV0.kt b/datasource/src/main/kotlin/gq/kirmanak/mealient/datasource/v0/MealieServiceV0.kt index 0d6329b..55771f3 100644 --- a/datasource/src/main/kotlin/gq/kirmanak/mealient/datasource/v0/MealieServiceV0.kt +++ b/datasource/src/main/kotlin/gq/kirmanak/mealient/datasource/v0/MealieServiceV0.kt @@ -39,4 +39,11 @@ interface MealieServiceV0 { @Url url: String, @Header(AUTHORIZATION_HEADER_NAME) token: String?, ): GetRecipeResponseV0 + + @POST + suspend fun createRecipeFromURL( + @Url url: String, + @Header(AUTHORIZATION_HEADER_NAME) token: String?, + @Body request: ParseRecipeURLRequestV0, + ): String } \ No newline at end of file diff --git a/datasource/src/main/kotlin/gq/kirmanak/mealient/datasource/v0/models/ParseRecipeURLRequestV0.kt b/datasource/src/main/kotlin/gq/kirmanak/mealient/datasource/v0/models/ParseRecipeURLRequestV0.kt new file mode 100644 index 0000000..7f46ece --- /dev/null +++ b/datasource/src/main/kotlin/gq/kirmanak/mealient/datasource/v0/models/ParseRecipeURLRequestV0.kt @@ -0,0 +1,9 @@ +package gq.kirmanak.mealient.datasource.v0.models + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class ParseRecipeURLRequestV0( + @SerialName("url") val url: String, +) diff --git a/datasource/src/main/kotlin/gq/kirmanak/mealient/datasource/v1/MealieDataSourceV1.kt b/datasource/src/main/kotlin/gq/kirmanak/mealient/datasource/v1/MealieDataSourceV1.kt index 6ba2d6b..a231834 100644 --- a/datasource/src/main/kotlin/gq/kirmanak/mealient/datasource/v1/MealieDataSourceV1.kt +++ b/datasource/src/main/kotlin/gq/kirmanak/mealient/datasource/v1/MealieDataSourceV1.kt @@ -1,6 +1,11 @@ package gq.kirmanak.mealient.datasource.v1 -import gq.kirmanak.mealient.datasource.v1.models.* +import gq.kirmanak.mealient.datasource.v1.models.CreateRecipeRequestV1 +import gq.kirmanak.mealient.datasource.v1.models.GetRecipeResponseV1 +import gq.kirmanak.mealient.datasource.v1.models.GetRecipeSummaryResponseV1 +import gq.kirmanak.mealient.datasource.v1.models.ParseRecipeURLRequestV1 +import gq.kirmanak.mealient.datasource.v1.models.UpdateRecipeRequestV1 +import gq.kirmanak.mealient.datasource.v1.models.VersionResponseV1 interface MealieDataSourceV1 { @@ -42,4 +47,10 @@ interface MealieDataSourceV1 { token: String?, slug: String, ): GetRecipeResponseV1 + + suspend fun parseRecipeFromURL( + baseUrl: String, + token: String?, + request: ParseRecipeURLRequestV1, + ): String } \ No newline at end of file diff --git a/datasource/src/main/kotlin/gq/kirmanak/mealient/datasource/v1/MealieDataSourceV1Impl.kt b/datasource/src/main/kotlin/gq/kirmanak/mealient/datasource/v1/MealieDataSourceV1Impl.kt index e00c0d0..f7551b0 100644 --- a/datasource/src/main/kotlin/gq/kirmanak/mealient/datasource/v1/MealieDataSourceV1Impl.kt +++ b/datasource/src/main/kotlin/gq/kirmanak/mealient/datasource/v1/MealieDataSourceV1Impl.kt @@ -3,7 +3,13 @@ package gq.kirmanak.mealient.datasource.v1 import gq.kirmanak.mealient.datasource.NetworkError import gq.kirmanak.mealient.datasource.NetworkRequestWrapper import gq.kirmanak.mealient.datasource.decode -import gq.kirmanak.mealient.datasource.v1.models.* +import gq.kirmanak.mealient.datasource.v1.models.CreateRecipeRequestV1 +import gq.kirmanak.mealient.datasource.v1.models.ErrorDetailV1 +import gq.kirmanak.mealient.datasource.v1.models.GetRecipeResponseV1 +import gq.kirmanak.mealient.datasource.v1.models.GetRecipeSummaryResponseV1 +import gq.kirmanak.mealient.datasource.v1.models.ParseRecipeURLRequestV1 +import gq.kirmanak.mealient.datasource.v1.models.UpdateRecipeRequestV1 +import gq.kirmanak.mealient.datasource.v1.models.VersionResponseV1 import kotlinx.serialization.SerializationException import kotlinx.serialization.json.Json import retrofit2.HttpException @@ -89,5 +95,16 @@ class MealieDataSourceV1Impl @Inject constructor( logParameters = { "baseUrl = $baseUrl, token = $token, slug = $slug" } ) + override suspend fun parseRecipeFromURL( + baseUrl: String, + token: String?, + request: ParseRecipeURLRequestV1 + ): String = networkRequestWrapper.makeCallAndHandleUnauthorized( + block = { service.createRecipeFromURL("$baseUrl/api/recipes/create-url", token, request) }, + logMethod = { "parseRecipeFromURL" }, + logParameters = { "baseUrl = $baseUrl, token = $token, request = $request" } + + ) + } diff --git a/datasource/src/main/kotlin/gq/kirmanak/mealient/datasource/v1/MealieServiceV1.kt b/datasource/src/main/kotlin/gq/kirmanak/mealient/datasource/v1/MealieServiceV1.kt index c6644fc..c5aa05e 100644 --- a/datasource/src/main/kotlin/gq/kirmanak/mealient/datasource/v1/MealieServiceV1.kt +++ b/datasource/src/main/kotlin/gq/kirmanak/mealient/datasource/v1/MealieServiceV1.kt @@ -46,4 +46,11 @@ interface MealieServiceV1 { @Url url: String, @Header(AUTHORIZATION_HEADER_NAME) token: String?, ): GetRecipeResponseV1 + + @POST + suspend fun createRecipeFromURL( + @Url url: String, + @Header(AUTHORIZATION_HEADER_NAME) token: String?, + @Body request: ParseRecipeURLRequestV1, + ): String } \ No newline at end of file diff --git a/datasource/src/main/kotlin/gq/kirmanak/mealient/datasource/v1/models/ParseRecipeURLRequestV1.kt b/datasource/src/main/kotlin/gq/kirmanak/mealient/datasource/v1/models/ParseRecipeURLRequestV1.kt new file mode 100644 index 0000000..e1f7671 --- /dev/null +++ b/datasource/src/main/kotlin/gq/kirmanak/mealient/datasource/v1/models/ParseRecipeURLRequestV1.kt @@ -0,0 +1,10 @@ +package gq.kirmanak.mealient.datasource.v1.models + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class ParseRecipeURLRequestV1( + @SerialName("url") val url: String, + @SerialName("includeTags") val includeTags: Boolean +)