Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
package com.mtvs.devlinkbackend.guild.controller;

import com.mtvs.devlinkbackend.config.JwtUtil;
import com.mtvs.devlinkbackend.guild.dto.GuildMemberModifyRequestDTO;
import com.mtvs.devlinkbackend.guild.dto.GuildRegistRequestDTO;
import com.mtvs.devlinkbackend.guild.dto.GuildUpdateRequestDTO;
import com.mtvs.devlinkbackend.guild.entity.Guild;
import com.mtvs.devlinkbackend.guild.service.GuildService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/api/guild")
public class GuildController {

private final GuildService guildService;
private final JwtUtil jwtUtil;

public GuildController(GuildService guildService, JwtUtil jwtUtil) {
this.guildService = guildService;
this.jwtUtil = jwtUtil;
}

@Operation(summary = "길드 생성", description = "새로운 길드를 생성합니다.")
@ApiResponses({
@ApiResponse(responseCode = "200", description = "길드가 성공적으로 생성되었습니다."),
@ApiResponse(responseCode = "400", description = "길드 생성 요청이 잘못되었습니다.")
})
@PostMapping
public Guild createGuild(
@RequestBody GuildRegistRequestDTO guildRegistRequestDTO,
@RequestHeader(name = "Authorization") String authorizationHeader) throws Exception {

String accountId = jwtUtil.getSubjectFromTokenWithoutAuth(authorizationHeader);
return guildService.createGuild(guildRegistRequestDTO, accountId);
}

@Operation(summary = "길드 조회", description = "길드 ID로 길드를 조회합니다.")
@ApiResponses({
@ApiResponse(responseCode = "200", description = "길드가 성공적으로 조회되었습니다."),
@ApiResponse(responseCode = "404", description = "길드를 찾을 수 없습니다.")
})
@GetMapping("/{guildId}")
public Guild findGuildByGuildId(@PathVariable Long guildId) {
return guildService.findGuildByGuildId(guildId);
}

@Operation(summary = "길드 이름 검색", description = "이름이 특정 문자열을 포함하는 길드 목록을 조회합니다.")
@ApiResponse(responseCode = "200", description = "길드 목록이 성공적으로 조회되었습니다.")
@GetMapping("/search")
public List<Guild> findGuildsByGuildNameContaining(@RequestParam String guildName) {
return guildService.findGuildsByGuildNameContaining(guildName);
}

@Operation(summary = "사용자가 소유자인 길드 조회", description = "사용자가 소유자인 길드를 조회합니다.")
@ApiResponse(responseCode = "200", description = "길드 목록이 성공적으로 조회되었습니다.")
@GetMapping("/owner")
public List<Guild> findGuildsByOwnerId(
@RequestHeader(name = "Authorization") String authorizationHeader) throws Exception {

String ownerId = jwtUtil.getSubjectFromTokenWithoutAuth(authorizationHeader);
return guildService.findGuildsByOwnerId(ownerId);
}

@Operation(summary = "사용자가 멤버인 길드 조회", description = "사용자가 멤버인 길드를 조회합니다.")
@ApiResponse(responseCode = "200", description = "길드 목록이 성공적으로 조회되었습니다.")
@GetMapping("/member")
public List<Guild> findGuildsByMemberIdContaining(
@RequestHeader(name = "Authorization") String authorizationHeader) throws Exception {

String memberId = jwtUtil.getSubjectFromTokenWithoutAuth(authorizationHeader);
return guildService.findGuildsByMemberIdContaining(memberId);
}

@Operation(summary = "길드 수정", description = "길드 정보를 수정합니다.")
@ApiResponses({
@ApiResponse(responseCode = "200", description = "길드가 성공적으로 수정되었습니다."),
@ApiResponse(responseCode = "403", description = "수정 권한이 없습니다."),
@ApiResponse(responseCode = "404", description = "길드를 찾을 수 없습니다.")
})
@PatchMapping
public Guild updateGuild(
@RequestBody GuildUpdateRequestDTO guildUpdateRequestDTO,
@RequestHeader(name = "Authorization") String authorizationHeader) throws Exception {

String accountId = jwtUtil.getSubjectFromTokenWithoutAuth(authorizationHeader);
return guildService.updateGuild(guildUpdateRequestDTO, accountId);
}

@Operation(summary = "길드 멤버 추가", description = "길드에 멤버를 추가합니다.")
@ApiResponses({
@ApiResponse(responseCode = "200", description = "멤버가 성공적으로 추가되었습니다."),
@ApiResponse(responseCode = "403", description = "추가 권한이 없습니다."),
@ApiResponse(responseCode = "404", description = "길드를 찾을 수 없습니다.")
})
@PostMapping("/member")
public Guild addMemberToGuild(
@RequestBody GuildMemberModifyRequestDTO guildMemberModifyRequestDTO,
@RequestHeader(name = "Authorization") String authorizationHeader) throws Exception {

String accountId = jwtUtil.getSubjectFromTokenWithoutAuth(authorizationHeader);
return guildService.addMemberToGuild(guildMemberModifyRequestDTO, accountId);
}

@Operation(summary = "길드 멤버 제거", description = "길드에서 멤버를 제거합니다.")
@ApiResponses({
@ApiResponse(responseCode = "200", description = "멤버가 성공적으로 제거되었습니다."),
@ApiResponse(responseCode = "403", description = "제거 권한이 없습니다."),
@ApiResponse(responseCode = "404", description = "길드를 찾을 수 없습니다.")
})
@DeleteMapping("/member")
public Guild removeMemberFromGuild(
@RequestBody GuildMemberModifyRequestDTO guildMemberModifyRequestDTO,
@RequestHeader(name = "Authorization") String authorizationHeader) throws Exception {

String accountId = jwtUtil.getSubjectFromTokenWithoutAuth(authorizationHeader);
return guildService.removeMemberToGuild(guildMemberModifyRequestDTO, accountId);
}

@Operation(summary = "길드 삭제", description = "길드를 삭제합니다.")
@ApiResponses({
@ApiResponse(responseCode = "200", description = "길드가 성공적으로 삭제되었습니다."),
@ApiResponse(responseCode = "404", description = "길드를 찾을 수 없습니다.")
})
@DeleteMapping("/{guildId}")
public void deleteGuild(@PathVariable Long guildId) {
guildService.deleteGuild(guildId);
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.mtvs.devlinkbackend.guild.dto;

import lombok.*;

import java.util.List;

@Getter @Setter
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class GuildMemberModifyRequestDTO {
private Long guildId;
private List<String> newMemberList;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.mtvs.devlinkbackend.guild.dto;

import lombok.*;

import java.util.List;

@Getter @Setter
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class GuildRegistRequestDTO {
private String guildName;
private String introduction;
private Long maximumMember;
private List<String> memberList;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.mtvs.devlinkbackend.guild.dto;

import lombok.*;

import java.util.List;

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class GuildUpdateRequestDTO {
private Long guildId;
private String guildName;
private String introduction;
private Long maximumMember;
private List<String> memberList;
private Long channelId;
}
92 changes: 92 additions & 0 deletions src/main/java/com/mtvs/devlinkbackend/guild/entity/Guild.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
package com.mtvs.devlinkbackend.guild.entity;

import jakarta.persistence.*;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.ToString;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

@Table(name = "GUILD")
@Entity(name = "Guild")
@ToString
@NoArgsConstructor
@Getter
public class Guild {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "GUILD_ID")
private Long guildId;

@Column(name = "OWNER_ID")
private String ownerId;

@Column(name = "GUILD_NAME")
private String guildName;

@Column(name = "INTRODUCTION")
private String introduction;

@Column(name = "MAXIMUM_MEMBER")
private Long maximumMember;

@Column(name = "CHANNEL_ID")
private Long channelId;

@ElementCollection
@CollectionTable(name = "GUILD_MEMBER", joinColumns = @JoinColumn(name = "GUILD_ID"))
private List<String> memberList = new ArrayList<>();

@CreationTimestamp
@Column(name = "CREATED_AT", updatable = false)
private LocalDateTime createdAt;

@UpdateTimestamp
@Column(name = "MODIFIED_AT")
private LocalDateTime modifiedAt;

public Guild(String ownerId, String guildName, String introduction, Long maximumMember, List<String> memberList) {
this.ownerId = ownerId;
this.guildName = guildName;
this.introduction = introduction;
this.maximumMember = maximumMember;
this.memberList = new ArrayList<>(memberList);
}

public Guild(String ownerId, String guildName, String introduction, Long maximumMember, List<String> memberList, Long channelId) {
this.ownerId = ownerId;
this.guildName = guildName;
this.introduction = introduction;
this.maximumMember = maximumMember;
this.memberList = new ArrayList<>(memberList);
this.channelId = channelId;
}

public void setOwnerId(String ownerId) {
this.ownerId = ownerId;
}

public void setGuildName(String guildName) {
this.guildName = guildName;
}

public void setIntroduction(String introduction) {
this.introduction = introduction;
}

public void setMaximumMember(Long maximumMember) {
this.maximumMember = maximumMember;
}

public void setChannelId(Long channelId) {
this.channelId = channelId;
}

public void setMemberList(List<String> memberList) {
this.memberList = new ArrayList<>(memberList);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.mtvs.devlinkbackend.guild.repository;

import com.mtvs.devlinkbackend.guild.entity.Guild;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface GuildRepository extends JpaRepository<Guild, Long> {
List<Guild> findGuildsByGuildNameContaining(String guildName);
List<Guild> findGuildsByOwnerId(String ownerId);
@Query("SELECT g FROM Guild g JOIN g.memberList m WHERE m LIKE :memberId")
List<Guild> findGuildsByMemberIdContaining(@Param("memberId") String accountId);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
package com.mtvs.devlinkbackend.guild.service;

import com.mtvs.devlinkbackend.guild.dto.GuildMemberModifyRequestDTO;
import com.mtvs.devlinkbackend.guild.dto.GuildRegistRequestDTO;
import com.mtvs.devlinkbackend.guild.dto.GuildUpdateRequestDTO;
import com.mtvs.devlinkbackend.guild.entity.Guild;
import com.mtvs.devlinkbackend.guild.repository.GuildRepository;
import jakarta.transaction.Transactional;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Optional;

@Service
public class GuildService {

private final GuildRepository guildRepository;

public GuildService(GuildRepository guildRepository) {
this.guildRepository = guildRepository;
}

@Transactional
public Guild createGuild(GuildRegistRequestDTO guildRegistRequestDTO, String accountId) {
return guildRepository.save(new Guild(
accountId,
guildRegistRequestDTO.getGuildName(),
guildRegistRequestDTO.getIntroduction(),
guildRegistRequestDTO.getMaximumMember(),
guildRegistRequestDTO.getMemberList()
));
}

public Guild findGuildByGuildId(Long guildId) {
return guildRepository.findById(guildId).orElse(null);
}

public List<Guild> findGuildsByGuildNameContaining(String guildName) {
return guildRepository.findGuildsByGuildNameContaining(guildName);
}

public List<Guild> findGuildsByOwnerId(String ownerId) {
return guildRepository.findGuildsByOwnerId(ownerId);
}

public List<Guild> findGuildsByMemberIdContaining(String memberId) {
return guildRepository.findGuildsByMemberIdContaining(memberId);
}

@Transactional
public Guild updateGuild(GuildUpdateRequestDTO guildUpdateRequestDTO, String accountId) {
Optional<Guild> guild = guildRepository.findById(guildUpdateRequestDTO.getGuildId());
if (guild.isPresent()) {
Guild foundGuild = guild.get();
if (foundGuild.getOwnerId().equals(accountId)) {
foundGuild.setGuildName(guildUpdateRequestDTO.getGuildName());
foundGuild.setIntroduction(guildUpdateRequestDTO.getIntroduction());
foundGuild.setMaximumMember(guildUpdateRequestDTO.getMaximumMember());
foundGuild.setMemberList(guildUpdateRequestDTO.getMemberList());
foundGuild.setChannelId(guildUpdateRequestDTO.getChannelId());
return foundGuild;
} else throw new IllegalArgumentException("owner가 아닌 계정으로 Guild 수정 시도");
} else return null;
}

@Transactional
public Guild addMemberToGuild(GuildMemberModifyRequestDTO guildMemberModifyRequestDTO, String accountId) {
Optional<Guild> guild = guildRepository.findById(guildMemberModifyRequestDTO.getGuildId());
if (guild.isPresent()) {
Guild foundGuild = guild.get();
if(foundGuild.getOwnerId().equals(accountId)) {
foundGuild.getMemberList().addAll(guildMemberModifyRequestDTO.getNewMemberList());
return foundGuild;
} else throw new IllegalArgumentException("owner가 아닌 계정으로 Guild 수정 시도");
} else return null;
}

@Transactional
public Guild removeMemberToGuild(GuildMemberModifyRequestDTO guildMemberModifyRequestDTO, String accountId) {
Optional<Guild> guild = guildRepository.findById(guildMemberModifyRequestDTO.getGuildId());
if (guild.isPresent()) {
Guild foundGuild = guild.get();
if(foundGuild.getOwnerId().equals(accountId)) {
foundGuild.getMemberList().removeAll(guildMemberModifyRequestDTO.getNewMemberList());
return foundGuild;
} else throw new IllegalArgumentException("owner가 아닌 계정으로 Guild 수정 시도");
} else return null;
}

public void deleteGuild(Long guildId) {
guildRepository.deleteById(guildId);
}
}
Loading