AnnouncementConverter.java

package com.hwhub.backend.infrastructure.mybatis.converter;

import com.hwhub.backend.domain.model.AnnouncementModel;
import com.hwhub.backend.infrastructure.mybatis.generated.entity.MAnnouncement;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Date;

/** {@link MAnnouncement} エンティティを {@link AnnouncementModel} に変換するコンバーター。 */
public final class AnnouncementConverter {

  private AnnouncementConverter() {}

  /**
   * エンティティをドメインモデルに変換する。
   *
   * @param entity MyBatis Generator 生成エンティティ
   * @return AnnouncementModel。entity が null の場合は null を返す。
   */
  public static AnnouncementModel toModel(MAnnouncement entity) {
    if (entity == null) {
      return null;
    }

    return AnnouncementModel.reconstruct(
        entity.getAnnouncementId(),
        entity.getTitleJa(),
        entity.getTitleEn(),
        entity.getTitleEs(),
        entity.getBodyJa(),
        entity.getBodyEn(),
        entity.getBodyEs(),
        entity.getSeverity(),
        entity.getTargetScope(),
        toLocalDateTime(entity.getStartAt()),
        toLocalDateTime(entity.getEndAt()));
  }

  /**
   * ドメインモデルをエンティティに変換する。
   *
   * @param model AnnouncementModel
   * @return MAnnouncement エンティティ
   */
  public static MAnnouncement toEntity(AnnouncementModel model) {
    MAnnouncement entity = new MAnnouncement();
    entity.setAnnouncementId(model.getId());
    entity.setTitleJa(model.getTitleJa());
    entity.setTitleEn(model.getTitleEn());
    entity.setTitleEs(model.getTitleEs());
    entity.setBodyJa(model.getBodyJa());
    entity.setBodyEn(model.getBodyEn());
    entity.setBodyEs(model.getBodyEs());
    entity.setSeverity(model.getSeverity());
    entity.setTargetScope(model.getTargetScope());
    entity.setStartAt(toDate(model.getStartAt()));
    entity.setEndAt(toDate(model.getEndAt()));
    return entity;
  }

  private static LocalDateTime toLocalDateTime(Date date) {
    if (date == null) {
      return null;
    }
    return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
  }

  private static Date toDate(LocalDateTime localDateTime) {
    if (localDateTime == null) {
      return null;
    }
    return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
  }
}