- Entity: LoginHistory, PageView, Issue, IssueComment 추가 - Repository: 각 엔티티별 JpaRepository 추가 - Service: UserService, RoleService, ActivityService, IssueService - Admin API: 사용자 관리 7개, 롤/권한 관리 7개, 통계 1개 엔드포인트 - Activity API: 페이지뷰 기록, 로그인 이력 조회 - Issue API: CRUD + 코멘트, 프로젝트/위치/Gitea 링크 지원 - Exception: GlobalExceptionHandler, ResourceNotFoundException, BusinessException - AuthController: 로그인 시 LoginHistory 기록 추가 - Dockerfile 추가 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
46 lines
1.7 KiB
Java
46 lines
1.7 KiB
Java
package com.gcsc.guide.service;
|
|
|
|
import com.gcsc.guide.dto.LoginHistoryResponse;
|
|
import com.gcsc.guide.entity.LoginHistory;
|
|
import com.gcsc.guide.entity.PageView;
|
|
import com.gcsc.guide.entity.User;
|
|
import com.gcsc.guide.exception.ResourceNotFoundException;
|
|
import com.gcsc.guide.repository.LoginHistoryRepository;
|
|
import com.gcsc.guide.repository.PageViewRepository;
|
|
import com.gcsc.guide.repository.UserRepository;
|
|
import lombok.RequiredArgsConstructor;
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
import java.util.List;
|
|
|
|
@Service
|
|
@RequiredArgsConstructor
|
|
public class ActivityService {
|
|
|
|
private final LoginHistoryRepository loginHistoryRepository;
|
|
private final PageViewRepository pageViewRepository;
|
|
private final UserRepository userRepository;
|
|
|
|
@Transactional
|
|
public void recordLogin(Long userId, String ipAddress, String userAgent) {
|
|
User user = userRepository.findById(userId)
|
|
.orElseThrow(() -> new ResourceNotFoundException("사용자", userId));
|
|
loginHistoryRepository.save(new LoginHistory(user, ipAddress, userAgent));
|
|
}
|
|
|
|
@Transactional
|
|
public void trackPageView(Long userId, String pagePath) {
|
|
User user = userRepository.findById(userId)
|
|
.orElseThrow(() -> new ResourceNotFoundException("사용자", userId));
|
|
pageViewRepository.save(new PageView(user, pagePath));
|
|
}
|
|
|
|
@Transactional(readOnly = true)
|
|
public List<LoginHistoryResponse> getLoginHistory(Long userId) {
|
|
return loginHistoryRepository.findByUserIdOrderByLoginAtDesc(userId).stream()
|
|
.map(LoginHistoryResponse::from)
|
|
.toList();
|
|
}
|
|
}
|