Add admin chat endpoint and request schemas for private messages, party messages, and punishments
This commit is contained in:
@@ -72,6 +72,8 @@ public class SecurityConfig {
|
|||||||
.requestMatchers("/api/history/admin/**").hasAuthority(PermissionClaimDto.HEAD_MOD.getValue())
|
.requestMatchers("/api/history/admin/**").hasAuthority(PermissionClaimDto.HEAD_MOD.getValue())
|
||||||
.requestMatchers("/api/login/userLogin/**").permitAll()
|
.requestMatchers("/api/login/userLogin/**").permitAll()
|
||||||
.requestMatchers("/api/site/chat/**").authenticated()
|
.requestMatchers("/api/site/chat/**").authenticated()
|
||||||
|
.requestMatchers("/api/site/chat/send-admin-chat/**").hasAnyAuthority(PermissionClaimDto.HEAD_MOD.getValue(), PermissionClaimDto.MOD.getValue())
|
||||||
|
.requestMatchers("/api/site/chat/punish/**").hasAnyAuthority(PermissionClaimDto.HEAD_MOD.getValue(), PermissionClaimDto.MOD.getValue())
|
||||||
.requestMatchers("/api/chat/server/send/**").permitAll()
|
.requestMatchers("/api/chat/server/send/**").permitAll()
|
||||||
.anyRequest().permitAll()
|
.anyRequest().permitAll()
|
||||||
)
|
)
|
||||||
|
|||||||
+47
-11
@@ -2,9 +2,19 @@ package com.alttd.altitudeweb.controllers.chat;
|
|||||||
|
|
||||||
import com.alttd.altitudeweb.api.ServerMessageApi;
|
import com.alttd.altitudeweb.api.ServerMessageApi;
|
||||||
import com.alttd.altitudeweb.controllers.data_from_auth.AuthenticatedUuid;
|
import com.alttd.altitudeweb.controllers.data_from_auth.AuthenticatedUuid;
|
||||||
|
import com.alttd.altitudeweb.model.PartyMessageRequestDto;
|
||||||
|
import com.alttd.altitudeweb.model.PrivateMessageRequestDto;
|
||||||
|
import com.alttd.altitudeweb.model.PunishRequestDto;
|
||||||
import com.alttd.altitudeweb.model.ServerMessageRequestDto;
|
import com.alttd.altitudeweb.model.ServerMessageRequestDto;
|
||||||
import com.alttd.altitudeweb.services.chat.to_server.ServerMessageService;
|
import com.alttd.altitudeweb.services.chat.to_server.ServerMessageService;
|
||||||
import com.alttd.altitudeweb.services.chat.to_server.data.ChatFromWeb;
|
import com.alttd.altitudeweb.services.chat.to_server.data.ChatFromWeb;
|
||||||
|
import com.alttd.altitudeweb.services.chat.to_server.data.PartyChatFromWeb;
|
||||||
|
import com.alttd.altitudeweb.services.chat.to_server.data.PrivateChatFromWeb;
|
||||||
|
import com.alttd.altitudeweb.services.chat.to_server.data.PunishFromWeb;
|
||||||
|
import com.alttd.altitudeweb.services.chat.to_server.mappers.ChatFromWebMapper;
|
||||||
|
import com.alttd.altitudeweb.services.chat.to_server.mappers.PartyChatFromWebMapper;
|
||||||
|
import com.alttd.altitudeweb.services.chat.to_server.mappers.PrivateChatFromWebMapper;
|
||||||
|
import com.alttd.altitudeweb.services.chat.to_server.mappers.PunishFromWebMapper;
|
||||||
import com.fasterxml.jackson.core.JsonProcessingException;
|
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
@@ -34,21 +44,47 @@ public class ServerMessageController implements ServerMessageApi {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ResponseEntity<Void> sendServerMessage(String server, ServerMessageRequestDto serverMessageRequestDto) {
|
public ResponseEntity<Void> punishPlayer(String server, PunishRequestDto punishRequestDto) throws Exception {
|
||||||
UUID authenticatedUserUuid = authenticatedUuid.getAuthenticatedUserUuid();
|
validateUser(punishRequestDto.getExecutor());
|
||||||
|
return send(server, "web_punish", PunishFromWebMapper.fromDto(punishRequestDto));
|
||||||
|
}
|
||||||
|
|
||||||
if (!authenticatedUserUuid.equals(serverMessageRequestDto.getUuid())) {
|
@Override
|
||||||
|
public ResponseEntity<Void> sendAdminChat(String server, ServerMessageRequestDto serverMessageRequestDto) {
|
||||||
|
validateUser(serverMessageRequestDto.getUuid());
|
||||||
|
return send(server, "web_admin_chat", ChatFromWebMapper.fromDto(serverMessageRequestDto));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ResponseEntity<Void> sendPartyMessage(PartyMessageRequestDto partyMessageRequestDto) {
|
||||||
|
validateUser(partyMessageRequestDto.getFrom());
|
||||||
|
return send("proxy", "web_party_chat", PartyChatFromWebMapper.fromDto(partyMessageRequestDto));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ResponseEntity<Void> sendPrivateMessage(PrivateMessageRequestDto privateMessageRequestDto) {
|
||||||
|
validateUser(privateMessageRequestDto.getFrom());
|
||||||
|
return send("proxy", "web_private_chat", PrivateChatFromWebMapper.fromDto(privateMessageRequestDto));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ResponseEntity<Void> sendServerMessage(String server, ServerMessageRequestDto serverMessageRequestDto) {
|
||||||
|
validateUser(serverMessageRequestDto.getUuid());
|
||||||
|
|
||||||
|
//TODO [Stijn] [2026-08-02]: Validate the user can send a message in this server (or do that in chat)
|
||||||
|
return send(server, "web_chat", ChatFromWebMapper.fromDto(serverMessageRequestDto));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void validateUser(UUID uuid) {
|
||||||
|
UUID authenticatedUserUuid = authenticatedUuid.getAuthenticatedUserUuid();
|
||||||
|
if (!authenticatedUserUuid.equals(uuid)) {
|
||||||
throw new ResponseStatusException(HttpStatus.FORBIDDEN, "Cannot send message as another user");
|
throw new ResponseStatusException(HttpStatus.FORBIDDEN, "Cannot send message as another user");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ChatFromWeb chatFromWeb = ChatFromWeb.builder()
|
private ResponseEntity<Void> send(String server, String channel, Object data) {
|
||||||
.sender(serverMessageRequestDto.getUuid())
|
String json = toJson(data);
|
||||||
.message(serverMessageRequestDto.getMessage())
|
if (serverMessageService.sendMessage(server, channel, json)) {
|
||||||
.build();
|
|
||||||
|
|
||||||
String json = toJson(chatFromWeb);
|
|
||||||
//TODO [Stijn] [2026-08-02]: Validate the user can send a message in this server (or do that in chat)
|
|
||||||
if (serverMessageService.sendMessage(server, "web_chat", json)) {
|
|
||||||
return new ResponseEntity<>(HttpStatus.ACCEPTED);
|
return new ResponseEntity<>(HttpStatus.ACCEPTED);
|
||||||
} else {
|
} else {
|
||||||
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
|
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
|
||||||
|
|||||||
+16
@@ -0,0 +1,16 @@
|
|||||||
|
package com.alttd.altitudeweb.services.chat.to_server.data;
|
||||||
|
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
@Builder
|
||||||
|
@Getter
|
||||||
|
public class PartyChatFromWeb {
|
||||||
|
|
||||||
|
private final UUID sender;
|
||||||
|
private final String message;
|
||||||
|
private final String partyId;
|
||||||
|
|
||||||
|
}
|
||||||
+16
@@ -0,0 +1,16 @@
|
|||||||
|
package com.alttd.altitudeweb.services.chat.to_server.data;
|
||||||
|
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
@Builder
|
||||||
|
@Getter
|
||||||
|
public class PrivateChatFromWeb {
|
||||||
|
|
||||||
|
private final UUID sender;
|
||||||
|
private final String message;
|
||||||
|
private final UUID recipient;
|
||||||
|
|
||||||
|
}
|
||||||
+18
@@ -0,0 +1,18 @@
|
|||||||
|
package com.alttd.altitudeweb.services.chat.to_server.data;
|
||||||
|
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
@Builder
|
||||||
|
@Getter
|
||||||
|
public class PunishFromWeb {
|
||||||
|
|
||||||
|
private final UUID executor;
|
||||||
|
private final UUID target;
|
||||||
|
private final String type;
|
||||||
|
private final String reason;
|
||||||
|
private final String time;
|
||||||
|
|
||||||
|
}
|
||||||
+18
@@ -0,0 +1,18 @@
|
|||||||
|
package com.alttd.altitudeweb.services.chat.to_server.mappers;
|
||||||
|
|
||||||
|
import com.alttd.altitudeweb.model.ServerMessageRequestDto;
|
||||||
|
import com.alttd.altitudeweb.services.chat.to_server.data.ChatFromWeb;
|
||||||
|
import lombok.experimental.UtilityClass;
|
||||||
|
|
||||||
|
@UtilityClass
|
||||||
|
public class ChatFromWebMapper {
|
||||||
|
|
||||||
|
public static ChatFromWeb fromDto(ServerMessageRequestDto dto) {
|
||||||
|
return ChatFromWeb.builder()
|
||||||
|
.sender(dto.getUuid())
|
||||||
|
.message(dto.getMessage())
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
+18
@@ -0,0 +1,18 @@
|
|||||||
|
package com.alttd.altitudeweb.services.chat.to_server.mappers;
|
||||||
|
|
||||||
|
import com.alttd.altitudeweb.model.PartyMessageRequestDto;
|
||||||
|
import com.alttd.altitudeweb.services.chat.to_server.data.PartyChatFromWeb;
|
||||||
|
import lombok.experimental.UtilityClass;
|
||||||
|
|
||||||
|
@UtilityClass
|
||||||
|
public class PartyChatFromWebMapper {
|
||||||
|
|
||||||
|
public static PartyChatFromWeb fromDto(PartyMessageRequestDto dto) {
|
||||||
|
return PartyChatFromWeb.builder()
|
||||||
|
.sender(dto.getFrom())
|
||||||
|
.message(dto.getMessage())
|
||||||
|
.partyId(dto.getPartyId())
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+18
@@ -0,0 +1,18 @@
|
|||||||
|
package com.alttd.altitudeweb.services.chat.to_server.mappers;
|
||||||
|
|
||||||
|
import com.alttd.altitudeweb.model.PrivateMessageRequestDto;
|
||||||
|
import com.alttd.altitudeweb.services.chat.to_server.data.PrivateChatFromWeb;
|
||||||
|
import lombok.experimental.UtilityClass;
|
||||||
|
|
||||||
|
@UtilityClass
|
||||||
|
public class PrivateChatFromWebMapper {
|
||||||
|
|
||||||
|
public static PrivateChatFromWeb fromDto(PrivateMessageRequestDto dto) {
|
||||||
|
return PrivateChatFromWeb.builder()
|
||||||
|
.sender(dto.getFrom())
|
||||||
|
.message(dto.getMessage())
|
||||||
|
.recipient(dto.getTo())
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+20
@@ -0,0 +1,20 @@
|
|||||||
|
package com.alttd.altitudeweb.services.chat.to_server.mappers;
|
||||||
|
|
||||||
|
import com.alttd.altitudeweb.model.PunishRequestDto;
|
||||||
|
import com.alttd.altitudeweb.services.chat.to_server.data.PunishFromWeb;
|
||||||
|
import lombok.experimental.UtilityClass;
|
||||||
|
|
||||||
|
@UtilityClass
|
||||||
|
public class PunishFromWebMapper {
|
||||||
|
|
||||||
|
public static PunishFromWeb fromDto(PunishRequestDto dto) {
|
||||||
|
return PunishFromWeb.builder()
|
||||||
|
.executor(dto.getExecutor())
|
||||||
|
.target(dto.getTarget())
|
||||||
|
.type(dto.getType().getValue())
|
||||||
|
.reason(dto.getReason())
|
||||||
|
.time(dto.getTime())
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -107,3 +107,11 @@ paths:
|
|||||||
$ref: './schemas/chat_info/chat_info.yml#/UserName'
|
$ref: './schemas/chat_info/chat_info.yml#/UserName'
|
||||||
/api/site/chat/send-message/{server}:
|
/api/site/chat/send-message/{server}:
|
||||||
$ref: './schemas/server-message/server-message.yml#/sendServerMessage'
|
$ref: './schemas/server-message/server-message.yml#/sendServerMessage'
|
||||||
|
/api/site/chat/send-admin-chat/{server}:
|
||||||
|
$ref: './schemas/server-message/server-message.yml#/sendAdminChat'
|
||||||
|
/api/site/chat/send-private-message:
|
||||||
|
$ref: './schemas/server-message/server-message.yml#/sendPrivateMessage'
|
||||||
|
/api/site/chat/send-party-message:
|
||||||
|
$ref: './schemas/server-message/server-message.yml#/sendPartyMessage'
|
||||||
|
/api/site/chat/punish/{server}:
|
||||||
|
$ref: './schemas/server-message/server-message.yml#/punishPlayer'
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ sendServerMessage:
|
|||||||
sendAdminChat:
|
sendAdminChat:
|
||||||
post:
|
post:
|
||||||
tags:
|
tags:
|
||||||
- admin-chat
|
- server-message
|
||||||
summary: Send an admin chat to a specific server
|
summary: Send an admin chat to a specific server
|
||||||
operationId: sendAdminChat
|
operationId: sendAdminChat
|
||||||
parameters:
|
parameters:
|
||||||
@@ -40,6 +40,61 @@ sendAdminChat:
|
|||||||
description: Server not found or not connected
|
description: Server not found or not connected
|
||||||
'400':
|
'400':
|
||||||
description: Invalid request
|
description: Invalid request
|
||||||
|
sendPrivateMessage:
|
||||||
|
post:
|
||||||
|
tags:
|
||||||
|
- server-message
|
||||||
|
summary: Send a private message
|
||||||
|
operationId: sendPrivateMessage
|
||||||
|
requestBody:
|
||||||
|
required: true
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/PrivateMessageRequest'
|
||||||
|
responses:
|
||||||
|
'202':
|
||||||
|
description: Message accepted and sent
|
||||||
|
'400':
|
||||||
|
description: Invalid request
|
||||||
|
sendPartyMessage:
|
||||||
|
post:
|
||||||
|
tags:
|
||||||
|
- server-message
|
||||||
|
summary: Send a party message
|
||||||
|
operationId: sendPartyMessage
|
||||||
|
requestBody:
|
||||||
|
required: true
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/PartyMessageRequest'
|
||||||
|
responses:
|
||||||
|
'202':
|
||||||
|
description: Message accepted and sent
|
||||||
|
'400':
|
||||||
|
description: Invalid request
|
||||||
|
punishPlayer:
|
||||||
|
post:
|
||||||
|
tags:
|
||||||
|
- server-message
|
||||||
|
summary: Punish a player on a specific server
|
||||||
|
operationId: punishPlayer
|
||||||
|
parameters:
|
||||||
|
- $ref: '#/components/parameters/Server'
|
||||||
|
requestBody:
|
||||||
|
required: true
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/PunishRequest'
|
||||||
|
responses:
|
||||||
|
'202':
|
||||||
|
description: Punishment accepted and applied
|
||||||
|
'404':
|
||||||
|
description: Server not found or not connected
|
||||||
|
'400':
|
||||||
|
description: Invalid request
|
||||||
components:
|
components:
|
||||||
parameters:
|
parameters:
|
||||||
Server:
|
Server:
|
||||||
|
|||||||
Reference in New Issue
Block a user