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
@@ -1,14 +1,14 @@
package com.deare.backend.api.home.controller;

import com.deare.backend.api.home.dto.request.HomeEditRequestDTO;
import com.deare.backend.api.home.dto.response.HomeDashboardResponse;
import com.deare.backend.api.home.service.HomeService;
import com.deare.backend.global.auth.util.SecurityUtil;
import com.deare.backend.global.common.response.ApiResponse;
import io.swagger.v3.oas.annotations.Operation;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;

@RestController
@RequiredArgsConstructor
Expand All @@ -27,4 +27,16 @@ public ApiResponse<HomeDashboardResponse> getHome() {
HomeDashboardResponse res = homeService.getHome(userId);
return ApiResponse.success(res);
}

@PutMapping
@Operation(
summary = "홈 화면 편집 저장",
description = "스티커 배치 , 배경색 변경 등 홈화면 편집 내용을 저장하는 API입니다."
)
public ApiResponse<Void> editHome(@Valid @RequestBody HomeEditRequestDTO request){
Long userId = SecurityUtil.getCurrentUserId();
homeService.editHome(userId, request);
return ApiResponse.success(null);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.deare.backend.api.home.dto.request;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Pattern;

import java.math.BigDecimal;
import java.util.List;

public record HomeEditRequestDTO(
@NotBlank
@Pattern(regexp = "^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{8})$",
message = "HEX 색상 코드 형식이 올바르지 않습니다.")
String homeColor, List<StickerRequest> stickers
) {
@NotNull
public record StickerRequest(
Long imageId,
BigDecimal posX,
BigDecimal posY,
Integer posZ,
BigDecimal rotation,
BigDecimal scale
){}
}
52 changes: 52 additions & 0 deletions src/main/java/com/deare/backend/api/home/service/HomeService.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,15 @@
package com.deare.backend.api.home.service;

import com.deare.backend.api.home.dto.request.HomeEditRequestDTO;
import com.deare.backend.api.home.dto.request.HomeEditRequestDTO.StickerRequest;
import com.deare.backend.api.home.dto.response.HomeDashboardResponse;
import com.deare.backend.api.home.dto.result.HomeSettingDto;
import com.deare.backend.api.home.dto.result.HomeStickerDto;
import com.deare.backend.api.home.dto.result.HomeUserDto;
import com.deare.backend.api.home.exception.HomeErrorCode;
import com.deare.backend.domain.image.entity.Image;
import com.deare.backend.domain.image.exception.ImageErrorCode;
import com.deare.backend.domain.image.repository.ImageRepository;
import com.deare.backend.domain.setting.entity.UserSetting;
import com.deare.backend.domain.setting.repository.UserSettingRepository;
import com.deare.backend.domain.sticker.entity.UserSticker;
Expand All @@ -17,6 +22,8 @@
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Service
@RequiredArgsConstructor
Expand All @@ -25,6 +32,7 @@ public class HomeService {
private final UserRepository userRepository;
private final UserSettingRepository userSettingRepository;
private final UserStickerRepository stickerRepository;
private final ImageRepository imageRepository;

@Transactional(readOnly=true)
public HomeDashboardResponse getHome(Long userId) {
Expand Down Expand Up @@ -64,6 +72,50 @@ public HomeDashboardResponse getHome(Long userId) {
stickerDtos
);
}
@Transactional
public void editHome(Long userId, HomeEditRequestDTO request) {

User user = userRepository.findById(userId)
.orElseThrow(() -> new GeneralException(HomeErrorCode.USER_NOT_FOUND));

UserSetting userSetting = userSettingRepository.findByUser_Id(userId).orElse(null);
if (userSetting != null) {
userSetting.updateHomeColor(request.homeColor());
} else {
userSettingRepository.save(UserSetting.createDefault(user, request.homeColor()));
}

stickerRepository.deleteAllByUserId(userId);

List<StickerRequest> stickerRequests = request.stickers();
if (stickerRequests.isEmpty()) {
return;
}

List<Long> imageIds = stickerRequests.stream()
.map(HomeEditRequestDTO.StickerRequest::imageId)
.distinct()
.toList();

Map<Long, Image> imageMap = imageRepository.findAllById(imageIds).stream()
.collect(Collectors.toMap(Image::getId, image -> image));

List<UserSticker> newStickers = stickerRequests.stream()
.map(dto -> {
Image image = imageMap.get(dto.imageId());
if (image == null) {
throw new GeneralException(ImageErrorCode.IMAGE_40001);
}
return UserSticker.create(
user, image,
dto.posX(), dto.posY(), dto.posZ(),
dto.rotation(), dto.scale()
);
})
.toList();

Comment thread
ownue marked this conversation as resolved.
stickerRepository.saveAll(newStickers);
}

private HomeStickerDto toStickerDto(UserSticker sticker) {
return new HomeStickerDto(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,11 @@
package com.deare.backend.api.setting.controller;

import com.deare.backend.api.setting.dto.request.UpdateFontRequestDTO;
import com.deare.backend.api.setting.dto.request.UpdateHomeColorRequestDTO;
import com.deare.backend.api.setting.dto.response.*;
import com.deare.backend.api.setting.service.SettingService;
import com.deare.backend.global.auth.util.SecurityUtil;
import com.deare.backend.global.common.response.ApiResponse;
import io.swagger.v3.oas.annotations.Operation;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

Expand Down Expand Up @@ -47,17 +45,5 @@ public ApiResponse<UpgradeMembershipResponseDTO> upgradeMembership() {
Long userId = SecurityUtil.getCurrentUserId();
return ApiResponse.success(settingService.upgradeMembership(userId));
}
@PatchMapping("/homecolor")
@Operation(
summary = "홈 배경색 변경",
description = "사용자의 홈 화면 배경색을 변경하는 API입니다."
)
public ApiResponse<UpdateHomeColorResponseDTO> updateHomeColor(
@Valid @RequestBody UpdateHomeColorRequestDTO request
) {
Long userId = SecurityUtil.getCurrentUserId();
UpdateHomeColorResponseDTO res = settingService.updateHomeColor(userId, request);
return ApiResponse.success(res);
}

}

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,12 +1,10 @@
package com.deare.backend.api.setting.service;

import com.deare.backend.api.setting.dto.request.UpdateFontRequestDTO;
import com.deare.backend.api.setting.dto.request.UpdateHomeColorRequestDTO;
import com.deare.backend.api.setting.dto.response.*;
import com.deare.backend.domain.setting.entity.enums.Font;
import com.deare.backend.domain.setting.entity.enums.MembershipPlan;
import com.deare.backend.domain.setting.entity.UserSetting;
import com.deare.backend.domain.setting.exception.HomeColorErrorCode;
import com.deare.backend.domain.setting.exception.MembershipErrorCode;
import com.deare.backend.domain.setting.exception.ThemeErrorCode;
import com.deare.backend.domain.setting.repository.UserSettingRepository;
Expand Down Expand Up @@ -89,16 +87,5 @@ private Font parseFontOrThrow422(String raw) {
throw new GeneralException(ThemeErrorCode.THEME_UNPROCESSABLE_ENTITY);
}
}
@Transactional
public UpdateHomeColorResponseDTO updateHomeColor(Long userId, UpdateHomeColorRequestDTO request) {

settingWriteService.ensureSettingExists(userId);

UserSetting setting = userSettingRepository.findByUser_Id(userId)
.orElseThrow(() -> new GeneralException(HomeColorErrorCode.SETTING_NOT_FOUND ));

setting.updateHomeColor(request.homeColor());
return new UpdateHomeColorResponseDTO(setting.getHomeColor());
}

}

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

Loading
Loading