Skip to content

Commit

Permalink
YEL-148 [merge] 개발서버 배포
Browse files Browse the repository at this point in the history
YEL-148 [merge] 개발서버 배포
  • Loading branch information
hyeonjeongs authored Aug 29, 2023
2 parents b7ded57 + 3899c5c commit 22e67ec
Show file tree
Hide file tree
Showing 39 changed files with 743 additions and 28 deletions.
3 changes: 3 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,9 @@ dependencies {
asciidoctorExt 'org.springframework.restdocs:spring-restdocs-asciidoctor'
testImplementation 'org.springframework.restdocs:spring-restdocs-mockmvc'
testImplementation 'org.springframework.security:spring-security-test'

// jwt decode
implementation 'org.bouncycastle:bcprov-jdk15on:1.69'
}

asciidoctor {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package com.yello.server.domain.admin.controller;

import static com.yello.server.global.common.SuccessCode.DELETE_COOLDOWN_ADMIN_SUCCESS;
import static com.yello.server.global.common.SuccessCode.DELETE_USER_ADMIN_SUCCESS;
import static com.yello.server.global.common.SuccessCode.READ_COOLDOWN_ADMIN_SUCCESS;
import static com.yello.server.global.common.SuccessCode.READ_USER_ADMIN_SUCCESS;

import com.yello.server.domain.admin.dto.response.AdminCooldownResponse;
import com.yello.server.domain.admin.dto.response.AdminUserResponse;
import com.yello.server.domain.admin.service.AdminService;
import com.yello.server.domain.user.entity.User;
import com.yello.server.global.common.annotation.AccessTokenUser;
import com.yello.server.global.common.dto.BaseResponse;
import com.yello.server.global.common.factory.PaginationFactory;
import javax.annotation.Nullable;
import lombok.RequiredArgsConstructor;
import lombok.val;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequiredArgsConstructor
@RequestMapping("/api/v1/admin")
@CrossOrigin(origins = "http://localhost:3000")
public class AdminController {

private final AdminService adminService;

@GetMapping("/user")
public BaseResponse<AdminUserResponse> getUserAdmin(@AccessTokenUser User user, @RequestParam Integer page,
@Nullable @RequestParam String yelloId) {
val data = yelloId == null
? adminService.findUser(user.getId(), PaginationFactory.createPageableLimitTen(page))
: adminService.findUserContaining(user.getId(), PaginationFactory.createPageableLimitTen(page),
yelloId);
return BaseResponse.success(READ_USER_ADMIN_SUCCESS, data);
}

@DeleteMapping("/user")
public BaseResponse deleteUser(@AccessTokenUser User user, @RequestParam Long userId) {
adminService.deleteUser(user.getId(), userId);
return BaseResponse.success(DELETE_USER_ADMIN_SUCCESS);
}

@GetMapping("/cooldown")
public BaseResponse<AdminCooldownResponse> getCooldownAdmin(@AccessTokenUser User user, @RequestParam Integer page,
@Nullable @RequestParam String yelloId) {
val data = yelloId == null
? adminService.findCooldown(user.getId(), PaginationFactory.createPageableLimitTen(page))
: adminService.findCooldownContaining(user.getId(), PaginationFactory.createPageableLimitTen(page),
yelloId);
return BaseResponse.success(READ_COOLDOWN_ADMIN_SUCCESS, data);
}

@DeleteMapping("/cooldown")
public BaseResponse deleteCooldown(@AccessTokenUser User user, @RequestParam Long cooldownId) {
adminService.deleteCooldown(user.getId(), cooldownId);
return BaseResponse.success(DELETE_COOLDOWN_ADMIN_SUCCESS);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.yello.server.domain.admin.dto.response;

import static com.yello.server.global.common.factory.TimeFactory.toDateFormattedString;

import com.yello.server.domain.cooldown.entity.Cooldown;
import com.yello.server.domain.user.entity.User;
import lombok.Builder;

@Builder
public record AdminCooldownContentVO(
Long id,
String name,
String yelloId,
String createdAt
) {

public static AdminCooldownContentVO of(Cooldown cooldown) {
final User cooldownUser = cooldown.getUser();

return AdminCooldownContentVO.builder()
.id(cooldown.getId())
.name(cooldownUser.getName())
.yelloId(cooldownUser.getYelloId())
.createdAt(toDateFormattedString(cooldown.getCreatedAt()))
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.yello.server.domain.admin.dto.response;

import java.util.List;
import lombok.Builder;

@Builder
public record AdminCooldownResponse(
Long pageCount,
Long totalCount,
List<AdminCooldownContentVO> userList
) {

public static AdminCooldownResponse of(Long totalCount, List<AdminCooldownContentVO> cooldownList) {
return AdminCooldownResponse.builder()
.pageCount(totalCount % 10 == 0 ? totalCount / 10 : totalCount / 10 + 1)
.totalCount(totalCount)
.userList(cooldownList)
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package com.yello.server.domain.admin.dto.response;

import static com.yello.server.global.common.factory.TimeFactory.toDateFormattedString;

import com.yello.server.domain.group.entity.School;
import com.yello.server.domain.user.entity.User;
import lombok.Builder;

@Builder
public record AdminUserContentVO(
Long id,
String name,
String yelloId,
String group,
String createdAt,
String deletedAt
) {

public static AdminUserContentVO of(User user) {
final School userGroup = user.getGroup();

return AdminUserContentVO.builder()
.id(user.getId())
.name(user.getName())
.yelloId(user.getYelloId())
.group(userGroup == null ? "" : userGroup.toString())
.createdAt(toDateFormattedString(user.getCreatedAt()))
.deletedAt(toDateFormattedString(user.getDeletedAt()))
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.yello.server.domain.admin.dto.response;

import java.util.List;
import lombok.Builder;

@Builder
public record AdminUserResponse(
Long pageCount,
Long totalCount,
List<AdminUserContentVO> userList
) {

public static AdminUserResponse of(Long totalCount, List<AdminUserContentVO> userList) {
return AdminUserResponse.builder()
.pageCount(totalCount % 10 == 0 ? totalCount / 10 : totalCount / 10 + 1)
.totalCount(totalCount)
.userList(userList)
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.yello.server.domain.admin.dto.response;

import java.util.List;
import lombok.Builder;

@Builder
public record AdminUserSearchResponse(
Long pageCount,
Long totalCount,
List<AdminUserContentVO> userList
) {

public static AdminUserSearchResponse of(Long totalCount, List<AdminUserContentVO> userList) {
return AdminUserSearchResponse.builder()
.pageCount(totalCount % 10 == 0 ? totalCount / 10 : totalCount / 10 + 1)
.totalCount(totalCount)
.userList(userList)
.build();
}
}
30 changes: 30 additions & 0 deletions src/main/java/com/yello/server/domain/admin/entity/UserAdmin.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.yello.server.domain.admin.entity;

import com.yello.server.domain.user.entity.User;
import com.yello.server.global.common.dto.AuditingTimeEntity;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@Entity
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class UserAdmin extends AuditingTimeEntity {

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

@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "userId")
private User user;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.yello.server.domain.admin.exception;

import com.yello.server.global.common.ErrorCode;
import com.yello.server.global.exception.CustomException;

public class UserAdminNotFoundException extends CustomException {

public UserAdminNotFoundException(ErrorCode error) {
super(error, "[UserAdminNotFoundException] " + error.getMessage());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.yello.server.domain.admin.repository;

import com.yello.server.domain.admin.entity.UserAdmin;
import com.yello.server.domain.user.entity.User;
import java.util.Optional;
import org.springframework.data.jpa.repository.JpaRepository;

public interface UserAdminJpaRepository extends JpaRepository<UserAdmin, Long> {

Optional<UserAdmin> findByUser(User user);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.yello.server.domain.admin.repository;

import com.yello.server.domain.admin.entity.UserAdmin;
import com.yello.server.domain.user.entity.User;
import java.util.Optional;

public interface UserAdminRepository {

UserAdmin getByUser(User user);

Optional<UserAdmin> findByUser(User user);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.yello.server.domain.admin.repository;

import static com.yello.server.global.common.ErrorCode.USER_ADMIN_NOT_FOUND_EXCEPTION;

import com.yello.server.domain.admin.entity.UserAdmin;
import com.yello.server.domain.admin.exception.UserAdminNotFoundException;
import com.yello.server.domain.user.entity.User;
import java.util.Optional;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;

@Repository
@RequiredArgsConstructor
public class UserAdminRepositoryImpl implements UserAdminRepository {

private final UserAdminJpaRepository userAdminJpaRepository;

@Override
public UserAdmin getByUser(User user) {
return userAdminJpaRepository.findByUser(user)
.orElseThrow(() -> new UserAdminNotFoundException(USER_ADMIN_NOT_FOUND_EXCEPTION));
}

@Override
public Optional<UserAdmin> findByUser(User user) {
return userAdminJpaRepository.findByUser(user);
}
}
104 changes: 104 additions & 0 deletions src/main/java/com/yello/server/domain/admin/service/AdminService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
package com.yello.server.domain.admin.service;

import com.yello.server.domain.admin.dto.response.AdminCooldownContentVO;
import com.yello.server.domain.admin.dto.response.AdminCooldownResponse;
import com.yello.server.domain.admin.dto.response.AdminUserContentVO;
import com.yello.server.domain.admin.dto.response.AdminUserResponse;
import com.yello.server.domain.admin.repository.UserAdminRepository;
import com.yello.server.domain.cooldown.entity.Cooldown;
import com.yello.server.domain.cooldown.repository.CooldownRepository;
import com.yello.server.domain.user.entity.User;
import com.yello.server.domain.user.repository.UserRepository;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class AdminService {

private final UserRepository userRepository;
private final CooldownRepository cooldownRepository;
private final UserAdminRepository userAdminRepository;

public AdminUserResponse findUser(Long adminId, Pageable page) {
// exception
final User admin = userRepository.getById(adminId);
userAdminRepository.getByUser(admin);

// logic
final Long totalCount = userRepository.count();
final List<AdminUserContentVO> list = userRepository.findAll(page).stream()
.map(AdminUserContentVO::of)
.toList();

return AdminUserResponse.of(totalCount, list);
}

public AdminUserResponse findUserContaining(Long adminId, Pageable page, String yelloId) {
// exception
final User admin = userRepository.getById(adminId);
userAdminRepository.getByUser(admin);

// logic
final Long totalCount = userRepository.countAllByYelloIdContaining(yelloId);
final List<AdminUserContentVO> list = userRepository.findAllContaining(page, yelloId).stream()
.map(AdminUserContentVO::of)
.toList();

return AdminUserResponse.of(totalCount, list);
}

@Transactional
public void deleteUser(Long adminId, Long userId) {
// exception
final User admin = userRepository.getById(adminId);
userAdminRepository.getByUser(admin);
final User user = userRepository.getById(userId);

// logic
userRepository.delete(user);
}

public AdminCooldownResponse findCooldown(Long adminId, Pageable page) {
// exception
final User admin = userRepository.getById(adminId);
userAdminRepository.getByUser(admin);

// logic
final Long totalCount = cooldownRepository.count();
final List<AdminCooldownContentVO> list = cooldownRepository.findAll(page).stream()
.map(AdminCooldownContentVO::of)
.toList();

return AdminCooldownResponse.of(totalCount, list);
}

public AdminCooldownResponse findCooldownContaining(Long adminId, Pageable page, String yelloId) {
// exception
final User admin = userRepository.getById(adminId);
userAdminRepository.getByUser(admin);

// logic
final Long totalCount = cooldownRepository.countAllByYelloIdContaining(yelloId);
final List<AdminCooldownContentVO> list = cooldownRepository.findAllContaining(page, yelloId).stream()
.map(AdminCooldownContentVO::of)
.toList();

return AdminCooldownResponse.of(totalCount, list);
}

@Transactional
public void deleteCooldown(Long adminId, Long cooldownId) {
// exception
final User admin = userRepository.getById(adminId);
userAdminRepository.getByUser(admin);
final Cooldown cooldown = cooldownRepository.getById(cooldownId);

// logic
cooldownRepository.delete(cooldown);
}
}
Loading

0 comments on commit 22e67ec

Please sign in to comment.