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
9 changes: 6 additions & 3 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
[submodule "ASSU_config"]
path = ASSU_config
url = https://github.com/ASSU-dev/ASSU_config.git
[submodule "config"]
path = config
url = https://github.com/ASSU-dev/ASSU_BE_config.git
[submodule "manifest"]
path = manifest
url = https://github.com/ASSU-dev/ASSU_BE_manifest.git
2 changes: 1 addition & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ WORKDIR /build

COPY --from=dependencies /build /build
COPY src src
COPY ASSU_config ASSU_config
COPY config config

RUN ./gradlew bootJar -x test --build-cache --no-daemon

Expand Down
6 changes: 3 additions & 3 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -117,9 +117,9 @@ tasks.named('test') {
}

tasks.register('copyPrivateConfig', Copy) {
from './ASSU_config/local'
from './ASSU_config/dev'
from './ASSU_config/prod'
from './config/local'
from './config/dev'
from './config/prod'

into 'src/main/resources'

Expand Down
1 change: 1 addition & 0 deletions manifest
Submodule manifest added at 8fcb0e
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ public class AdminController {
" - `partnerAddress` (String): 제휴업체 주소\n" +
" - `partnerDetailAddress` (String): 제휴업체 상세주소\n" +
" - `partnerName` (String): 제휴업체 상호명\n" +
" - `partnerUrl` (String): 제휴업체 카카오맵 URL\n" +
" - `partnerUrl` (String): 제휴업체 프로필 이미지 URL (S3 주소)\n" +
" - `partnerPhone` (String): 제휴업체 전화번호\n")
@GetMapping("/partner-recommend")
public BaseResponse<AdminResponseDTO> randomPartnerRecommend(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.assu.server.domain.mapping.controller;
package com.assu.server.domain.admin.controller;

import com.assu.server.domain.mapping.dto.StudentAdminResponseDTO;
import com.assu.server.domain.mapping.service.StudentAdminService;
import com.assu.server.domain.admin.dto.StudentAdminResponseDTO;
import com.assu.server.domain.admin.service.StudentAdminService;
import com.assu.server.global.apiPayload.BaseResponse;
import com.assu.server.global.apiPayload.code.status.SuccessStatus;
import com.assu.server.global.util.PrincipalDetails;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ public record AdminResponseDTO (
@Schema(description = "제휴업체 상세주소", example = "2층 201호")
String partnerDetailAddress,

@Schema(description = "제휴업체 URL", example = "https://www.beer.co.kr")
@Schema(description = "제휴업체 프로필 이미지 URL (S3 주소)", example = "https://assu-bucket.s3.amazonaws.com/profile.png")
String partnerUrl,

@Schema(description = "제휴업체 전화번호", example = "02-123-4567")
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.assu.server.domain.mapping.dto;
package com.assu.server.domain.admin.dto;

public record StoreUsageWithPaper(
Long paperId,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.assu.server.domain.admin.dto;

public class StudentAdminRequestDTO {

}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.assu.server.domain.mapping.dto;
package com.assu.server.domain.admin.dto;

import com.assu.server.domain.admin.entity.Admin;
import com.assu.server.domain.partnership.entity.Paper;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.assu.server.domain.mapping.entity;
package com.assu.server.domain.admin.entity;

import com.assu.server.domain.common.entity.BaseEntity;
import com.assu.server.domain.student.entity.Student;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,42 +29,39 @@ List<Admin> findMatchingAdmins(@Param("university") University university,
@Param("department") Department department,
@Param("major") Major major);

// 후보 수 카운트: 해당 partner와 ACTIVE 제휴가 없는 admin 수
@Query(value = """
SELECT COUNT(*)
FROM admin a
// 후보 수 카운트
@Query("""
SELECT COUNT(a)
FROM Admin a
WHERE NOT EXISTS (
SELECT 1 FROM paper pa
WHERE pa.admin_id = a.id
AND pa.partner_id = :partnerId
AND pa.is_activated = 'ACTIVE'
SELECT 1 FROM Paper pa
WHERE pa.admin = a
AND pa.partner.id = :partnerId
AND pa.isActivated = com.assu.server.domain.common.enums.ActivationStatus.ACTIVE
)
""", nativeQuery = true)
long countPartner(@Param("partnerId") Long partnerId);
""")
long countPartner(@Param("partnerId") Long partnerId);

// 랜덤 오프셋으로 1~N건 가져오기 (LIMIT :offset, :limit)
@Query(value = """
SELECT a.*
FROM admin a
// 랜덤 오프셋 조회
@Query("""
SELECT a
FROM Admin a
WHERE NOT EXISTS (
SELECT 1 FROM paper pa
WHERE pa.admin_id = a.id
AND pa.partner_id = :partnerId
AND pa.is_activated = 'ACTIVE'
SELECT 1 FROM Paper pa
WHERE pa.admin = a
AND pa.partner.id = :partnerId
AND pa.isActivated = com.assu.server.domain.common.enums.ActivationStatus.ACTIVE
)
LIMIT :offset, :limit
""", nativeQuery = true)
List<Admin> findPartnerWithOffset(@Param("partnerId") Long partnerId,
@Param("offset") int offset,
@Param("limit") int limit);
""")
List<Admin> findPartnerWithOffset(@Param("partnerId") Long partnerId, Pageable pageable);

@Query("""
SELECT DISTINCT a
FROM Admin a
LEFT JOIN FETCH a.member
WHERE a.point IS NOT NULL
AND function('ST_Contains', function('ST_GeomFromText', :wkt, 4326), a.point) = true
""")
AND ST_Contains(ST_GeomFromText(:wkt, 4326), a.point) = true
""")
List<Admin> findAllWithinViewportWithMember(@Param("wkt") String wkt, Pageable pageable);

@Query("""
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
package com.assu.server.domain.mapping.repository;
package com.assu.server.domain.admin.repository;

import com.assu.server.domain.mapping.dto.StoreUsageWithPaper;
import com.assu.server.domain.mapping.dto.StudentAdminResponseDTO;
import com.assu.server.domain.mapping.entity.StudentAdmin;
import com.assu.server.domain.admin.dto.StoreUsageWithPaper;
import com.assu.server.domain.admin.entity.StudentAdmin;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
Expand Down Expand Up @@ -34,7 +33,7 @@ Long countTodayUsersByAdmin(
);

@Query("""
SELECT new com.assu.server.domain.mapping.dto.StoreUsageWithPaper(
SELECT new com.assu.server.domain.admin.dto.StoreUsageWithPaper(
p.id, p.store.id, p.store.name, COUNT(pu.id)
)
FROM PartnershipUsage pu
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@
import com.assu.server.global.apiPayload.code.status.ErrorStatus;
import com.assu.server.global.exception.DatabaseException;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

Expand All @@ -24,14 +26,11 @@ public class AdminServiceImpl implements AdminService {
private final AdminRepository adminRepository;
private final PartnerRepository partnerRepository;

@Override
@Transactional
public List<Admin> findMatchingAdmins(University university, Department department, Major major){

List<Admin> adminList = adminRepository.findMatchingAdmins(university, department, major);

return adminList;
}
@Override
@Transactional
public List<Admin> findMatchingAdmins(University university, Department department, Major major){
return adminRepository.findMatchingAdmins(university, department, major);
}

@Override
@Transactional(readOnly = true)
Expand All @@ -40,19 +39,22 @@ public AdminResponseDTO suggestRandomPartner(Long adminId) {
Admin admin = adminRepository.findById(adminId)
.orElseThrow(() -> new DatabaseException(ErrorStatus.NO_SUCH_ADMIN));

long total = partnerRepository.countUnpartneredActiveByAdmin(admin.getId());
long total = partnerRepository.countUnpartneredActiveByAdmin(admin.getId(), com.assu.server.domain.common.enums.ActivationStatus.ACTIVE);
if (total <= 0) {
throw new DatabaseException(ErrorStatus.NO_AVAILABLE_PARTNER);
}

int offset = ThreadLocalRandom.current().nextInt((int)total);

Partner picked = partnerRepository.findUnpartneredActiveByAdminWithOffset(admin.getId(), offset);
if(picked == null) {
Pageable pageable = PageRequest.of(offset, 1);
List<Partner> pickedList = partnerRepository.findUnpartneredActiveByAdminWithOffset(admin.getId(), com.assu.server.domain.common.enums.ActivationStatus.ACTIVE, pageable);

if (pickedList.isEmpty()) {
throw new DatabaseException(ErrorStatus.NO_AVAILABLE_PARTNER);
}

Partner picked = pickedList.get(0);

return AdminResponseDTO.from(picked);
}

}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.assu.server.domain.mapping.service;
package com.assu.server.domain.admin.service;

import com.assu.server.domain.mapping.dto.StudentAdminResponseDTO;
import com.assu.server.domain.admin.dto.StudentAdminResponseDTO;

public interface StudentAdminService {
StudentAdminResponseDTO.CountAdminAuthResponseDTO getCountAdminAuth(Long memberId);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package com.assu.server.domain.mapping.service;
package com.assu.server.domain.admin.service;

import com.assu.server.domain.admin.entity.Admin;
import com.assu.server.domain.admin.repository.AdminRepository;
import com.assu.server.domain.mapping.dto.StoreUsageWithPaper;
import com.assu.server.domain.mapping.dto.StudentAdminResponseDTO;
import com.assu.server.domain.mapping.repository.StudentAdminRepository;
import com.assu.server.domain.admin.dto.StoreUsageWithPaper;
import com.assu.server.domain.admin.dto.StudentAdminResponseDTO;
import com.assu.server.domain.admin.repository.StudentAdminRepository;
import com.assu.server.domain.partnership.entity.Paper;
import com.assu.server.domain.partnership.repository.PaperRepository;
import com.assu.server.global.apiPayload.code.status.ErrorStatus;
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ public class PartnerController {
" - `adminAddress` (String): 관리자 주소\n" +
" - `adminDetailAddress` (String): 관리자 상세주소\n" +
" - `adminName` (String): 관리자 상호명\n" +
" - `adminUrl` (String): 관리자 카카오맵 URL\n" +
" - `adminUrl` (String): 관리자 프로필 이미지 URL (S3 주소)\n" +
" - `adminPhone` (String): 관리자 전화번호\n")
@GetMapping("/admin-recommend")
public BaseResponse<PartnerResponseDTO> randomAdminRecommend(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.assu.server.domain.partner.repository;

import com.assu.server.domain.partner.entity.Partner;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
Expand All @@ -11,41 +12,41 @@ public interface PartnerRepository extends JpaRepository<Partner, Long> {

boolean existsByPhoneNum(String phoneNum);

// 현재 admin과 'ACTIVE' 상태로 제휴 중인 partner를 제외한 후보 수
@Query(value = """
SELECT COUNT(*)
FROM partner p
LEFT JOIN paper pa
ON pa.partner_id = p.id
AND pa.admin_id = :adminId
AND pa.is_activated = 'ACTIVE'
WHERE pa.id IS NULL
""", nativeQuery = true)
long countUnpartneredActiveByAdmin(@Param("adminId") Long adminId);

// 위 후보들 중에서 offset 하나만 가져오기 (랜덤 오프셋으로 1건)
@Query(value = """
SELECT p.*
FROM partner p
LEFT JOIN paper pa
ON pa.partner_id = p.id
AND pa.admin_id = :adminId
AND pa.is_activated = 'ACTIVE'
WHERE pa.id IS NULL
LIMIT :offset, 1
""", nativeQuery = true)
Partner findUnpartneredActiveByAdminWithOffset(@Param("adminId") Long adminId,
@Param("offset") int offset);
@Query("""
SELECT COUNT(p)
FROM Partner p
WHERE NOT EXISTS (
SELECT 1 FROM Paper pa
WHERE pa.partner = p
AND pa.admin.id = :adminId
AND pa.isActivated = :status
)
""")
long countUnpartneredActiveByAdmin(@Param("adminId") Long adminId, @Param("status") com.assu.server.domain.common.enums.ActivationStatus status);

@Query("""
SELECT p
FROM Partner p
WHERE NOT EXISTS (
SELECT 1 FROM Paper pa
WHERE pa.partner = p
AND pa.admin.id = :adminId
AND pa.isActivated = :status
)
""")
List<Partner> findUnpartneredActiveByAdminWithOffset(@Param("adminId") Long adminId, @Param("status") com.assu.server.domain.common.enums.ActivationStatus status, Pageable pageable);

// 반경 내 제휴업체 조회
@Query("""
SELECT DISTINCT p
FROM Partner p
LEFT JOIN FETCH p.member
WHERE p.point IS NOT NULL
AND function('ST_Contains', function('ST_GeomFromText', :wkt, 4326), p.point) = true
AND ST_Contains(ST_GeomFromText(:wkt, 4326), p.point) = true
""")
List<Partner> findAllWithinViewportWithMember(@Param("wkt") String wkt);

// 키워드 검색
@Query("""
SELECT DISTINCT p
FROM Partner p
Expand All @@ -55,6 +56,4 @@ WHERE LOWER(p.name) LIKE LOWER(CONCAT('%', :keyword, '%'))
List<Partner> searchPartnerByKeywordWithMember(
@Param("keyword") String keyword
);


}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;

import java.util.List;
import java.util.concurrent.ThreadLocalRandom;
Expand Down Expand Up @@ -41,8 +43,8 @@ public PartnerResponseDTO getRandomAdmin(Long partnerId) {
offset = ThreadLocalRandom.current().nextInt(0, (int)(total - limit + 1));
}

List<Admin> picked = adminRepository.findPartnerWithOffset(partner.getId(), offset, limit);

Pageable pageable = PageRequest.of(offset, limit);
List<Admin> picked = adminRepository.findPartnerWithOffset(partner.getId(), pageable);
List<PartnerResponseDTO.AdminLiteDTO> admins = picked.stream()
.map(PartnerResponseDTO.AdminLiteDTO::from)
.collect(Collectors.toList());
Expand Down
Loading