Skip to content

Commit

Permalink
Fixes #21821: Refactor without trait
Browse files Browse the repository at this point in the history
  • Loading branch information
VinceMacBuche committed Sep 22, 2022
1 parent 9675f2c commit 74f08ba
Show file tree
Hide file tree
Showing 6 changed files with 43 additions and 51 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -45,10 +45,10 @@ import zio.syntax._
import com.normation.errors.Unexpected

trait CampaignRepository {
def getAll(): IOResult[List[Campaign]]
def get(id : CampaignId) : IOResult[Campaign]
def getAll(): IOResult[List[Campaign[_]]]
def get(id : CampaignId) : IOResult[Campaign[_]]
def delete(id : CampaignId) : IOResult[CampaignId]
def save(c : Campaign): IOResult[Campaign]
def save(c : Campaign[_]): IOResult[Campaign[_]]
}

object CampaignRepositoryImpl {
Expand All @@ -68,7 +68,7 @@ object CampaignRepositoryImpl {

class CampaignRepositoryImpl(campaignSerializer: CampaignSerializer, path: File, campaignEventRepository: CampaignEventRepository) extends CampaignRepository {

def getAll(): IOResult[List[Campaign]] = {
def getAll(): IOResult[List[Campaign[_]]] = {
for {
jsonFiles <- IOResult.effect{path.collectChildren(_.extension.exists(_ ==".json"))}
campaigns <- (ZIO.foreach(jsonFiles.toList) {
Expand All @@ -88,7 +88,7 @@ class CampaignRepositoryImpl(campaignSerializer: CampaignSerializer, path: File,
campaigns.partitionMap(identity)._2
}
}
def get(id : CampaignId) : IOResult[Campaign] = {
def get(id : CampaignId) : IOResult[Campaign[_]] = {
for {
content <- IOResult.effect (s"error when getting campaign file for campaign with id '${id.value}'"){
val file = path / (s"${id.value}.json")
Expand All @@ -100,7 +100,7 @@ class CampaignRepositoryImpl(campaignSerializer: CampaignSerializer, path: File,
campaign
}
}
def save(c : Campaign): IOResult[Campaign] = {
def save(c : Campaign[_]): IOResult[Campaign[_]] = {
for {
file <- IOResult.effect (s"error when creating campaign file for campaign with id '${c.info.id.value}'"){
val file = path / (s"${c.info.id.value}.json")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,13 +52,12 @@ case class CampaignParsingInfo (
, version : Int
)

trait Campaign {
def info : CampaignInfo
def details : CampaignDetails
def campaignType: CampaignType
def copyWithId(newId : CampaignId) : Campaign
def version : Int
}
case class Campaign[DETAILS](
info : CampaignInfo
, details : DETAILS
, campaignType: CampaignType
, version : Int
)

case class CampaignInfo (
id : CampaignId
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,12 +54,12 @@ import zio.json.EncoderOps

trait JSONTranslateCampaign{

def getRawJson(): PartialFunction[Campaign, IOResult[Json]]
def getRawJson(): PartialFunction[Campaign[_], IOResult[Json]]

// serialize the campaign based on its campaignType
def handle(pretty: Boolean) = getRawJson().andThen(r => r.map(json => if (pretty) json.toJsonPretty else json.toJson))

def read(): PartialFunction[(String,CampaignParsingInfo), IOResult[Campaign]]
def read(): PartialFunction[(String,CampaignParsingInfo), IOResult[Campaign[_]]]

def campaignType(): PartialFunction[String, CampaignType]
}
Expand All @@ -69,7 +69,7 @@ class CampaignSerializer {
private[this] var tranlaters : List[JSONTranslateCampaign] = Nil
import CampaignSerializer._

def getJson(campaign: Campaign) = tranlaters.map(_.getRawJson()).fold(Jsonbase) { case (a, b) => b orElse a }(campaign).flatMap{
def getJson(campaign: Campaign[_]) = tranlaters.map(_.getRawJson()).fold(Jsonbase) { case (a, b) => b orElse a }(campaign).flatMap{

json =>
CampaignParsingInfo(campaign.campaignType, campaign.version).toJsonAST.toIO.map(json.merge)
Expand All @@ -78,15 +78,15 @@ class CampaignSerializer {
}


val Jsonbase : PartialFunction[Campaign, IOResult[Json]] = {
case c : Campaign => Inconsistency(s"No translater for campaign ${c.info.id.value}").fail
val Jsonbase : PartialFunction[Campaign[_], IOResult[Json]] = {
case c : Campaign[_] => Inconsistency(s"No translater for campaign ${c.info.id.value}").fail
}

val base : PartialFunction[Campaign, IOResult[String]] = {
case c : Campaign => Inconsistency(s"No translater for campaign ${c.info.id.value}").fail
val base : PartialFunction[Campaign[_], IOResult[String]] = {
case c : Campaign[_] => Inconsistency(s"No translater for campaign ${c.info.id.value}").fail
}

val readBase : PartialFunction[(String,CampaignParsingInfo),IOResult[Campaign]]= {
val readBase : PartialFunction[(String,CampaignParsingInfo),IOResult[Campaign[_]]]= {
case (_,v) => Inconsistency(s"could not translate into campaign of type ${v.campaignType.value} version ${v.version}").fail
}

Expand All @@ -97,8 +97,8 @@ class CampaignSerializer {

def addJsonTranslater(c : JSONTranslateCampaign ) = tranlaters = c :: tranlaters

def serialize(campaign: Campaign) : IOResult[String] = getJson(campaign).map(_.toJsonPretty)
def parse(string : String) : IOResult[Campaign] = {
def serialize(campaign: Campaign[_]) : IOResult[String] = getJson(campaign).map(_.toJsonPretty)
def parse(string : String) : IOResult[Campaign[_]] = {
for {
baseInfo <- string.fromJson[CampaignParsingInfo].toIO
res <- tranlaters.map(_.read()).fold(readBase) { case (a, b) => b orElse a }((string,baseInfo))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ import scala.annotation.nowarn


trait CampaignHandler{
def handle(mainCampaignService: MainCampaignService, event :CampaignEvent): PartialFunction[Campaign, IOResult[CampaignEvent]]
def handle(mainCampaignService: MainCampaignService, event :CampaignEvent): PartialFunction[Campaign[_], IOResult[CampaignEvent]]
}

object MainCampaignService {
Expand All @@ -77,7 +77,7 @@ class MainCampaignService(repo: CampaignEventRepository, campaignRepo: CampaignR

private[this] var inner : Option[CampaignScheduler] = None

def saveCampaign(c : Campaign) = {
def saveCampaign(c : Campaign[_]) = {
for {
_ <- campaignRepo.save(c)
_ <- scheduleCampaignEvent(c, DateTime.now())
Expand All @@ -104,7 +104,7 @@ class MainCampaignService(repo: CampaignEventRepository, campaignRepo: CampaignR

def handle(eventId: CampaignEventId) = {

def base(event : CampaignEvent): PartialFunction[Campaign, IOResult[CampaignEvent]] = {
def base(event : CampaignEvent): PartialFunction[Campaign[_], IOResult[CampaignEvent]] = {
case _ => event.succeed
}

Expand Down Expand Up @@ -301,7 +301,7 @@ class MainCampaignService(repo: CampaignEventRepository, campaignRepo: CampaignR
}
}

def scheduleCampaignEvent(campaign: Campaign, date : DateTime) : IOResult[CampaignEvent] = {
def scheduleCampaignEvent(campaign: Campaign[_], date : DateTime) : IOResult[CampaignEvent] = {
for {
nbOfEvents <- repo.numberOfEventsByCampaign(campaign.info.id)
events <- repo.getWithCriteria(Running.value :: Nil, None,Some(campaign.info.id), None, None, None, None)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,7 @@ class CampaignApi (
case eb: EmptyBox => Unexpected((eb ?~! "error when accessing request body").messageChain).fail
case Full(bytes) => campaignSerializer.parse(new String(bytes, charset))
}
withId = if (campaign.info.id.value.isEmpty) campaign.copyWithId(CampaignId(stringUuidGenerator.newUuid)) else campaign
withId = if (campaign.info.id.value.isEmpty) campaign.copy(info = campaign.info.copy(id = CampaignId(stringUuidGenerator.newUuid))) else campaign
saved <- mainCampaignService.saveCampaign(withId)
serialized <- campaignSerializer.getJson(saved)
} yield {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -159,9 +159,6 @@ import com.normation.rudder.campaigns.Finished
import com.normation.rudder.campaigns.Running
import com.normation.rudder.campaigns.Scheduled
import com.normation.zio._
import zio.json.jsonDiscriminator
import zio.json.jsonHint

/*
* Mock services for test, especially repositories, and provides
* test data (nodes, directives, etc)
Expand Down Expand Up @@ -2353,23 +2350,19 @@ final object DumbCampaignType extends CampaignType("dumb-campaign")

final case class DumbCampaignDetails(name: String) extends CampaignDetails

@jsonDiscriminator("campaignType")
sealed trait DumbCampaignTrait extends Campaign

@jsonHint(DumbCampaignType.value)
final case class DumbCampaign(info: CampaignInfo, details: DumbCampaignDetails) extends DumbCampaignTrait {
val campaignType = DumbCampaignType
val version = 1
def copyWithId(newId: CampaignId): Campaign = this.copy(info = info.copy(id = newId))

object DumbCampaign {
def make (info: CampaignInfo, details: DumbCampaignDetails) : Campaign[DumbCampaignDetails] = {
Campaign(info,details,DumbCampaignType,1)
}
}

class MockCampaign() {

val campaignSerializer = new CampaignSerializer()

// init item: one campaign, with a finished event, one running, one scheduled
val c0 = DumbCampaign(CampaignInfo(
val c0 = DumbCampaign.make(CampaignInfo(
CampaignId("c0")
, "first campaign"
, "a test campaign present when rudder boot"
Expand All @@ -2380,13 +2373,13 @@ class MockCampaign() {


object repo extends CampaignRepository {
val items = Ref.make(Map[CampaignId, DumbCampaignTrait]((c0.info.id -> c0))).runNow
val items = Ref.make(Map[CampaignId, Campaign[_]]((c0.info.id -> c0))).runNow

override def getAll(): IOResult[List[Campaign]] = items.get.map(_.valuesIterator.toList)
override def get(id: CampaignId): IOResult[Campaign] = items.get.map(_.get(id)).notOptional(s"Missing campaign with id '${id.serialize}''")
override def save(c: Campaign): IOResult[Campaign] = {
override def getAll(): IOResult[List[Campaign[_]]] = items.get.map(_.valuesIterator.toList)
override def get(id: CampaignId): IOResult[Campaign[_]] = items.get.map(_.get(id)).notOptional(s"Missing campaign with id '${id.serialize}''")
override def save(c: Campaign[_]): IOResult[Campaign[_]] = {
c match {
case x:DumbCampaignTrait => items.update (_ + (x.info.id -> x)) *> c.succeed
case x:Campaign[DumbCampaignDetails] => items.update (_ + (x.info.id -> x)) *> c.succeed
case _ => Inconsistency("Unknown campaign type").fail
}
}
Expand All @@ -2400,16 +2393,16 @@ class MockCampaign() {
import zio.json._
import com.normation.rudder.campaigns.CampaignSerializer._
implicit val dumbCampaignDetailsDecoder : JsonDecoder[DumbCampaignDetails] = DeriveJsonDecoder.gen
implicit val dumbCampaignDecoder : JsonDecoder[DumbCampaignTrait] = DeriveJsonDecoder.gen
implicit val dumbCampaignDecoder : JsonDecoder[Campaign[DumbCampaignDetails]] = DeriveJsonDecoder.gen
implicit val dumbCampaignDetailsEncoder : JsonEncoder[DumbCampaignDetails] = DeriveJsonEncoder.gen
implicit val dumbCampaignEncoder : JsonEncoder[DumbCampaignTrait] = DeriveJsonEncoder.gen
implicit val dumbCampaignEncoder : JsonEncoder[Campaign[DumbCampaignDetails]] = DeriveJsonEncoder.gen

def read(): PartialFunction[(String,CampaignParsingInfo), IOResult[Campaign]] = {
case (s,CampaignParsingInfo(DumbCampaignType,1)) => s.fromJson[DumbCampaignTrait].toIO
def read(): PartialFunction[(String,CampaignParsingInfo), IOResult[Campaign[_]]] = {
case (s,CampaignParsingInfo(DumbCampaignType,1)) => s.fromJson[Campaign[DumbCampaignDetails]].toIO
}

def getRawJson(): PartialFunction[Campaign, IOResult[zio.json.ast.Json]] = {
case c: DumbCampaignTrait => c.toJsonAST.toIO
def getRawJson(): PartialFunction[Campaign[_], IOResult[zio.json.ast.Json]] = {
case c: Campaign[DumbCampaignDetails] => c.toJsonAST.toIO
}

def campaignType(): PartialFunction[String, CampaignType] = {
Expand Down

0 comments on commit 74f08ba

Please sign in to comment.