Skip to content
18 changes: 18 additions & 0 deletions src/main/java/com/faforever/api/data/domain/Player.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,21 @@

import com.faforever.api.data.checks.IsEntityOwner;
import com.faforever.api.data.checks.Prefab;
import com.faforever.api.data.hook.PlayerAvatarUpdateHook;
import com.faforever.api.security.elide.permission.AdminModerationReportCheck;
import com.github.jasminb.jsonapi.annotations.Type;
import com.yahoo.elide.annotation.Include;
import com.yahoo.elide.annotation.LifeCycleHookBinding;
import com.yahoo.elide.annotation.ReadPermission;
import com.yahoo.elide.annotation.UpdatePermission;
import lombok.Setter;
import org.hibernate.annotations.BatchSize;

import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToMany;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.OneToMany;
import jakarta.persistence.OneToOne;
import jakarta.persistence.Table;
Expand All @@ -29,9 +34,22 @@ public class Player extends Login {
private ClanMembership clanMembership;
private Set<NameRecord> names;
private Set<AvatarAssignment> avatarAssignments;
private Avatar currentAvatar;
private Set<ModerationReport> reporterOnModerationReports;
private Set<ModerationReport> reportedOnModerationReports;

@UpdatePermission(expression = IsEntityOwner.EXPRESSION)
@LifeCycleHookBinding(
operation = LifeCycleHookBinding.Operation.UPDATE,
phase = LifeCycleHookBinding.TransactionPhase.POSTCOMMIT,
hook = PlayerAvatarUpdateHook.class
)
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "avatar_id")
public Avatar getCurrentAvatar() {
return currentAvatar;
}
Comment thread
coderabbitai[bot] marked this conversation as resolved.

// Permission is managed by ClanMembership class
@UpdatePermission(expression = Prefab.ALL)
@OneToOne(mappedBy = "player")
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package com.faforever.api.data.hook;

import com.faforever.api.config.RabbitConfiguration;
import com.faforever.api.data.domain.Avatar;
import com.faforever.api.data.domain.Player;
import com.yahoo.elide.annotation.LifeCycleHookBinding.Operation;
import com.yahoo.elide.annotation.LifeCycleHookBinding.TransactionPhase;
import com.yahoo.elide.core.lifecycle.LifeCycleHook;
import com.yahoo.elide.core.security.ChangeSpec;
import com.yahoo.elide.core.security.RequestScope;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;
import java.util.Optional;

@Slf4j
@Component
@RequiredArgsConstructor
public class PlayerAvatarUpdateHook implements LifeCycleHook<Player> {

public static final String ROUTING_KEY_PLAYER_AVATAR_UPDATE = "success.player_avatar.update";

private final RabbitTemplate rabbitTemplate;

@Override
public void execute(Operation operation, TransactionPhase phase, Player player, RequestScope requestScope, Optional<ChangeSpec> changes) {
final Avatar avatar = player.getCurrentAvatar();
final Integer avatarId = avatar == null ? null : avatar.getId();

Map<String, Object> payload = new HashMap<>();
payload.put("player_id", player.getId());
payload.put("avatar_id", avatarId);

log.debug("Publishing player_avatar update: {}", payload);
rabbitTemplate.convertAndSend(
RabbitConfiguration.EXCHANGE_FAF_LOBBY,
ROUTING_KEY_PLAYER_AVATAR_UPDATE,
payload
);
}
}
Loading