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
Expand Up @@ -4,20 +4,19 @@
import com.somemore.domains.note.dto.SendNoteToVolunteerRequestDto;
import com.somemore.domains.note.usecase.SendNoteToCenterUseCase;
import com.somemore.domains.note.usecase.SendNoteToVolunteerUseCase;
import com.somemore.global.auth.annotation.CurrentUser;
import com.somemore.global.auth.annotation.RoleId;
import com.somemore.global.common.response.ApiResponse;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import java.util.UUID;
import lombok.RequiredArgsConstructor;
import org.springframework.security.access.annotation.Secured;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.UUID;

@Tag(name = "Note Command API", description = "쪽지 송신 삭제 API")
@RequiredArgsConstructor
@RequestMapping("/api/note")
Expand All @@ -30,7 +29,10 @@ public class NoteCommandApiController {
@Secured("ROLE_VOLUNTEER")
@Operation(summary = "봉사자 to 기관 쪽지 송신")
@PostMapping("/volunteer-to-center")
public ApiResponse<Long> sendNoteToCenter(@CurrentUser UUID volunteerId, @Valid @RequestBody SendNoteToCenterRequestDto requestDto) {
public ApiResponse<Long> sendNoteToCenter(
@RoleId UUID volunteerId,
@Valid @RequestBody SendNoteToCenterRequestDto requestDto
) {

Long noteId = sendNoteToCenterUseCase.sendNoteToCenter(volunteerId, requestDto);

Expand All @@ -40,7 +42,10 @@ public ApiResponse<Long> sendNoteToCenter(@CurrentUser UUID volunteerId, @Valid
@Secured("ROLE_CENTER")
@Operation(summary = "기관 to 봉사자 쪽지 송신")
@PostMapping("/center-to-volunteer")
public ApiResponse<Long> sendNoteToCenter(@CurrentUser UUID centerId, @Valid @RequestBody SendNoteToVolunteerRequestDto requestDto) {
public ApiResponse<Long> sendNoteToCenter(
@RoleId UUID centerId,
@Valid @RequestBody SendNoteToVolunteerRequestDto requestDto
) {

Long noteId = sendNoteToVolunteerUseCase.sendNoteToVolunteer(centerId, requestDto);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,11 @@
import com.somemore.domains.note.repository.mapper.NoteReceiverViewForCenter;
import com.somemore.domains.note.repository.mapper.NoteReceiverViewForVolunteer;
import com.somemore.domains.note.usecase.NoteQueryUseCase;
import com.somemore.global.auth.annotation.CurrentUser;
import com.somemore.global.auth.annotation.RoleId;
import com.somemore.global.common.response.ApiResponse;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import java.util.UUID;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
Expand All @@ -18,8 +19,6 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.UUID;

@Tag(name = "Note Query API", description = "쪽지 조회 API")
@RequiredArgsConstructor
@RequestMapping("/api/note")
Expand All @@ -31,19 +30,26 @@ public class NoteQueryApiController {
@Secured("ROLE_CENTER")
@Operation(summary = "기관의 자신에게 온 쪽지 조회")
@GetMapping("/center")
public ApiResponse<Page<NoteReceiverViewForCenter>> getNotesByCenterId(@CurrentUser UUID centerId, Pageable pageable) {
public ApiResponse<Page<NoteReceiverViewForCenter>> getNotesByCenterId(
@RoleId UUID centerId,
Pageable pageable) {

Page<NoteReceiverViewForCenter> response = noteQueryUseCase.getNotesForCenter(centerId, pageable);
Page<NoteReceiverViewForCenter> response = noteQueryUseCase.getNotesForCenter(centerId,
pageable);

return ApiResponse.ok(200, response, "내 쪽지 조회 성공");
}

@Secured("ROLE_VOLUNTEER")
@Operation(summary = "봉사자의 자신에게 온 쪽지 조회")
@GetMapping("/volunteer")
public ApiResponse<Page<NoteReceiverViewForVolunteer>> getNotesByVolunteerId(@CurrentUser UUID volunteerId, Pageable pageable) {
public ApiResponse<Page<NoteReceiverViewForVolunteer>> getNotesByVolunteerId(
@RoleId UUID volunteerId,
Pageable pageable
) {

Page<NoteReceiverViewForVolunteer> response = noteQueryUseCase.getNotesForVolunteer(volunteerId, pageable);
Page<NoteReceiverViewForVolunteer> response = noteQueryUseCase.getNotesForVolunteer(
volunteerId, pageable);

return ApiResponse.ok(200, response, "내 쪽지 조회 성공");
}
Expand All @@ -61,7 +67,8 @@ public ApiResponse<NoteDetailViewForCenter> getNoteDetailForCenter(@PathVariable
@Secured("ROLE_VOLUNTEER")
@Operation(summary = "봉사자의 자신에게 온 쪽지 상세 조회")
@GetMapping("/volunteer/{noteId}")
public ApiResponse<NoteDetailViewForVolunteer> getNoteDetailForVolunteer(@PathVariable Long noteId) {
public ApiResponse<NoteDetailViewForVolunteer> getNoteDetailForVolunteer(
@PathVariable Long noteId) {

NoteDetailViewForVolunteer response = noteQueryUseCase.getNoteDetailForVolunteer(noteId);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,24 +4,24 @@
import com.querydsl.core.types.dsl.BooleanExpression;
import com.querydsl.jpa.impl.JPAQuery;
import com.querydsl.jpa.impl.JPAQueryFactory;
import com.somemore.domains.center.domain.QCenter;
import com.somemore.center.domain.QNEWCenter;
import com.somemore.domains.note.domain.Note;
import com.somemore.domains.note.domain.QNote;
import com.somemore.domains.note.repository.mapper.NoteDetailViewForCenter;
import com.somemore.domains.note.repository.mapper.NoteDetailViewForVolunteer;
import com.somemore.domains.note.repository.mapper.NoteReceiverViewForCenter;
import com.somemore.domains.note.repository.mapper.NoteReceiverViewForVolunteer;
import com.somemore.domains.volunteer.domain.QVolunteer;
import com.somemore.user.domain.QUserCommonAttribute;
import com.somemore.volunteer.domain.QNEWVolunteer;
import java.util.List;
import java.util.Optional;
import java.util.UUID;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.support.PageableExecutionUtils;
import org.springframework.stereotype.Repository;

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

@RequiredArgsConstructor
@Repository
public class NoteRepositoryImpl implements NoteRepository {
Expand All @@ -30,8 +30,9 @@ public class NoteRepositoryImpl implements NoteRepository {
private final NoteJpaRepository noteJpaRepository;

private static final QNote note = QNote.note;
private static final QVolunteer volunteer = QVolunteer.volunteer;
private static final QCenter center = QCenter.center;
private static final QNEWVolunteer volunteer = QNEWVolunteer.nEWVolunteer;
private static final QNEWCenter center = QNEWCenter.nEWCenter;
private static final QUserCommonAttribute userCommonAttribute = QUserCommonAttribute.userCommonAttribute;

private static final String SENDER_ID = "senderId";
private static final String SENDER_NAME = "senderName";
Expand All @@ -48,7 +49,8 @@ public Optional<Note> findById(Long noteId) {
}

@Override
public Page<NoteReceiverViewForCenter> findNotesByReceiverIsCenter(UUID centerId, Pageable pageable) {
public Page<NoteReceiverViewForCenter> findNotesByReceiverIsCenter(UUID centerId,
Pageable pageable) {

BooleanExpression activeVolunteer = isActiveVolunteer();
BooleanExpression condition = isReceiver(centerId);
Expand All @@ -73,13 +75,15 @@ public Page<NoteReceiverViewForCenter> findNotesByReceiverIsCenter(UUID centerId
JPAQuery<Long> count = queryFactory
.select(note.count())
.from(note)
.join(volunteer).on(note.senderId.eq(volunteer.id).and(activeVolunteer))
.where(condition);

return PageableExecutionUtils.getPage(results, pageable, count::fetchOne);
}

@Override
public Page<NoteReceiverViewForVolunteer> findNotesByReceiverIsVolunteer(UUID volunteerId, Pageable pageable) {
public Page<NoteReceiverViewForVolunteer> findNotesByReceiverIsVolunteer(UUID volunteerId,
Pageable pageable) {
BooleanExpression activeCenter = isActiveCenter();
BooleanExpression condition = isReceiver(volunteerId);

Expand All @@ -89,11 +93,12 @@ public Page<NoteReceiverViewForVolunteer> findNotesByReceiverIsVolunteer(UUID vo
note.id,
note.title,
center.id.as(SENDER_ID),
center.name.as(SENDER_NAME),
userCommonAttribute.name.as(SENDER_NAME),
note.isRead
))
.from(note)
.join(center).on(note.senderId.eq(center.id).and(activeCenter))
.join(userCommonAttribute).on(center.userId.eq(userCommonAttribute.userId))
.where(condition)
.offset(pageable.getOffset())
.limit(pageable.getPageSize())
Expand All @@ -103,6 +108,8 @@ public Page<NoteReceiverViewForVolunteer> findNotesByReceiverIsVolunteer(UUID vo
JPAQuery<Long> count = queryFactory
.select(note.count())
.from(note)
.join(center).on(note.senderId.eq(center.id).and(activeCenter))
.join(userCommonAttribute).on(center.userId.eq(userCommonAttribute.userId))
.where(condition);

return PageableExecutionUtils.getPage(results, pageable, count::fetchOne);
Expand All @@ -121,11 +128,12 @@ public Optional<NoteDetailViewForCenter> findNoteDetailViewReceiverIsCenter(Long
note.content,
volunteer.id.as(SENDER_ID),
volunteer.nickname.as(SENDER_NAME),
volunteer.imgUrl.as(SENDER_PROFILE_IMG_LINK),
userCommonAttribute.imgUrl.as(SENDER_PROFILE_IMG_LINK),
note.createdAt
))
.from(note)
.join(volunteer).on(note.senderId.eq(volunteer.id).and(activeVolunteer))
.join(userCommonAttribute).on(volunteer.userId.eq(userCommonAttribute.userId))
.where(note.id.eq(noteId).and(note.deleted.eq(false)))
.fetchOne();

Expand All @@ -144,12 +152,13 @@ public Optional<NoteDetailViewForVolunteer> findNoteDetailViewReceiverIsVoluntee
note.title,
note.content,
center.id.as(SENDER_ID),
center.name.as(SENDER_NAME),
center.imgUrl.as(SENDER_PROFILE_IMG_LINK),
userCommonAttribute.name.as(SENDER_NAME),
userCommonAttribute.imgUrl.as(SENDER_PROFILE_IMG_LINK),
note.createdAt
))
.from(note)
.join(center).on(note.senderId.eq(center.id).and(activeCenter))
.join(userCommonAttribute).on(center.userId.eq(userCommonAttribute.userId))
.where(note.id.eq(noteId).and(note.deleted.eq(false)))
.fetchOne();

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.somemore.domains.note.service;

import static com.somemore.global.exception.ExceptionMessage.NOT_EXISTS_NOTE;

import com.somemore.domains.note.domain.Note;
import com.somemore.domains.note.repository.NoteRepository;
import com.somemore.domains.note.usecase.NoteMarkAsReadUseCase;
Expand All @@ -8,8 +10,6 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import static com.somemore.global.exception.ExceptionMessage.NOT_EXISTS_NOTE;

@RequiredArgsConstructor
@Service
@Transactional
Expand All @@ -21,7 +21,6 @@ public class NoteMarkAsReadService implements NoteMarkAsReadUseCase {
public void noteMarkAsRead(Long noteId) {
Note note = getNote(noteId);
note.markAsRead();
noteRepository.save(note);
}

private Note getNote(Long noteId) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,22 +1,21 @@
package com.somemore.domains.note.service;

import com.somemore.domains.center.usecase.query.CenterQueryUseCase;
import com.somemore.center.usecase.NEWCenterQueryUseCase;
import com.somemore.domains.note.domain.Note;
import com.somemore.domains.note.dto.SendNoteToCenterRequestDto;
import com.somemore.domains.note.repository.NoteRepository;
import com.somemore.domains.note.usecase.SendNoteToCenterUseCase;
import java.util.UUID;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.UUID;

@RequiredArgsConstructor
@Service
@Transactional
public class SendNoteToCenterService implements SendNoteToCenterUseCase {

private final CenterQueryUseCase centerQueryUseCase;
private final NEWCenterQueryUseCase centerQueryUseCase;
private final NoteRepository noteRepository;

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,25 +4,24 @@
import com.somemore.domains.note.dto.SendNoteToVolunteerRequestDto;
import com.somemore.domains.note.repository.NoteRepository;
import com.somemore.domains.note.usecase.SendNoteToVolunteerUseCase;
import com.somemore.domains.volunteer.usecase.VolunteerQueryUseCase;
import com.somemore.volunteer.usecase.NEWVolunteerQueryUseCase;
import java.util.UUID;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.UUID;


@RequiredArgsConstructor
@Service
@Transactional
public class SendNoteToVolunteerService implements SendNoteToVolunteerUseCase {

private final VolunteerQueryUseCase volunteerQueryUseCase;
private final NEWVolunteerQueryUseCase volunteerQueryUseCase;
private final NoteRepository noteRepository;

@Override
public Long sendNoteToVolunteer(UUID senderId, SendNoteToVolunteerRequestDto requestDto) {
volunteerQueryUseCase.validateVolunteerExists(senderId);
volunteerQueryUseCase.validateExistsById(requestDto.receiverId());

Note note = requestDto.toEntity(senderId);
noteRepository.save(note);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,4 +21,9 @@ public interface NEWVolunteerRepository {

List<VolunteerNicknameAndId> findVolunteerNicknameAndIdsByIds(List<UUID> ids);

boolean existsById(UUID id);

default boolean doesNotExistById(UUID id) {
return !existsById(id);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,11 @@
import com.somemore.volunteer.domain.QNEWVolunteer;
import com.somemore.volunteer.repository.record.VolunteerNickname;
import com.somemore.volunteer.repository.record.VolunteerNicknameAndId;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Optional;
import java.util.UUID;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;

@Repository("newVolunteerRepository")
@RequiredArgsConstructor
Expand All @@ -33,7 +32,7 @@ public Optional<NEWVolunteer> findById(UUID id) {
return Optional.ofNullable(
queryFactory.selectFrom(volunteer)
.where(
volunteer.id.eq(id),
idEq(id),
isNotDeleted()
)
.fetchOne()
Expand All @@ -58,7 +57,7 @@ public Optional<String> findNicknameById(UUID id) {
queryFactory.select(volunteer.nickname)
.from(volunteer)
.where(
volunteer.id.eq(id),
idEq(id),
isNotDeleted()
)
.fetchOne()
Expand Down Expand Up @@ -95,6 +94,21 @@ public List<VolunteerNicknameAndId> findVolunteerNicknameAndIdsByIds(List<UUID>
.fetch();
}

public boolean existsById(UUID id) {
return queryFactory
.selectOne()
.from(volunteer)
.where(
idEq(id),
isNotDeleted()
)
.fetchFirst() != null;
}

private static BooleanExpression idEq(UUID id) {
return volunteer.id.eq(id);
}

private static BooleanExpression isNotDeleted() {
return volunteer.deleted.eq(false);
}
Expand Down
Loading