HouseholdMemberModel.java

package com.hwhub.backend.domain.model;

import com.hwhub.backend.domain.enums.HouseholdMemberStatus;
import lombok.Getter;

@Getter
public class HouseholdMemberModel {

  private static final String ROLE_MEMBER = "MEMBER";

  private Long householdId;
  private Long userId;
  private String displayName;
  private String profileImageKey;
  private String iconUrl;
  private String nickname;
  private String status;
  private String role;

  /**
   * 全プロパティを引数に取るコンストラクタ。
   *
   * @param householdId 世帯ID
   * @param userId ユーザID
   * @param displayName ユーザの表示名
   * @param profileImageKey ユーザのプロフィール画像キー
   * @param iconUrl プロフィール画像のUTL
   * @param nickname ニックネーム
   * @param status ステータス
   * @param role ロール
   */
  private HouseholdMemberModel(
      Long householdId,
      Long userId,
      String displayName,
      String profileImageKey,
      String iconUrl,
      String nickname,
      String status,
      String role) {
    this.householdId = householdId;
    this.userId = userId;
    this.displayName = displayName;
    this.profileImageKey = profileImageKey;
    this.iconUrl = iconUrl;
    this.nickname = nickname;
    this.status = status;
    this.role = role;
  }

  /**
   * 再構築・永続化用。infrastructure層からのみ呼び出されることを想定。
   *
   * @param householdId 世帯ID
   * @param userId ユーザID
   * @param displayName ユーザの表示名
   * @param profileImageKey ユーザのプロフィール画像キー
   * @param iconUrl プロフィール画像のUTL
   * @param nickname ニックネーム
   * @param status ステータス
   * @param role ロール
   * @return インスタンスを返す。
   */
  public static HouseholdMemberModel reconstruct(
      Long householdId,
      Long userId,
      String displayName,
      String profileImageKey,
      String iconUrl,
      String nickname,
      String status,
      String role) {
    return new HouseholdMemberModel(
        householdId, userId, displayName, profileImageKey, iconUrl, nickname, status, role);
  }

  /**
   * 新規追加時のファクトリメソッド。
   *
   * @param householdId 世帯ID
   * @param userId ユーザID
   * @param displayName ユーザの表示名
   * @return インスタンスを返す。
   */
  public static HouseholdMemberModel create(Long householdId, Long userId, String displayName) {
    return new HouseholdMemberModel(
        householdId,
        userId,
        displayName,
        null,
        null,
        displayName,
        HouseholdMemberStatus.ACTIVE.getCode(),
        ROLE_MEMBER);
  }

  /** 世帯に再参加する。 */
  public void rejoin() {
    this.status = HouseholdMemberStatus.ACTIVE.getCode();
  }

  /** 世帯から離脱する。 */
  public void leave() {
    this.status = HouseholdMemberStatus.LEFT.getCode();
  }

  /**
   * アイコンのURLを変更する。Infrastructure層で生成後に設定すること。
   *
   * @param iconUrl アイコンのURL
   */
  public void changeIconUrl(String iconUrl) {
    this.iconUrl = iconUrl;
  }

  /**
   * ニックネームを変更する。
   *
   * @param nickname
   */
  public void changeNickname(String nickname) {
    this.nickname = nickname;
  }
}