JoinRequest.java

package access.model;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

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

@Entity(name = "join_requests")
@NoArgsConstructor
@Getter
@Setter
public class JoinRequest implements NameHolder {

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

    @Enumerated(EnumType.STRING)
    private Language language;

    @Column
    private String message;

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

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "user_id")
    @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
    private User user;

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

    @Transient
    private String transientName;

    public JoinRequest(User user, Organization organization, String message, Language language) {
        this.user = user;
        this.organization = organization;
        this.message = message;
        this.language = language;
        this.createdAt = Instant.now();
        this.transientName = getClass().getName().concat(organization.getName()).concat(user.getName());
    }

    //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 organization = getOrganization();
        Map<String, Serializable> organizationInfo = new HashMap<>();
        if (organization != null) {
            organizationInfo.put("id", organization.getId());
            organizationInfo.put("name", organization.getName());
        }
        return organizationInfo;
    }

    //We need user info, but we don't want cyclic JSON deserialization
    @JsonProperty(access = JsonProperty.Access.READ_ONLY, value = "user")
    public Map<String, Serializable> getUserInfo() {
        User user = getUser();
        Map<String, Serializable> userInfo = new HashMap<>();
        if (user != null) {
            userInfo.put("id", user.getId());
            userInfo.put("name", user.getName());
            userInfo.put("email", user.getEmail());
            userInfo.put("schacHomeOrganization", user.getSchacHomeOrganization());
        }
        return userInfo;
    }

    @Override
    @Transient
    @JsonIgnore
    public String getName() {
        return transientName;
    }
}