diff --git a/src/frontend/src/modelo/Jogo.ts b/src/frontend/src/modelo/Jogo.ts index 3e5b154..f8d9d91 100644 --- a/src/frontend/src/modelo/Jogo.ts +++ b/src/frontend/src/modelo/Jogo.ts @@ -9,13 +9,6 @@ export default class Jogo { ) { } } -export class Preco { - constructor ( - public tipo: TipoDePreco, - public valor: number - ) { } -} - -export type TipoDePreco = 'VALOR' | 'DE_GRACA' | 'DESCONHECIDO' | 'PRESENTE'; +export type Preco = 'VALOR' | 'DE_GRACA' | 'DESCONHECIDO' | 'PRESENTE' | number; export type Estado = 'NOVO' | 'JOGUEI' | 'SATISFEITO' | 'PALHA' | 'ETERNO'; \ No newline at end of file diff --git a/src/main/java/casa/sotu/organizajogos/api/json/DesserializadorDePreco.java b/src/main/java/casa/sotu/organizajogos/api/json/DesserializadorDePreco.java new file mode 100644 index 0000000..24f76b9 --- /dev/null +++ b/src/main/java/casa/sotu/organizajogos/api/json/DesserializadorDePreco.java @@ -0,0 +1,36 @@ +package casa.sotu.organizajogos.api.json; + +import java.io.IOException; +import java.math.BigDecimal; + +import com.fasterxml.jackson.core.JacksonException; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.deser.std.StdDeserializer; + +import casa.sotu.organizajogos.api.modelo.Preco; +import casa.sotu.organizajogos.api.modelo.Preco.TipoDePreco; + +public class DesserializadorDePreco extends StdDeserializer { + + protected DesserializadorDePreco() { + this(Preco.class); + } + + protected DesserializadorDePreco(Class vc) { + super(vc); + } + + @Override + public Preco deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JacksonException { + + String value = p.getValueAsString(); + try { + return new Preco(new BigDecimal(value)); + } catch (NumberFormatException e) { + return new Preco(TipoDePreco.valueOf(value.toUpperCase())); + } + + } + +} diff --git a/src/main/java/casa/sotu/organizajogos/api/json/SerializadorDePreco.java b/src/main/java/casa/sotu/organizajogos/api/json/SerializadorDePreco.java new file mode 100644 index 0000000..a5cedda --- /dev/null +++ b/src/main/java/casa/sotu/organizajogos/api/json/SerializadorDePreco.java @@ -0,0 +1,31 @@ +package casa.sotu.organizajogos.api.json; + +import java.io.IOException; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.ser.std.StdSerializer; + +import casa.sotu.organizajogos.api.modelo.Preco; +import casa.sotu.organizajogos.api.modelo.Preco.TipoDePreco; + +public class SerializadorDePreco extends StdSerializer { + + protected SerializadorDePreco() { + this(Preco.class); + } + + protected SerializadorDePreco(Class t) { + super(t); + } + + @Override + public void serialize(Preco preco, JsonGenerator generator, SerializerProvider provider) throws IOException { + if (preco.tipo() == TipoDePreco.VALOR) { + generator.writeString(preco.valor().toString()); + } else { + generator.writeString(preco.tipo().name()); + } + } + +} diff --git a/src/main/java/casa/sotu/organizajogos/api/modelo/Preco.java b/src/main/java/casa/sotu/organizajogos/api/modelo/Preco.java index da7d061..7a5416d 100644 --- a/src/main/java/casa/sotu/organizajogos/api/modelo/Preco.java +++ b/src/main/java/casa/sotu/organizajogos/api/modelo/Preco.java @@ -2,7 +2,12 @@ package casa.sotu.organizajogos.api.modelo; import java.math.BigDecimal; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; + import casa.sotu.organizajogos.api.excecao.PrecoInvalidoExcecao; +import casa.sotu.organizajogos.api.json.DesserializadorDePreco; +import casa.sotu.organizajogos.api.json.SerializadorDePreco; import jakarta.persistence.Embeddable; import jakarta.persistence.EnumType; import jakarta.persistence.Enumerated; @@ -10,6 +15,8 @@ import jakarta.validation.constraints.Min; import jakarta.validation.constraints.NotNull; @Embeddable +@JsonSerialize(using = SerializadorDePreco.class) +@JsonDeserialize(using = DesserializadorDePreco.class) public record Preco( @Min(0) BigDecimal valor, @NotNull @Enumerated(EnumType.STRING) TipoDePreco tipo) {