Skip to content

Commit

Permalink
Guild user removal
Browse files Browse the repository at this point in the history
Allow DELETE request in cors configuration
  • Loading branch information
Alf-Melmac committed Jan 28, 2023
1 parent ef71736 commit c07b4ce
Show file tree
Hide file tree
Showing 11 changed files with 76 additions and 14 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedMethods(GET.name(), POST.name(), PUT.name())
.allowedMethods(GET.name(), POST.name(), PUT.name(), DELETE.name())
.allowedOrigins(allowedOrigins)
.allowCredentials(true);
}
Expand Down
14 changes: 9 additions & 5 deletions src/main/java/de/webalf/slotbot/controller/GuildController.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,8 @@
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

import java.util.List;

Expand Down Expand Up @@ -43,8 +41,14 @@ public GuildDetailsDto getGuild(@PathVariable(value = "id") long guildId) {
}

@GetMapping("/{id}/users")
public List<UserInGuildDto> getGuildUser(@PathVariable(value = "id") long guildId) {
public List<UserInGuildDto> getGuildUsers(@PathVariable(value = "id") long guildId) {
final Guild guild = guildService.findByDiscordGuild(guildId);
return userInGuildAssembler.toDtoList(guildUsersService.getUsers(guild), guild);
}

@DeleteMapping("/{id}/users/{userId}")
@PreAuthorize("@permissionChecker.hasGuildAdminPrivileges(#guildId)")
public void deleteGuildUser(@PathVariable(value = "id") long guildId, @PathVariable(value = "userId") long userId) {
guildUsersService.remove(guildId, userId);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,6 @@ public interface GuildUsersRepository extends SuperIdEntityJpaRepository<GuildUs
List<GuildUsers> findByGuild(Guild guild);

Optional<GuildUsers> findByGuildAndUser(Guild guild, User user);

void deleteByGuildAndUser(Guild guild, User user);
}
11 changes: 11 additions & 0 deletions src/main/java/de/webalf/slotbot/service/GuildService.java
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,17 @@ public Guild find(long id) {
.orElseGet(() -> guildRepository.save(Guild.builder().id(id).build()));
}

/**
* Returns the guild associated with the given guildId
*
* @param guildId to find guild for
* @return Guild found by id
* @throws ResourceNotFoundException if no guild with this guildId could be found
*/
Guild findExisting(long guildId) {
return guildRepository.findById(guildId).orElseThrow(ResourceNotFoundException::new);
}

public Guild findByDiscordGuild(long discordGuild) {
return guildRepository.findById(discordGuild).orElseThrow(ResourceNotFoundException::new);
}
Expand Down
11 changes: 9 additions & 2 deletions src/main/java/de/webalf/slotbot/service/GuildUsersService.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,11 +27,18 @@ public List<User> getUsers(Guild guild) {
return guildUsersRepository.findByGuild(guild).stream().map(GuildUsers::getUser).toList();
}

public GuildUsers add(long userId, long guildId) {
final User user = userService.find(userId);
public GuildUsers add(long guildId, long userId) {
final Guild guild = guildService.find(guildId);
final User user = userService.find(userId);

return guildUsersRepository.findByGuildAndUser(guild, user)
.orElseGet(() -> guildUsersRepository.save(GuildUsers.builder().user(user).guild(guild).build()));
}

public void remove(long guildId, long userId) {
final User user = userService.findExisting(userId);
final Guild guild = guildService.findExisting(guildId);

guildUsersRepository.deleteByGuildAndUser(guild, user);
}
}
15 changes: 15 additions & 0 deletions src/main/java/de/webalf/slotbot/service/UserService.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package de.webalf.slotbot.service;

import de.webalf.slotbot.assembler.UserAssembler;
import de.webalf.slotbot.exception.ResourceNotFoundException;
import de.webalf.slotbot.model.Guild;
import de.webalf.slotbot.model.User;
import de.webalf.slotbot.model.dtos.UserDto;
Expand Down Expand Up @@ -32,10 +33,24 @@ User find(@NonNull UserDto userDto) {
.orElseGet(() -> userServiceImpl.createUser(userDto));
}

/**
* @see UserServiceImpl#find(long)
*/
public User find(long id) {
return userServiceImpl.find(id);
}

/**
* Returns the user associated with the given userId
*
* @param id to find user for
* @return User found by id
* @throws ResourceNotFoundException if no user with this userId could be found
*/
User findExisting(long id) {
return userRepository.findById(id).orElseThrow(ResourceNotFoundException::new);
}

public User getDefaultUser() {
return find(User.DEFAULT_USER_ID);
}
Expand Down
6 changes: 6 additions & 0 deletions src/main/java/de/webalf/slotbot/service/UserServiceImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,12 @@ User createUser(@NonNull UserDto userDto) {
return userRepository.save(user);
}

/**
* Returns the user associated with the given userId. Creates a new user if it doesn't already exist.
*
* @param id to find or create user for
* @return User found by id
*/
User find(long id) {
return userRepository.findById(id)
.orElseGet(() -> createUser(UserDto.builder().id(LongUtils.toString(id)).build()));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
public class GuildUsersBotService {
private final GuildUsersService guildUsersService;

public void add(long userId, long guildId) {
guildUsersService.add(userId, guildId);
public void add(long guildId, long userId) {
guildUsersService.add(guildId, userId);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ public void perform(@NonNull UserContextInteractionEvent event, @NonNull Discord

final User target = event.getTarget();
//noinspection DataFlowIssue This context menu is only allowed in guilds
guildUsersBotService.add(target.getIdLong(), event.getGuild().getIdLong());
guildUsersBotService.add(event.getGuild().getIdLong(), target.getIdLong());
reply(event, locale.t("bot.context.guild.addUserToGuild.response", target.getAsMention()));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,4 +23,8 @@ public boolean hasEventManagePermissionInCurrentOwnerGuild() {
public boolean hasEventManagePermission(long eventId) {
return PermissionHelper.hasEventManagePermission(eventService.getGuildByEventId(eventId).getId());
}

public boolean hasGuildAdminPrivileges(long guildId) {
return PermissionHelper.hasAdministratorPermission(guildId);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,7 @@
import static de.webalf.slotbot.constant.AuthorizationCheckValues.ROLE_PREFIX;
import static de.webalf.slotbot.model.Guild.GUILD_PLACEHOLDER;
import static de.webalf.slotbot.util.DiscordOAuthUtils.getAttribute;
import static de.webalf.slotbot.util.permissions.ApplicationPermissionHelper.Role.APPLICATION_ROLE_VALUES;
import static de.webalf.slotbot.util.permissions.ApplicationPermissionHelper.Role.EVENT_MANAGE;
import static de.webalf.slotbot.util.permissions.ApplicationPermissionHelper.Role.*;

/**
* @author Alf
Expand Down Expand Up @@ -109,7 +108,21 @@ public static boolean hasPermissionInGuild(@NonNull ApplicationPermissionHelper.
}
}

static boolean hasEventManagePermission(Long guildId) {
/**
* Checks for the {@link ApplicationPermissionHelper.Role#ADMINISTRATOR} role
*
* @see #hasPermissionInGuild(ApplicationPermissionHelper.Role, long)
*/
static boolean hasAdministratorPermission(long guildId) {
return hasPermissionInGuild(ADMINISTRATOR, guildId);
}

/**
* Checks for the {@link ApplicationPermissionHelper.Role#EVENT_MANAGE} role
*
* @see #hasPermissionInGuild(ApplicationPermissionHelper.Role, long)
*/
static boolean hasEventManagePermission(long guildId) {
return hasPermissionInGuild(EVENT_MANAGE, guildId);
}
}

0 comments on commit c07b4ce

Please sign in to comment.