Skip to content

Commit

Permalink
[요양보호사 / 보호자] Line messaging API를 활용하여 알림 서비스 구현하기 (#42)
Browse files Browse the repository at this point in the history
* feat : 의존성 추가

* feat : line api 의존성 추가 및 exception 디렉토리 위치 변경

* feat : 웰컴 메시지 및 사용자 입력 메시지 받기 완료!!

* feat : 알림 메시지 구현 완료!!

* refactor : Stranger 웰컴 메시지 변경

* refactor : 디렉토리 위치 변경

* refactor : 30분 단위도 가능하게 변경, 웰컴 메시지 변경

* refactor : unfollow 이벤트 대처

* [관리자 페이지] 요양원 도메인 CRUD (#39)

* feat: 요양원 도메인

* refactor: admin에서 developer로 변경

* refactor: developer -> admin

* refactor: admin->institution 요양원이 관리하는 부분

* refactor : 파일 분리

* refactor : baseEntity 위치 변경

* feat : 기본값 초기화

* feat : 기본값 초기화

* refactor : 전화번호 입력 로직 구체화

* refactor : Optional 제거

* refactor : 예외 케이스 대처

* refactor : 메서드 분리

* refactor : mapper 리팩토링

* refactor : 순환 참조 해결

* refactor : 디렉토리명 정의

* test : 테스트 완료!

* refactor : private으로 바꾸기

---------

Co-authored-by: hyyyh0x <[email protected]>
  • Loading branch information
pykido and hyyyh0x authored Oct 3, 2024
1 parent 6059e68 commit f635816
Show file tree
Hide file tree
Showing 37 changed files with 599 additions and 62 deletions.
4 changes: 4 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,10 @@ dependencies {
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'com.h2database:h2' // H2는 테스트 환경에서 주로 사용

// Line-messaging-api 라이브러리
implementation 'com.linecorp.bot:line-bot-spring-boot:4.7.0'


// MapStruct
implementation 'org.mapstruct:mapstruct:1.4.2.Final'
annotationProcessor 'org.mapstruct:mapstruct-processor:1.4.2.Final'
Expand Down
2 changes: 2 additions & 0 deletions src/main/java/dbdr/DbdrApplication.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,11 @@
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication
@EnableJpaAuditing
@EnableScheduling
public class DbdrApplication {

public static void main(String[] args) {
Expand Down
35 changes: 29 additions & 6 deletions src/main/java/dbdr/domain/careworker/entity/Careworker.java
Original file line number Diff line number Diff line change
@@ -1,9 +1,15 @@
package dbdr.domain.careworker.entity;

import dbdr.domain.core.entity.BaseEntity;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;

import dbdr.domain.core.base.entity.BaseEntity;
import dbdr.domain.careworker.dto.request.CareworkerRequestDTO;
import jakarta.persistence.*;
import jakarta.validation.constraints.Pattern;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.SQLDelete;
Expand All @@ -23,22 +29,31 @@ public class Careworker extends BaseEntity {
private String loginPassword;

@Column(nullable = false)
private Long institutionId;
@Pattern(regexp = "010\\d{8}")
private String phone;

@Column(nullable = false)
@Column(nullable = false, length = 50)
private String name;

@Column(nullable = false)
private Long institutionId;

@Column(nullable = true)
private String lineUserId;

@Column(nullable = true)
private LocalTime alertTime;

@Column(nullable = false, unique = true)
private String email;

@Column(nullable = false)
private String phone;

@Builder
public Careworker(Long institutionId, String name, String email, String phone) {
this.institutionId = institutionId;
this.name = name;
this.email = email;
this.phone = phone;
this.alertTime = LocalTime.of(17, 0); // 오후 5시로 초기화
}

public void updateCareworker(CareworkerRequestDTO careworkerDTO) {
Expand All @@ -47,4 +62,12 @@ public void updateCareworker(CareworkerRequestDTO careworkerDTO) {
this.email = careworkerDTO.getEmail();
this.phone = careworkerDTO.getPhone();
}

public void updateLineUserId(String lineUserId) {
this.lineUserId = lineUserId;
}

public void updateAlertTime(LocalTime alertTime) {
this.alertTime = alertTime;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,19 @@
import dbdr.domain.careworker.entity.Careworker;
import org.springframework.data.jpa.repository.JpaRepository;

import java.time.LocalTime;
import java.util.List;
import java.util.Optional;

public interface CareworkerRepository extends JpaRepository<Careworker, Long> {

List<Careworker> findByInstitutionId(Long institutionId);

boolean existsByEmail(String email);

Optional<Careworker> findByLineUserId(String userId);

List<Careworker> findByAlertTime(LocalTime currentTime);

Optional<Careworker> findByPhone(String phoneNumber);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package dbdr.domain.careworker.service;

import java.time.LocalTime;

import org.springframework.stereotype.Service;

import dbdr.domain.careworker.entity.Careworker;
import dbdr.domain.careworker.repository.CareworkerRepository;

import org.springframework.transaction.annotation.Transactional;

import dbdr.global.util.line.LineMessagingUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

@Service
@RequiredArgsConstructor
@Slf4j
public class CareworkerMessagingService {

private final CareworkerService careworkerService;
private final CareworkerRepository careworkerRepository;
private final LineMessagingUtil lineMessagingUtil;

@Transactional
public void handleCareworkerPhoneMessage(String userId, String phoneNumber) {
Careworker careworker = careworkerService.findByPhone(phoneNumber);
String userName = careworker.getName();
careworker.updateLineUserId(userId);
careworkerRepository.save(careworker);

String welcomeMessage =
" " + userName + " 요양보호사님, 안녕하세요! 🌸 \n" +
" 최고의 요양원 서비스 돌봄다리입니다. 🤗\n" +
" 저희와 함께 해주셔서 정말 감사합니다! 🙏\n" +
" 기본적인 알림 시간은 매일 오후 5시로 설정되어있습니다. 😄\n" +
" 알림을 받고 싶은 시간을 수정하고 싶으시다면 알려주세요! 💬\n" +
" 예 : `오후 7시' 혹은 '오후 7시 30분'";

log.info("Careworker {} has been registered with Line ID {}", userName, userId);
log.info("Sending welcome message to CareworkerPhone {}", careworker.getPhone());

lineMessagingUtil.sendMessageToUser(userId, welcomeMessage);
}

@Transactional
public void updateCareworkerAlertTime(String userId, String ampm, String hour, String minute) {
Careworker careworker = careworkerService.findByLineUserId(userId);
int minuteValue = (minute != null) ? Integer.parseInt(minute) : 0; // minute이 null이면 0으로 처리
LocalTime alertTime = lineMessagingUtil.convertToLocalTime(ampm, Integer.parseInt(hour), minuteValue);
careworker.updateAlertTime(alertTime);
careworkerRepository.save(careworker);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
import dbdr.domain.careworker.dto.request.CareworkerRequestDTO;
import dbdr.domain.careworker.dto.response.CareworkerResponseDTO;
import dbdr.domain.careworker.repository.CareworkerRepository;
import dbdr.exception.ApplicationError;
import dbdr.exception.ApplicationException;
import dbdr.global.exception.ApplicationError;
import dbdr.global.exception.ApplicationException;
import lombok.RequiredArgsConstructor;

import org.springframework.stereotype.Service;
Expand Down Expand Up @@ -85,4 +85,12 @@ private CareworkerResponseDTO toResponseDTO(Careworker careworker) {
return new CareworkerResponseDTO(careworker.getId(), careworker.getInstitutionId(),
careworker.getName(), careworker.getEmail(), careworker.getPhone());
}

public Careworker findByLineUserId(String userId) {
return careworkerRepository.findByLineUserId(userId).orElse(null);
}

public Careworker findByPhone(String phoneNumber) {
return careworkerRepository.findByPhone(phoneNumber).orElse(null);
}
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
package dbdr.domain.chart.controller;

import static dbdr.util.Utils.DEFAULT_PAGE_SIZE;
import static dbdr.global.util.api.Utils.DEFAULT_PAGE_SIZE;

import dbdr.domain.chart.dto.request.ChartDetailRequest;
import dbdr.domain.chart.dto.response.ChartDetailResponse;
import dbdr.domain.chart.service.ChartService;
import dbdr.util.ApiUtils;
import dbdr.global.util.api.ApiUtils;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package dbdr.domain.chart.controller;

import static dbdr.util.Utils.DEFAULT_PAGE_SIZE;
import static dbdr.global.util.api.Utils.DEFAULT_PAGE_SIZE;

import dbdr.domain.chart.dto.response.ChartDetailResponse;
import dbdr.domain.chart.service.ChartService;
import dbdr.util.ApiUtils;
import dbdr.global.util.api.ApiUtils;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
Expand Down
22 changes: 12 additions & 10 deletions src/main/java/dbdr/domain/chart/dto/ChartMapper.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,21 +27,23 @@ public interface ChartMapper {
ChartDetailResponse toResponse(Chart chart);

@Mappings({
@Mapping(target = "bodyManagement", source = "bodyManagement"),
@Mapping(target = "nursingManagement", source = "nursingManagement"),
@Mapping(target = "cognitiveManagement", source = "cognitiveManagement"),
@Mapping(target = "recoveryTraining", source = "recoveryTraining")
@Mapping(target = "bodyManagement", source = "bodyManagement"),
@Mapping(target = "nursingManagement", source = "nursingManagement"),
@Mapping(target = "cognitiveManagement", source = "cognitiveManagement"),
@Mapping(target = "recoveryTraining", source = "recoveryTraining"),
@Mapping(target = "conditionDisease", source = "conditionDisease"),
@Mapping(target = "recipient", source = "recipient")
})
Chart toEntity(ChartDetailRequest request);

// BodyManagement 매핑
@Mappings({
@Mapping(target = "wash", source = "physicalClear.wash"),
@Mapping(target = "bath", source = "physicalClear.bath"),
@Mapping(target = "mealType", source = "physicalMeal.mealType"),
@Mapping(target = "intakeAmount", source = "physicalMeal.intakeAmount"),
@Mapping(target = "has_walked", source = "physicalWalk.hasWalked"),
@Mapping(target = "has_companion", source = "physicalWalk.hasCompanion"),
@Mapping(target = "wash", source = "physicalClear.wash"),
@Mapping(target = "bath", source = "physicalClear.bath"),
@Mapping(target = "mealType", source = "physicalMeal.mealType"),
@Mapping(target = "intakeAmount", source = "physicalMeal.intakeAmount"),
@Mapping(target = "has_walked", source = "physicalWalk.hasWalked"),
@Mapping(target = "has_companion", source = "physicalWalk.hasCompanion"),
})
BodyManagementResponse toResponse(BodyManagement bodyManagement);

Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
package dbdr.domain.chart.dto.request;

import dbdr.domain.recipient.entity.Recipient;

public record ChartDetailRequest(
BodyManagementRequest bodyManagement,
NursingManagementRequest nursingManagement,
CognitiveManagementRequest cognitiveManagement,
RecoveryTrainingRequest recoveryTraining
String conditionDisease,
Recipient recipient,
BodyManagementRequest bodyManagement,
NursingManagementRequest nursingManagement,
CognitiveManagementRequest cognitiveManagement,
RecoveryTrainingRequest recoveryTraining
) {
}
2 changes: 1 addition & 1 deletion src/main/java/dbdr/domain/chart/entity/BodyManagement.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package dbdr.domain.chart.entity;

import dbdr.domain.core.entity.BaseEntity;
import dbdr.domain.core.base.entity.BaseEntity;
import jakarta.persistence.Column;
import jakarta.persistence.Embedded;
import jakarta.persistence.Entity;
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/dbdr/domain/chart/entity/Chart.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package dbdr.domain.chart.entity;


import dbdr.domain.core.entity.BaseEntity;
import dbdr.domain.core.base.entity.BaseEntity;
import dbdr.domain.recipient.entity.Recipient;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
package dbdr.domain.chart.entity;

import dbdr.domain.core.entity.BaseEntity;
import org.hibernate.annotations.Comment;
import org.hibernate.annotations.SQLDelete;
import org.hibernate.annotations.SQLRestriction;

import dbdr.domain.core.base.entity.BaseEntity;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.Comment;
import org.hibernate.annotations.SQLDelete;
import org.hibernate.annotations.SQLRestriction;

@Entity
@Getter
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package dbdr.domain.chart.entity;

import dbdr.domain.core.entity.BaseEntity;
import dbdr.domain.core.base.entity.BaseEntity;
import jakarta.persistence.Column;
import jakarta.persistence.Embedded;
import jakarta.persistence.Entity;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package dbdr.domain.chart.entity;

import dbdr.domain.core.entity.BaseEntity;
import dbdr.domain.core.base.entity.BaseEntity;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Table;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package dbdr.domain.core.entity;
package dbdr.domain.core.base.entity;

import jakarta.persistence.Column;
import jakarta.persistence.EntityListeners;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package dbdr.domain.core.messaging.controller;

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 dbdr.domain.core.messaging.service.LineMessagingService;
import lombok.RequiredArgsConstructor;


@RestController
@RequestMapping("/line")
@RequiredArgsConstructor
public class LineMessagingController {
private final LineMessagingService lineMessagingService;

@PostMapping
public void handleLineEvent(@RequestBody String requestBody) {
lineMessagingService.handleLineEvent(requestBody);
}
}
Loading

0 comments on commit f635816

Please sign in to comment.