Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 23 additions & 19 deletions src/main/scala/api/GetPublicationRequestsHistory.scala
Original file line number Diff line number Diff line change
Expand Up @@ -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.*
Expand Down Expand Up @@ -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)
2 changes: 2 additions & 0 deletions src/main/scala/api/moderation/ModerationHistoryResponse.scala
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
15 changes: 11 additions & 4 deletions src/main/scala/api/recipes/publicationRequests/GetAll.scala
Original file line number Diff line number Diff line change
Expand Up @@ -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.*
Expand All @@ -15,20 +14,28 @@ 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)

private def getAllHandler(recipeId: RecipeId):
ZIO[
AuthenticatedUser & GetAllEnv,
InternalServerError | RecipeNotFound,
List[ModerationHistoryResponse]
List[RecipeModerationHistoryResponse]
] =
for
isUserOwner <- ZIO.serviceWithZIO[RecipesRepo](_.isUserOwner(recipeId))
Expand All @@ -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
Expand Down
Original file line number Diff line number Diff line change
@@ -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}
Expand All @@ -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)
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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] =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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] =
Expand Down