Skip to content
This repository has been archived by the owner on Aug 13, 2022. It is now read-only.

Commit

Permalink
[#25] 요청에 대한 알림 추가 기능 구현
Browse files Browse the repository at this point in the history
Enum 관련

* AlarmTypes 클래스 추가

- Alarm 관련 타입 상수를 담을 클래스

- DB에 저장 시 정수로, DB에서 꺼낼 때는 정식 명칭을 가진 상수로의 자동
  변환을 위해 `TypeHandler` 구현 및 MyBatisConfig에 추가

Mapper 계층 관련

* AlarmMapper 인터페이스 추가

- 알람 추가 기능에 대한 로직 처리 후 이를 DB에 반영하기 위한
  `insertAlarm` 메소드 추가

* AlarmMapper.xml 추가

- 위의 사항을 처리할 쿼리문 작성

Service 계층 관련

* AlarmService 클래스 추가

- 알람 추가 기능 요청에 대한 비즈니스 로직을 처리할 `addAlarm` 메소드 추가

- 알람 추가 요청을 받으면 보내는 대상과 받을 대상 그리고 알람 타입을
  매핑해서 `Alarm 클래스의 인스턴스 생성` 후 Mapper로 넘김

* FriendService

- AlarmService 주입 및 알람 추가가 필요한 메소드`(친구추가 요청, 친구수락 요청)들에addAlarm 코드 추가

테스트 관련

- 전체적인 내용을 포스트맨을 활용해 테스트
  • Loading branch information
msugo1 committed Mar 14, 2021
1 parent d84e4dc commit 6df61a8
Show file tree
Hide file tree
Showing 9 changed files with 133 additions and 1 deletion.
3 changes: 2 additions & 1 deletion src/main/java/me/soo/helloworld/config/MyBatisConfig.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package me.soo.helloworld.config;

import me.soo.helloworld.enumeration.AlarmTypes;
import me.soo.helloworld.enumeration.FriendStatus;
import me.soo.helloworld.enumeration.LanguageLevel;
import me.soo.helloworld.enumeration.LanguageStatus;
Expand Down Expand Up @@ -28,7 +29,7 @@ public SqlSessionFactory sqlSessionFactory(@Qualifier("proxyDataSource") DataSou
sessionFactory.setMapperLocations(resolver.getResources("/mappers/*.xml"));

sessionFactory.setTypeHandlers(new LanguageLevel.TypeHandler(), new LanguageStatus.TypeHandler(),
new FriendStatus.TypeHandler());
new FriendStatus.TypeHandler(), new AlarmTypes.TypeHandler());

return sessionFactory.getObject();
}
Expand Down
24 changes: 24 additions & 0 deletions src/main/java/me/soo/helloworld/enumeration/AlarmTypes.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package me.soo.helloworld.enumeration;

import lombok.Getter;
import lombok.RequiredArgsConstructor;
import me.soo.helloworld.util.handler.EnumCategoryTypeHandler;
import org.apache.ibatis.type.MappedTypes;

@Getter
@RequiredArgsConstructor
public enum AlarmTypes implements EnumCategory {

FRIEND_REQUEST_RECEIVED(1),
FRIEND_REQUEST_ACCEPTED(2);

private final int category;

@MappedTypes(AlarmTypes.class)
public static class TypeHandler extends EnumCategoryTypeHandler<AlarmTypes> {

public TypeHandler() {
super(AlarmTypes.class);
}
}
}
10 changes: 10 additions & 0 deletions src/main/java/me/soo/helloworld/mapper/AlarmMapper.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package me.soo.helloworld.mapper;

import me.soo.helloworld.model.alarm.Alarm;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface AlarmMapper {

public void insertAlarm(Alarm alarm);
}
25 changes: 25 additions & 0 deletions src/main/java/me/soo/helloworld/model/alarm/Alarm.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package me.soo.helloworld.model.alarm;

import lombok.Builder;
import lombok.Getter;
import me.soo.helloworld.enumeration.AlarmTypes;

@Getter
@Builder
public class Alarm {

private final String to;

private final String from;

private final AlarmTypes type;

public static Alarm create(String userId, String targetId, AlarmTypes type) {

return Alarm.builder()
.from(userId)
.to(targetId)
.type(type)
.build();
}
}
19 changes: 19 additions & 0 deletions src/main/java/me/soo/helloworld/service/AlarmService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package me.soo.helloworld.service;

import lombok.RequiredArgsConstructor;
import me.soo.helloworld.enumeration.AlarmTypes;
import me.soo.helloworld.mapper.AlarmMapper;
import me.soo.helloworld.model.alarm.Alarm;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class AlarmService {

private final AlarmMapper alarmMapper;

public void addAlarm(String to, String from, AlarmTypes type) {
Alarm alarm = Alarm.create(to, from, type);
alarmMapper.insertAlarm(alarm);
}
}
5 changes: 5 additions & 0 deletions src/main/java/me/soo/helloworld/service/FriendService.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package me.soo.helloworld.service;

import lombok.RequiredArgsConstructor;
import me.soo.helloworld.enumeration.AlarmTypes;
import me.soo.helloworld.enumeration.FriendStatus;
import me.soo.helloworld.exception.DuplicateRequestException;
import me.soo.helloworld.exception.InvalidRequestException;
Expand Down Expand Up @@ -28,6 +29,8 @@ public class FriendService {

private final Pagination pagination;

private final AlarmService alarmService;

public void sendFriendRequest(String userId, String targetId) {
TargetValidator.targetNotSelf(userId, targetId);
TargetValidator.targetExistence(userService.isUserIdExist(targetId));
Expand All @@ -40,6 +43,7 @@ public void sendFriendRequest(String userId, String targetId) {
validateFriendStatusDetail(status);

friendMapper.sendFriendRequest(userId, targetId);
alarmService.addAlarm(targetId, userId, AlarmTypes.FRIEND_REQUEST_RECEIVED);
}

public FriendStatus getFriendStatus(String userId, String targetId) {
Expand All @@ -56,6 +60,7 @@ public void acceptFriendRequest(String userId, String targetId) {
FriendStatus status = getFriendStatus(userId, targetId);
validateFriendStatus(status, FRIEND_REQUEST_RECEIVED);
friendMapper.updateFriendRequest(userId, targetId, FRIEND);
alarmService.addAlarm(targetId, userId, AlarmTypes.FRIEND_REQUEST_ACCEPTED);
}

public void rejectFriendRequest(String userId, String targetId) {
Expand Down
9 changes: 9 additions & 0 deletions src/main/resources/mappers/AlarmMapper.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="me.soo.helloworld.mapper.AlarmMapper">

<insert id="insertAlarm" parameterType="me.soo.helloworld.model.alarm.Alarm">
INSERT INTO alarms (alarmTo, alarmFrom, type) VALUES (#{to}, #{from}, #{type})
</insert>
</mapper>
10 changes: 10 additions & 0 deletions src/main/resources/sql/alarms.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
create table alarms
(
id bigint auto_increment
primary key,
alarmTo varchar(20) not null,
alarmFrom varchar(20) not null,
type tinyint not null,
hasRead enum ('Y', 'N') default 'N' not null,
createdAt timestamp default CURRENT_TIMESTAMP not null
);
29 changes: 29 additions & 0 deletions src/test/java/me/soo/helloworld/AlarmMapperTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package me.soo.helloworld;

import me.soo.helloworld.enumeration.AlarmTypes;
import me.soo.helloworld.mapper.AlarmMapper;
import me.soo.helloworld.model.alarm.Alarm;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit.jupiter.SpringExtension;

@ExtendWith(SpringExtension.class)
@SpringBootTest
public class AlarmMapperTest {
private final String userId = "Soo1045";

private final String targetId = "Hello";

@Autowired
AlarmMapper alarmMapper;

@Test
public void insertAlarmTest() {
Alarm alarm = Alarm.create(userId, targetId, AlarmTypes.FRIEND_REQUEST_RECEIVED);

alarmMapper.insertAlarm(alarm);
}

}

0 comments on commit 6df61a8

Please sign in to comment.