Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[feat] redis 의존성 추가 및 유저의 대학교 설정 정보 저장 및 조회 api 생성 #40

Merged
merged 7 commits into from
Jul 10, 2024
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
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);
}
Loading