ApplicationMembership.java

package access.model;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import jakarta.persistence.*;
import jakarta.validation.constraints.NotNull;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.hibernate.Hibernate;

import java.time.Instant;

@Entity(name = "application_memberships")
@NoArgsConstructor
@Getter
@Setter
public class ApplicationMembership implements NameHolder {

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

    @Column(name = "created_at")
    private Instant createdAt;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "application_id")
    @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
    private Application application;


    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "organization_membership_id")
    @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
    private OrganizationMembership organizationMembership;

    @Enumerated(EnumType.STRING)
    @Column
    @NotNull
    private Authority authority = Authority.MEMBER;

    public ApplicationMembership(Application application, OrganizationMembership organizationMembership) {
        this.application = application;
        this.organizationMembership = organizationMembership;
        this.createdAt = Instant.now();
    }

    @Override
    @Transient
    @JsonIgnore
    public String getName() {
        return getClass().getName().concat(application.getName()).concat(authority.name());
    }

    //We need info, about the application
    @JsonProperty(access = JsonProperty.Access.READ_ONLY, value = "applicationIdentifier")
    public Long getApplicationIndentifier() {
        Application application = getApplication();
        if (application != null && Hibernate.isInitialized(application)) {
            return application.getId();
        }
        return null;
    }

    //We need info, about the application
    @JsonProperty(access = JsonProperty.Access.READ_ONLY, value = "applicationName")
    public String getApplicationName() {
        Application application = getApplication();
        if (application != null && Hibernate.isInitialized(application)) {
            return application.getName();
        }
        return null;
    }

    @JsonProperty(value = "organizationMembershipIdentifier", access = JsonProperty.Access.READ_ONLY)
    public Long getOrganizationMembershipInfo() {
        OrganizationMembership organizationMembership = this.getOrganizationMembership();
        Hibernate.initialize(organizationMembership);
        return organizationMembership.getId();
    }

}