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
+)