Skip to content

Commit

Permalink
Merge pull request #17 from dnd-side-project/feature/#9-group
Browse files Browse the repository at this point in the history
Feature/#9 group
  • Loading branch information
youcastle03 authored Jan 29, 2025
2 parents f1de490 + f344beb commit 9106139
Show file tree
Hide file tree
Showing 12 changed files with 308 additions and 4 deletions.
26 changes: 22 additions & 4 deletions src/main/java/com/dnd/reevserver/domain/member/entity/Member.java
Original file line number Diff line number Diff line change
@@ -1,19 +1,20 @@
package com.dnd.reevserver.domain.member.entity;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import com.dnd.reevserver.domain.userTeam.entity.UserTeam;
import jakarta.persistence.*;
import lombok.*;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.oauth2.core.user.OAuth2User;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;

@Entity
@Table(name = "Member")
@Getter
@Setter
@Builder
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
Expand All @@ -34,6 +35,9 @@ public class Member implements OAuth2User {
@Column(name = "role", nullable = false, length = 100)
private String role;

@OneToMany(mappedBy = "member")
private List<UserTeam> userGroups = new ArrayList<>();

@Column(name = "job", nullable = false, length = 100)
private String job;

Expand All @@ -60,7 +64,21 @@ public void updateProfileUrl(String newProfileUrl) {
this.profileUrl = newProfileUrl;
}



public Member(String userId, String nickname, String profileUrl, String role) {
this.userId = userId;
this.nickname = nickname;
this.profileUrl = profileUrl;
this.role = role;
}

public void addUserGroup(UserTeam userGroup) {
userGroups.add(userGroup);
userGroup.setMember(this);

public void updateJob(String updateJob) {
this.job = updateJob;

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package com.dnd.reevserver.domain.team.controller;

import com.dnd.reevserver.domain.team.dto.request.AddTeamRequestDto;
import com.dnd.reevserver.domain.team.dto.response.TeamResponseDto;
import com.dnd.reevserver.domain.team.dto.response.AddTeamResponseDto;
import com.dnd.reevserver.domain.team.service.TeamService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/api/v1/group")
@RequiredArgsConstructor
public class TeamController {

private final TeamService groupService;

@GetMapping("/list")
public ResponseEntity<List<TeamResponseDto>> getAllGroups(){
List<TeamResponseDto> groups = groupService.getAllGroups();
return ResponseEntity.ok().body(groups);
}

@GetMapping("/{groupId}")
public ResponseEntity<TeamResponseDto> getGroupById(@PathVariable("groupId") Long groupId){
TeamResponseDto group = groupService.getGroupById(groupId);
return ResponseEntity.ok().body(group);
}

@PostMapping
public ResponseEntity<AddTeamResponseDto> addGroup(@RequestBody AddTeamRequestDto addGroupRequestDto){
AddTeamResponseDto response = groupService.addGroup(addGroupRequestDto);
return ResponseEntity.ok().body(response);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.dnd.reevserver.domain.team.dto.request;

import lombok.Builder;

@Builder
public record AddTeamRequestDto(String userId, String teamName, String description,
boolean isPublic, int maxNum) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.dnd.reevserver.domain.team.dto.response;

import lombok.Builder;

@Builder
public record AddTeamResponseDto(Long teamId) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.dnd.reevserver.domain.team.dto.response;

import lombok.Builder;

@Builder
public record TeamResponseDto(Long teamId, String teamName, String description,
int userCount, String recentActString) {

}
58 changes: 58 additions & 0 deletions src/main/java/com/dnd/reevserver/domain/team/entity/Team.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package com.dnd.reevserver.domain.team.entity;

import com.dnd.reevserver.domain.userTeam.entity.UserTeam;
import jakarta.persistence.*;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

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

@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Team {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long teamId;

@Column(name = "team_name", nullable = false, length = 100)
private String teamName;

@Column(nullable = false, length = 1000)
private String description;

@Column(name = "is_public", nullable = false)
private Boolean isPublic;

@Column(name = "max_num", nullable = false)
private int maxNum;

@OneToMany(mappedBy = "team")
private List<UserTeam> userTeams = new ArrayList<>();

@Column(name = "recent_act")
private LocalDateTime recentAct;

@Column(name = "owner_id", nullable = false)
private String ownerId;

@Builder
public Team(String teamName, String description, Boolean isPublic, int maxNum, String ownerId) {
this.teamName = teamName;
this.description = description;
this.isPublic = isPublic;
this.maxNum = maxNum;
this.recentAct = LocalDateTime.now();
this.ownerId = ownerId;
}

public void addUserTeam(UserTeam userTeam) {
userTeams.add(userTeam);
userTeam.setTeam(this);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.dnd.reevserver.domain.team.exception;

import com.dnd.reevserver.global.exception.GeneralException;

public class TeamNotFoundException extends GeneralException {
private static final String MESSAGE = "TeamId에 해당하는 모임이 존재하지 않습니다.";

public TeamNotFoundException() {
super(MESSAGE);
}

@Override
public int getStatusCode() {
return 404;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.dnd.reevserver.domain.team.repository;

import com.dnd.reevserver.domain.team.entity.Team;
import org.springframework.data.jpa.repository.JpaRepository;

public interface TeamRepository extends JpaRepository<Team, Long> {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
package com.dnd.reevserver.domain.team.service;

import com.dnd.reevserver.domain.team.dto.request.AddTeamRequestDto;
import com.dnd.reevserver.domain.team.dto.response.AddTeamResponseDto;
import com.dnd.reevserver.domain.team.dto.response.TeamResponseDto;
import com.dnd.reevserver.domain.team.entity.Team;
import com.dnd.reevserver.domain.team.exception.TeamNotFoundException;
import com.dnd.reevserver.domain.team.repository.TeamRepository;
import com.dnd.reevserver.domain.member.entity.Member;
import com.dnd.reevserver.domain.member.service.MemberService;
import com.dnd.reevserver.domain.userTeam.entity.UserTeam;
import com.dnd.reevserver.domain.userTeam.repository.UserTeamRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
import java.util.List;

@Service
@RequiredArgsConstructor
public class TeamService {

private final TeamRepository teamRepository;
private final UserTeamRepository userTeamRepository;
private final MemberService memberService;

@Transactional(readOnly = true)
public List<TeamResponseDto> getAllGroups() {
List<Team> groups = teamRepository.findAll();
List<TeamResponseDto> teamList = groups.stream()
.map(team -> TeamResponseDto.builder()
.teamId(team.getTeamId())
.teamName(team.getTeamName())
.description(team.getDescription())
.userCount(team.getUserTeams().size())
.recentActString(getRecentActString(team.getRecentAct()))
.build())
.toList();
return teamList;
}

@Transactional(readOnly = true)
public TeamResponseDto getGroupById(Long groupId) {
Team team = teamRepository.findById(groupId).orElseThrow(TeamNotFoundException::new);
return TeamResponseDto.builder()
.teamId(team.getTeamId())
.teamName(team.getTeamName())
.description(team.getDescription())
.userCount(team.getUserTeams().size())
.recentActString(getRecentActString(team.getRecentAct()))
.build();
}

private String getRecentActString(LocalDateTime recentAct){
LocalDateTime now = LocalDateTime.now();
long timeGap = ChronoUnit.MINUTES.between(recentAct, now);

if(timeGap < 60){
return timeGap + "분 전";
}
if(timeGap < 1440){
return ChronoUnit.HOURS.between(recentAct, now) + "시간 전";
}
return ChronoUnit.DAYS.between(recentAct, now) + "일 전";

}


public AddTeamResponseDto addGroup(AddTeamRequestDto addTeamRequestDto) {
Team team = Team.builder().teamName(addTeamRequestDto.teamName())
.description(addTeamRequestDto.description())
.maxNum(addTeamRequestDto.maxNum())
.ownerId(addTeamRequestDto.userId())
.isPublic(addTeamRequestDto.isPublic())
.build();

teamRepository.save(team);
Member member = memberService.findById(addTeamRequestDto.userId());
UserTeam userTeam = new UserTeam(member,team);
userTeamRepository.save(userTeam);

member.addUserGroup(userTeam);
team.addUserTeam(userTeam);
teamRepository.save(team);
userTeamRepository.save(userTeam);


return new AddTeamResponseDto(team.getTeamId());
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
package com.dnd.reevserver.domain.template.dto.request;


public record CreateTemplateRequestDto(String userId, String templateName, String content, String description) {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package com.dnd.reevserver.domain.userTeam.entity;

import com.dnd.reevserver.domain.team.entity.Team;
import com.dnd.reevserver.domain.member.entity.Member;
import jakarta.persistence.*;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Table(name = "user_team")
public class UserTeam {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long userTeamId;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id", nullable = false)
private Member member;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "team_id", nullable = false)
private Team team;

public void setMember(Member member) {
this.member = member;
}

public void setTeam(Team team) {
this.team = team;
}

public UserTeam(Member member, Team team) {
this.member = member;
this.team = team;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.dnd.reevserver.domain.userTeam.repository;

import com.dnd.reevserver.domain.userTeam.entity.UserTeam;
import org.springframework.data.jpa.repository.JpaRepository;

public interface UserTeamRepository extends JpaRepository<UserTeam, Long> {
}

0 comments on commit 9106139

Please sign in to comment.