Group.java

package ntnu.idatt2016.v233.SmartMat.entity.group;


import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.OnDelete;
import org.hibernate.annotations.OnDeleteAction;

import java.util.ArrayList;
import java.util.List;

/**
 * Group is an entity class representing a user group in the system.
 *
 * @author Stian Lyng, Anders Austlid, Birk, Pedro
 * @version 1.3
 */

@NoArgsConstructor
@AllArgsConstructor
@Builder
@Entity(name = "groups")
@Data
public class Group {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "group_id")
    long groupId;

    @Column(name = "level")
    long level;

    @Column(name = "points")
    long points;
    
    @Column(name = "group_name")
    String groupName;

    @Column(name = "link_code")
    String linkCode;

    @Column(name = "is_open")
    Boolean open;

    @OneToOne(cascade = CascadeType.ALL, mappedBy = "group")
    @OnDelete(action = OnDeleteAction.CASCADE)
    @JsonIgnoreProperties("groupId")
    private ShoppingList shoppingList;


    @OneToMany(cascade = {CascadeType.ALL},
            fetch = FetchType.LAZY, mappedBy = "group",
            orphanRemoval = true
    )
    @JsonIgnoreProperties("group")
    private List<UserGroupAsso> user = new ArrayList<>();


    public void addUser(UserGroupAsso userGroupTable){
        if (this.user == null) {
            this.user = new ArrayList<>();
        }

        this.user.add(userGroupTable);
    }

    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "group")
    @JsonIgnoreProperties("group")
    @OnDelete(action = OnDeleteAction.CASCADE)
    private Fridge fridge;

    @ManyToMany(cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH}, fetch = FetchType.LAZY,
            mappedBy = "groups")
    @JsonIgnoreProperties({"groups"})
    private List<Achievement> achievements;

    /**
     * Checks if two objects are equal
     * @param o the object to compare to
     * @return true if the objects are equal, false otherwise
     */
    @Override
    public boolean equals(Object o){
        if(o == this){
            return true;
        }
        if(!(o instanceof Group group)){
            return false;
        }
        return group.getGroupId() == this.getGroupId();
    }

    /**
     * Gets the hashcode of the object
     * @return the hashcode of the object
     */
    @Override
    public int hashCode(){
        return Long.hashCode(this.getGroupId());
    }

}