Contract.java

package access.model;

import com.fasterxml.jackson.annotation.JsonProperty;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.OneToOne;
import jakarta.validation.constraints.NotNull;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.hibernate.Hibernate;

import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;

@Entity(name = "contracts")
@NoArgsConstructor
@Getter
@Setter
public class Contract {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "provider_name")
    @NotNull
    private String providerName;

    @Column(name = "organization_name")
    @NotNull
    private String organizationName;

    @Column(name = "signee_name")
    @NotNull
    private String signeeName;

    @Column(name = "signee_title")
    private String signeeTitle;

    @Column
    private String address;

    @Column
    private String country;

    @Column
    private String telephone;

    @Column
    @NotNull
    private String email;

    @Column(name = "signed_contract")
    private boolean signedContract;

    @Column(name = "ticket_key")
    private String ticketKey;

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "organization_id")
    @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
    private Organization organization;

    //We need organization info, but we don't want cyclic JSON deserialization
    @JsonProperty(access = JsonProperty.Access.READ_ONLY, value = "organization")
    public Map<String, Serializable> getOrganizationInfo() {
        Organization org = getOrganization();
        Map<String, Serializable> organizationInfo = new HashMap<>();
        if (org != null && Hibernate.isInitialized(org)) {
            organizationInfo.put("id", org.getId());
            organizationInfo.put("name", org.getName());
        }
        return organizationInfo;
    }

}