Skip to content

Commit

Permalink
Work in progress
Browse files Browse the repository at this point in the history
  • Loading branch information
fanf committed May 3, 2024
1 parent a197366 commit 477994e
Show file tree
Hide file tree
Showing 3 changed files with 64 additions and 20 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -40,10 +40,12 @@ package com.normation.plugins
import better.files.File
import com.normation.errors
import com.normation.errors.IOResult
import com.normation.utils.DateFormaterService
import java.time.ZonedDateTime
import java.util.Properties
import zio.Chunk
import zio.ZIO
import org.joda.time.DateTime
import zio.*
import zio.json.*

case class PluginSettings(
url: String,
Expand All @@ -60,6 +62,7 @@ case class PluginSettings(
*/
final case class PluginsDetails(
limits: Option[GlobalPluginLimits],
// plugins should be sorted by id
plugins: Seq[PluginDetails]
)

Expand All @@ -72,17 +75,54 @@ final case class GlobalPluginLimits(
maxVersion: String,
startDate: ZonedDateTime,
endDate: ZonedDateTime,
maxNodes: Option[Int]
maxNodes: Int
)
object GlobalPluginLimits {
import DateFormaterService.json.encoderZonedDateTime
implicit val encoderGlobalPluginLimits: JsonEncoder[GlobalPluginLimits] = DeriveJsonEncoder.gen
}

trait PluginStatusRest {
def value: String
}
object PluginStatusRest {
case object Enabled extends PluginStatusRest { override val value: String = "enabled" }
case object Disabled extends PluginStatusRest { override val value: String = "disabled" }
}

final case class PluginDetails(
id: String,
name: String,
shortName: String,
description: String,
version: String,

status: PluginStatusRest,
license: Option[PluginLicenseInfo]
)
object PluginDetails {
implicit val encoderPluginStatusRest: JsonEncoder[PluginStatusRest] = JsonEncoder[String].contramap(_.value)
implicit val encoderPluginDetails: JsonEncoder[PluginDetails] = DeriveJsonEncoder.gen
}

/*
* This object gives main information about license information.
* It is designated to be read to the user. No string information
* should be used for comparison.
*/
final case class PluginLicenseInfo(
licensee: String,
softwareId: String,
minVersion: String,
maxVersion: String,
startDate: DateTime,
endDate: DateTime,
maxNodes: Option[Int],
others: Map[String, String]
)
object PluginLicenseInfo {
import DateFormaterService.json.encoderDateTime
implicit val encoderPluginLicenseInfo: JsonEncoder[PluginLicenseInfo] = DeriveJsonEncoder.gen
}

trait PluginSettingsService {
def readPluginSettings(): IOResult[PluginSettings]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,6 @@
package com.normation.plugins

import com.normation.rudder.domain.logger.ApplicationLoggerPure
import org.joda.time.DateTime

/**
* This file defined an entry point for license information and other
Expand All @@ -52,21 +51,7 @@ object PluginStatusInfo {
final case class Disabled(reason: String, details: Option[PluginLicenseInfo]) extends PluginStatusInfo
}

/*
* This object gives main information about license information.
* It is destinated to be read to the user. No string information
* should be used for comparison.
*/
final case class PluginLicenseInfo(
licensee: String,
softwareId: String,
minVersion: String,
maxVersion: String,
startDate: DateTime,
endDate: DateTime,
maxNodes: Option[Int],
others: Map[String, String]
)


trait PluginStatus {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ package com.normation.utils

import com.normation.errors.Inconsistency
import com.normation.errors.PureResult
import java.time.ZonedDateTime
import org.joda.time.DateTime
import org.joda.time.DateTimeFieldType
import org.joda.time.Duration
Expand All @@ -49,8 +50,16 @@ import org.joda.time.format.DateTimeFormatterBuilder
import org.joda.time.format.ISODateTimeFormat
import org.joda.time.format.PeriodFormatterBuilder
import scala.util.control.NonFatal
import zio.json.*

object DateFormaterService {
object json {
implicit val encoderDateTime: JsonEncoder[DateTime] = JsonEncoder[String].contramap(serialize)
implicit val decoderDateTime: JsonDecoder[DateTime] = JsonDecoder[String].mapOrFail(parseDate(_).left.map(_.fullMsg))
implicit val encoderZonedDateTime: JsonEncoder[ZonedDateTime] = JsonEncoder[String].contramap(serializeZDT)
implicit val decoderZonedDateTime: JsonDecoder[ZonedDateTime] =
JsonDecoder[String].mapOrFail(parseDateZDT(_).left.map(_.fullMsg))
}

val displayDateFormat: DateTimeFormatter = new DateTimeFormatterBuilder()
.append(DateTimeFormat.forPattern("YYYY-MM-dd"))
Expand All @@ -75,6 +84,8 @@ object DateFormaterService {
*/
def serialize(datetime: DateTime): String = datetime.toString(ISODateTimeFormat.dateTimeNoMillis)

def serializeZDT(datetime: ZonedDateTime): String = datetime.format(java.time.format.DateTimeFormatter.ISO_OFFSET_DATE_TIME)

def parseDate(date: String): PureResult[DateTime] = {
try {
Right(ISODateTimeFormat.dateTimeNoMillis().parseDateTime(date))
Expand All @@ -83,6 +94,14 @@ object DateFormaterService {
}
}

def parseDateZDT(date: String): PureResult[ZonedDateTime] = {
try {
Right(ZonedDateTime.parse(date, java.time.format.DateTimeFormatter.ISO_OFFSET_DATE_TIME))
} catch {
case NonFatal(ex) => Left(Inconsistency(s"String '${date}' can't be parsed as an ISO date/time: ${ex.getMessage}"))
}
}

val dateFormatTimePicker = "yyyy-MM-dd HH:mm"
def parseDateTimePicker(date: String): PureResult[DateTime] = {
try {
Expand Down

0 comments on commit 477994e

Please sign in to comment.