Skip to content

Commit

Permalink
[feat] redis 의존성 추가 및 유저의 대학교 설정 정보 저장 및 조회 api 생성 (#40)
Browse files Browse the repository at this point in the history
* [dependency] add redis dependency

* [feat] create redis hash

* [feat] create errorcode for user's university update

* [feat] create redis repository for UserUniversity

* [feat] create helper class for UserUniversity

* [feat] create post user's university api

* [feat] create get user's university api
  • Loading branch information
Parkjyun authored Jul 10, 2024
1 parent fd0fdc8 commit 4e3c96c
Show file tree
Hide file tree
Showing 13 changed files with 234 additions and 0 deletions.
3 changes: 3 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,9 @@ dependencies {

// Feign
implementation 'org.springframework.cloud:spring-cloud-starter-openfeign:4.1.2'

// Redis
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
}

tasks.named('test') {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package org.hankki.hankkiserver.api.user.controller;

import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.hankki.hankkiserver.api.dto.HankkiResponse;
import org.hankki.hankkiserver.api.user.controller.request.UserUniversityPostRequest;
import org.hankki.hankkiserver.api.user.service.UserCommandService;
import org.hankki.hankkiserver.api.user.service.UserQueryService;
import org.hankki.hankkiserver.api.user.service.command.UserUniversityPostCommand;
import org.hankki.hankkiserver.api.user.service.response.UserUniversityFindResponse;
import org.hankki.hankkiserver.auth.UserId;
import org.hankki.hankkiserver.common.code.CommonSuccessCode;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api/v1")
@RequiredArgsConstructor
public class UserController {

private final UserCommandService userCommandService;
private final UserQueryService userQueryService;

@PostMapping("/users/me/university")
public HankkiResponse<Void> postUserUniversity(@UserId final Long userId,
@Valid @RequestBody final UserUniversityPostRequest request) {
userCommandService.saveUserUniversity(new UserUniversityPostCommand(userId, request));
return HankkiResponse.success(CommonSuccessCode.CREATED);
}

@GetMapping("/users/me/university")
public HankkiResponse<UserUniversityFindResponse> findUserUniversity(@UserId final Long userId) {
return HankkiResponse.success(CommonSuccessCode.OK, userQueryService.findUserUniversity(userId));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package org.hankki.hankkiserver.api.user.controller.request;

import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;

public record UserUniversityPostRequest(long universityId, @NotBlank @Size(max = 5) String name, double longitude, double latitude) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package org.hankki.hankkiserver.api.user.service;

import lombok.RequiredArgsConstructor;
import org.hankki.hankkiserver.api.user.service.command.UserUniversityPostCommand;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@RequiredArgsConstructor
public class UserCommandService {

private final UserUniversityUpdater userUniversityUpdater;
private final UserUniversityDeleter userUniversityDeleter;
private final UserUniversityFinder userUniversityFinder;

@Transactional
public void saveUserUniversity(UserUniversityPostCommand userUniversityPostCommand) {
userUniversityFinder.findByUserId(userUniversityPostCommand.userId())
.ifPresent(userUniversity -> userUniversityDeleter.deleteById(userUniversity.getId()));
userUniversityUpdater.save(userUniversityPostCommand.toEntity());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package org.hankki.hankkiserver.api.user.service;

import lombok.RequiredArgsConstructor;
import org.hankki.hankkiserver.api.user.service.response.UserUniversityFindResponse;
import org.hankki.hankkiserver.common.code.UserUniversityErrorCode;
import org.hankki.hankkiserver.common.exception.NotFoundException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@RequiredArgsConstructor
public class UserQueryService {

private final UserUniversityFinder userUniversityFinder;

@Transactional(readOnly = true)
public UserUniversityFindResponse findUserUniversity(Long userId) {
return UserUniversityFindResponse.of(userUniversityFinder.findByUserId(userId)
.orElseThrow(() -> new NotFoundException(UserUniversityErrorCode.USER_UNIVERSITY_NOT_FOUND)));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package org.hankki.hankkiserver.api.user.service;

import lombok.RequiredArgsConstructor;
import org.hankki.hankkiserver.domain.user.repository.UserUniversityRepository;
import org.springframework.stereotype.Component;

@Component
@RequiredArgsConstructor
public class UserUniversityDeleter {

private final UserUniversityRepository userUniversityRepository;

protected void deleteById(Long id) {
userUniversityRepository.deleteById(id);
}

protected void deleteByUserId(Long userId) {
userUniversityRepository.deleteByUserId(userId);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package org.hankki.hankkiserver.api.user.service;

import lombok.RequiredArgsConstructor;
import org.hankki.hankkiserver.domain.user.model.UserUniversity;
import org.hankki.hankkiserver.domain.user.repository.UserUniversityRepository;
import org.springframework.stereotype.Component;

import java.util.Optional;

@Component
@RequiredArgsConstructor
public class UserUniversityFinder {

private final UserUniversityRepository userUniversityRepository;

public Optional<UserUniversity> findByUserId(Long userId) {
return userUniversityRepository.findByUserId(userId);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package org.hankki.hankkiserver.api.user.service;

import lombok.RequiredArgsConstructor;
import org.hankki.hankkiserver.domain.user.model.UserUniversity;
import org.hankki.hankkiserver.domain.user.repository.UserUniversityRepository;
import org.springframework.stereotype.Component;

@Component
@RequiredArgsConstructor
public class UserUniversityUpdater {

private final UserUniversityRepository userUniversityRepository;

protected void save(UserUniversity userUniversity) {
userUniversityRepository.save(userUniversity).getUserId();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package org.hankki.hankkiserver.api.user.service.command;

import org.hankki.hankkiserver.api.user.controller.request.UserUniversityPostRequest;
import org.hankki.hankkiserver.domain.user.model.UserUniversity;

public record UserUniversityPostCommand(Long userId, Long universityId, String universityName,
double longitude, double latitude) {
public UserUniversityPostCommand(Long userId, UserUniversityPostRequest request) {
this(userId, request.universityId(), request.name(), request.longitude(), request.latitude());
}

public UserUniversity toEntity() {
return UserUniversity.builder()
.userId(userId)
.universityId(universityId)
.universityName(universityName)
.longitude(longitude)
.latitude(latitude)
.build();
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package org.hankki.hankkiserver.api.user.service.response;

import org.hankki.hankkiserver.domain.user.model.UserUniversity;

public record UserUniversityFindResponse(long id,
String name,
double longitude,
double latitude) {
public static UserUniversityFindResponse of (UserUniversity userUniversity) {
return new UserUniversityFindResponse(userUniversity.getUniversityId(), userUniversity.getUniversityName(),
userUniversity.getLongitude(), userUniversity.getLatitude());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package org.hankki.hankkiserver.common.code;

import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;

@Getter
@RequiredArgsConstructor
public enum UserUniversityErrorCode implements ErrorCode {
USER_UNIVERSITY_NOT_FOUND(HttpStatus.NOT_FOUND, "대학 정보를 찾을 수 없습니다.");

private final HttpStatus httpStatus;
private final String message;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package org.hankki.hankkiserver.domain.user.model;

import jakarta.persistence.Id;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import org.springframework.data.redis.core.RedisHash;
import org.springframework.data.redis.core.index.Indexed;

@RedisHash(value = "UserUniversity", timeToLive = 60 * 60 * 24 * 1000L * 30)
@Builder
@AllArgsConstructor
@Getter
public class UserUniversity {

@Id
private Long id;

@Indexed
private Long userId;

private Long universityId;

private String universityName;

private Double longitude;

private Double latitude;

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package org.hankki.hankkiserver.domain.user.repository;

import org.hankki.hankkiserver.domain.user.model.UserUniversity;
import org.springframework.data.repository.CrudRepository;

import java.util.Optional;

public interface UserUniversityRepository extends CrudRepository<UserUniversity, Long> {
Optional<UserUniversity> findByUserId(Long userId);
void deleteById(Long id);
void deleteByUserId(Long userId);
}

0 comments on commit 4e3c96c

Please sign in to comment.