diff --git a/src/main/scala/api/GetPublicationRequestsHistory.scala b/src/main/scala/api/GetPublicationRequestsHistory.scala index e2de12e..768cdb2 100644 --- a/src/main/scala/api/GetPublicationRequestsHistory.scala +++ b/src/main/scala/api/GetPublicationRequestsHistory.scala @@ -4,9 +4,10 @@ import api.Authentication.{AuthenticatedUser, zSecuredServerLogic} import api.EndpointErrorVariants.serverErrorVariant import api.common.search.PaginationParams import api.moderation.ModerationHistoryResponse -import db.repositories.{RecipePublicationRequestsRepo, IngredientPublicationRequestsRepo} +import db.repositories.{IngredientPublicationRequestsRepo, RecipePublicationRequestsRepo} +import db.tables.{DbIngredient, DbRecipe} +import db.tables.publication.{DbIngredientPublicationRequest, DbRecipePublicationRequest} import domain.InternalServerError - import io.circe.Decoder import io.circe.derivation.Configuration import io.circe.generic.auto.* @@ -38,27 +39,30 @@ def getPublicationRequestsHistoryHandler(paginationParams: PaginationParams): .getAllCreatedBy .orElseFail(InternalServerError()) ) + recipeRequests = dbRecipeRequests.map { + case (dbRecipeReq: DbRecipePublicationRequest, recipe: DbRecipe) => ModerationHistoryResponse( + recipe.name, + "recipe", + dbRecipeReq.createdAt, + dbRecipeReq.updatedAt, + PublicationRequestStatusResp.fromDomain(dbRecipeReq.status.toDomain(dbRecipeReq.reason)), + dbRecipeReq.reason + ) + } + dbIngredientRequests <- ZIO.serviceWithZIO[IngredientPublicationRequestsRepo](_ .getAllCreatedBy .orElseFail(InternalServerError()) ) - recipeRequests = dbRecipeRequests - .map( - dbReq => ModerationHistoryResponse( - dbReq.createdAt, - dbReq.updatedAt, - PublicationRequestStatusResp.fromDomain(dbReq.status.toDomain(dbReq.reason)), - dbReq.reason + ingredientRequests = dbIngredientRequests.map { + case (dbRecipeReq: DbIngredientPublicationRequest, ingredient: DbIngredient) => ModerationHistoryResponse( + ingredient.name, + "ingredient", + dbRecipeReq.createdAt, + dbRecipeReq.updatedAt, + PublicationRequestStatusResp.fromDomain(dbRecipeReq.status.toDomain(dbRecipeReq.reason)), + dbRecipeReq.reason ) - ) - ingredientRequests = dbIngredientRequests - .map( - dbReq => ModerationHistoryResponse( - dbReq.createdAt, - dbReq.updatedAt, - PublicationRequestStatusResp.fromDomain(dbReq.status.toDomain(dbReq.reason)), - dbReq.reason - ) - ) + } yield (recipeRequests ++ ingredientRequests) .sortBy(_.updatedAt) diff --git a/src/main/scala/api/moderation/ModerationHistoryResponse.scala b/src/main/scala/api/moderation/ModerationHistoryResponse.scala index 80feef9..772a745 100644 --- a/src/main/scala/api/moderation/ModerationHistoryResponse.scala +++ b/src/main/scala/api/moderation/ModerationHistoryResponse.scala @@ -5,6 +5,8 @@ import api.PublicationRequestStatusResp import java.time.OffsetDateTime final case class ModerationHistoryResponse( + name: String, + requestType: String, createdAt: OffsetDateTime, updatedAt: OffsetDateTime, status: PublicationRequestStatusResp, diff --git a/src/main/scala/api/recipes/publicationRequests/GetAll.scala b/src/main/scala/api/recipes/publicationRequests/GetAll.scala index 5c4f800..300ce44 100644 --- a/src/main/scala/api/recipes/publicationRequests/GetAll.scala +++ b/src/main/scala/api/recipes/publicationRequests/GetAll.scala @@ -6,7 +6,6 @@ import api.PublicationRequestStatusResp import api.moderation.ModerationHistoryResponse import db.repositories.{RecipePublicationRequestsRepo, RecipesRepo} import domain.{InternalServerError, RecipeId, RecipeNotFound} - import io.circe.Decoder import io.circe.derivation.Configuration import io.circe.generic.auto.* @@ -15,12 +14,20 @@ import sttp.tapir.json.circe.* import sttp.tapir.ztapir.* import zio.ZIO +import java.time.OffsetDateTime + +final case class RecipeModerationHistoryResponse( + createdAt: OffsetDateTime, + updatedAt: OffsetDateTime, + status: PublicationRequestStatusResp, + reason: Option[String] + ) private type GetAllEnv = RecipePublicationRequestsRepo & RecipesRepo val getAll: ZServerEndpoint[GetAllEnv, Any] = recipesPublicationRequestsEndpoint .get - .out(jsonBody[List[ModerationHistoryResponse]]) + .out(jsonBody[List[RecipeModerationHistoryResponse]]) .errorOut(oneOf(serverErrorVariant, recipeNotFoundVariant)) .zSecuredServerLogic(getAllHandler) @@ -28,7 +35,7 @@ private def getAllHandler(recipeId: RecipeId): ZIO[ AuthenticatedUser & GetAllEnv, InternalServerError | RecipeNotFound, - List[ModerationHistoryResponse] + List[RecipeModerationHistoryResponse] ] = for isUserOwner <- ZIO.serviceWithZIO[RecipesRepo](_.isUserOwner(recipeId)) @@ -39,7 +46,7 @@ private def getAllHandler(recipeId: RecipeId): .orElseFail(InternalServerError()) res = dbRequests .map( - dbReq => ModerationHistoryResponse( + dbReq => RecipeModerationHistoryResponse( dbReq.createdAt, dbReq.updatedAt, PublicationRequestStatusResp.fromDomain(dbReq.status.toDomain(dbReq.reason)), dbReq.reason diff --git a/src/main/scala/db/repositories/IngredientPublicationRequestRepo.scala b/src/main/scala/db/repositories/IngredientPublicationRequestRepo.scala index 6e97298..73619d2 100644 --- a/src/main/scala/db/repositories/IngredientPublicationRequestRepo.scala +++ b/src/main/scala/db/repositories/IngredientPublicationRequestRepo.scala @@ -1,6 +1,8 @@ package db.repositories import api.Authentication.AuthenticatedUser +import api.PublicationRequestStatusResp +import api.moderation.ModerationHistoryResponse import db.DbError import db.tables.DbIngredient import db.tables.publication.{DbIngredientPublicationRequest, DbPublicationRequestStatus} @@ -17,7 +19,7 @@ trait IngredientPublicationRequestsRepo: def get(id: PublicationRequestId): IO[DbError, Option[DbIngredientPublicationRequest]] def getWithIngredient(id: PublicationRequestId): IO[DbError, Option[(DbIngredientPublicationRequest, DbIngredient)]] def updateStatus(id: PublicationRequestId, status: PublicationRequestStatus): IO[DbError, Boolean] - def getAllCreatedBy: ZIO[AuthenticatedUser, DbError, List[DbIngredientPublicationRequest]] + def getAllCreatedBy: ZIO[AuthenticatedUser, DbError, List[(DbIngredientPublicationRequest, DbIngredient)]] def getAllRequestsForIngredient(id: IngredientId): IO[DbError, Seq[DbIngredientPublicationRequest]] final case class IngredientPublicationRequestsRepoLive(dataSource: DataSource) @@ -56,7 +58,7 @@ final case class IngredientPublicationRequestsRepoLive(dataSource: DataSource) .on(_.ingredientId == _.id) ).map(_.headOption).provideDS - override def getAllCreatedBy: ZIO[AuthenticatedUser, DbError, List[DbIngredientPublicationRequest]] = + override def getAllCreatedBy: ZIO[AuthenticatedUser, DbError, List[(DbIngredientPublicationRequest, DbIngredient)]] = for userId <- ZIO.serviceWith[AuthenticatedUser](_.userId) res <- run(getAllCreatedByQ(lift(userId))).provideDS @@ -106,12 +108,11 @@ object IngredientPublicationRequestsQueries: _.reason -> reason, ) - inline def getAllCreatedByQ(inline userId: UserId): Query[DbIngredientPublicationRequest] = + inline def getAllCreatedByQ(inline userId: UserId): Query[(DbIngredientPublicationRequest, DbIngredient)] = query[DbIngredientPublicationRequest] - .join(query[DbIngredientPublicationRequest]) + .join(query[DbIngredient]) .on(_.ingredientId == _.id) - .map(_._1) - + .filter(_._2.ownerId.contains(userId)) object IngredientPublicationRequestsRepo: def layer: RLayer[DataSource, IngredientPublicationRequestsRepo] = diff --git a/src/main/scala/db/repositories/RecipePublicationRequestsRepo.scala b/src/main/scala/db/repositories/RecipePublicationRequestsRepo.scala index d3ed67d..8ce0cac 100644 --- a/src/main/scala/db/repositories/RecipePublicationRequestsRepo.scala +++ b/src/main/scala/db/repositories/RecipePublicationRequestsRepo.scala @@ -20,7 +20,7 @@ trait RecipePublicationRequestsRepo: def updateStatus(id: PublicationRequestId, status: PublicationRequestStatus): IO[DbError, Boolean] def getAllByRecipeId(recipeId: RecipeId): IO[DbError, List[DbRecipePublicationRequest]] - def getAllCreatedBy: ZIO[AuthenticatedUser, DbError, List[DbRecipePublicationRequest]] + def getAllCreatedBy: ZIO[AuthenticatedUser, DbError, List[(DbRecipePublicationRequest, DbRecipe)]] final case class RecipePublicationRequestsRepoLive(dataSource: DataSource) extends RecipePublicationRequestsRepo: @@ -65,7 +65,7 @@ final case class RecipePublicationRequestsRepoLive(dataSource: DataSource) override def getAllByRecipeId(recipeId: RecipeId): IO[DbError, List[DbRecipePublicationRequest]] = run(getAllByRecipeIdQ(lift(recipeId))).provideDS - override def getAllCreatedBy: ZIO[AuthenticatedUser, DbError, List[DbRecipePublicationRequest]] = + override def getAllCreatedBy: ZIO[AuthenticatedUser, DbError, List[(DbRecipePublicationRequest, DbRecipe)]] = for userId <- ZIO.serviceWith[AuthenticatedUser](_.userId) res <- run(getAllCreatedByQ(lift(userId))).provideDS @@ -113,12 +113,11 @@ object RecipePublicationRequestsQueries: inline def getAllByRecipeIdQ(inline recipeId: RecipeId): EntityQuery[DbRecipePublicationRequest] = requestsQ.filter(_.recipeId == recipeId) - inline def getAllCreatedByQ(inline userId: UserId): Query[DbRecipePublicationRequest] = + inline def getAllCreatedByQ(inline userId: UserId): Query[(DbRecipePublicationRequest, DbRecipe)] = requestsQ .join(query[DbRecipe]) .on(_.recipeId == _.id) .filter(_._2.creatorId.contains(userId)) - .map(_._1) object RecipePublicationRequestsRepo: def layer: RLayer[DataSource, RecipePublicationRequestsRepo] =