Untitled

 avatar
unknown
plain_text
3 months ago
2.5 kB
8
Indexable
package pl.chunklock.core.database.entity.impl;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;
import jakarta.persistence.UniqueConstraint;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.experimental.FieldDefaults;
import pl.chunklock.core.database.cache.EntityCache;
import pl.chunklock.core.database.entity.BaseEntity;

@Entity
@Getter
@Setter
@NoArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE)
@Table(name = "island_upgrades", uniqueConstraints = {
    @UniqueConstraint(columnNames = {"islandId", "upgradeId"})
})
public class IslandUpgrade extends BaseEntity {

  public static final String CACHE_BY_ISLAND = "upgradeByIslandId";
  public static final String CACHE_BY_ISLAND_AND_UPGRADE = "upgradeByIslandAndUpgradeId";

  @Column(nullable = false)
  long islandId;

  @Column(nullable = false)
  String upgradeId;

  @Column(nullable = false)
  int level;

  public static List<IslandUpgrade> findByIslandId(final long islandId) {
    return findCached(CACHE_BY_ISLAND, islandId, () ->
        Optional.of(
            findAll(
                IslandUpgrade.class,
                "FROM IslandUpgrade WHERE islandId = :islandId",
                Map.of("islandId", islandId),
                Integer.MAX_VALUE
            )
        )
    ).orElseGet(List::of);
  }

  public static Optional<IslandUpgrade> findByIslandAndUpgradeId(final long islandId,
      final String upgradeId) {
    final String key = islandId + ":" + upgradeId;
    return findCached(CACHE_BY_ISLAND_AND_UPGRADE, key, () ->
        findSingle(
            IslandUpgrade.class,
            "FROM IslandUpgrade WHERE islandId = :islandId AND upgradeId = :upgradeId",
            Map.of("islandId", islandId, "upgradeId", upgradeId)
        )
    );
  }

  @Override
  protected void onCacheUpdate() {
    namedCache(CACHE_BY_ISLAND_AND_UPGRADE).put(islandId + ":" + upgradeId, this);
    namedCache(CACHE_BY_ISLAND).invalidate(islandId);
  }

  @Override
  protected void onCacheEvict() {
    namedCache(CACHE_BY_ISLAND_AND_UPGRADE).invalidate(islandId + ":" + upgradeId);
    namedCache(CACHE_BY_ISLAND).invalidate(islandId);
  }
}
Editor is loading...
Leave a Comment